Added an alternate builder syntax and started using it in a few places.

This commit is contained in:
Azareal 2017-11-11 08:46:30 +00:00
parent fb8fa10570
commit 7ac3de8299
5 changed files with 226 additions and 109 deletions

View File

@ -75,7 +75,7 @@ func init() {
acc := qgen.Builder.Accumulator() acc := qgen.Builder.Accumulator()
replyStmts = ReplyStmts{ replyStmts = ReplyStmts{
isLiked: acc.SimpleSelect("likes", "targetItem", "sentBy = ? and targetItem = ? and targetType = 'replies'", "", ""), isLiked: acc.SimpleSelect("likes", "targetItem", "sentBy = ? and targetItem = ? and targetType = 'replies'", "", ""),
createLike: acc.SimpleInsert("likes", "weight, targetItem, targetType, sentBy", "?,?,?,?"), createLike: acc.Insert("likes").Columns("weight, targetItem, targetType, sentBy").Fields("?,?,?,?").Prepare(),
delete: acc.SimpleDelete("replies", "rid = ?"), delete: acc.SimpleDelete("replies", "rid = ?"),
addLikesToReply: acc.SimpleUpdate("replies", "likeCount = likeCount + ?", "rid = ?"), addLikesToReply: acc.SimpleUpdate("replies", "likeCount = likeCount + ?", "rid = ?"),
removeRepliesFromTopic: acc.SimpleUpdate("topics", "postCount = postCount - ?", "tid = ?"), removeRepliesFromTopic: acc.SimpleUpdate("topics", "postCount = postCount - ?", "tid = ?"),

View File

@ -129,17 +129,18 @@ func init() {
DbInits.Add(func() error { DbInits.Add(func() error {
acc := qgen.Builder.Accumulator() acc := qgen.Builder.Accumulator()
topicStmts = TopicStmts{ topicStmts = TopicStmts{
addRepliesToTopic: acc.SimpleUpdate("topics", "postCount = postCount + ?, lastReplyBy = ?, lastReplyAt = UTC_TIMESTAMP()", "tid = ?"), addRepliesToTopic: acc.Update("topics").Set("postCount = postCount + ?, lastReplyBy = ?, lastReplyAt = UTC_TIMESTAMP()").Where("tid = ?").Prepare(),
lock: acc.SimpleUpdate("topics", "is_closed = 1", "tid = ?"), lock: acc.Update("topics").Set("is_closed = 1").Where("tid = ?").Prepare(),
unlock: acc.SimpleUpdate("topics", "is_closed = 0", "tid = ?"), unlock: acc.Update("topics").Set("is_closed = 0").Where("tid = ?").Prepare(),
stick: acc.SimpleUpdate("topics", "sticky = 1", "tid = ?"), stick: acc.Update("topics").Set("sticky = 1").Where("tid = ?").Prepare(),
unstick: acc.SimpleUpdate("topics", "sticky = 0", "tid = ?"), unstick: acc.Update("topics").Set("sticky = 0").Where("tid = ?").Prepare(),
hasLikedTopic: acc.SimpleSelect("likes", "targetItem", "sentBy = ? and targetItem = ? and targetType = 'topics'", "", ""), hasLikedTopic: acc.Select("likes").Columns("targetItem").Where("sentBy = ? and targetItem = ? and targetType = 'topics'").Prepare(),
createLike: acc.SimpleInsert("likes", "weight, targetItem, targetType, sentBy", "?,?,?,?"), createLike: acc.Insert("likes").Columns("weight, targetItem, targetType, sentBy").Fields("?,?,?,?").Prepare(),
addLikesToTopic: acc.SimpleUpdate("topics", "likeCount = likeCount + ?", "tid = ?"), addLikesToTopic: acc.Update("topics").Set("likeCount = likeCount + ?").Where("tid = ?").Prepare(),
delete: acc.SimpleDelete("topics", "tid = ?"), delete: acc.Delete("topics").Where("tid = ?").Prepare(),
edit: acc.SimpleUpdate("topics", "title = ?, content = ?, parsed_content = ?", "tid = ?"), edit: acc.Update("topics").Set("title = ?, content = ?, parsed_content = ?").Where("tid = ?").Prepare(),
createActionReply: acc.SimpleInsert("replies", "tid, actionType, ipaddress, createdBy, createdAt, lastUpdated, content, parsed_content", "?,?,?,?,UTC_TIMESTAMP(),UTC_TIMESTAMP(),'',''"), createActionReply: acc.Insert("replies").Columns("tid, actionType, ipaddress, createdBy, createdAt, lastUpdated, content, parsed_content").Fields("?,?,?,?,UTC_TIMESTAMP(),UTC_TIMESTAMP(),'',''").Prepare(),
getTopicUser: acc.SimpleLeftJoin("topics", "users", "topics.title, topics.content, topics.createdBy, topics.createdAt, topics.is_closed, topics.sticky, topics.parentID, topics.ipaddress, topics.postCount, topics.likeCount, users.name, users.avatar, users.group, users.url_prefix, users.url_name, users.level", "topics.createdBy = users.uid", "tid = ?", "", ""), getTopicUser: acc.SimpleLeftJoin("topics", "users", "topics.title, topics.content, topics.createdBy, topics.createdAt, topics.is_closed, topics.sticky, topics.parentID, topics.ipaddress, topics.postCount, topics.likeCount, users.name, users.avatar, users.group, users.url_prefix, users.url_name, users.level", "topics.createdBy = users.uid", "tid = ?", "", ""),
} }
return acc.FirstError() return acc.FirstError()

View File

@ -1,24 +1,21 @@
package main package main
import ( import (
//"os"
"bytes" "bytes"
"database/sql"
"errors" "errors"
"log" "log"
"strconv"
"strings"
//"math/rand"
"database/sql"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"strconv"
"strings"
"testing" "testing"
"time" "time"
"./common" "./common"
"./install/install" "./install/install"
"./query_gen/lib"
//"runtime/pprof" //"runtime/pprof"
//_ "github.com/go-sql-driver/mysql"
//"github.com/erikstmartin/go-testdb"
//"github.com/husobee/vestigo" //"github.com/husobee/vestigo"
) )
@ -75,16 +72,16 @@ func gloinit() (err error) {
return err return err
} }
err = initDatabase() err = InitDatabase()
if err != nil { if err != nil {
return err return err
} }
rstore, err = NewSQLReplyStore() common.Rstore, err = common.NewSQLReplyStore()
if err != nil { if err != nil {
return err return err
} }
prstore, err = NewSQLProfileReplyStore() common.Prstore, err = common.NewSQLProfileReplyStore()
if err != nil { if err != nil {
return err return err
} }
@ -95,25 +92,29 @@ func gloinit() (err error) {
// return err // return err
//} //}
err = initTemplates() err = common.InitTemplates()
if err != nil { if err != nil {
return err return err
} }
dbProd.SetMaxOpenConns(64) dbProd.SetMaxOpenConns(64)
err = initPhrases() err = common.InitPhrases()
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
log.Print("Loading the static files.") log.Print("Loading the static files.")
err = initStaticFiles() err = common.StaticFiles.Init()
if err != nil { if err != nil {
return err return err
} }
auth = NewDefaultAuth()
err = LoadWordFilters() common.Auth, err = common.NewDefaultAuth()
if err != nil {
return err
}
err = common.LoadWordFilters()
if err != nil { if err != nil {
return err return err
} }
@ -142,15 +143,15 @@ func BenchmarkTopicAdminRouteParallel(b *testing.B) {
} }
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
admin, err := users.Get(1) admin, err := common.Users.Get(1)
if err != nil { if err != nil {
b.Fatal(err) b.Fatal(err)
} }
if !admin.IsAdmin { if !admin.IsAdmin {
b.Fatal("UID1 is not an admin") b.Fatal("UID1 is not an admin")
} }
adminUIDCookie := http.Cookie{Name: "uid", Value: "1", Path: "/", MaxAge: year} adminUIDCookie := http.Cookie{Name: "uid", Value: "1", Path: "/", MaxAge: common.Year}
adminSessionCookie := http.Cookie{Name: "session", Value: admin.Session, Path: "/", MaxAge: year} adminSessionCookie := http.Cookie{Name: "session", Value: admin.Session, Path: "/", MaxAge: common.Year}
topicW := httptest.NewRecorder() topicW := httptest.NewRecorder()
topicReq := httptest.NewRequest("get", "/topic/1", bytes.NewReader(nil)) topicReq := httptest.NewRequest("get", "/topic/1", bytes.NewReader(nil))
@ -159,7 +160,7 @@ func BenchmarkTopicAdminRouteParallel(b *testing.B) {
topicReqAdmin.AddCookie(&adminSessionCookie) topicReqAdmin.AddCookie(&adminSessionCookie)
// Deal with the session stuff, etc. // Deal with the session stuff, etc.
user, ok := PreRoute(topicW, topicReqAdmin) user, ok := common.PreRoute(topicW, topicReqAdmin)
if !ok { if !ok {
b.Fatal("Mysterious error!") b.Fatal("Mysterious error!")
} }
@ -185,7 +186,7 @@ func BenchmarkTopicGuestRouteParallel(b *testing.B) {
topicReq := httptest.NewRequest("get", "/topic/1", bytes.NewReader(nil)) topicReq := httptest.NewRequest("get", "/topic/1", bytes.NewReader(nil))
for pb.Next() { for pb.Next() {
topicW.Body.Reset() topicW.Body.Reset()
routeTopicID(topicW, topicReq, guestUser) routeTopicID(topicW, topicReq, common.GuestUser)
} }
}) })
} }
@ -522,7 +523,7 @@ func BenchmarkQueryTopicParallel(b *testing.B) {
} }
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
var tu TopicUser var tu common.TopicUser
for pb.Next() { for pb.Next() {
err := db.QueryRow("select topics.title, topics.content, topics.createdBy, topics.createdAt, topics.is_closed, topics.sticky, topics.parentID, topics.ipaddress, topics.postCount, topics.likeCount, users.name, users.avatar, users.group, users.url_prefix, users.url_name, users.level from topics left join users ON topics.createdBy = users.uid where tid = ?", 1).Scan(&tu.Title, &tu.Content, &tu.CreatedBy, &tu.CreatedAt, &tu.IsClosed, &tu.Sticky, &tu.ParentID, &tu.IPAddress, &tu.PostCount, &tu.LikeCount, &tu.CreatedByName, &tu.Avatar, &tu.Group, &tu.URLPrefix, &tu.URLName, &tu.Level) err := db.QueryRow("select topics.title, topics.content, topics.createdBy, topics.createdAt, topics.is_closed, topics.sticky, topics.parentID, topics.ipaddress, topics.postCount, topics.likeCount, users.name, users.avatar, users.group, users.url_prefix, users.url_name, users.level from topics left join users ON topics.createdBy = users.uid where tid = ?", 1).Scan(&tu.Title, &tu.Content, &tu.CreatedBy, &tu.CreatedAt, &tu.IsClosed, &tu.Sticky, &tu.ParentID, &tu.IPAddress, &tu.PostCount, &tu.LikeCount, &tu.CreatedByName, &tu.Avatar, &tu.Group, &tu.URLPrefix, &tu.URLName, &tu.Level)
if err == ErrNoRows { if err == ErrNoRows {
@ -546,9 +547,15 @@ func BenchmarkQueryPreparedTopicParallel(b *testing.B) {
} }
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
var tu TopicUser var tu common.TopicUser
getTopicUser, err := qgen.Builder.SimpleLeftJoin("topics", "users", "topics.title, topics.content, topics.createdBy, topics.createdAt, topics.is_closed, topics.sticky, topics.parentID, topics.ipaddress, topics.postCount, topics.likeCount, users.name, users.avatar, users.group, users.url_prefix, users.url_name, users.level", "topics.createdBy = users.uid", "tid = ?", "", "")
if err != nil {
b.Fatal(err)
}
for pb.Next() { for pb.Next() {
err := stmts.getTopicUser.QueryRow(1).Scan(&tu.Title, &tu.Content, &tu.CreatedBy, &tu.CreatedAt, &tu.IsClosed, &tu.Sticky, &tu.ParentID, &tu.IPAddress, &tu.PostCount, &tu.LikeCount, &tu.CreatedByName, &tu.Avatar, &tu.Group, &tu.URLPrefix, &tu.URLName, &tu.Level) err := getTopicUser.QueryRow(1).Scan(&tu.Title, &tu.Content, &tu.CreatedBy, &tu.CreatedAt, &tu.IsClosed, &tu.Sticky, &tu.ParentID, &tu.IPAddress, &tu.PostCount, &tu.LikeCount, &tu.CreatedByName, &tu.Avatar, &tu.Group, &tu.URLPrefix, &tu.URLName, &tu.Level)
if err == ErrNoRows { if err == ErrNoRows {
b.Fatal("No rows found!") b.Fatal("No rows found!")
return return
@ -572,7 +579,7 @@ func BenchmarkUserGet(b *testing.B) {
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
var err error var err error
for pb.Next() { for pb.Next() {
_, err = users.Get(1) _, err = common.Users.Get(1)
if err != nil { if err != nil {
b.Fatal(err) b.Fatal(err)
return return
@ -594,7 +601,7 @@ func BenchmarkUserBypassGet(b *testing.B) {
b.RunParallel(func(pb *testing.PB) { b.RunParallel(func(pb *testing.PB) {
var err error var err error
for pb.Next() { for pb.Next() {
_, err = users.BypassGet(1) _, err = common.Users.BypassGet(1)
if err != nil { if err != nil {
b.Fatal(err) b.Fatal(err)
return return
@ -605,7 +612,7 @@ func BenchmarkUserBypassGet(b *testing.B) {
func BenchmarkQueriesSerial(b *testing.B) { func BenchmarkQueriesSerial(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
var tu TopicUser var tu common.TopicUser
b.Run("topic", func(b *testing.B) { b.Run("topic", func(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
err := db.QueryRow("select topics.title, topics.content, topics.createdBy, topics.createdAt, topics.is_closed, topics.sticky, topics.parentID, topics.ipaddress, topics.postCount, topics.likeCount, users.name, users.avatar, users.group, users.url_prefix, users.url_name, users.level from topics left join users ON topics.createdBy = users.uid where tid = ?", 1).Scan(&tu.Title, &tu.Content, &tu.CreatedBy, &tu.CreatedAt, &tu.IsClosed, &tu.Sticky, &tu.ParentID, &tu.IPAddress, &tu.PostCount, &tu.LikeCount, &tu.CreatedByName, &tu.Avatar, &tu.Group, &tu.URLPrefix, &tu.URLName, &tu.Level) err := db.QueryRow("select topics.title, topics.content, topics.createdBy, topics.createdAt, topics.is_closed, topics.sticky, topics.parentID, topics.ipaddress, topics.postCount, topics.likeCount, users.name, users.avatar, users.group, users.url_prefix, users.url_name, users.level from topics left join users ON topics.createdBy = users.uid where tid = ?", 1).Scan(&tu.Title, &tu.Content, &tu.CreatedBy, &tu.CreatedAt, &tu.IsClosed, &tu.Sticky, &tu.ParentID, &tu.IPAddress, &tu.PostCount, &tu.LikeCount, &tu.CreatedByName, &tu.Avatar, &tu.Group, &tu.URLPrefix, &tu.URLName, &tu.Level)
@ -637,7 +644,7 @@ func BenchmarkQueriesSerial(b *testing.B) {
} }
}) })
var replyItem ReplyUser var replyItem common.ReplyUser
var isSuperAdmin bool var isSuperAdmin bool
var group int var group int
b.Run("topic_replies_scan", func(b *testing.B) { b.Run("topic_replies_scan", func(b *testing.B) {
@ -997,32 +1004,32 @@ func BenchmarkParserSerial(b *testing.B) {
b.ReportAllocs() b.ReportAllocs()
b.Run("empty_post", func(b *testing.B) { b.Run("empty_post", func(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
_ = parseMessage("", 0, "") _ = common.ParseMessage("", 0, "")
} }
}) })
b.Run("short_post", func(b *testing.B) { b.Run("short_post", func(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
_ = parseMessage("Hey everyone, how's it going?", 0, "") _ = common.ParseMessage("Hey everyone, how's it going?", 0, "")
} }
}) })
b.Run("one_smily", func(b *testing.B) { b.Run("one_smily", func(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
_ = parseMessage("Hey everyone, how's it going? :)", 0, "") _ = common.ParseMessage("Hey everyone, how's it going? :)", 0, "")
} }
}) })
b.Run("five_smilies", func(b *testing.B) { b.Run("five_smilies", func(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
_ = parseMessage("Hey everyone, how's it going? :):):):):)", 0, "") _ = common.ParseMessage("Hey everyone, how's it going? :):):):):)", 0, "")
} }
}) })
b.Run("ten_smilies", func(b *testing.B) { b.Run("ten_smilies", func(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
_ = parseMessage("Hey everyone, how's it going? :):):):):):):):):):)", 0, "") _ = common.ParseMessage("Hey everyone, how's it going? :):):):):):):):):):)", 0, "")
} }
}) })
b.Run("twenty_smilies", func(b *testing.B) { b.Run("twenty_smilies", func(b *testing.B) {
for i := 0; i < b.N; i++ { for i := 0; i < b.N; i++ {
_ = parseMessage("Hey everyone, how's it going? :):):):):):):):):):):):):):):):):):):):)", 0, "") _ = common.ParseMessage("Hey everyone, how's it going? :):):):):):):):):):):):):):):):):):):):)", 0, "")
} }
}) })
} }
@ -1175,7 +1182,7 @@ func BenchmarkBBCodePluginWithFullParserSerial(b *testing.B) {
} }
func TestLevels(t *testing.T) { func TestLevels(t *testing.T) {
levels := getLevels(40) levels := common.GetLevels(40)
for level, score := range levels { for level, score := range levels {
sscore := strconv.FormatFloat(score, 'f', -1, 64) sscore := strconv.FormatFloat(score, 'f', -1, 64)
t.Log("Level: " + strconv.Itoa(level) + " Score: " + sscore) t.Log("Level: " + strconv.Itoa(level) + " Score: " + sscore)

View File

@ -35,24 +35,24 @@ func TestUserStore(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
} }
if !pluginsInited { if !common.PluginsInited {
initPlugins() common.InitPlugins()
} }
var err error var err error
users, err = NewMemoryUserStore(config.UserCacheCapacity) common.Users, err = common.NewMemoryUserStore(common.Config.UserCacheCapacity)
expectNilErr(t, err) expectNilErr(t, err)
users.(UserCache).Flush() common.Users.(common.UserCache).Flush()
userStoreTest(t, 2) userStoreTest(t, 2)
users, err = NewSQLUserStore() common.Users, err = common.NewSQLUserStore()
expectNilErr(t, err) expectNilErr(t, err)
userStoreTest(t, 3) userStoreTest(t, 3)
} }
func userStoreTest(t *testing.T, newUserID int) { func userStoreTest(t *testing.T, newUserID int) {
ucache, hasCache := common.Users.(UserCache) ucache, hasCache := common.Users.(common.UserCache)
// Go doesn't have short-circuiting, so this'll allow us to do one liner tests // Go doesn't have short-circuiting, so this'll allow us to do one liner tests
if !hasCache { if !hasCache {
ucache = &NullUserStore{} ucache = &common.NullUserStore{}
} }
expect(t, (!hasCache || ucache.Length() == 0), fmt.Sprintf("The initial ucache length should be zero, not %d", ucache.Length())) expect(t, (!hasCache || ucache.Length() == 0), fmt.Sprintf("The initial ucache length should be zero, not %d", ucache.Length()))
@ -104,7 +104,7 @@ func userStoreTest(t *testing.T, newUserID int) {
} }
// TODO: Lock onto the specific error type. Is this even possible without sacrificing the detailed information in the error message? // TODO: Lock onto the specific error type. Is this even possible without sacrificing the detailed information in the error message?
var userList map[int]*User var userList map[int]*common.User
userList, _ = common.Users.BulkGetMap([]int{-1}) userList, _ = common.Users.BulkGetMap([]int{-1})
if len(userList) > 0 { if len(userList) > 0 {
t.Error("There shouldn't be any results for UID #-1") t.Error("There shouldn't be any results for UID #-1")
@ -135,7 +135,6 @@ func userStoreTest(t *testing.T, newUserID int) {
t.Error("We couldn't find UID #1 in the returned map") t.Error("We couldn't find UID #1 in the returned map")
t.Error("userList", userList) t.Error("userList", userList)
} }
if user.ID != 1 { if user.ID != 1 {
t.Error("user.ID does not match the requested UID. Got '" + strconv.Itoa(user.ID) + "' instead.") t.Error("user.ID does not match the requested UID. Got '" + strconv.Itoa(user.ID) + "' instead.")
} }
@ -151,10 +150,10 @@ func userStoreTest(t *testing.T, newUserID int) {
ucache.Flush() ucache.Flush()
} }
expect(t, !users.Exists(-1), "UID #-1 shouldn't exist") expect(t, !common.Users.Exists(-1), "UID #-1 shouldn't exist")
expect(t, !users.Exists(0), "UID #0 shouldn't exist") expect(t, !common.Users.Exists(0), "UID #0 shouldn't exist")
expect(t, common.Users.Exists(1), "UID #1 should exist") expect(t, common.Users.Exists(1), "UID #1 should exist")
expect(t, !users.Exists(newUserID), fmt.Sprintf("UID #%d shouldn't exist", newUserID)) expect(t, !common.Users.Exists(newUserID), fmt.Sprintf("UID #%d shouldn't exist", newUserID))
expect(t, !hasCache || ucache.Length() == 0, fmt.Sprintf("User cache length should be 0, not %d", ucache.Length())) expect(t, !hasCache || ucache.Length() == 0, fmt.Sprintf("User cache length should be 0, not %d", ucache.Length()))
expectIntToBeX(t, common.Users.GlobalCount(), 1, "The number of users should be one, not %d") expectIntToBeX(t, common.Users.GlobalCount(), 1, "The number of users should be one, not %d")
@ -207,7 +206,7 @@ func userStoreTest(t *testing.T, newUserID int) {
expect(t, !user.IsMod, "Sam should not be a mod") expect(t, !user.IsMod, "Sam should not be a mod")
expect(t, !user.IsBanned, "Sam should not be banned") expect(t, !user.IsBanned, "Sam should not be banned")
expect(t, user.Group == config.DefaultGroup, fmt.Sprintf("Sam should be in group %d, not %d", config.DefaultGroup, user.Group)) expect(t, user.Group == common.Config.DefaultGroup, fmt.Sprintf("Sam should be in group %d, not %d", common.Config.DefaultGroup, user.Group))
// Permanent ban // Permanent ban
duration, _ := time.ParseDuration("0") duration, _ := time.ParseDuration("0")
@ -215,7 +214,7 @@ func userStoreTest(t *testing.T, newUserID int) {
// TODO: Attempt a double ban, double activation, and double unban // TODO: Attempt a double ban, double activation, and double unban
err = user.Ban(duration, 1) err = user.Ban(duration, 1)
expectNilErr(t, err) expectNilErr(t, err)
expect(t, user.Group == config.DefaultGroup, fmt.Sprintf("Sam should be in group %d, not %d", config.DefaultGroup, user.Group)) expect(t, user.Group == common.Config.DefaultGroup, fmt.Sprintf("Sam should be in group %d, not %d", common.Config.DefaultGroup, user.Group))
if hasCache { if hasCache {
expectIntToBeX(t, ucache.Length(), 0, "User cache length should be 0, not %d") expectIntToBeX(t, ucache.Length(), 0, "User cache length should be 0, not %d")
@ -235,13 +234,13 @@ func userStoreTest(t *testing.T, newUserID int) {
expect(t, !user.IsMod, "Sam should not be a mod") expect(t, !user.IsMod, "Sam should not be a mod")
expect(t, user.IsBanned, "Sam should be banned") expect(t, user.IsBanned, "Sam should be banned")
expectIntToBeX(t, user.Group, banGroup, "Sam should be in group %d") expectIntToBeX(t, user.Group, common.BanGroup, "Sam should be in group %d")
// TODO: Do tests against the scheduled updates table and the task system to make sure the ban exists there and gets revoked when it should // TODO: Do tests against the scheduled updates table and the task system to make sure the ban exists there and gets revoked when it should
err = user.Unban() err = user.Unban()
expectNilErr(t, err) expectNilErr(t, err)
expectIntToBeX(t, user.Group, banGroup, "Sam should still be in the ban group in this copy") expectIntToBeX(t, user.Group, common.BanGroup, "Sam should still be in the ban group in this copy")
if hasCache { if hasCache {
expectIntToBeX(t, ucache.Length(), 0, "User cache length should be 0, not %d") expectIntToBeX(t, ucache.Length(), 0, "User cache length should be 0, not %d")
@ -259,7 +258,7 @@ func userStoreTest(t *testing.T, newUserID int) {
expect(t, !user.IsMod, "Sam should not be a mod") expect(t, !user.IsMod, "Sam should not be a mod")
expect(t, !user.IsBanned, "Sam should not be banned") expect(t, !user.IsBanned, "Sam should not be banned")
expectIntToBeX(t, user.Group, config.DefaultGroup, "Sam should be back in group %d") expectIntToBeX(t, user.Group, common.Config.DefaultGroup, "Sam should be back in group %d")
var reportsForumID = 1 var reportsForumID = 1
var generalForumID = 2 var generalForumID = 2
@ -270,12 +269,12 @@ func userStoreTest(t *testing.T, newUserID int) {
err = user.ChangeGroup(1) err = user.ChangeGroup(1)
expectNilErr(t, err) expectNilErr(t, err)
expect(t, user.Group == config.DefaultGroup, "Someone's mutated this pointer elsewhere") expect(t, user.Group == common.Config.DefaultGroup, "Someone's mutated this pointer elsewhere")
user, err = common.Users.Get(newUserID) user, err = common.Users.Get(newUserID)
recordMustExist(t, err, "Couldn't find UID #%d", newUserID) recordMustExist(t, err, "Couldn't find UID #%d", newUserID)
expectIntToBeX(t, user.ID, newUserID, "The UID of the user record should be %d") expectIntToBeX(t, user.ID, newUserID, "The UID of the user record should be %d")
var user2 *User = getDummyUser() var user2 *common.User = common.BlankUser()
*user2 = *user *user2 = *user
expect(t, !user.IsSuperAdmin, "Sam should not be a super admin") expect(t, !user.IsSuperAdmin, "Sam should not be a super admin")
@ -284,10 +283,10 @@ func userStoreTest(t *testing.T, newUserID int) {
expect(t, user.IsMod, "Sam should be a mod") expect(t, user.IsMod, "Sam should be a mod")
expect(t, !user.IsBanned, "Sam should not be banned") expect(t, !user.IsBanned, "Sam should not be banned")
_, ferr := forumUserCheck(dummyResponseRecorder, dummyRequest1, user, reportsForumID) _, ferr := common.ForumUserCheck(dummyResponseRecorder, dummyRequest1, user, reportsForumID)
expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck") expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck")
expect(t, user.Perms.ViewTopic, "Admins should be able to access the reports forum") expect(t, user.Perms.ViewTopic, "Admins should be able to access the reports forum")
_, ferr = forumUserCheck(dummyResponseRecorder, dummyRequest2, user2, generalForumID) _, ferr = common.ForumUserCheck(dummyResponseRecorder, dummyRequest2, user2, generalForumID)
expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck") expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck")
expect(t, user2.Perms.ViewTopic, "Sam should be able to access the general forum") expect(t, user2.Perms.ViewTopic, "Sam should be able to access the general forum")
@ -298,7 +297,7 @@ func userStoreTest(t *testing.T, newUserID int) {
user, err = common.Users.Get(newUserID) user, err = common.Users.Get(newUserID)
recordMustExist(t, err, "Couldn't find UID #%d", newUserID) recordMustExist(t, err, "Couldn't find UID #%d", newUserID)
expectIntToBeX(t, user.ID, newUserID, "The UID of the user record should be %d") expectIntToBeX(t, user.ID, newUserID, "The UID of the user record should be %d")
user2 = getDummyUser() user2 = common.BlankUser()
*user2 = *user *user2 = *user
expect(t, !user.IsSuperAdmin, "Sam should not be a super admin") expect(t, !user.IsSuperAdmin, "Sam should not be a super admin")
@ -307,10 +306,10 @@ func userStoreTest(t *testing.T, newUserID int) {
expect(t, user.IsMod, "Sam should be a mod") expect(t, user.IsMod, "Sam should be a mod")
expect(t, !user.IsBanned, "Sam should not be banned") expect(t, !user.IsBanned, "Sam should not be banned")
_, ferr = forumUserCheck(dummyResponseRecorder, dummyRequest1, user, reportsForumID) _, ferr = common.ForumUserCheck(dummyResponseRecorder, dummyRequest1, user, reportsForumID)
expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck") expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck")
expect(t, user.Perms.ViewTopic, "Mods should be able to access the reports forum") expect(t, user.Perms.ViewTopic, "Mods should be able to access the reports forum")
_, ferr = forumUserCheck(dummyResponseRecorder, dummyRequest2, user2, generalForumID) _, ferr = common.ForumUserCheck(dummyResponseRecorder, dummyRequest2, user2, generalForumID)
expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck") expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck")
expect(t, user2.Perms.ViewTopic, "Sam should be able to access the general forum") expect(t, user2.Perms.ViewTopic, "Sam should be able to access the general forum")
@ -321,7 +320,7 @@ func userStoreTest(t *testing.T, newUserID int) {
user, err = common.Users.Get(newUserID) user, err = common.Users.Get(newUserID)
recordMustExist(t, err, "Couldn't find UID #%d", newUserID) recordMustExist(t, err, "Couldn't find UID #%d", newUserID)
expectIntToBeX(t, user.ID, newUserID, "The UID of the user record should be %d") expectIntToBeX(t, user.ID, newUserID, "The UID of the user record should be %d")
user2 = getDummyUser() user2 = common.BlankUser()
*user2 = *user *user2 = *user
expect(t, !user.IsSuperAdmin, "Sam should not be a super admin") expect(t, !user.IsSuperAdmin, "Sam should not be a super admin")
@ -330,10 +329,10 @@ func userStoreTest(t *testing.T, newUserID int) {
expect(t, !user.IsMod, "Sam should not be a mod") expect(t, !user.IsMod, "Sam should not be a mod")
expect(t, !user.IsBanned, "Sam should not be banned") expect(t, !user.IsBanned, "Sam should not be banned")
_, ferr = forumUserCheck(dummyResponseRecorder, dummyRequest1, user, reportsForumID) _, ferr = common.ForumUserCheck(dummyResponseRecorder, dummyRequest1, user, reportsForumID)
expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck") expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck")
expect(t, !user.Perms.ViewTopic, "Members shouldn't be able to access the reports forum") expect(t, !user.Perms.ViewTopic, "Members shouldn't be able to access the reports forum")
_, ferr = forumUserCheck(dummyResponseRecorder, dummyRequest2, user2, generalForumID) _, ferr = common.ForumUserCheck(dummyResponseRecorder, dummyRequest2, user2, generalForumID)
expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck") expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck")
expect(t, user2.Perms.ViewTopic, "Sam should be able to access the general forum") expect(t, user2.Perms.ViewTopic, "Sam should be able to access the general forum")
expect(t, user.Perms.ViewTopic != user2.Perms.ViewTopic, "user.Perms.ViewTopic and user2.Perms.ViewTopic should never match") expect(t, user.Perms.ViewTopic != user2.Perms.ViewTopic, "user.Perms.ViewTopic and user2.Perms.ViewTopic should never match")
@ -345,7 +344,7 @@ func userStoreTest(t *testing.T, newUserID int) {
user, err = common.Users.Get(newUserID) user, err = common.Users.Get(newUserID)
recordMustExist(t, err, "Couldn't find UID #%d", newUserID) recordMustExist(t, err, "Couldn't find UID #%d", newUserID)
expectIntToBeX(t, user.ID, newUserID, "The UID of the user record should be %d") expectIntToBeX(t, user.ID, newUserID, "The UID of the user record should be %d")
user2 = getDummyUser() user2 = common.BlankUser()
*user2 = *user *user2 = *user
expect(t, !user.IsSuperAdmin, "Sam should not be a super admin") expect(t, !user.IsSuperAdmin, "Sam should not be a super admin")
@ -354,10 +353,10 @@ func userStoreTest(t *testing.T, newUserID int) {
expect(t, !user.IsMod, "Sam should not be a mod") expect(t, !user.IsMod, "Sam should not be a mod")
expect(t, user.IsBanned, "Sam should be banned") expect(t, user.IsBanned, "Sam should be banned")
_, ferr = forumUserCheck(dummyResponseRecorder, dummyRequest1, user, reportsForumID) _, ferr = common.ForumUserCheck(dummyResponseRecorder, dummyRequest1, user, reportsForumID)
expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck") expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck")
expect(t, !user.Perms.ViewTopic, "Members shouldn't be able to access the reports forum") expect(t, !user.Perms.ViewTopic, "Members shouldn't be able to access the reports forum")
_, ferr = forumUserCheck(dummyResponseRecorder, dummyRequest2, user2, generalForumID) _, ferr = common.ForumUserCheck(dummyResponseRecorder, dummyRequest2, user2, generalForumID)
expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck") expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck")
expect(t, user2.Perms.ViewTopic, "Sam should be able to access the general forum") expect(t, user2.Perms.ViewTopic, "Sam should be able to access the general forum")
@ -368,7 +367,7 @@ func userStoreTest(t *testing.T, newUserID int) {
user, err = common.Users.Get(newUserID) user, err = common.Users.Get(newUserID)
recordMustExist(t, err, "Couldn't find UID #%d", newUserID) recordMustExist(t, err, "Couldn't find UID #%d", newUserID)
expectIntToBeX(t, user.ID, newUserID, "The UID of the user record should be %d") expectIntToBeX(t, user.ID, newUserID, "The UID of the user record should be %d")
user2 = getDummyUser() user2 = common.BlankUser()
*user2 = *user *user2 = *user
expect(t, !user.IsSuperAdmin, "Sam should not be a super admin") expect(t, !user.IsSuperAdmin, "Sam should not be a super admin")
@ -377,10 +376,10 @@ func userStoreTest(t *testing.T, newUserID int) {
expect(t, !user.IsMod, "Sam should not be a mod") expect(t, !user.IsMod, "Sam should not be a mod")
expect(t, !user.IsBanned, "Sam should not be banned") expect(t, !user.IsBanned, "Sam should not be banned")
_, ferr = forumUserCheck(dummyResponseRecorder, dummyRequest1, user, reportsForumID) _, ferr = common.ForumUserCheck(dummyResponseRecorder, dummyRequest1, user, reportsForumID)
expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck") expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck")
expect(t, !user.Perms.ViewTopic, "Members shouldn't be able to access the reports forum") expect(t, !user.Perms.ViewTopic, "Members shouldn't be able to access the reports forum")
_, ferr = forumUserCheck(dummyResponseRecorder, dummyRequest2, user2, generalForumID) _, ferr = common.ForumUserCheck(dummyResponseRecorder, dummyRequest2, user2, generalForumID)
expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck") expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck")
expect(t, user2.Perms.ViewTopic, "Sam should be able to access the general forum") expect(t, user2.Perms.ViewTopic, "Sam should be able to access the general forum")
@ -391,7 +390,7 @@ func userStoreTest(t *testing.T, newUserID int) {
user, err = common.Users.Get(newUserID) user, err = common.Users.Get(newUserID)
recordMustExist(t, err, "Couldn't find UID #%d", newUserID) recordMustExist(t, err, "Couldn't find UID #%d", newUserID)
expectIntToBeX(t, user.ID, newUserID, "The UID of the user record should be %d") expectIntToBeX(t, user.ID, newUserID, "The UID of the user record should be %d")
user2 = getDummyUser() user2 = common.BlankUser()
*user2 = *user *user2 = *user
expect(t, !user.IsSuperAdmin, "Sam should not be a super admin") expect(t, !user.IsSuperAdmin, "Sam should not be a super admin")
@ -400,20 +399,20 @@ func userStoreTest(t *testing.T, newUserID int) {
expect(t, !user.IsMod, "Sam should not be a mod") expect(t, !user.IsMod, "Sam should not be a mod")
expect(t, !user.IsBanned, "Sam should not be banned") expect(t, !user.IsBanned, "Sam should not be banned")
_, ferr = forumUserCheck(dummyResponseRecorder, dummyRequest1, user, reportsForumID) _, ferr = common.ForumUserCheck(dummyResponseRecorder, dummyRequest1, user, reportsForumID)
expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck") expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck")
expect(t, !user.Perms.ViewTopic, "Members shouldn't be able to access the reports forum") expect(t, !user.Perms.ViewTopic, "Members shouldn't be able to access the reports forum")
_, ferr = forumUserCheck(dummyResponseRecorder, dummyRequest2, user2, generalForumID) _, ferr = common.ForumUserCheck(dummyResponseRecorder, dummyRequest2, user2, generalForumID)
expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck") expect(t, ferr == nil, "There shouldn't be any errors in forumUserCheck")
expect(t, user2.Perms.ViewTopic, "Sam should be able to access the general forum") expect(t, user2.Perms.ViewTopic, "Sam should be able to access the general forum")
err = user.ChangeGroup(config.DefaultGroup) err = user.ChangeGroup(common.Config.DefaultGroup)
expectNilErr(t, err) expectNilErr(t, err)
expect(t, user.Group == 6, "Someone's mutated this pointer elsewhere") expect(t, user.Group == 6, "Someone's mutated this pointer elsewhere")
err = user.Delete() err = user.Delete()
expectNilErr(t, err) expectNilErr(t, err)
expect(t, !users.Exists(newUserID), fmt.Sprintf("UID #%d should no longer exist", newUserID)) expect(t, !common.Users.Exists(newUserID), fmt.Sprintf("UID #%d should no longer exist", newUserID))
if hasCache { if hasCache {
expectIntToBeX(t, ucache.Length(), 0, "User cache length should be 0, not %d") expectIntToBeX(t, ucache.Length(), 0, "User cache length should be 0, not %d")
@ -456,39 +455,39 @@ func TestPermsMiddleware(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
} }
if !pluginsInited { if !common.PluginsInited {
initPlugins() common.InitPlugins()
} }
dummyResponseRecorder := httptest.NewRecorder() dummyResponseRecorder := httptest.NewRecorder()
bytesBuffer := bytes.NewBuffer([]byte("")) bytesBuffer := bytes.NewBuffer([]byte(""))
dummyRequest := httptest.NewRequest("", "/forum/1", bytesBuffer) dummyRequest := httptest.NewRequest("", "/forum/1", bytesBuffer)
user := getDummyUser() user := common.BlankUser()
ferr := SuperModOnly(dummyResponseRecorder, dummyRequest, *user) ferr := common.SuperModOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr != nil, "Blank users shouldn't be supermods") expect(t, ferr != nil, "Blank users shouldn't be supermods")
user.IsSuperMod = false user.IsSuperMod = false
ferr = SuperModOnly(dummyResponseRecorder, dummyRequest, *user) ferr = common.SuperModOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr != nil, "Non-supermods shouldn't be allowed through supermod gates") expect(t, ferr != nil, "Non-supermods shouldn't be allowed through supermod gates")
user.IsSuperMod = true user.IsSuperMod = true
ferr = SuperModOnly(dummyResponseRecorder, dummyRequest, *user) ferr = common.SuperModOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr == nil, "Supermods should be allowed through supermod gates") expect(t, ferr == nil, "Supermods should be allowed through supermod gates")
// TODO: Loop over the Control Panel routes and make sure only supermods can get in // TODO: Loop over the Control Panel routes and make sure only supermods can get in
user = getDummyUser() user = common.BlankUser()
ferr = MemberOnly(dummyResponseRecorder, dummyRequest, *user) ferr = common.MemberOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr != nil, "Blank users shouldn't be considered loggedin") expect(t, ferr != nil, "Blank users shouldn't be considered loggedin")
user.Loggedin = false user.Loggedin = false
ferr = MemberOnly(dummyResponseRecorder, dummyRequest, *user) ferr = common.MemberOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr != nil, "Guests shouldn't be able to access member areas") expect(t, ferr != nil, "Guests shouldn't be able to access member areas")
user.Loggedin = true user.Loggedin = true
ferr = MemberOnly(dummyResponseRecorder, dummyRequest, *user) ferr = common.MemberOnly(dummyResponseRecorder, dummyRequest, *user)
expect(t, ferr == nil, "Logged in users should be able to access member areas") expect(t, ferr == nil, "Logged in users should be able to access member areas")
// TODO: Loop over the /user/ routes and make sure only members can access the ones other than /user/username // TODO: Loop over the /user/ routes and make sure only members can access the ones other than /user/username
@ -501,20 +500,20 @@ func TestTopicStore(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
} }
if !pluginsInited { if !common.PluginsInited {
initPlugins() common.InitPlugins()
} }
var err error var err error
topics, err = NewMemoryTopicStore(config.TopicCacheCapacity) common.Topics, err = common.NewMemoryTopicStore(common.Config.TopicCacheCapacity)
expectNilErr(t, err) expectNilErr(t, err)
topicStoreTest(t) topicStoreTest(t)
topics, err = NewSQLTopicStore() common.Topics, err = common.NewSQLTopicStore()
expectNilErr(t, err) expectNilErr(t, err)
topicStoreTest(t) topicStoreTest(t)
} }
func topicStoreTest(t *testing.T) { func topicStoreTest(t *testing.T) {
var topic *Topic var topic *common.Topic
var err error var err error
_, err = common.Topics.Get(-1) _, err = common.Topics.Get(-1)
@ -560,17 +559,17 @@ func TestForumStore(t *testing.T) {
if !gloinited { if !gloinited {
gloinit() gloinit()
} }
if !pluginsInited { if !common.PluginsInited {
initPlugins() common.InitPlugins()
} }
_, err := fstore.Get(-1) _, err := common.Fstore.Get(-1)
recordMustNotExist(t, err, "FID #-1 shouldn't exist") recordMustNotExist(t, err, "FID #-1 shouldn't exist")
_, err = fstore.Get(0) _, err = common.Fstore.Get(0)
recordMustNotExist(t, err, "FID #0 shouldn't exist") recordMustNotExist(t, err, "FID #0 shouldn't exist")
forum, err := fstore.Get(1) forum, err := common.Fstore.Get(1)
recordMustExist(t, err, "Couldn't find FID #1") recordMustExist(t, err, "Couldn't find FID #1")
if forum.ID != 1 { if forum.ID != 1 {
@ -582,7 +581,7 @@ func TestForumStore(t *testing.T) {
var expectDesc = "All the reports go here" var expectDesc = "All the reports go here"
expect(t, forum.Desc == expectDesc, fmt.Sprintf("The forum description should be '%s' not '%s'", expectDesc, forum.Desc)) expect(t, forum.Desc == expectDesc, fmt.Sprintf("The forum description should be '%s' not '%s'", expectDesc, forum.Desc))
forum, err = fstore.Get(2) forum, err = common.Fstore.Get(2)
recordMustExist(t, err, "Couldn't find FID #1") recordMustExist(t, err, "Couldn't find FID #1")
expect(t, forum.ID == 2, fmt.Sprintf("The FID should be 2 not %d", forum.ID)) expect(t, forum.ID == 2, fmt.Sprintf("The FID should be 2 not %d", forum.ID))
@ -591,11 +590,11 @@ func TestForumStore(t *testing.T) {
expectDesc = "A place for general discussions which don't fit elsewhere" expectDesc = "A place for general discussions which don't fit elsewhere"
expect(t, forum.Desc == expectDesc, fmt.Sprintf("The forum description should be '%s' not '%s'", expectDesc, forum.Desc)) expect(t, forum.Desc == expectDesc, fmt.Sprintf("The forum description should be '%s' not '%s'", expectDesc, forum.Desc))
ok := fstore.Exists(-1) ok := common.Fstore.Exists(-1)
expect(t, !ok, "FID #-1 shouldn't exist") expect(t, !ok, "FID #-1 shouldn't exist")
ok = fstore.Exists(0) ok = common.Fstore.Exists(0)
expect(t, !ok, "FID #0 shouldn't exist") expect(t, !ok, "FID #0 shouldn't exist")
ok = fstore.Exists(1) ok = common.Fstore.Exists(1)
expect(t, ok, "FID #1 should exist") expect(t, ok, "FID #1 should exist")
// TODO: Test forum creation // TODO: Test forum creation

View File

@ -186,3 +186,113 @@ func (build *accBuilder) PurgeTx(tx *sql.Tx, table string) (stmt *sql.Stmt) {
res, err := build.adapter.Purge("_builder", table) res, err := build.adapter.Purge("_builder", table)
return build.prepareTx(tx, res, err) return build.prepareTx(tx, res, err)
} }
func (build *accBuilder) Delete(table string) *deleteBuilder {
return &deleteBuilder{table, "", build}
}
type deleteBuilder struct {
table string
where string
build *accBuilder
}
func (delete *deleteBuilder) Where(where string) *deleteBuilder {
delete.where = where
return delete
}
func (delete *deleteBuilder) Prepare() *sql.Stmt {
return delete.build.SimpleDelete(delete.table, delete.where)
}
func (build *accBuilder) Update(table string) *updateBuilder {
return &updateBuilder{table, "", "", build}
}
type updateBuilder struct {
table string
set string
where string
build *accBuilder
}
func (update *updateBuilder) Set(set string) *updateBuilder {
update.set = set
return update
}
func (update *updateBuilder) Where(where string) *updateBuilder {
update.where = where
return update
}
func (update *updateBuilder) Prepare() *sql.Stmt {
return update.build.SimpleUpdate(update.table, update.set, update.where)
}
func (build *accBuilder) Select(table string) *selectBuilder {
return &selectBuilder{table, "", "", "", "", build}
}
type selectBuilder struct {
table string
columns string
where string
orderby string
limit string
build *accBuilder
}
func (selectItem *selectBuilder) Columns(columns string) *selectBuilder {
selectItem.columns = columns
return selectItem
}
func (selectItem *selectBuilder) Where(where string) *selectBuilder {
selectItem.where = where
return selectItem
}
func (selectItem *selectBuilder) Orderby(orderby string) *selectBuilder {
selectItem.orderby = orderby
return selectItem
}
func (selectItem *selectBuilder) Limit(limit string) *selectBuilder {
selectItem.limit = limit
return selectItem
}
func (selectItem *selectBuilder) Prepare() *sql.Stmt {
return selectItem.build.SimpleSelect(selectItem.table, selectItem.columns, selectItem.where, selectItem.orderby, selectItem.limit)
}
func (build *accBuilder) Insert(table string) *insertBuilder {
return &insertBuilder{table, "", "", build}
}
type insertBuilder struct {
table string
columns string
fields string
build *accBuilder
}
func (insert *insertBuilder) Columns(columns string) *insertBuilder {
insert.columns = columns
return insert
}
func (insert *insertBuilder) Fields(fields string) *insertBuilder {
insert.fields = fields
return insert
}
func (insert *insertBuilder) Prepare() *sql.Stmt {
return insert.build.SimpleInsert(insert.table, insert.columns, insert.fields)
}