From 2545d4addebd654e3dd079aa696581a3baae26ae Mon Sep 17 00:00:00 2001 From: Azareal Date: Sun, 12 Nov 2017 03:29:05 +0000 Subject: [PATCH] Converted more queries over to the new OO builder syntax. Renamed accBuilder to Accumulator so that it can be used in type hints outside the query generator. The DbInit accumulator is now initialised in the caller rather than the callee. --- common/audit_logs.go | 3 +- common/auth.go | 6 +- common/common.go | 9 ++- common/extend.go | 3 +- common/forum.go | 5 +- common/forum_store.go | 16 ++--- common/group.go | 5 +- common/group_store.go | 6 +- common/profile_reply_store.go | 4 +- common/reply.go | 11 ++-- common/reply_store.go | 4 +- common/setting.go | 3 +- common/tasks.go | 7 +-- common/themes.go | 3 +- common/topic.go | 3 +- common/topic_store.go | 16 ++--- common/user.go | 3 +- common/widgets.go | 3 +- common/word_filters.go | 3 +- config.go | 90 ++++++++++++++-------------- plugin_guilds.go | 16 ++--- query_gen/lib/accumulator.go | 110 +++++++++++++++++++++------------- query_gen/lib/builder.go | 4 +- 23 files changed, 176 insertions(+), 157 deletions(-) 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) {