diff --git a/common/audit_logs.go b/common/audit_logs.go index d74d6739..5daf3545 100644 --- a/common/audit_logs.go +++ b/common/audit_logs.go @@ -14,8 +14,7 @@ type LogStmts struct { var logStmts LogStmts func init() { - DbInits.Add(func() error { - acc := qgen.Builder.Accumulator() + DbInits.Add(func(acc *qgen.Accumulator) error { logStmts = LogStmts{ addModLogEntry: acc.Insert("moderation_logs").Columns("action, elementID, elementType, ipaddress, actorID, doneAt").Fields("?,?,?,?,?,UTC_TIMESTAMP()").Prepare(), addAdminLogEntry: acc.Insert("administration_logs").Columns("action, elementID, elementType, ipaddress, actorID, doneAt").Fields("?,?,?,?,?,UTC_TIMESTAMP()").Prepare(), diff --git a/common/auth.go b/common/auth.go index 72f63c6c..e75a704a 100644 --- a/common/auth.go +++ b/common/auth.go @@ -48,9 +48,9 @@ type DefaultAuth struct { func NewDefaultAuth() (*DefaultAuth, error) { acc := qgen.Builder.Accumulator() return &DefaultAuth{ - login: acc.SimpleSelect("users", "uid, password, salt", "name = ?", "", ""), - logout: acc.SimpleUpdate("users", "session = ''", "uid = ?"), - updateSession: acc.SimpleUpdate("users", "session = ?", "uid = ?"), + login: acc.Select("users").Columns("uid, password, salt").Where("name = ?").Prepare(), + logout: acc.Update("users").Set("session = ''").Where("uid = ?").Prepare(), + updateSession: acc.Update("users").Set("session = ?").Where("uid = ?").Prepare(), }, acc.FirstError() } diff --git a/common/common.go b/common/common.go index 1e98d43f..18973efe 100644 --- a/common/common.go +++ b/common/common.go @@ -2,6 +2,8 @@ package common import ( "database/sql" + + "../query_gen/lib" ) // nolint I don't want to write comments for each of these o.o @@ -62,13 +64,14 @@ func (slice StringList) Contains(needle string) bool { return false } -type dbInits []func() error +type dbInits []func(acc *qgen.Accumulator) error var DbInits dbInits func (inits dbInits) Run() error { for _, init := range inits { - err := init() + acc := qgen.Builder.Accumulator() + err := init(acc) if err != nil { return err } @@ -76,6 +79,6 @@ func (inits dbInits) Run() error { return nil } -func (inits dbInits) Add(init ...func() error) { +func (inits dbInits) Add(init ...func(acc *qgen.Accumulator) error) { DbInits = dbInits(append(DbInits, init...)) } diff --git a/common/extend.go b/common/extend.go index 288f2982..ffb97808 100644 --- a/common/extend.go +++ b/common/extend.go @@ -145,8 +145,7 @@ type ExtendStmts struct { var extendStmts ExtendStmts func init() { - DbInits.Add(func() error { - acc := qgen.Builder.Accumulator() + DbInits.Add(func(acc *qgen.Accumulator) error { extendStmts = ExtendStmts{ getPlugins: acc.Select("plugins").Columns("uname, active, installed").Prepare(), } diff --git a/common/forum.go b/common/forum.go index 7753e4fb..626c23c0 100644 --- a/common/forum.go +++ b/common/forum.go @@ -54,10 +54,9 @@ type ForumStmts struct { var forumStmts ForumStmts func init() { - DbInits.Add(func() error { - acc := qgen.Builder.Accumulator() + DbInits.Add(func(acc *qgen.Accumulator) error { forumStmts = ForumStmts{ - update: acc.SimpleUpdate("forums", "name = ?, desc = ?, active = ?, preset = ?", "fid = ?"), + update: acc.Update("forums").Set("name = ?, desc = ?, active = ?, preset = ?").Where("fid = ?").Prepare(), } return acc.FirstError() }) diff --git a/common/forum_store.go b/common/forum_store.go index 4cfbe9bf..a04bb310 100644 --- a/common/forum_store.go +++ b/common/forum_store.go @@ -74,14 +74,14 @@ func NewMemoryForumStore() (*MemoryForumStore, error) { acc := qgen.Builder.Accumulator() // TODO: Do a proper delete return &MemoryForumStore{ - get: acc.SimpleSelect("forums", "name, desc, active, preset, parentID, parentType, topicCount, lastTopicID, lastReplyerID", "fid = ?", "", ""), - getAll: acc.SimpleSelect("forums", "fid, name, desc, active, preset, parentID, parentType, topicCount, lastTopicID, lastReplyerID", "", "fid ASC", ""), - delete: acc.SimpleUpdate("forums", "name= '', active = 0", "fid = ?"), - create: acc.SimpleInsert("forums", "name, desc, active, preset", "?,?,?,?"), - count: acc.SimpleCount("forums", "name != ''", ""), - updateCache: acc.SimpleUpdate("forums", "lastTopicID = ?, lastReplyerID = ?", "fid = ?"), - addTopics: acc.SimpleUpdate("forums", "topicCount = topicCount + ?", "fid = ?"), - removeTopics: acc.SimpleUpdate("forums", "topicCount = topicCount - ?", "fid = ?"), + get: acc.Select("forums").Columns("name, desc, active, preset, parentID, parentType, topicCount, lastTopicID, lastReplyerID").Where("fid = ?").Prepare(), + getAll: acc.Select("forums").Columns("fid, name, desc, active, preset, parentID, parentType, topicCount, lastTopicID, lastReplyerID").Orderby("fid ASC").Prepare(), + delete: acc.Update("forums").Set("name= '', active = 0").Where("fid = ?").Prepare(), + create: acc.Insert("forums").Columns("name, desc, active, preset").Fields("?,?,?,?").Prepare(), + count: acc.Count("forums").Where("name != ''").Prepare(), + updateCache: acc.Update("forums").Set("lastTopicID = ?, lastReplyerID = ?").Where("fid = ?").Prepare(), + addTopics: acc.Update("forums").Set("topicCount = topicCount + ?").Where("fid = ?").Prepare(), + removeTopics: acc.Update("forums").Set("topicCount = topicCount - ?").Where("fid = ?").Prepare(), }, acc.FirstError() } diff --git a/common/group.go b/common/group.go index 99e1f9c0..a7dbaa9b 100644 --- a/common/group.go +++ b/common/group.go @@ -37,10 +37,9 @@ type GroupStmts struct { var groupStmts GroupStmts func init() { - DbInits.Add(func() error { - acc := qgen.Builder.Accumulator() + DbInits.Add(func(acc *qgen.Accumulator) error { groupStmts = GroupStmts{ - updateGroupRank: acc.SimpleUpdate("users_groups", "is_admin = ?, is_mod = ?, is_banned = ?", "gid = ?"), + updateGroupRank: acc.Update("users_groups").Set("is_admin = ?, is_mod = ?, is_banned = ?").Where("gid = ?").Prepare(), } return acc.FirstError() }) diff --git a/common/group_store.go b/common/group_store.go index f8340e02..376aab0b 100644 --- a/common/group_store.go +++ b/common/group_store.go @@ -48,9 +48,9 @@ func NewMemoryGroupStore() (*MemoryGroupStore, error) { return &MemoryGroupStore{ groups: make(map[int]*Group), groupCount: 0, - getAll: acc.SimpleSelect("users_groups", "gid, name, permissions, plugin_perms, is_mod, is_admin, is_banned, tag", "", "", ""), - get: acc.SimpleSelect("users_groups", "name, permissions, plugin_perms, is_mod, is_admin, is_banned, tag", "gid = ?", "", ""), - count: acc.SimpleCount("users_groups", "", ""), + getAll: acc.Select("users_groups").Columns("gid, name, permissions, plugin_perms, is_mod, is_admin, is_banned, tag").Prepare(), + get: acc.Select("users_groups").Columns("name, permissions, plugin_perms, is_mod, is_admin, is_banned, tag").Where("gid = ?").Prepare(), + count: acc.Count("users_groups").Prepare(), }, acc.FirstError() } diff --git a/common/profile_reply_store.go b/common/profile_reply_store.go index 2b745ff8..3a79a3a1 100644 --- a/common/profile_reply_store.go +++ b/common/profile_reply_store.go @@ -23,8 +23,8 @@ type SQLProfileReplyStore struct { func NewSQLProfileReplyStore() (*SQLProfileReplyStore, error) { acc := qgen.Builder.Accumulator() return &SQLProfileReplyStore{ - get: acc.SimpleSelect("users_replies", "uid, content, createdBy, createdAt, lastEdit, lastEditBy, ipaddress", "rid = ?", "", ""), - create: acc.SimpleInsert("users_replies", "uid, content, parsed_content, createdAt, createdBy, ipaddress", "?,?,?,UTC_TIMESTAMP(),?,?"), + get: acc.Select("users_replies").Columns("uid, content, createdBy, createdAt, lastEdit, lastEditBy, ipaddress").Where("rid = ?").Prepare(), + create: acc.Insert("users_replies").Columns("uid, content, parsed_content, createdAt, createdBy, ipaddress").Fields("?,?,?,UTC_TIMESTAMP(),?,?").Prepare(), }, acc.FirstError() } diff --git a/common/reply.go b/common/reply.go index 79e54743..0c530a68 100644 --- a/common/reply.go +++ b/common/reply.go @@ -71,14 +71,13 @@ type ReplyStmts struct { } func init() { - DbInits.Add(func() error { - acc := qgen.Builder.Accumulator() + DbInits.Add(func(acc *qgen.Accumulator) error { replyStmts = ReplyStmts{ - isLiked: acc.SimpleSelect("likes", "targetItem", "sentBy = ? and targetItem = ? and targetType = 'replies'", "", ""), + isLiked: acc.Select("likes").Columns("targetItem").Where("sentBy = ? and targetItem = ? and targetType = 'replies'").Prepare(), createLike: acc.Insert("likes").Columns("weight, targetItem, targetType, sentBy").Fields("?,?,?,?").Prepare(), - delete: acc.SimpleDelete("replies", "rid = ?"), - addLikesToReply: acc.SimpleUpdate("replies", "likeCount = likeCount + ?", "rid = ?"), - removeRepliesFromTopic: acc.SimpleUpdate("topics", "postCount = postCount - ?", "tid = ?"), + delete: acc.Delete("replies").Where("rid = ?").Prepare(), + addLikesToReply: acc.Update("replies").Set("likeCount = likeCount + ?").Where("rid = ?").Prepare(), + removeRepliesFromTopic: acc.Update("topics").Set("postCount = postCount - ?").Where("tid = ?").Prepare(), getParent: acc.SimpleLeftJoin("replies", "topics", "topics.tid, topics.title, topics.content, topics.createdBy, topics.createdAt, topics.is_closed, topics.sticky, topics.parentID, topics.ipaddress, topics.postCount, topics.likeCount, topics.data", "replies.tid = topics.tid", "rid = ?", "", ""), } return acc.FirstError() diff --git a/common/reply_store.go b/common/reply_store.go index a823c582..e73a9257 100644 --- a/common/reply_store.go +++ b/common/reply_store.go @@ -18,8 +18,8 @@ type SQLReplyStore struct { func NewSQLReplyStore() (*SQLReplyStore, error) { acc := qgen.Builder.Accumulator() return &SQLReplyStore{ - get: acc.SimpleSelect("replies", "tid, content, createdBy, createdAt, lastEdit, lastEditBy, ipaddress, likeCount", "rid = ?", "", ""), - create: acc.SimpleInsert("replies", "tid, content, parsed_content, createdAt, lastUpdated, ipaddress, words, createdBy", "?,?,?,UTC_TIMESTAMP(),UTC_TIMESTAMP(),?,?,?"), + get: acc.Select("replies").Columns("tid, content, createdBy, createdAt, lastEdit, lastEditBy, ipaddress, likeCount").Where("rid = ?").Prepare(), + create: acc.Insert("replies").Columns("tid, content, parsed_content, createdAt, lastUpdated, ipaddress, words, createdBy").Fields("?,?,?,UTC_TIMESTAMP(),UTC_TIMESTAMP(),?,?,?").Prepare(), }, acc.FirstError() } diff --git a/common/setting.go b/common/setting.go index a784de97..dc9f2aeb 100644 --- a/common/setting.go +++ b/common/setting.go @@ -35,8 +35,7 @@ var settingStmts SettingStmts func init() { SettingBox.Store(SettingMap(make(map[string]interface{}))) - DbInits.Add(func() error { - acc := qgen.Builder.Accumulator() + DbInits.Add(func(acc *qgen.Accumulator) error { settingStmts = SettingStmts{ getFull: acc.Select("settings").Columns("name, content, type, constraints").Prepare(), } diff --git a/common/tasks.go b/common/tasks.go index b1024cef..c0324466 100644 --- a/common/tasks.go +++ b/common/tasks.go @@ -24,11 +24,10 @@ var lastSync time.Time func init() { lastSync = time.Now() - DbInits.Add(func() error { - acc := qgen.Builder.Accumulator() + DbInits.Add(func(acc *qgen.Accumulator) error { taskStmts = TaskStmts{ - getExpiredScheduledGroups: acc.SimpleSelect("users_groups_scheduler", "uid", "UTC_TIMESTAMP() > revert_at AND temporary = 1", "", ""), - getSync: acc.SimpleSelect("sync", "last_update", "", "", ""), + getExpiredScheduledGroups: acc.Select("users_groups_scheduler").Columns("uid").Where("UTC_TIMESTAMP() > revert_at AND temporary = 1").Prepare(), + getSync: acc.Select("sync").Columns("last_update").Prepare(), } return acc.FirstError() }) diff --git a/common/themes.go b/common/themes.go index 87a01b99..01041921 100644 --- a/common/themes.go +++ b/common/themes.go @@ -83,8 +83,7 @@ var themeStmts ThemeStmts func init() { DefaultThemeBox.Store(fallbackTheme) - DbInits.Add(func() error { - acc := qgen.Builder.Accumulator() + DbInits.Add(func(acc *qgen.Accumulator) error { themeStmts = ThemeStmts{ getThemes: acc.Select("themes").Columns("uname, default").Prepare(), } diff --git a/common/topic.go b/common/topic.go index 5ede565a..9bfaf3dd 100644 --- a/common/topic.go +++ b/common/topic.go @@ -126,8 +126,7 @@ type TopicStmts struct { var topicStmts TopicStmts func init() { - DbInits.Add(func() error { - acc := qgen.Builder.Accumulator() + DbInits.Add(func(acc *qgen.Accumulator) error { topicStmts = TopicStmts{ addRepliesToTopic: acc.Update("topics").Set("postCount = postCount + ?, lastReplyBy = ?, lastReplyAt = UTC_TIMESTAMP()").Where("tid = ?").Prepare(), lock: acc.Update("topics").Set("is_closed = 1").Where("tid = ?").Prepare(), diff --git a/common/topic_store.go b/common/topic_store.go index 8a1d7c3a..fad86b32 100644 --- a/common/topic_store.go +++ b/common/topic_store.go @@ -69,10 +69,10 @@ func NewMemoryTopicStore(capacity int) (*MemoryTopicStore, error) { return &MemoryTopicStore{ items: make(map[int]*Topic), capacity: capacity, - get: acc.SimpleSelect("topics", "title, content, createdBy, createdAt, lastReplyAt, is_closed, sticky, parentID, ipaddress, postCount, likeCount, data", "tid = ?", "", ""), - exists: acc.SimpleSelect("topics", "tid", "tid = ?", "", ""), - topicCount: acc.SimpleCount("topics", "", ""), - create: acc.SimpleInsert("topics", "parentID, title, content, parsed_content, createdAt, lastReplyAt, lastReplyBy, ipaddress, words, createdBy", "?,?,?,?,UTC_TIMESTAMP(),UTC_TIMESTAMP(),?,?,?,?"), + get: acc.Select("topics").Columns("title, content, createdBy, createdAt, lastReplyAt, is_closed, sticky, parentID, ipaddress, postCount, likeCount, data").Where("tid = ?").Prepare(), + exists: acc.Select("topics").Columns("tid").Where("tid = ?").Prepare(), + topicCount: acc.Count("topics").Prepare(), + create: acc.Insert("topics").Columns("parentID, title, content, parsed_content, createdAt, lastReplyAt, lastReplyBy, ipaddress, words, createdBy").Fields("?,?,?,?,UTC_TIMESTAMP(),UTC_TIMESTAMP(),?,?,?,?").Prepare(), }, acc.FirstError() } @@ -279,10 +279,10 @@ type SQLTopicStore struct { func NewSQLTopicStore() (*SQLTopicStore, error) { acc := qgen.Builder.Accumulator() return &SQLTopicStore{ - get: acc.SimpleSelect("topics", "title, content, createdBy, createdAt, lastReplyAt, is_closed, sticky, parentID, ipaddress, postCount, likeCount, data", "tid = ?", "", ""), - exists: acc.SimpleSelect("topics", "tid", "tid = ?", "", ""), - topicCount: acc.SimpleCount("topics", "", ""), - create: acc.SimpleInsert("topics", "parentID, title, content, parsed_content, createdAt, lastReplyAt, lastReplyBy, ipaddress, words, createdBy", "?,?,?,?,UTC_TIMESTAMP(),UTC_TIMESTAMP(),?,?,?,?"), + get: acc.Select("topics").Columns("title, content, createdBy, createdAt, lastReplyAt, is_closed, sticky, parentID, ipaddress, postCount, likeCount, data").Where("tid = ?").Prepare(), + exists: acc.Select("topics").Columns("tid").Where("tid = ?").Prepare(), + topicCount: acc.Count("topics").Prepare(), + create: acc.Insert("topics").Columns("parentID, title, content, parsed_content, createdAt, lastReplyAt, lastReplyBy, ipaddress, words, createdBy").Fields("?,?,?,?,UTC_TIMESTAMP(),UTC_TIMESTAMP(),?,?,?,?").Prepare(), }, acc.FirstError() } diff --git a/common/user.go b/common/user.go index 7172b049..193925cc 100644 --- a/common/user.go +++ b/common/user.go @@ -80,8 +80,7 @@ type UserStmts struct { var userStmts UserStmts func init() { - DbInits.Add(func() error { - acc := qgen.Builder.Accumulator() + DbInits.Add(func(acc *qgen.Accumulator) error { userStmts = UserStmts{ activate: acc.SimpleUpdate("users", "active = 1", "uid = ?"), changeGroup: acc.SimpleUpdate("users", "group = ?", "uid = ?"), diff --git a/common/widgets.go b/common/widgets.go index a4711e72..2dbbddbc 100644 --- a/common/widgets.go +++ b/common/widgets.go @@ -50,8 +50,7 @@ type WidgetStmts struct { var widgetStmts WidgetStmts func init() { - DbInits.Add(func() error { - acc := qgen.Builder.Accumulator() + DbInits.Add(func(acc *qgen.Accumulator) error { widgetStmts = WidgetStmts{ getWidgets: acc.Select("widgets").Columns("position, side, type, active, location, data").Orderby("position ASC").Prepare(), } diff --git a/common/word_filters.go b/common/word_filters.go index 9915809e..73598f47 100644 --- a/common/word_filters.go +++ b/common/word_filters.go @@ -24,8 +24,7 @@ var filterStmts FilterStmts func init() { WordFilterBox.Store(WordFilterMap(make(map[int]WordFilter))) - DbInits.Add(func() error { - acc := qgen.Builder.Accumulator() + DbInits.Add(func(acc *qgen.Accumulator) error { filterStmts = FilterStmts{ getWordFilters: acc.Select("word_filters").Columns("wfid, find, replacement").Prepare(), } diff --git a/config.go b/config.go index 273cfda4..e9b746e0 100644 --- a/config.go +++ b/config.go @@ -1,64 +1,66 @@ package main +import "./common" + func init() { // Site Info - site.ShortName = "Ts" // This should be less than three letters to fit in the navbar - site.Name = "Test Site" - site.Email = "" - site.URL = "localhost" - site.Port = "8080" // 8080 - site.EnableSsl = false - site.EnableEmails = false - site.HasProxy = false // Cloudflare counts as this, if it's sitting in the middle - config.SslPrivkey = "" - config.SslFullchain = "" - site.Language = "english" + common.Site.ShortName = "Ts" // This should be less than three letters to fit in the navbar + common.Site.Name = "Test Site" + common.Site.Email = "" + common.Site.URL = "localhost" + common.Site.Port = "8080" // 8080 + common.Site.EnableSsl = false + common.Site.EnableEmails = false + common.Site.HasProxy = false // Cloudflare counts as this, if it's sitting in the middle + common.Config.SslPrivkey = "" + common.Config.SslFullchain = "" + common.Site.Language = "english" // Database details - dbConfig.Host = "localhost" - dbConfig.Username = "root" - dbConfig.Password = "password" - dbConfig.Dbname = "gosora" - dbConfig.Port = "3306" // You probably won't need to change this + common.DbConfig.Host = "localhost" + common.DbConfig.Username = "root" + common.DbConfig.Password = "password" + common.DbConfig.Dbname = "gosora" + common.DbConfig.Port = "3306" // You probably won't need to change this // MySQL Test Database details - dbConfig.TestHost = "localhost" - dbConfig.TestUsername = "root" - dbConfig.TestPassword = "" - dbConfig.TestDbname = "gosora_test" // The name of the test database, leave blank to disable. DON'T USE YOUR PRODUCTION DATABASE FOR THIS. LEAVE BLANK IF YOU DON'T KNOW WHAT THIS MEANS. - dbConfig.TestPort = "3306" + common.DbConfig.TestHost = "localhost" + common.DbConfig.TestUsername = "root" + common.DbConfig.TestPassword = "" + common.DbConfig.TestDbname = "gosora_test" // The name of the test database, leave blank to disable. DON'T USE YOUR PRODUCTION DATABASE FOR THIS. LEAVE BLANK IF YOU DON'T KNOW WHAT THIS MEANS. + common.DbConfig.TestPort = "3306" // Limiters - config.MaxRequestSize = 5 * megabyte + common.Config.MaxRequestSize = 5 * common.Megabyte // Caching - config.CacheTopicUser = CACHE_STATIC - config.UserCacheCapacity = 120 // The max number of users held in memory - config.TopicCacheCapacity = 200 // The max number of topics held in memory + common.Config.CacheTopicUser = common.CACHE_STATIC + common.Config.UserCacheCapacity = 120 // The max number of users held in memory + common.Config.TopicCacheCapacity = 200 // The max number of topics held in memory // Email - config.SMTPServer = "" - config.SMTPUsername = "" - config.SMTPPassword = "" - config.SMTPPort = "25" + common.Config.SMTPServer = "" + common.Config.SMTPUsername = "" + common.Config.SMTPPassword = "" + common.Config.SMTPPort = "25" // Misc - config.DefaultRoute = routeTopics - config.DefaultGroup = 3 // Should be a setting in the database - config.ActivationGroup = 5 // Should be a setting in the database - config.StaffCSS = "staff_post" - config.DefaultForum = 2 - config.MinifyTemplates = true - config.MultiServer = false // Experimental: Enable Cross-Server Synchronisation and several other features + common.Config.DefaultRoute = routeTopics + common.Config.DefaultGroup = 3 // Should be a setting in the database + common.Config.ActivationGroup = 5 // Should be a setting in the database + common.Config.StaffCSS = "staff_post" + common.Config.DefaultForum = 2 + common.Config.MinifyTemplates = true + common.Config.MultiServer = false // Experimental: Enable Cross-Server Synchronisation and several other features - //config.Noavatar = "https://api.adorable.io/avatars/{width}/{id}@{site_url}.png" - config.Noavatar = "https://api.adorable.io/avatars/285/{id}@{site_url}.png" - config.ItemsPerPage = 25 + //common.Config.Noavatar = "https://api.adorable.io/avatars/{width}/{id}@{site_url}.png" + common.Config.Noavatar = "https://api.adorable.io/avatars/285/{id}@{site_url}.png" + common.Config.ItemsPerPage = 25 // Developer flags - dev.DebugMode = true - //dev.SuperDebug = true - //dev.TemplateDebug = true - //dev.Profiling = true - //dev.TestDB = true + //common.Dev.DebugMode = true + //common.Dev.SuperDebug = true + //common.Dev.TemplateDebug = true + //common.Dev.Profiling = true + //common.Dev.TestDB = true } diff --git a/plugin_guilds.go b/plugin_guilds.go index 1198b7d2..601621cc 100644 --- a/plugin_guilds.go +++ b/plugin_guilds.go @@ -35,23 +35,23 @@ func initGuilds() (err error) { acc := qgen.Builder.Accumulator() - guilds.ListStmt = acc.SimpleSelect("guilds", "guildID, name, desc, active, privacy, joinable, owner, memberCount, createdAt, lastUpdateTime", "", "", "") + guilds.ListStmt = acc.Select("guilds").Columns("guildID, name, desc, active, privacy, joinable, owner, memberCount, createdAt, lastUpdateTime").Prepare() - guilds.GetGuildStmt = acc.SimpleSelect("guilds", "name, desc, active, privacy, joinable, owner, memberCount, mainForum, backdrop, createdAt, lastUpdateTime", "guildID = ?", "", "") + guilds.GetGuildStmt = acc.Select("guilds").Columns("name, desc, active, privacy, joinable, owner, memberCount, mainForum, backdrop, createdAt, lastUpdateTime").Where("guildID = ?").Prepare() - guilds.MemberListStmt = acc.SimpleSelect("guilds_members", "guildID, uid, rank, posts, joinedAt", "", "", "") + guilds.MemberListStmt = acc.Select("guilds_members").Columns("guildID, uid, rank, posts, joinedAt").Prepare() guilds.MemberListJoinStmt = acc.SimpleLeftJoin("guilds_members", "users", "users.uid, guilds_members.rank, guilds_members.posts, guilds_members.joinedAt, users.name, users.avatar", "guilds_members.uid = users.uid", "guilds_members.guildID = ?", "guilds_members.rank DESC, guilds_members.joinedat ASC", "") - guilds.GetMemberStmt = acc.SimpleSelect("guilds_members", "rank, posts, joinedAt", "guildID = ? AND uid = ?", "", "") + guilds.GetMemberStmt = acc.Select("guilds_members").Columns("rank, posts, joinedAt").Where("guildID = ? AND uid = ?").Prepare() - guilds.CreateGuildStmt = acc.SimpleInsert("guilds", "name, desc, active, privacy, joinable, owner, memberCount, mainForum, backdrop, createdAt, lastUpdateTime", "?,?,?,?,1,?,1,?,'',UTC_TIMESTAMP(),UTC_TIMESTAMP()") + guilds.CreateGuildStmt = acc.Insert("guilds").Columns("name, desc, active, privacy, joinable, owner, memberCount, mainForum, backdrop, createdAt, lastUpdateTime").Fields("?,?,?,?,1,?,1,?,'',UTC_TIMESTAMP(),UTC_TIMESTAMP()").Prepare() - guilds.AttachForumStmt = acc.SimpleUpdate("forums", "parentID = ?, parentType = 'guild'", "fid = ?") + guilds.AttachForumStmt = acc.Update("forums").Set("parentID = ?, parentType = 'guild'").Where("fid = ?").Prepare() - guilds.UnattachForumStmt = acc.SimpleUpdate("forums", "parentID = 0, parentType = ''", "fid = ?") + guilds.UnattachForumStmt = acc.Update("forums").Set("parentID = 0, parentType = ''").Where("fid = ?").Prepare() - guilds.AddMemberStmt = acc.SimpleInsert("guilds_members", "guildID, uid, rank, posts, joinedAt", "?,?,?,0,UTC_TIMESTAMP()") + guilds.AddMemberStmt = acc.Insert("guilds_members").Columns("guildID, uid, rank, posts, joinedAt").Fields("?,?,?,0,UTC_TIMESTAMP()").Prepare() return acc.FirstError() } diff --git a/query_gen/lib/accumulator.go b/query_gen/lib/accumulator.go index 59a85792..7a0f0193 100644 --- a/query_gen/lib/accumulator.go +++ b/query_gen/lib/accumulator.go @@ -5,17 +5,17 @@ import ( "database/sql" ) -type accBuilder struct { +type Accumulator struct { conn *sql.DB adapter DB_Adapter firstErr error } -func (build *accBuilder) SetConn(conn *sql.DB) { +func (build *Accumulator) SetConn(conn *sql.DB) { build.conn = conn } -func (build *accBuilder) SetAdapter(name string) error { +func (build *Accumulator) SetAdapter(name string) error { adap, err := GetAdapter(name) if err != nil { return err @@ -24,15 +24,15 @@ func (build *accBuilder) SetAdapter(name string) error { return nil } -func (build *accBuilder) GetAdapter() DB_Adapter { +func (build *Accumulator) GetAdapter() DB_Adapter { return build.adapter } -func (build *accBuilder) FirstError() error { +func (build *Accumulator) FirstError() error { return build.firstErr } -func (build *accBuilder) recordError(err error) { +func (build *Accumulator) recordError(err error) { if err == nil { return } @@ -41,7 +41,7 @@ func (build *accBuilder) recordError(err error) { } } -func (build *accBuilder) prepare(res string, err error) *sql.Stmt { +func (build *Accumulator) prepare(res string, err error) *sql.Stmt { if err != nil { build.recordError(err) return nil @@ -51,7 +51,7 @@ func (build *accBuilder) prepare(res string, err error) *sql.Stmt { return stmt } -func (build *accBuilder) Tx(handler func(*TransactionBuilder) error) { +func (build *Accumulator) Tx(handler func(*TransactionBuilder) error) { tx, err := build.conn.Begin() if err != nil { build.recordError(err) @@ -66,56 +66,56 @@ func (build *accBuilder) Tx(handler func(*TransactionBuilder) error) { build.recordError(tx.Commit()) } -func (build *accBuilder) SimpleSelect(table string, columns string, where string, orderby string, limit string) *sql.Stmt { +func (build *Accumulator) SimpleSelect(table string, columns string, where string, orderby string, limit string) *sql.Stmt { return build.prepare(build.adapter.SimpleSelect("_builder", table, columns, where, orderby, limit)) } -func (build *accBuilder) SimpleCount(table string, where string, limit string) *sql.Stmt { +func (build *Accumulator) SimpleCount(table string, where string, limit string) *sql.Stmt { return build.prepare(build.adapter.SimpleCount("_builder", table, where, limit)) } -func (build *accBuilder) SimpleLeftJoin(table1 string, table2 string, columns string, joiners string, where string, orderby string, limit string) *sql.Stmt { +func (build *Accumulator) SimpleLeftJoin(table1 string, table2 string, columns string, joiners string, where string, orderby string, limit string) *sql.Stmt { return build.prepare(build.adapter.SimpleLeftJoin("_builder", table1, table2, columns, joiners, where, orderby, limit)) } -func (build *accBuilder) SimpleInnerJoin(table1 string, table2 string, columns string, joiners string, where string, orderby string, limit string) *sql.Stmt { +func (build *Accumulator) SimpleInnerJoin(table1 string, table2 string, columns string, joiners string, where string, orderby string, limit string) *sql.Stmt { return build.prepare(build.adapter.SimpleInnerJoin("_builder", table1, table2, columns, joiners, where, orderby, limit)) } -func (build *accBuilder) CreateTable(table string, charset string, collation string, columns []DB_Table_Column, keys []DB_Table_Key) *sql.Stmt { +func (build *Accumulator) CreateTable(table string, charset string, collation string, columns []DB_Table_Column, keys []DB_Table_Key) *sql.Stmt { return build.prepare(build.adapter.CreateTable("_builder", table, charset, collation, columns, keys)) } -func (build *accBuilder) SimpleInsert(table string, columns string, fields string) *sql.Stmt { +func (build *Accumulator) SimpleInsert(table string, columns string, fields string) *sql.Stmt { return build.prepare(build.adapter.SimpleInsert("_builder", table, columns, fields)) } -func (build *accBuilder) SimpleInsertSelect(ins DB_Insert, sel DB_Select) *sql.Stmt { +func (build *Accumulator) SimpleInsertSelect(ins DB_Insert, sel DB_Select) *sql.Stmt { return build.prepare(build.adapter.SimpleInsertSelect("_builder", ins, sel)) } -func (build *accBuilder) SimpleInsertLeftJoin(ins DB_Insert, sel DB_Join) *sql.Stmt { +func (build *Accumulator) SimpleInsertLeftJoin(ins DB_Insert, sel DB_Join) *sql.Stmt { return build.prepare(build.adapter.SimpleInsertLeftJoin("_builder", ins, sel)) } -func (build *accBuilder) SimpleInsertInnerJoin(ins DB_Insert, sel DB_Join) *sql.Stmt { +func (build *Accumulator) SimpleInsertInnerJoin(ins DB_Insert, sel DB_Join) *sql.Stmt { return build.prepare(build.adapter.SimpleInsertInnerJoin("_builder", ins, sel)) } -func (build *accBuilder) SimpleUpdate(table string, set string, where string) *sql.Stmt { +func (build *Accumulator) SimpleUpdate(table string, set string, where string) *sql.Stmt { return build.prepare(build.adapter.SimpleUpdate("_builder", table, set, where)) } -func (build *accBuilder) SimpleDelete(table string, where string) *sql.Stmt { +func (build *Accumulator) SimpleDelete(table string, where string) *sql.Stmt { return build.prepare(build.adapter.SimpleDelete("_builder", table, where)) } // I don't know why you need this, but here it is x.x -func (build *accBuilder) Purge(table string) *sql.Stmt { +func (build *Accumulator) Purge(table string) *sql.Stmt { return build.prepare(build.adapter.Purge("_builder", table)) } -func (build *accBuilder) prepareTx(tx *sql.Tx, res string, err error) (stmt *sql.Stmt) { +func (build *Accumulator) prepareTx(tx *sql.Tx, res string, err error) (stmt *sql.Stmt) { if err != nil { build.recordError(err) return nil @@ -126,68 +126,68 @@ func (build *accBuilder) prepareTx(tx *sql.Tx, res string, err error) (stmt *sql } // These ones support transactions -func (build *accBuilder) SimpleSelectTx(tx *sql.Tx, table string, columns string, where string, orderby string, limit string) (stmt *sql.Stmt) { +func (build *Accumulator) SimpleSelectTx(tx *sql.Tx, table string, columns string, where string, orderby string, limit string) (stmt *sql.Stmt) { res, err := build.adapter.SimpleSelect("_builder", table, columns, where, orderby, limit) return build.prepareTx(tx, res, err) } -func (build *accBuilder) SimpleCountTx(tx *sql.Tx, table string, where string, limit string) (stmt *sql.Stmt) { +func (build *Accumulator) SimpleCountTx(tx *sql.Tx, table string, where string, limit string) (stmt *sql.Stmt) { res, err := build.adapter.SimpleCount("_builder", table, where, limit) return build.prepareTx(tx, res, err) } -func (build *accBuilder) SimpleLeftJoinTx(tx *sql.Tx, table1 string, table2 string, columns string, joiners string, where string, orderby string, limit string) (stmt *sql.Stmt) { +func (build *Accumulator) SimpleLeftJoinTx(tx *sql.Tx, table1 string, table2 string, columns string, joiners string, where string, orderby string, limit string) (stmt *sql.Stmt) { res, err := build.adapter.SimpleLeftJoin("_builder", table1, table2, columns, joiners, where, orderby, limit) return build.prepareTx(tx, res, err) } -func (build *accBuilder) SimpleInnerJoinTx(tx *sql.Tx, table1 string, table2 string, columns string, joiners string, where string, orderby string, limit string) (stmt *sql.Stmt) { +func (build *Accumulator) SimpleInnerJoinTx(tx *sql.Tx, table1 string, table2 string, columns string, joiners string, where string, orderby string, limit string) (stmt *sql.Stmt) { res, err := build.adapter.SimpleInnerJoin("_builder", table1, table2, columns, joiners, where, orderby, limit) return build.prepareTx(tx, res, err) } -func (build *accBuilder) CreateTableTx(tx *sql.Tx, table string, charset string, collation string, columns []DB_Table_Column, keys []DB_Table_Key) (stmt *sql.Stmt) { +func (build *Accumulator) CreateTableTx(tx *sql.Tx, table string, charset string, collation string, columns []DB_Table_Column, keys []DB_Table_Key) (stmt *sql.Stmt) { res, err := build.adapter.CreateTable("_builder", table, charset, collation, columns, keys) return build.prepareTx(tx, res, err) } -func (build *accBuilder) SimpleInsertTx(tx *sql.Tx, table string, columns string, fields string) (stmt *sql.Stmt) { +func (build *Accumulator) SimpleInsertTx(tx *sql.Tx, table string, columns string, fields string) (stmt *sql.Stmt) { res, err := build.adapter.SimpleInsert("_builder", table, columns, fields) return build.prepareTx(tx, res, err) } -func (build *accBuilder) SimpleInsertSelectTx(tx *sql.Tx, ins DB_Insert, sel DB_Select) (stmt *sql.Stmt) { +func (build *Accumulator) SimpleInsertSelectTx(tx *sql.Tx, ins DB_Insert, sel DB_Select) (stmt *sql.Stmt) { res, err := build.adapter.SimpleInsertSelect("_builder", ins, sel) return build.prepareTx(tx, res, err) } -func (build *accBuilder) SimpleInsertLeftJoinTx(tx *sql.Tx, ins DB_Insert, sel DB_Join) (stmt *sql.Stmt) { +func (build *Accumulator) SimpleInsertLeftJoinTx(tx *sql.Tx, ins DB_Insert, sel DB_Join) (stmt *sql.Stmt) { res, err := build.adapter.SimpleInsertLeftJoin("_builder", ins, sel) return build.prepareTx(tx, res, err) } -func (build *accBuilder) SimpleInsertInnerJoinTx(tx *sql.Tx, ins DB_Insert, sel DB_Join) (stmt *sql.Stmt) { +func (build *Accumulator) SimpleInsertInnerJoinTx(tx *sql.Tx, ins DB_Insert, sel DB_Join) (stmt *sql.Stmt) { res, err := build.adapter.SimpleInsertInnerJoin("_builder", ins, sel) return build.prepareTx(tx, res, err) } -func (build *accBuilder) SimpleUpdateTx(tx *sql.Tx, table string, set string, where string) (stmt *sql.Stmt) { +func (build *Accumulator) SimpleUpdateTx(tx *sql.Tx, table string, set string, where string) (stmt *sql.Stmt) { res, err := build.adapter.SimpleUpdate("_builder", table, set, where) return build.prepareTx(tx, res, err) } -func (build *accBuilder) SimpleDeleteTx(tx *sql.Tx, table string, where string) (stmt *sql.Stmt) { +func (build *Accumulator) SimpleDeleteTx(tx *sql.Tx, table string, where string) (stmt *sql.Stmt) { res, err := build.adapter.SimpleDelete("_builder", table, where) return build.prepareTx(tx, res, err) } // I don't know why you need this, but here it is x.x -func (build *accBuilder) PurgeTx(tx *sql.Tx, table string) (stmt *sql.Stmt) { +func (build *Accumulator) PurgeTx(tx *sql.Tx, table string) (stmt *sql.Stmt) { res, err := build.adapter.Purge("_builder", table) return build.prepareTx(tx, res, err) } -func (build *accBuilder) Delete(table string) *deleteBuilder { +func (build *Accumulator) Delete(table string) *deleteBuilder { return &deleteBuilder{table, "", build} } @@ -195,7 +195,7 @@ type deleteBuilder struct { table string where string - build *accBuilder + build *Accumulator } func (delete *deleteBuilder) Where(where string) *deleteBuilder { @@ -207,7 +207,7 @@ func (delete *deleteBuilder) Prepare() *sql.Stmt { return delete.build.SimpleDelete(delete.table, delete.where) } -func (build *accBuilder) Update(table string) *updateBuilder { +func (build *Accumulator) Update(table string) *updateBuilder { return &updateBuilder{table, "", "", build} } @@ -216,7 +216,7 @@ type updateBuilder struct { set string where string - build *accBuilder + build *Accumulator } func (update *updateBuilder) Set(set string) *updateBuilder { @@ -233,7 +233,7 @@ func (update *updateBuilder) Prepare() *sql.Stmt { return update.build.SimpleUpdate(update.table, update.set, update.where) } -func (build *accBuilder) Select(table string) *selectBuilder { +func (build *Accumulator) Select(table string) *selectBuilder { return &selectBuilder{table, "", "", "", "", build} } @@ -244,7 +244,7 @@ type selectBuilder struct { orderby string limit string - build *accBuilder + build *Accumulator } func (selectItem *selectBuilder) Columns(columns string) *selectBuilder { @@ -276,10 +276,10 @@ func (selectItem *selectBuilder) Query(args ...interface{}) (*sql.Rows, error) { if stmt != nil { return stmt.Query(args...) } - return nil, selectItem.FirstError() + return nil, selectItem.build.FirstError() } -func (build *accBuilder) Insert(table string) *insertBuilder { +func (build *Accumulator) Insert(table string) *insertBuilder { return &insertBuilder{table, "", "", build} } @@ -288,7 +288,7 @@ type insertBuilder struct { columns string fields string - build *accBuilder + build *Accumulator } func (insert *insertBuilder) Columns(columns string) *insertBuilder { @@ -304,3 +304,29 @@ func (insert *insertBuilder) Fields(fields string) *insertBuilder { func (insert *insertBuilder) Prepare() *sql.Stmt { return insert.build.SimpleInsert(insert.table, insert.columns, insert.fields) } + +func (build *Accumulator) Count(table string) *countBuilder { + return &countBuilder{table, "", "", build} +} + +type countBuilder struct { + table string + where string + limit string + + build *Accumulator +} + +func (count *countBuilder) Where(where string) *countBuilder { + count.where = where + return count +} + +func (count *countBuilder) Limit(limit string) *countBuilder { + count.limit = limit + return count +} + +func (count *countBuilder) Prepare() *sql.Stmt { + return count.build.SimpleCount(count.table, count.where, count.limit) +} diff --git a/query_gen/lib/builder.go b/query_gen/lib/builder.go index c504b099..f3c61ef0 100644 --- a/query_gen/lib/builder.go +++ b/query_gen/lib/builder.go @@ -16,8 +16,8 @@ type builder struct { adapter DB_Adapter } -func (build *builder) Accumulator() *accBuilder { - return &accBuilder{build.conn, build.adapter, nil} +func (build *builder) Accumulator() *Accumulator { + return &Accumulator{build.conn, build.adapter, nil} } func (build *builder) SetConn(conn *sql.DB) {