diff --git a/common/permissions.go b/common/permissions.go index 6b954577..6d9106c1 100644 --- a/common/permissions.go +++ b/common/permissions.go @@ -295,8 +295,8 @@ func PermmapToQuery(permmap map[string]ForumPerms, fid int) error { } addForumPermsToForumAdminsTx, err := qgen.Builder.SimpleInsertSelectTx(tx, - qgen.DB_Insert{"forums_permissions", "gid, fid, preset, permissions", ""}, - qgen.DB_Select{"users_groups", "gid, ? AS fid, ? AS preset, ? AS permissions", "is_admin = 1", "", ""}, + qgen.DBInsert{"forums_permissions", "gid, fid, preset, permissions", ""}, + qgen.DBSelect{"users_groups", "gid, ? AS fid, ? AS preset, ? AS permissions", "is_admin = 1", "", ""}, ) if err != nil { return err @@ -313,8 +313,8 @@ func PermmapToQuery(permmap map[string]ForumPerms, fid int) error { } addForumPermsToForumStaffTx, err := qgen.Builder.SimpleInsertSelectTx(tx, - qgen.DB_Insert{"forums_permissions", "gid, fid, preset, permissions", ""}, - qgen.DB_Select{"users_groups", "gid, ? AS fid, ? AS preset, ? AS permissions", "is_admin = 0 AND is_mod = 1", "", ""}, + qgen.DBInsert{"forums_permissions", "gid, fid, preset, permissions", ""}, + qgen.DBSelect{"users_groups", "gid, ? AS fid, ? AS preset, ? AS permissions", "is_admin = 0 AND is_mod = 1", "", ""}, ) if err != nil { return err @@ -330,8 +330,8 @@ func PermmapToQuery(permmap map[string]ForumPerms, fid int) error { } addForumPermsToForumMembersTx, err := qgen.Builder.SimpleInsertSelectTx(tx, - qgen.DB_Insert{"forums_permissions", "gid, fid, preset, permissions", ""}, - qgen.DB_Select{"users_groups", "gid, ? AS fid, ? AS preset, ? AS permissions", "is_admin = 0 AND is_mod = 0 AND is_banned = 0", "", ""}, + qgen.DBInsert{"forums_permissions", "gid, fid, preset, permissions", ""}, + qgen.DBSelect{"users_groups", "gid, ? AS fid, ? AS preset, ? AS permissions", "is_admin = 0 AND is_mod = 0 AND is_banned = 0", "", ""}, ) if err != nil { return err diff --git a/pgsql.go b/pgsql.go index d1ff62b4..803b32e1 100644 --- a/pgsql.go +++ b/pgsql.go @@ -4,12 +4,14 @@ /* Super experimental and incomplete. DON'T USE IT YET! */ package main -import "strings" +import ( + "database/sql" + "strings" -//import "time" -import "database/sql" -import _ "github.com/lib/pq" -import "./query_gen/lib" + "./common" + "./query_gen/lib" + _ "github.com/lib/pq" +) // TODO: Add support for SSL for all database drivers, not just pgsql var db_sslmode = "disable" // verify-full @@ -23,10 +25,10 @@ func initPgsql() (err error) { // TODO: Investigate connect_timeout to see what it does exactly and whether it's relevant to us var _dbpassword string if dbpassword != "" { - _dbpassword = " password='" + _escape_bit(db_config.Password) + "'" + _dbpassword = " password='" + _escape_bit(common.DbConfig.Password) + "'" } // TODO: Move this bit to the query gen lib - db, err = sql.Open("postgres", "host='"+_escape_bit(db_config.Host)+"' port='"+_escape_bit(db_config.Port)+"' user='"+_escape_bit(db_config.Username)+"' dbname='"+_escape_bit(config.Dbname)+"'"+_dbpassword+" sslmode='"+db_sslmode+"'") + db, err = sql.Open("postgres", "host='"+_escape_bit(common.DbConfig.Host)+"' port='"+_escape_bit(common.DbConfig.Port)+"' user='"+_escape_bit(common.DbConfig.Username)+"' dbname='"+_escape_bit(common.Config.Dbname)+"'"+_dbpassword+" sslmode='"+db_sslmode+"'") if err != nil { return err } diff --git a/plugin_guilds.go b/plugin_guilds.go index 601621cc..876c22ef 100644 --- a/plugin_guilds.go +++ b/plugin_guilds.go @@ -82,23 +82,23 @@ func deactivateGuilds() { // TODO: Stop accessing the query builder directly and add a feature in Gosora which is more easily reversed, if an error comes up during the installation process func installGuilds() error { guildTableStmt, err := qgen.Builder.CreateTable("guilds", "utf8mb4", "utf8mb4_general_ci", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"guildID", "int", 0, false, true, ""}, - qgen.DB_Table_Column{"name", "varchar", 100, false, false, ""}, - qgen.DB_Table_Column{"desc", "varchar", 200, false, false, ""}, - qgen.DB_Table_Column{"active", "boolean", 1, false, false, ""}, - qgen.DB_Table_Column{"privacy", "smallint", 0, false, false, ""}, - qgen.DB_Table_Column{"joinable", "smallint", 0, false, false, "0"}, - qgen.DB_Table_Column{"owner", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"memberCount", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"mainForum", "int", 0, false, false, "0"}, // The board the user lands on when they click on a group, we'll make it possible for group admins to change what users land on - //qgen.DB_Table_Column{"boards","varchar",255,false,false,""}, // Cap the max number of boards at 8 to avoid overflowing the confines of a 64-bit integer? - qgen.DB_Table_Column{"backdrop", "varchar", 200, false, false, ""}, // File extension for the uploaded file, or an external link - qgen.DB_Table_Column{"createdAt", "createdAt", 0, false, false, ""}, - qgen.DB_Table_Column{"lastUpdateTime", "datetime", 0, false, false, ""}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"guildID", "int", 0, false, true, ""}, + qgen.DBTableColumn{"name", "varchar", 100, false, false, ""}, + qgen.DBTableColumn{"desc", "varchar", 200, false, false, ""}, + qgen.DBTableColumn{"active", "boolean", 1, false, false, ""}, + qgen.DBTableColumn{"privacy", "smallint", 0, false, false, ""}, + qgen.DBTableColumn{"joinable", "smallint", 0, false, false, "0"}, + qgen.DBTableColumn{"owner", "int", 0, false, false, ""}, + qgen.DBTableColumn{"memberCount", "int", 0, false, false, ""}, + qgen.DBTableColumn{"mainForum", "int", 0, false, false, "0"}, // The board the user lands on when they click on a group, we'll make it possible for group admins to change what users land on + //qgen.DBTableColumn{"boards","varchar",255,false,false,""}, // Cap the max number of boards at 8 to avoid overflowing the confines of a 64-bit integer? + qgen.DBTableColumn{"backdrop", "varchar", 200, false, false, ""}, // File extension for the uploaded file, or an external link + qgen.DBTableColumn{"createdAt", "createdAt", 0, false, false, ""}, + qgen.DBTableColumn{"lastUpdateTime", "datetime", 0, false, false, ""}, }, - []qgen.DB_Table_Key{ - qgen.DB_Table_Key{"guildID", "primary"}, + []qgen.DBTableKey{ + qgen.DBTableKey{"guildID", "primary"}, }, ) if err != nil { @@ -111,14 +111,14 @@ func installGuilds() error { } guildMembersTableStmt, err := qgen.Builder.CreateTable("guilds_members", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"guildID", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"uid", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"rank", "int", 0, false, false, "0"}, /* 0: Member. 1: Mod. 2: Admin. */ - qgen.DB_Table_Column{"posts", "int", 0, false, false, "0"}, /* Per-Group post count. Should we do some sort of score system? */ - qgen.DB_Table_Column{"joinedAt", "datetime", 0, false, false, ""}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"guildID", "int", 0, false, false, ""}, + qgen.DBTableColumn{"uid", "int", 0, false, false, ""}, + qgen.DBTableColumn{"rank", "int", 0, false, false, "0"}, /* 0: Member. 1: Mod. 2: Admin. */ + qgen.DBTableColumn{"posts", "int", 0, false, false, "0"}, /* Per-Group post count. Should we do some sort of score system? */ + qgen.DBTableColumn{"joinedAt", "datetime", 0, false, false, ""}, }, - []qgen.DB_Table_Key{}, + []qgen.DBTableKey{}, ) if err != nil { return err diff --git a/query_gen/lib/acc_builders.go b/query_gen/lib/acc_builders.go new file mode 100644 index 00000000..1a4d8df6 --- /dev/null +++ b/query_gen/lib/acc_builders.go @@ -0,0 +1,127 @@ +package qgen + +import "database/sql" + +type accDeleteBuilder struct { + table string + where string + + build *Accumulator +} + +func (delete *accDeleteBuilder) Where(where string) *accDeleteBuilder { + delete.where = where + return delete +} + +func (delete *accDeleteBuilder) Prepare() *sql.Stmt { + return delete.build.SimpleDelete(delete.table, delete.where) +} + +type accUpdateBuilder struct { + table string + set string + where string + + build *Accumulator +} + +func (update *accUpdateBuilder) Set(set string) *accUpdateBuilder { + update.set = set + return update +} + +func (update *accUpdateBuilder) Where(where string) *accUpdateBuilder { + update.where = where + return update +} + +func (update *accUpdateBuilder) Prepare() *sql.Stmt { + return update.build.SimpleUpdate(update.table, update.set, update.where) +} + +type accSelectBuilder struct { + table string + columns string + where string + orderby string + limit string + + build *Accumulator +} + +func (selectItem *accSelectBuilder) Columns(columns string) *accSelectBuilder { + selectItem.columns = columns + return selectItem +} + +func (selectItem *accSelectBuilder) Where(where string) *accSelectBuilder { + selectItem.where = where + return selectItem +} + +func (selectItem *accSelectBuilder) Orderby(orderby string) *accSelectBuilder { + selectItem.orderby = orderby + return selectItem +} + +func (selectItem *accSelectBuilder) Limit(limit string) *accSelectBuilder { + selectItem.limit = limit + return selectItem +} + +func (selectItem *accSelectBuilder) Prepare() *sql.Stmt { + return selectItem.build.SimpleSelect(selectItem.table, selectItem.columns, selectItem.where, selectItem.orderby, selectItem.limit) +} + +func (selectItem *accSelectBuilder) Query(args ...interface{}) (*sql.Rows, error) { + stmt := selectItem.Prepare() + if stmt != nil { + return stmt.Query(args...) + } + return nil, selectItem.build.FirstError() +} + +type accInsertBuilder struct { + table string + columns string + fields string + + build *Accumulator +} + +func (insert *accInsertBuilder) Columns(columns string) *accInsertBuilder { + insert.columns = columns + return insert +} + +func (insert *accInsertBuilder) Fields(fields string) *accInsertBuilder { + insert.fields = fields + return insert +} + +func (insert *accInsertBuilder) Prepare() *sql.Stmt { + return insert.build.SimpleInsert(insert.table, insert.columns, insert.fields) +} + +type accCountBuilder struct { + table string + where string + limit string + + build *Accumulator +} + +func (count *accCountBuilder) Where(where string) *accCountBuilder { + count.where = where + return count +} + +func (count *accCountBuilder) Limit(limit string) *accCountBuilder { + count.limit = limit + return count +} + +func (count *accCountBuilder) Prepare() *sql.Stmt { + return count.build.SimpleCount(count.table, count.where, count.limit) +} diff --git a/query_gen/lib/accumulator.go b/query_gen/lib/accumulator.go index 7a0f0193..23b18b73 100644 --- a/query_gen/lib/accumulator.go +++ b/query_gen/lib/accumulator.go @@ -7,7 +7,7 @@ import ( type Accumulator struct { conn *sql.DB - adapter DB_Adapter + adapter Adapter firstErr error } @@ -24,7 +24,7 @@ func (build *Accumulator) SetAdapter(name string) error { return nil } -func (build *Accumulator) GetAdapter() DB_Adapter { +func (build *Accumulator) GetAdapter() Adapter { return build.adapter } @@ -82,7 +82,7 @@ func (build *Accumulator) SimpleInnerJoin(table1 string, table2 string, columns return build.prepare(build.adapter.SimpleInnerJoin("_builder", table1, table2, columns, joiners, where, orderby, limit)) } -func (build *Accumulator) 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 []DBTableColumn, keys []DBTableKey) *sql.Stmt { return build.prepare(build.adapter.CreateTable("_builder", table, charset, collation, columns, keys)) } @@ -90,15 +90,15 @@ func (build *Accumulator) SimpleInsert(table string, columns string, fields stri return build.prepare(build.adapter.SimpleInsert("_builder", table, columns, fields)) } -func (build *Accumulator) SimpleInsertSelect(ins DB_Insert, sel DB_Select) *sql.Stmt { +func (build *Accumulator) SimpleInsertSelect(ins DBInsert, sel DBSelect) *sql.Stmt { return build.prepare(build.adapter.SimpleInsertSelect("_builder", ins, sel)) } -func (build *Accumulator) SimpleInsertLeftJoin(ins DB_Insert, sel DB_Join) *sql.Stmt { +func (build *Accumulator) SimpleInsertLeftJoin(ins DBInsert, sel DBJoin) *sql.Stmt { return build.prepare(build.adapter.SimpleInsertLeftJoin("_builder", ins, sel)) } -func (build *Accumulator) SimpleInsertInnerJoin(ins DB_Insert, sel DB_Join) *sql.Stmt { +func (build *Accumulator) SimpleInsertInnerJoin(ins DBInsert, sel DBJoin) *sql.Stmt { return build.prepare(build.adapter.SimpleInsertInnerJoin("_builder", ins, sel)) } @@ -146,7 +146,7 @@ func (build *Accumulator) SimpleInnerJoinTx(tx *sql.Tx, table1 string, table2 st return build.prepareTx(tx, res, err) } -func (build *Accumulator) 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 []DBTableColumn, keys []DBTableKey) (stmt *sql.Stmt) { res, err := build.adapter.CreateTable("_builder", table, charset, collation, columns, keys) return build.prepareTx(tx, res, err) } @@ -156,17 +156,17 @@ func (build *Accumulator) SimpleInsertTx(tx *sql.Tx, table string, columns strin return build.prepareTx(tx, res, err) } -func (build *Accumulator) SimpleInsertSelectTx(tx *sql.Tx, ins DB_Insert, sel DB_Select) (stmt *sql.Stmt) { +func (build *Accumulator) SimpleInsertSelectTx(tx *sql.Tx, ins DBInsert, sel DBSelect) (stmt *sql.Stmt) { res, err := build.adapter.SimpleInsertSelect("_builder", ins, sel) return build.prepareTx(tx, res, err) } -func (build *Accumulator) SimpleInsertLeftJoinTx(tx *sql.Tx, ins DB_Insert, sel DB_Join) (stmt *sql.Stmt) { +func (build *Accumulator) SimpleInsertLeftJoinTx(tx *sql.Tx, ins DBInsert, sel DBJoin) (stmt *sql.Stmt) { res, err := build.adapter.SimpleInsertLeftJoin("_builder", ins, sel) return build.prepareTx(tx, res, err) } -func (build *Accumulator) SimpleInsertInnerJoinTx(tx *sql.Tx, ins DB_Insert, sel DB_Join) (stmt *sql.Stmt) { +func (build *Accumulator) SimpleInsertInnerJoinTx(tx *sql.Tx, ins DBInsert, sel DBJoin) (stmt *sql.Stmt) { res, err := build.adapter.SimpleInsertInnerJoin("_builder", ins, sel) return build.prepareTx(tx, res, err) } @@ -187,146 +187,22 @@ func (build *Accumulator) PurgeTx(tx *sql.Tx, table string) (stmt *sql.Stmt) { return build.prepareTx(tx, res, err) } -func (build *Accumulator) Delete(table string) *deleteBuilder { - return &deleteBuilder{table, "", build} +func (build *Accumulator) Delete(table string) *accDeleteBuilder { + return &accDeleteBuilder{table, "", build} } -type deleteBuilder struct { - table string - where string - - build *Accumulator +func (build *Accumulator) Update(table string) *accUpdateBuilder { + return &accUpdateBuilder{table, "", "", build} } -func (delete *deleteBuilder) Where(where string) *deleteBuilder { - delete.where = where - return delete +func (build *Accumulator) Select(table string) *accSelectBuilder { + return &accSelectBuilder{table, "", "", "", "", build} } -func (delete *deleteBuilder) Prepare() *sql.Stmt { - return delete.build.SimpleDelete(delete.table, delete.where) +func (build *Accumulator) Insert(table string) *accInsertBuilder { + return &accInsertBuilder{table, "", "", build} } -func (build *Accumulator) Update(table string) *updateBuilder { - return &updateBuilder{table, "", "", build} -} - -type updateBuilder struct { - table string - set string - where string - - build *Accumulator -} - -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 *Accumulator) Select(table string) *selectBuilder { - return &selectBuilder{table, "", "", "", "", build} -} - -type selectBuilder struct { - table string - columns string - where string - orderby string - limit string - - build *Accumulator -} - -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 (selectItem *selectBuilder) Query(args ...interface{}) (*sql.Rows, error) { - stmt := selectItem.Prepare() - if stmt != nil { - return stmt.Query(args...) - } - return nil, selectItem.build.FirstError() -} - -func (build *Accumulator) Insert(table string) *insertBuilder { - return &insertBuilder{table, "", "", build} -} - -type insertBuilder struct { - table string - columns string - fields string - - build *Accumulator -} - -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) -} - -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) +func (build *Accumulator) Count(table string) *accCountBuilder { + return &accCountBuilder{table, "", "", build} } diff --git a/query_gen/lib/builder.go b/query_gen/lib/builder.go index f3c61ef0..e664c712 100644 --- a/query_gen/lib/builder.go +++ b/query_gen/lib/builder.go @@ -13,7 +13,7 @@ func init() { // A set of wrappers around the generator methods, so that we can use this inline in Gosora type builder struct { conn *sql.DB - adapter DB_Adapter + adapter Adapter } func (build *builder) Accumulator() *Accumulator { @@ -33,7 +33,7 @@ func (build *builder) SetAdapter(name string) error { return nil } -func (build *builder) GetAdapter() DB_Adapter { +func (build *builder) GetAdapter() Adapter { return build.adapter } @@ -77,7 +77,7 @@ func (build *builder) SimpleInnerJoin(table1 string, table2 string, columns stri return build.prepare(build.adapter.SimpleInnerJoin("_builder", table1, table2, columns, joiners, where, orderby, limit)) } -func (build *builder) CreateTable(table string, charset string, collation string, columns []DB_Table_Column, keys []DB_Table_Key) (stmt *sql.Stmt, err error) { +func (build *builder) CreateTable(table string, charset string, collation string, columns []DBTableColumn, keys []DBTableKey) (stmt *sql.Stmt, err error) { return build.prepare(build.adapter.CreateTable("_builder", table, charset, collation, columns, keys)) } @@ -85,15 +85,15 @@ func (build *builder) SimpleInsert(table string, columns string, fields string) return build.prepare(build.adapter.SimpleInsert("_builder", table, columns, fields)) } -func (build *builder) SimpleInsertSelect(ins DB_Insert, sel DB_Select) (stmt *sql.Stmt, err error) { +func (build *builder) SimpleInsertSelect(ins DBInsert, sel DBSelect) (stmt *sql.Stmt, err error) { return build.prepare(build.adapter.SimpleInsertSelect("_builder", ins, sel)) } -func (build *builder) SimpleInsertLeftJoin(ins DB_Insert, sel DB_Join) (stmt *sql.Stmt, err error) { +func (build *builder) SimpleInsertLeftJoin(ins DBInsert, sel DBJoin) (stmt *sql.Stmt, err error) { return build.prepare(build.adapter.SimpleInsertLeftJoin("_builder", ins, sel)) } -func (build *builder) SimpleInsertInnerJoin(ins DB_Insert, sel DB_Join) (stmt *sql.Stmt, err error) { +func (build *builder) SimpleInsertInnerJoin(ins DBInsert, sel DBJoin) (stmt *sql.Stmt, err error) { return build.prepare(build.adapter.SimpleInsertInnerJoin("_builder", ins, sel)) } @@ -143,7 +143,7 @@ func (build *builder) SimpleInnerJoinTx(tx *sql.Tx, table1 string, table2 string return tx.Prepare(res) } -func (build *builder) CreateTableTx(tx *sql.Tx, table string, charset string, collation string, columns []DB_Table_Column, keys []DB_Table_Key) (stmt *sql.Stmt, err error) { +func (build *builder) CreateTableTx(tx *sql.Tx, table string, charset string, collation string, columns []DBTableColumn, keys []DBTableKey) (stmt *sql.Stmt, err error) { res, err := build.adapter.CreateTable("_builder", table, charset, collation, columns, keys) if err != nil { return stmt, err @@ -159,7 +159,7 @@ func (build *builder) SimpleInsertTx(tx *sql.Tx, table string, columns string, f return tx.Prepare(res) } -func (build *builder) SimpleInsertSelectTx(tx *sql.Tx, ins DB_Insert, sel DB_Select) (stmt *sql.Stmt, err error) { +func (build *builder) SimpleInsertSelectTx(tx *sql.Tx, ins DBInsert, sel DBSelect) (stmt *sql.Stmt, err error) { res, err := build.adapter.SimpleInsertSelect("_builder", ins, sel) if err != nil { return stmt, err @@ -167,7 +167,7 @@ func (build *builder) SimpleInsertSelectTx(tx *sql.Tx, ins DB_Insert, sel DB_Sel return tx.Prepare(res) } -func (build *builder) SimpleInsertLeftJoinTx(tx *sql.Tx, ins DB_Insert, sel DB_Join) (stmt *sql.Stmt, err error) { +func (build *builder) SimpleInsertLeftJoinTx(tx *sql.Tx, ins DBInsert, sel DBJoin) (stmt *sql.Stmt, err error) { res, err := build.adapter.SimpleInsertLeftJoin("_builder", ins, sel) if err != nil { return stmt, err @@ -175,7 +175,7 @@ func (build *builder) SimpleInsertLeftJoinTx(tx *sql.Tx, ins DB_Insert, sel DB_J return tx.Prepare(res) } -func (build *builder) SimpleInsertInnerJoinTx(tx *sql.Tx, ins DB_Insert, sel DB_Join) (stmt *sql.Stmt, err error) { +func (build *builder) SimpleInsertInnerJoinTx(tx *sql.Tx, ins DBInsert, sel DBJoin) (stmt *sql.Stmt, err error) { res, err := build.adapter.SimpleInsertInnerJoin("_builder", ins, sel) if err != nil { return stmt, err diff --git a/query_gen/lib/install.go b/query_gen/lib/install.go index 1bc39c91..99aa5b49 100644 --- a/query_gen/lib/install.go +++ b/query_gen/lib/install.go @@ -16,7 +16,7 @@ type DB_Install_Instruction struct { // A set of wrappers around the generator methods, so we can use this in the installer // TODO: Re-implement the query generation, query builder and installer adapters as layers on-top of a query text adapter type installer struct { - adapter DB_Adapter + adapter Adapter instructions []DB_Install_Instruction plugins []QueryPlugin } @@ -31,7 +31,7 @@ func (install *installer) SetAdapter(name string) error { return nil } -func (install *installer) SetAdapterInstance(adapter DB_Adapter) { +func (install *installer) SetAdapterInstance(adapter Adapter) { install.adapter = adapter install.instructions = []DB_Install_Instruction{} } @@ -40,7 +40,7 @@ func (install *installer) RegisterPlugin(plugin QueryPlugin) { install.plugins = append(install.plugins, plugin) } -func (install *installer) CreateTable(table string, charset string, collation string, columns []DB_Table_Column, keys []DB_Table_Key) error { +func (install *installer) CreateTable(table string, charset string, collation string, columns []DBTableColumn, keys []DBTableKey) error { for _, plugin := range install.plugins { err := plugin.Hook("CreateTableStart", table, charset, collation, columns, keys) if err != nil { diff --git a/query_gen/lib/micro_builders.go b/query_gen/lib/micro_builders.go new file mode 100644 index 00000000..630d06c1 --- /dev/null +++ b/query_gen/lib/micro_builders.go @@ -0,0 +1,174 @@ +package qgen + +type deletePrebuilder struct { + name string + table string + where string + + build Adapter +} + +func (delete *deletePrebuilder) Table(table string) *deletePrebuilder { + delete.table = table + return delete +} + +func (delete *deletePrebuilder) Where(where string) *deletePrebuilder { + delete.where = where + return delete +} + +func (delete *deletePrebuilder) Text() (string, error) { + return delete.build.SimpleDelete(delete.name, delete.table, delete.where) +} + +func (delete *deletePrebuilder) Parse() { + delete.build.SimpleDelete(delete.name, delete.table, delete.where) +} + +type updatePrebuilder struct { + name string + table string + set string + where string + + build Adapter +} + +func (update *updatePrebuilder) Table(table string) *updatePrebuilder { + update.table = table + return update +} + +func (update *updatePrebuilder) Set(set string) *updatePrebuilder { + update.set = set + return update +} + +func (update *updatePrebuilder) Where(where string) *updatePrebuilder { + update.where = where + return update +} + +func (update *updatePrebuilder) Text() (string, error) { + return update.build.SimpleUpdate(update.name, update.table, update.set, update.where) +} + +func (update *updatePrebuilder) Parse() { + update.build.SimpleUpdate(update.name, update.table, update.set, update.where) +} + +type selectPrebuilder struct { + name string + table string + columns string + where string + orderby string + limit string + + build Adapter +} + +func (selectItem *selectPrebuilder) Table(table string) *selectPrebuilder { + selectItem.table = table + return selectItem +} + +func (selectItem *selectPrebuilder) Columns(columns string) *selectPrebuilder { + selectItem.columns = columns + return selectItem +} + +func (selectItem *selectPrebuilder) Where(where string) *selectPrebuilder { + selectItem.where = where + return selectItem +} + +func (selectItem *selectPrebuilder) Orderby(orderby string) *selectPrebuilder { + selectItem.orderby = orderby + return selectItem +} + +func (selectItem *selectPrebuilder) Limit(limit string) *selectPrebuilder { + selectItem.limit = limit + return selectItem +} + +func (selectItem *selectPrebuilder) Text() (string, error) { + return selectItem.build.SimpleSelect(selectItem.name, selectItem.table, selectItem.columns, selectItem.where, selectItem.orderby, selectItem.limit) +} + +func (selectItem *selectPrebuilder) Parse() { + selectItem.build.SimpleSelect(selectItem.name, selectItem.table, selectItem.columns, selectItem.where, selectItem.orderby, selectItem.limit) +} + +type insertPrebuilder struct { + name string + table string + columns string + fields string + + build Adapter +} + +func (insert *insertPrebuilder) Table(table string) *insertPrebuilder { + insert.table = table + return insert +} + +func (insert *insertPrebuilder) Columns(columns string) *insertPrebuilder { + insert.columns = columns + return insert +} + +func (insert *insertPrebuilder) Fields(fields string) *insertPrebuilder { + insert.fields = fields + return insert +} + +func (insert *insertPrebuilder) Text() (string, error) { + return insert.build.SimpleInsert(insert.name, insert.table, insert.columns, insert.fields) +} + +func (insert *insertPrebuilder) Parse() { + insert.build.SimpleInsert(insert.name, insert.table, insert.columns, insert.fields) +} + +type countPrebuilder struct { + name string + table string + where string + limit string + + build Adapter +} + +func (count *countPrebuilder) Table(table string) *countPrebuilder { + count.table = table + return count +} + +func (count *countPrebuilder) Where(where string) *countPrebuilder { + count.where = where + return count +} + +func (count *countPrebuilder) Limit(limit string) *countPrebuilder { + count.limit = limit + return count +} + +func (count *countPrebuilder) Text() (string, error) { + return count.build.SimpleCount(count.name, count.table, count.where, count.limit) +} + +func (count *countPrebuilder) Parse() { + count.build.SimpleCount(count.name, count.table, count.where, count.limit) +} + +func optString(nlist []string, defaultStr string) string { + if len(nlist) == 0 { + return defaultStr + } + return nlist[0] +} diff --git a/query_gen/lib/mssql.go b/query_gen/lib/mssql.go index bcce8f6c..c321cbae 100644 --- a/query_gen/lib/mssql.go +++ b/query_gen/lib/mssql.go @@ -9,14 +9,14 @@ import ( ) func init() { - DB_Registry = append(DB_Registry, - &MssqlAdapter{Name: "mssql", Buffer: make(map[string]DB_Stmt)}, + Registry = append(Registry, + &MssqlAdapter{Name: "mssql", Buffer: make(map[string]DBStmt)}, ) } type MssqlAdapter struct { Name string // ? - Do we really need this? Can't we hard-code this? - Buffer map[string]DB_Stmt + Buffer map[string]DBStmt BufferOrder []string // Map iteration order is random, so we need this to track the order, so we don't get huge diffs every commit keys map[string]string } @@ -26,17 +26,17 @@ func (adapter *MssqlAdapter) GetName() string { return adapter.Name } -func (adapter *MssqlAdapter) GetStmt(name string) DB_Stmt { +func (adapter *MssqlAdapter) GetStmt(name string) DBStmt { return adapter.Buffer[name] } -func (adapter *MssqlAdapter) GetStmts() map[string]DB_Stmt { +func (adapter *MssqlAdapter) GetStmts() map[string]DBStmt { return adapter.Buffer } // TODO: Convert any remaining stringy types to nvarchar // We may need to change the CreateTable API to better suit Mssql and the other database drivers which are coming up -func (adapter *MssqlAdapter) CreateTable(name string, table string, charset string, collation string, columns []DB_Table_Column, keys []DB_Table_Key) (string, error) { +func (adapter *MssqlAdapter) CreateTable(name string, table string, charset string, collation string, columns []DBTableColumn, keys []DBTableKey) (string, error) { if name == "" { return "", errors.New("You need a name for this statement") } @@ -89,7 +89,7 @@ func (adapter *MssqlAdapter) CreateTable(name string, table string, charset stri } // ! Not exactly the meaning of auto increment... - if column.Auto_Increment { + if column.AutoIncrement { end += " IDENTITY" } @@ -770,7 +770,7 @@ func (adapter *MssqlAdapter) SimpleInnerJoin(name string, table1 string, table2 return querystr, nil } -func (adapter *MssqlAdapter) SimpleInsertSelect(name string, ins DB_Insert, sel DB_Select) (string, error) { +func (adapter *MssqlAdapter) SimpleInsertSelect(name string, ins DBInsert, sel DBSelect) (string, error) { // TODO: More errors. // TODO: Add this to the MySQL adapter in order to make this problem more discoverable? if len(sel.Orderby) == 0 && sel.Limit != "" { @@ -885,7 +885,7 @@ func (adapter *MssqlAdapter) SimpleInsertSelect(name string, ins DB_Insert, sel return querystr, nil } -func (adapter *MssqlAdapter) simpleJoin(name string, ins DB_Insert, sel DB_Join, joinType string) (string, error) { +func (adapter *MssqlAdapter) simpleJoin(name string, ins DBInsert, sel DBJoin, joinType string) (string, error) { // TODO: More errors. // TODO: Add this to the MySQL adapter in order to make this problem more discoverable? if len(sel.Orderby) == 0 && sel.Limit != "" { @@ -1015,11 +1015,11 @@ func (adapter *MssqlAdapter) simpleJoin(name string, ins DB_Insert, sel DB_Join, return querystr, nil } -func (adapter *MssqlAdapter) SimpleInsertLeftJoin(name string, ins DB_Insert, sel DB_Join) (string, error) { +func (adapter *MssqlAdapter) SimpleInsertLeftJoin(name string, ins DBInsert, sel DBJoin) (string, error) { return adapter.simpleJoin(name, ins, sel, "LEFT") } -func (adapter *MssqlAdapter) SimpleInsertInnerJoin(name string, ins DB_Insert, sel DB_Join) (string, error) { +func (adapter *MssqlAdapter) SimpleInsertInnerJoin(name string, ins DBInsert, sel DBJoin) (string, error) { return adapter.simpleJoin(name, ins, sel, "INNER") } @@ -1036,9 +1036,6 @@ func (adapter *MssqlAdapter) SimpleCount(name string, table string, where string // TODO: Add support for BETWEEN x.x if len(where) != 0 { querystr += " WHERE" - //fmt.Println("SimpleCount:",name) - //fmt.Println("where:",where) - //fmt.Println("processWhere:",processWhere(where)) for _, loc := range processWhere(where) { for _, token := range loc.Expr { switch token.Type { @@ -1069,6 +1066,11 @@ func (adapter *MssqlAdapter) SimpleCount(name string, table string, where string return querystr, nil } +func (adapter *MssqlAdapter) Select(nlist ...string) *selectPrebuilder { + name := optString(nlist, "_builder") + return &selectPrebuilder{name, "", "", "", "", "", adapter} +} + func (adapter *MssqlAdapter) Write() error { var stmts, body string for _, name := range adapter.BufferOrder { @@ -1130,7 +1132,7 @@ func _gen_mssql() (err error) { // Internal methods, not exposed in the interface func (adapter *MssqlAdapter) pushStatement(name string, stype string, querystr string) { - adapter.Buffer[name] = DB_Stmt{querystr, stype} + adapter.Buffer[name] = DBStmt{querystr, stype} adapter.BufferOrder = append(adapter.BufferOrder, name) } diff --git a/query_gen/lib/mysql.go b/query_gen/lib/mysql.go index 37fd6e8c..1d935f34 100644 --- a/query_gen/lib/mysql.go +++ b/query_gen/lib/mysql.go @@ -7,14 +7,14 @@ import "strconv" import "errors" func init() { - DB_Registry = append(DB_Registry, - &MysqlAdapter{Name: "mysql", Buffer: make(map[string]DB_Stmt)}, + Registry = append(Registry, + &MysqlAdapter{Name: "mysql", Buffer: make(map[string]DBStmt)}, ) } type MysqlAdapter struct { Name string // ? - Do we really need this? Can't we hard-code this? - Buffer map[string]DB_Stmt + Buffer map[string]DBStmt BufferOrder []string // Map iteration order is random, so we need this to track the order, so we don't get huge diffs every commit } @@ -23,15 +23,15 @@ func (adapter *MysqlAdapter) GetName() string { return adapter.Name } -func (adapter *MysqlAdapter) GetStmt(name string) DB_Stmt { +func (adapter *MysqlAdapter) GetStmt(name string) DBStmt { return adapter.Buffer[name] } -func (adapter *MysqlAdapter) GetStmts() map[string]DB_Stmt { +func (adapter *MysqlAdapter) GetStmts() map[string]DBStmt { return adapter.Buffer } -func (adapter *MysqlAdapter) CreateTable(name string, table string, charset string, collation string, columns []DB_Table_Column, keys []DB_Table_Key) (string, error) { +func (adapter *MysqlAdapter) CreateTable(name string, table string, charset string, collation string, columns []DBTableColumn, keys []DBTableKey) (string, error) { if name == "" { return "", errors.New("You need a name for this statement") } @@ -71,7 +71,7 @@ func (adapter *MysqlAdapter) CreateTable(name string, table string, charset stri end += " not null" } - if column.Auto_Increment { + if column.AutoIncrement { end += " AUTO_INCREMENT" } @@ -430,7 +430,7 @@ func (adapter *MysqlAdapter) SimpleInnerJoin(name string, table1 string, table2 return querystr, nil } -func (adapter *MysqlAdapter) SimpleInsertSelect(name string, ins DB_Insert, sel DB_Select) (string, error) { +func (adapter *MysqlAdapter) SimpleInsertSelect(name string, ins DBInsert, sel DBSelect) (string, error) { whereStr, err := adapter.buildWhere(sel.Where) if err != nil { return "", err @@ -443,7 +443,7 @@ func (adapter *MysqlAdapter) SimpleInsertSelect(name string, ins DB_Insert, sel return querystr, nil } -func (adapter *MysqlAdapter) SimpleInsertLeftJoin(name string, ins DB_Insert, sel DB_Join) (string, error) { +func (adapter *MysqlAdapter) SimpleInsertLeftJoin(name string, ins DBInsert, sel DBJoin) (string, error) { whereStr, err := adapter.buildJoinWhere(sel.Where) if err != nil { return "", err @@ -520,7 +520,7 @@ func (adapter *MysqlAdapter) buildJoinColumns(columns string) (querystr string) return querystr[0 : len(querystr)-1] } -func (adapter *MysqlAdapter) SimpleInsertInnerJoin(name string, ins DB_Insert, sel DB_Join) (string, error) { +func (adapter *MysqlAdapter) SimpleInsertInnerJoin(name string, ins DBInsert, sel DBJoin) (string, error) { whereStr, err := adapter.buildJoinWhere(sel.Where) if err != nil { return "", err @@ -552,6 +552,11 @@ func (adapter *MysqlAdapter) SimpleCount(name string, table string, where string return querystr, nil } +func (adapter *MysqlAdapter) Select(nlist ...string) *selectPrebuilder { + name := optString(nlist, "_builder") + return &selectPrebuilder{name, "", "", "", "", "", adapter} +} + func (adapter *MysqlAdapter) Write() error { var stmts, body string for _, name := range adapter.BufferOrder { @@ -623,7 +628,7 @@ func _gen_mysql() (err error) { // Internal methods, not exposed in the interface func (adapter *MysqlAdapter) pushStatement(name string, stype string, querystr string) { - adapter.Buffer[name] = DB_Stmt{querystr, stype} + adapter.Buffer[name] = DBStmt{querystr, stype} adapter.BufferOrder = append(adapter.BufferOrder, name) } diff --git a/query_gen/lib/pgsql.go b/query_gen/lib/pgsql.go index 437dcacf..0c3716a1 100644 --- a/query_gen/lib/pgsql.go +++ b/query_gen/lib/pgsql.go @@ -6,14 +6,14 @@ import "strconv" import "errors" func init() { - DB_Registry = append(DB_Registry, - &PgsqlAdapter{Name: "pgsql", Buffer: make(map[string]DB_Stmt)}, + Registry = append(Registry, + &PgsqlAdapter{Name: "pgsql", Buffer: make(map[string]DBStmt)}, ) } type PgsqlAdapter struct { Name string // ? - Do we really need this? Can't we hard-code this? - Buffer map[string]DB_Stmt + Buffer map[string]DBStmt BufferOrder []string // Map iteration order is random, so we need this to track the order, so we don't get huge diffs every commit } @@ -22,17 +22,17 @@ func (adapter *PgsqlAdapter) GetName() string { return adapter.Name } -func (adapter *PgsqlAdapter) GetStmt(name string) DB_Stmt { +func (adapter *PgsqlAdapter) GetStmt(name string) DBStmt { return adapter.Buffer[name] } -func (adapter *PgsqlAdapter) GetStmts() map[string]DB_Stmt { +func (adapter *PgsqlAdapter) GetStmts() map[string]DBStmt { return adapter.Buffer } // TODO: Implement this // We may need to change the CreateTable API to better suit PGSQL and the other database drivers which are coming up -func (adapter *PgsqlAdapter) CreateTable(name string, table string, charset string, collation string, columns []DB_Table_Column, keys []DB_Table_Key) (string, error) { +func (adapter *PgsqlAdapter) CreateTable(name string, table string, charset string, collation string, columns []DBTableColumn, keys []DBTableKey) (string, error) { if name == "" { return "", errors.New("You need a name for this statement") } @@ -45,7 +45,7 @@ func (adapter *PgsqlAdapter) CreateTable(name string, table string, charset stri var querystr = "CREATE TABLE `" + table + "` (" for _, column := range columns { - if column.Auto_Increment { + if column.AutoIncrement { column.Type = "serial" } else if column.Type == "createdAt" { column.Type = "timestamp" @@ -293,17 +293,17 @@ func (adapter *PgsqlAdapter) SimpleInnerJoin(name string, table1 string, table2 } // TODO: Implement this -func (adapter *PgsqlAdapter) SimpleInsertSelect(name string, ins DB_Insert, sel DB_Select) (string, error) { +func (adapter *PgsqlAdapter) SimpleInsertSelect(name string, ins DBInsert, sel DBSelect) (string, error) { return "", nil } // TODO: Implement this -func (adapter *PgsqlAdapter) SimpleInsertLeftJoin(name string, ins DB_Insert, sel DB_Join) (string, error) { +func (adapter *PgsqlAdapter) SimpleInsertLeftJoin(name string, ins DBInsert, sel DBJoin) (string, error) { return "", nil } // TODO: Implement this -func (adapter *PgsqlAdapter) SimpleInsertInnerJoin(name string, ins DB_Insert, sel DB_Join) (string, error) { +func (adapter *PgsqlAdapter) SimpleInsertInnerJoin(name string, ins DBInsert, sel DBJoin) (string, error) { return "", nil } @@ -318,6 +318,11 @@ func (adapter *PgsqlAdapter) SimpleCount(name string, table string, where string return "", nil } +func (adapter *PgsqlAdapter) Select(nlist ...string) *selectPrebuilder { + name := optString(nlist, "_builder") + return &selectPrebuilder{name, "", "", "", "", "", adapter} +} + func (adapter *PgsqlAdapter) Write() error { var stmts, body string for _, name := range adapter.BufferOrder { @@ -378,7 +383,7 @@ func _gen_pgsql() (err error) { // Internal methods, not exposed in the interface func (adapter *PgsqlAdapter) pushStatement(name string, stype string, querystr string) { - adapter.Buffer[name] = DB_Stmt{querystr, stype} + adapter.Buffer[name] = DBStmt{querystr, stype} adapter.BufferOrder = append(adapter.BufferOrder, name) } diff --git a/query_gen/lib/querygen.go b/query_gen/lib/querygen.go index cb72659f..dfb021c4 100644 --- a/query_gen/lib/querygen.go +++ b/query_gen/lib/querygen.go @@ -6,24 +6,24 @@ import ( "errors" ) -var DB_Registry []DB_Adapter +var Registry []Adapter var ErrNoAdapter = errors.New("This adapter doesn't exist") -type DB_Table_Column struct { - Name string - Type string - Size int - Null bool - Auto_Increment bool - Default string +type DBTableColumn struct { + Name string + Type string + Size int + Null bool + AutoIncrement bool + Default string } -type DB_Table_Key struct { +type DBTableKey struct { Columns string Type string } -type DB_Select struct { +type DBSelect struct { Table string Columns string Where string @@ -31,7 +31,7 @@ type DB_Select struct { Limit string } -type DB_Join struct { +type DBJoin struct { Table1 string Table2 string Columns string @@ -41,29 +41,29 @@ type DB_Join struct { Limit string } -type DB_Insert struct { +type DBInsert struct { Table string Columns string Fields string } -type DB_Column struct { +type DBColumn struct { Table string Left string // Could be a function or a column, so I'm naming this Left Alias string // aka AS Blah, if it's present Type string // function or column } -type DB_Field struct { +type DBField struct { Name string Type string } -type DB_Where struct { - Expr []DB_Token // Simple expressions, the innards of functions are opaque for now. +type DBWhere struct { + Expr []DBToken // Simple expressions, the innards of functions are opaque for now. } -type DB_Joiner struct { +type DBJoiner struct { LeftTable string LeftColumn string RightTable string @@ -71,34 +71,34 @@ type DB_Joiner struct { Operator string } -type DB_Order struct { +type DBOrder struct { Column string Order string } -type DB_Token struct { +type DBToken struct { Contents string Type string // function, operator, column, number, string, substitute } -type DB_Setter struct { +type DBSetter struct { Column string - Expr []DB_Token // Simple expressions, the innards of functions are opaque for now. + Expr []DBToken // Simple expressions, the innards of functions are opaque for now. } -type DB_Limit struct { +type DBLimit struct { Offset string // ? or int MaxCount string // ? or int } -type DB_Stmt struct { +type DBStmt struct { Contents string Type string // create-table, insert, update, delete } -type DB_Adapter interface { +type Adapter interface { GetName() string - CreateTable(name string, table string, charset string, collation string, columns []DB_Table_Column, keys []DB_Table_Key) (string, error) + CreateTable(name string, table string, charset string, collation string, columns []DBTableColumn, keys []DBTableKey) (string, error) SimpleInsert(name string, table string, columns string, fields string) (string, error) // ! DEPRECATED @@ -111,17 +111,19 @@ type DB_Adapter interface { SimpleSelect(name string, table string, columns string, where string, orderby string, limit string) (string, error) SimpleLeftJoin(name string, table1 string, table2 string, columns string, joiners string, where string, orderby string, limit string) (string, error) SimpleInnerJoin(string, string, string, string, string, string, string, string) (string, error) - SimpleInsertSelect(string, DB_Insert, DB_Select) (string, error) - SimpleInsertLeftJoin(string, DB_Insert, DB_Join) (string, error) - SimpleInsertInnerJoin(string, DB_Insert, DB_Join) (string, error) + SimpleInsertSelect(string, DBInsert, DBSelect) (string, error) + SimpleInsertLeftJoin(string, DBInsert, DBJoin) (string, error) + SimpleInsertInnerJoin(string, DBInsert, DBJoin) (string, error) SimpleCount(string, string, string, string) (string, error) + + Select(name ...string) *selectPrebuilder Write() error // TODO: Add a simple query builder } -func GetAdapter(name string) (adap DB_Adapter, err error) { - for _, adapter := range DB_Registry { +func GetAdapter(name string) (adap Adapter, err error) { + for _, adapter := range Registry { if adapter.GetName() == name { return adapter, nil } diff --git a/query_gen/lib/transaction.go b/query_gen/lib/transaction.go index f04d1fcb..7f757382 100644 --- a/query_gen/lib/transaction.go +++ b/query_gen/lib/transaction.go @@ -20,7 +20,7 @@ func (stmt *transactionStmt) Exec(args ...interface{}) (*sql.Result, error) { type TransactionBuilder struct { tx *sql.Tx - adapter DB_Adapter + adapter Adapter textToStmt map[string]*transactionStmt } diff --git a/query_gen/lib/utils.go b/query_gen/lib/utils.go index 6f1fec80..17138c0e 100644 --- a/query_gen/lib/utils.go +++ b/query_gen/lib/utils.go @@ -13,13 +13,13 @@ import ( "strings" ) -func processColumns(colstr string) (columns []DB_Column) { +func processColumns(colstr string) (columns []DBColumn) { if colstr == "" { return columns } colstr = strings.Replace(colstr, " as ", " AS ", -1) for _, segment := range strings.Split(colstr, ",") { - var outcol DB_Column + var outcol DBColumn dotHalves := strings.Split(strings.TrimSpace(segment), ".") var halves []string @@ -49,12 +49,12 @@ func processColumns(colstr string) (columns []DB_Column) { } // TODO: Allow order by statements without a direction -func processOrderby(orderstr string) (order []DB_Order) { +func processOrderby(orderstr string) (order []DBOrder) { if orderstr == "" { return order } for _, segment := range strings.Split(orderstr, ",") { - var outorder DB_Order + var outorder DBOrder halves := strings.Split(strings.TrimSpace(segment), " ") if len(halves) != 2 { continue @@ -66,14 +66,14 @@ func processOrderby(orderstr string) (order []DB_Order) { return order } -func processJoiner(joinstr string) (joiner []DB_Joiner) { +func processJoiner(joinstr string) (joiner []DBJoiner) { if joinstr == "" { return joiner } joinstr = strings.Replace(joinstr, " on ", " ON ", -1) joinstr = strings.Replace(joinstr, " and ", " AND ", -1) for _, segment := range strings.Split(joinstr, " AND ") { - var outjoin DB_Joiner + var outjoin DBJoiner var parseOffset int var left, right string @@ -93,7 +93,7 @@ func processJoiner(joinstr string) (joiner []DB_Joiner) { return joiner } -func processWhere(wherestr string) (where []DB_Where) { +func processWhere(wherestr string) (where []DBWhere) { if wherestr == "" { return where } @@ -102,7 +102,7 @@ func processWhere(wherestr string) (where []DB_Where) { var buffer string var optype int // 0: None, 1: Number, 2: Column, 3: Function, 4: String, 5: Operator for _, segment := range strings.Split(wherestr, " AND ") { - var tmpWhere DB_Where + var tmpWhere DBWhere segment += ")" for i := 0; i < len(segment); i++ { char := segment[i] @@ -124,7 +124,7 @@ func processWhere(wherestr string) (where []DB_Where) { buffer = string(char) } else if char == '?' { //fmt.Println("Expr:","?") - tmpWhere.Expr = append(tmpWhere.Expr, DB_Token{"?", "substitute"}) + tmpWhere.Expr = append(tmpWhere.Expr, DBToken{"?", "substitute"}) } case 1: // number if '0' <= char && char <= '9' { @@ -133,7 +133,7 @@ func processWhere(wherestr string) (where []DB_Where) { optype = 0 i-- //fmt.Println("Expr:",buffer) - tmpWhere.Expr = append(tmpWhere.Expr, DB_Token{buffer, "number"}) + tmpWhere.Expr = append(tmpWhere.Expr, DBToken{buffer, "number"}) } case 2: // column if ('a' <= char && char <= 'z') || ('A' <= char && char <= 'Z') || char == '.' || char == '_' { @@ -145,7 +145,7 @@ func processWhere(wherestr string) (where []DB_Where) { optype = 0 i-- //fmt.Println("Expr:", buffer) - tmpWhere.Expr = append(tmpWhere.Expr, DB_Token{buffer, "column"}) + tmpWhere.Expr = append(tmpWhere.Expr, DBToken{buffer, "column"}) } case 3: // function var preI = i @@ -160,7 +160,7 @@ func processWhere(wherestr string) (where []DB_Where) { //fmt.Println("string(i)", string(halves[1][i])) buffer += segment[preI:i] + string(segment[i]) //fmt.Println("Expr:",buffer) - tmpWhere.Expr = append(tmpWhere.Expr, DB_Token{buffer, "function"}) + tmpWhere.Expr = append(tmpWhere.Expr, DBToken{buffer, "function"}) optype = 0 case 4: // string if char != '\'' { @@ -168,7 +168,7 @@ func processWhere(wherestr string) (where []DB_Where) { } else { optype = 0 //fmt.Println("Expr:",buffer) - tmpWhere.Expr = append(tmpWhere.Expr, DB_Token{buffer, "string"}) + tmpWhere.Expr = append(tmpWhere.Expr, DBToken{buffer, "string"}) } case 5: // operator if isOpByte(char) { @@ -177,10 +177,10 @@ func processWhere(wherestr string) (where []DB_Where) { optype = 0 i-- //fmt.Println("Expr:",buffer) - tmpWhere.Expr = append(tmpWhere.Expr, DB_Token{buffer, "operator"}) + tmpWhere.Expr = append(tmpWhere.Expr, DBToken{buffer, "operator"}) } default: - panic("Bad optype in _process_where") + panic("Bad optype in processWhere") } } where = append(where, tmpWhere) @@ -188,11 +188,10 @@ func processWhere(wherestr string) (where []DB_Where) { return where } -func processSet(setstr string) (setter []DB_Setter) { +func processSet(setstr string) (setter []DBSetter) { if setstr == "" { return setter } - //fmt.Println("setstr",setstr) // First pass, splitting the string by commas while ignoring the innards of functions var setset []string @@ -217,7 +216,7 @@ func processSet(setstr string) (setter []DB_Setter) { // Second pass. Break this setitem into manageable chunks buffer = "" for _, setitem := range setset { - var tmpSetter DB_Setter + var tmpSetter DBSetter halves := strings.Split(setitem, "=") if len(halves) != 2 { continue @@ -246,7 +245,7 @@ func processSet(setstr string) (setter []DB_Setter) { buffer = string(char) } else if char == '?' { //fmt.Println("Expr:","?") - tmpSetter.Expr = append(tmpSetter.Expr, DB_Token{"?", "substitute"}) + tmpSetter.Expr = append(tmpSetter.Expr, DBToken{"?", "substitute"}) } case 1: // number if '0' <= char && char <= '9' { @@ -255,7 +254,7 @@ func processSet(setstr string) (setter []DB_Setter) { optype = 0 i-- //fmt.Println("Expr:",buffer) - tmpSetter.Expr = append(tmpSetter.Expr, DB_Token{buffer, "number"}) + tmpSetter.Expr = append(tmpSetter.Expr, DBToken{buffer, "number"}) } case 2: // column if ('a' <= char && char <= 'z') || ('A' <= char && char <= 'Z') || char == '_' { @@ -267,7 +266,7 @@ func processSet(setstr string) (setter []DB_Setter) { optype = 0 i-- //fmt.Println("Expr:",buffer) - tmpSetter.Expr = append(tmpSetter.Expr, DB_Token{buffer, "column"}) + tmpSetter.Expr = append(tmpSetter.Expr, DBToken{buffer, "column"}) } case 3: // function var preI = i @@ -282,7 +281,7 @@ func processSet(setstr string) (setter []DB_Setter) { //fmt.Println("string(i)",string(halves[1][i])) buffer += halves[1][preI:i] + string(halves[1][i]) //fmt.Println("Expr:",buffer) - tmpSetter.Expr = append(tmpSetter.Expr, DB_Token{buffer, "function"}) + tmpSetter.Expr = append(tmpSetter.Expr, DBToken{buffer, "function"}) optype = 0 case 4: // string if char != '\'' { @@ -290,7 +289,7 @@ func processSet(setstr string) (setter []DB_Setter) { } else { optype = 0 //fmt.Println("Expr:", buffer) - tmpSetter.Expr = append(tmpSetter.Expr, DB_Token{buffer, "string"}) + tmpSetter.Expr = append(tmpSetter.Expr, DBToken{buffer, "string"}) } case 5: // operator if isOpByte(char) { @@ -299,7 +298,7 @@ func processSet(setstr string) (setter []DB_Setter) { optype = 0 i-- //fmt.Println("Expr:", buffer) - tmpSetter.Expr = append(tmpSetter.Expr, DB_Token{buffer, "operator"}) + tmpSetter.Expr = append(tmpSetter.Expr, DBToken{buffer, "operator"}) } default: panic("Bad optype in processSet") @@ -307,11 +306,10 @@ func processSet(setstr string) (setter []DB_Setter) { } setter = append(setter, tmpSetter) } - //fmt.Println("setter",setter) return setter } -func processLimit(limitstr string) (limiter DB_Limit) { +func processLimit(limitstr string) (limiter DBLimit) { halves := strings.Split(limitstr, ",") if len(halves) == 2 { limiter.Offset = halves[0] @@ -330,7 +328,7 @@ func isOpRune(char rune) bool { return char == '<' || char == '>' || char == '=' || char == '!' || char == '*' || char == '%' || char == '+' || char == '-' || char == '/' } -func processFields(fieldstr string) (fields []DB_Field) { +func processFields(fieldstr string) (fields []DBField) { if fieldstr == "" { return fields } @@ -340,11 +338,11 @@ func processFields(fieldstr string) (fields []DB_Field) { for i := 0; i < len(fieldstr); i++ { if fieldstr[i] == '(' { i = skipFunctionCall(fieldstr, i-1) - fields = append(fields, DB_Field{Name: fieldstr[lastItem : i+1], Type: getIdentifierType(fieldstr[lastItem : i+1])}) + fields = append(fields, DBField{Name: fieldstr[lastItem : i+1], Type: getIdentifierType(fieldstr[lastItem : i+1])}) buffer = "" lastItem = i + 2 } else if fieldstr[i] == ',' && buffer != "" { - fields = append(fields, DB_Field{Name: buffer, Type: getIdentifierType(buffer)}) + fields = append(fields, DBField{Name: buffer, Type: getIdentifierType(buffer)}) buffer = "" lastItem = i + 1 } else if (fieldstr[i] > 32) && fieldstr[i] != ',' && fieldstr[i] != ')' { diff --git a/query_gen/main.go b/query_gen/main.go index 780e4e63..0a5ce393 100644 --- a/query_gen/main.go +++ b/query_gen/main.go @@ -23,8 +23,8 @@ func main() { }() log.Println("Running the query generator") - for _, adapter := range qgen.DB_Registry { - log.Println("Building the queries for the " + adapter.GetName() + " adapter") + for _, adapter := range qgen.Registry { + log.Printf("Building the queries for the %s adapter", adapter.GetName()) qgen.Install.SetAdapterInstance(adapter) qgen.Install.RegisterPlugin(NewPrimaryKeySpitter()) // TODO: Do we really need to fill the spitter for every adapter? @@ -44,7 +44,7 @@ func main() { } // nolint -func writeStatements(adapter qgen.DB_Adapter) error { +func writeStatements(adapter qgen.Adapter) error { err := createTables(adapter) if err != nil { return err @@ -118,7 +118,7 @@ func writeStatements(adapter qgen.DB_Adapter) error { return nil } -func seedTables(adapter qgen.DB_Adapter) error { +func seedTables(adapter qgen.Adapter) error { qgen.Install.SimpleInsert("sync", "last_update", "UTC_TIMESTAMP()") qgen.Install.SimpleInsert("settings", "name, content, type", "'url_tags','1','bool'") @@ -219,22 +219,22 @@ func seedTables(adapter qgen.DB_Adapter) error { return nil } -func writeSelects(adapter qgen.DB_Adapter) error { +func writeSelects(adapter qgen.Adapter) error { // Looking for getTopic? Your statement is in another castle - adapter.SimpleSelect("getPassword", "users", "password, salt", "uid = ?", "", "") + adapter.Select("getPassword").Table("users").Columns("password, salt").Where("uid = ?").Parse() - adapter.SimpleSelect("getSettings", "settings", "name, content, type", "", "", "") + adapter.Select("getSettings").Table("settings").Columns("name, content, type").Parse() - adapter.SimpleSelect("getSetting", "settings", "content, type", "name = ?", "", "") + adapter.Select("getSetting").Table("settings").Columns("content, type").Where("name = ?").Parse() - adapter.SimpleSelect("getFullSetting", "settings", "name, type, constraints", "name = ?", "", "") + adapter.Select("getFullSetting").Table("settings").Columns("name, type, constraints").Where("name = ?").Parse() - adapter.SimpleSelect("isPluginActive", "plugins", "active", "uname = ?", "", "") + adapter.Select("isPluginActive").Table("plugins").Columns("active").Where("uname = ?").Parse() //adapter.SimpleSelect("isPluginInstalled","plugins","installed","uname = ?","","") - adapter.SimpleSelect("getUsersOffset", "users", "uid, name, group, active, is_super_admin, avatar", "", "uid ASC", "?,?") + adapter.Select("getUsersOffset").Table("users").Columns("uid, name, group, active, is_super_admin, avatar").Orderby("uid ASC").Limit("?,?").Parse() adapter.SimpleSelect("isThemeDefault", "themes", "default", "uname = ?", "", "") @@ -267,7 +267,7 @@ func writeSelects(adapter qgen.DB_Adapter) error { return nil } -func writeLeftJoins(adapter qgen.DB_Adapter) error { +func writeLeftJoins(adapter qgen.Adapter) error { adapter.SimpleLeftJoin("getTopicRepliesOffset", "replies", "users", "replies.rid, replies.content, replies.createdBy, replies.createdAt, replies.lastEdit, replies.lastEditBy, users.avatar, users.name, users.group, users.url_prefix, users.url_name, users.level, replies.ipaddress, replies.likeCount, replies.actionType", "replies.createdBy = users.uid", "replies.tid = ?", "replies.rid ASC", "?,?") adapter.SimpleLeftJoin("getTopicList", "topics", "users", "topics.tid, topics.title, topics.content, topics.createdBy, topics.is_closed, topics.sticky, topics.createdAt, topics.parentID, users.name, users.avatar", "topics.createdBy = users.uid", "", "topics.sticky DESC, topics.lastReplyAt DESC, topics.createdBy DESC", "") @@ -281,7 +281,7 @@ func writeLeftJoins(adapter qgen.DB_Adapter) error { return nil } -func writeInnerJoins(adapter qgen.DB_Adapter) (err error) { +func writeInnerJoins(adapter qgen.Adapter) (err error) { _, err = adapter.SimpleInnerJoin("getWatchers", "activity_stream", "activity_subscriptions", "activity_subscriptions.user", "activity_subscriptions.targetType = activity_stream.elementType AND activity_subscriptions.targetID = activity_stream.elementID AND activity_subscriptions.user != activity_stream.actor", "asid = ?", "", "") if err != nil { return err @@ -290,7 +290,7 @@ func writeInnerJoins(adapter qgen.DB_Adapter) (err error) { return nil } -func writeInserts(adapter qgen.DB_Adapter) error { +func writeInserts(adapter qgen.Adapter) error { adapter.SimpleInsert("createReport", "topics", "title, content, parsed_content, createdAt, lastReplyAt, createdBy, lastReplyBy, data, parentID, css_class", "?,?,?,UTC_TIMESTAMP(),UTC_TIMESTAMP(),?,?,?,1,'report'") adapter.SimpleInsert("addActivity", "activity_stream", "actor, targetUser, event, elementType, elementID", "?,?,?,?,?") @@ -314,12 +314,12 @@ func writeInserts(adapter qgen.DB_Adapter) error { return nil } -func writeReplaces(adapter qgen.DB_Adapter) (err error) { +func writeReplaces(adapter qgen.Adapter) (err error) { return nil } // ! Upserts are broken atm -/*func writeUpserts(adapter qgen.DB_Adapter) (err error) { +/*func writeUpserts(adapter qgen.Adapter) (err error) { _, err = adapter.SimpleUpsert("addForumPermsToGroup", "forums_permissions", "gid, fid, preset, permissions", "?,?,?,?", "gid = ? AND fid = ?") if err != nil { return err @@ -333,7 +333,7 @@ func writeReplaces(adapter qgen.DB_Adapter) (err error) { return nil }*/ -func writeUpdates(adapter qgen.DB_Adapter) error { +func writeUpdates(adapter qgen.Adapter) error { adapter.SimpleUpdate("editReply", "replies", "content = ?, parsed_content = ?", "rid = ?") adapter.SimpleUpdate("editProfileReply", "users_replies", "content = ?, parsed_content = ?", "rid = ?") @@ -367,7 +367,7 @@ func writeUpdates(adapter qgen.DB_Adapter) error { return nil } -func writeDeletes(adapter qgen.DB_Adapter) error { +func writeDeletes(adapter qgen.Adapter) error { adapter.SimpleDelete("deleteProfileReply", "users_replies", "rid = ?") //adapter.SimpleDelete("deleteForumPermsByForum", "forums_permissions", "fid = ?") @@ -380,7 +380,7 @@ func writeDeletes(adapter qgen.DB_Adapter) error { return nil } -func writeSimpleCounts(adapter qgen.DB_Adapter) error { +func writeSimpleCounts(adapter qgen.Adapter) error { adapter.SimpleCount("reportExists", "topics", "data = ? AND data != '' AND parentID = 1", "") adapter.SimpleCount("modlogCount", "moderation_logs", "", "") @@ -388,7 +388,7 @@ func writeSimpleCounts(adapter qgen.DB_Adapter) error { return nil } -func writeInsertSelects(adapter qgen.DB_Adapter) error { +func writeInsertSelects(adapter qgen.Adapter) error { /*adapter.SimpleInsertSelect("addForumPermsToForumAdmins", qgen.DB_Insert{"forums_permissions", "gid, fid, preset, permissions", ""}, qgen.DB_Select{"users_groups", "gid, ? AS fid, ? AS preset, ? AS permissions", "is_admin = 1", "", ""}, @@ -408,14 +408,14 @@ func writeInsertSelects(adapter qgen.DB_Adapter) error { } // nolint -func writeInsertLeftJoins(adapter qgen.DB_Adapter) error { +func writeInsertLeftJoins(adapter qgen.Adapter) error { return nil } -func writeInsertInnerJoins(adapter qgen.DB_Adapter) error { +func writeInsertInnerJoins(adapter qgen.Adapter) error { adapter.SimpleInsertInnerJoin("notifyWatchers", - qgen.DB_Insert{"activity_stream_matches", "watcher, asid", ""}, - qgen.DB_Join{"activity_stream", "activity_subscriptions", "activity_subscriptions.user, activity_stream.asid", "activity_subscriptions.targetType = activity_stream.elementType AND activity_subscriptions.targetID = activity_stream.elementID AND activity_subscriptions.user != activity_stream.actor", "asid = ?", "", ""}, + qgen.DBInsert{"activity_stream_matches", "watcher, asid", ""}, + qgen.DBJoin{"activity_stream", "activity_subscriptions", "activity_subscriptions.user, activity_stream.asid", "activity_subscriptions.targetType = activity_stream.elementType AND activity_subscriptions.targetID = activity_stream.elementID AND activity_subscriptions.user != activity_stream.actor", "asid = ?", "", ""}, ) return nil diff --git a/query_gen/spitter.go b/query_gen/spitter.go index 5159d1b8..60e1ab75 100644 --- a/query_gen/spitter.go +++ b/query_gen/spitter.go @@ -14,7 +14,7 @@ func NewPrimaryKeySpitter() *PrimaryKeySpitter { func (spit *PrimaryKeySpitter) Hook(name string, args ...interface{}) error { if name == "CreateTableStart" { var found string - for _, key := range args[4].([]qgen.DB_Table_Key) { + for _, key := range args[4].([]qgen.DBTableKey) { if key.Type == "primary" { expl := strings.Split(key.Columns, ",") if len(expl) > 1 { diff --git a/query_gen/tables.go b/query_gen/tables.go index 3603dc81..3f546e51 100644 --- a/query_gen/tables.go +++ b/query_gen/tables.go @@ -3,53 +3,55 @@ package main import "./lib" -func createTables(adapter qgen.DB_Adapter) error { +func createTables(adapter qgen.Adapter) error { qgen.Install.CreateTable("users", "utf8mb4", "utf8mb4_general_ci", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"uid", "int", 0, false, true, ""}, - qgen.DB_Table_Column{"name", "varchar", 100, false, false, ""}, - qgen.DB_Table_Column{"password", "varchar", 100, false, false, ""}, - qgen.DB_Table_Column{"salt", "varchar", 80, false, false, "''"}, - qgen.DB_Table_Column{"group", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"active", "boolean", 0, false, false, "0"}, - qgen.DB_Table_Column{"is_super_admin", "boolean", 0, false, false, "0"}, - qgen.DB_Table_Column{"createdAt", "createdAt", 0, false, false, ""}, - qgen.DB_Table_Column{"lastActiveAt", "datetime", 0, false, false, ""}, - qgen.DB_Table_Column{"session", "varchar", 200, false, false, "''"}, - qgen.DB_Table_Column{"last_ip", "varchar", 200, false, false, "0.0.0.0.0"}, - qgen.DB_Table_Column{"email", "varchar", 200, false, false, "''"}, - qgen.DB_Table_Column{"avatar", "varchar", 100, false, false, "''"}, - qgen.DB_Table_Column{"message", "text", 0, false, false, "''"}, - qgen.DB_Table_Column{"url_prefix", "varchar", 20, false, false, "''"}, - qgen.DB_Table_Column{"url_name", "varchar", 100, false, false, "''"}, - qgen.DB_Table_Column{"level", "smallint", 0, false, false, "0"}, - qgen.DB_Table_Column{"score", "int", 0, false, false, "0"}, - qgen.DB_Table_Column{"posts", "int", 0, false, false, "0"}, - qgen.DB_Table_Column{"bigposts", "int", 0, false, false, "0"}, - qgen.DB_Table_Column{"megaposts", "int", 0, false, false, "0"}, - qgen.DB_Table_Column{"topics", "int", 0, false, false, "0"}, - //qgen.DB_Table_Column{"penalty_count","int",0,false,false,"0"}, - qgen.DB_Table_Column{"temp_group", "int", 0, false, false, "0"}, // For temporary groups, set this to zero when a temporary group isn't in effect + []qgen.DBTableColumn{ + qgen.DBTableColumn{"uid", "int", 0, false, true, ""}, + qgen.DBTableColumn{"name", "varchar", 100, false, false, ""}, + qgen.DBTableColumn{"password", "varchar", 100, false, false, ""}, + + qgen.DBTableColumn{"salt", "varchar", 80, false, false, "''"}, + qgen.DBTableColumn{"group", "int", 0, false, false, ""}, + qgen.DBTableColumn{"active", "boolean", 0, false, false, "0"}, + qgen.DBTableColumn{"is_super_admin", "boolean", 0, false, false, "0"}, + qgen.DBTableColumn{"createdAt", "createdAt", 0, false, false, ""}, + qgen.DBTableColumn{"lastActiveAt", "datetime", 0, false, false, ""}, + qgen.DBTableColumn{"session", "varchar", 200, false, false, "''"}, + qgen.DBTableColumn{"last_ip", "varchar", 200, false, false, "0.0.0.0.0"}, + qgen.DBTableColumn{"email", "varchar", 200, false, false, "''"}, + qgen.DBTableColumn{"avatar", "varchar", 100, false, false, "''"}, + qgen.DBTableColumn{"message", "text", 0, false, false, "''"}, + qgen.DBTableColumn{"url_prefix", "varchar", 20, false, false, "''"}, + qgen.DBTableColumn{"url_name", "varchar", 100, false, false, "''"}, + qgen.DBTableColumn{"level", "smallint", 0, false, false, "0"}, + qgen.DBTableColumn{"score", "int", 0, false, false, "0"}, + qgen.DBTableColumn{"posts", "int", 0, false, false, "0"}, + qgen.DBTableColumn{"bigposts", "int", 0, false, false, "0"}, + qgen.DBTableColumn{"megaposts", "int", 0, false, false, "0"}, + qgen.DBTableColumn{"topics", "int", 0, false, false, "0"}, + //qgen.DBTableColumn{"penalty_count","int",0,false,false,"0"}, + qgen.DBTableColumn{"temp_group", "int", 0, false, false, "0"}, // For temporary groups, set this to zero when a temporary group isn't in effect }, - []qgen.DB_Table_Key{ - qgen.DB_Table_Key{"uid", "primary"}, - qgen.DB_Table_Key{"name", "unique"}, + []qgen.DBTableKey{ + qgen.DBTableKey{"uid", "primary"}, + qgen.DBTableKey{"name", "unique"}, }, ) qgen.Install.CreateTable("users_groups", "utf8mb4", "utf8mb4_general_ci", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"gid", "int", 0, false, true, ""}, - qgen.DB_Table_Column{"name", "varchar", 100, false, false, ""}, - qgen.DB_Table_Column{"permissions", "text", 0, false, false, ""}, - qgen.DB_Table_Column{"plugin_perms", "text", 0, false, false, ""}, - qgen.DB_Table_Column{"is_mod", "boolean", 0, false, false, "0"}, - qgen.DB_Table_Column{"is_admin", "boolean", 0, false, false, "0"}, - qgen.DB_Table_Column{"is_banned", "boolean", 0, false, false, "0"}, - qgen.DB_Table_Column{"tag", "varchar", 50, false, false, "''"}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"gid", "int", 0, false, true, ""}, + qgen.DBTableColumn{"name", "varchar", 100, false, false, ""}, + qgen.DBTableColumn{"permissions", "text", 0, false, false, ""}, + qgen.DBTableColumn{"plugin_perms", "text", 0, false, false, ""}, + qgen.DBTableColumn{"is_mod", "boolean", 0, false, false, "0"}, + qgen.DBTableColumn{"is_admin", "boolean", 0, false, false, "0"}, + qgen.DBTableColumn{"is_banned", "boolean", 0, false, false, "0"}, + + qgen.DBTableColumn{"tag", "varchar", 50, false, false, "''"}, }, - []qgen.DB_Table_Key{ - qgen.DB_Table_Key{"gid", "primary"}, + []qgen.DBTableKey{ + qgen.DBTableKey{"gid", "primary"}, }, ) @@ -60,303 +62,303 @@ func createTables(adapter qgen.DB_Adapter) error { // TODO: Add a penalty type where a user is stopped from creating plugin_guilds social groups // TODO: Shadow bans. We will probably have a CanShadowBan permission for this, as we *really* don't want people using this lightly. /*qgen.Install.CreateTable("users_penalties","","", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"uid","int",0,false,false,""}, - qgen.DB_Table_Column{"element_id","int",0,false,false,""}, - qgen.DB_Table_Column{"element_type","varchar",50,false,false,""}, //forum, profile?, and social_group. Leave blank for global. - qgen.DB_Table_Column{"overrides","text",0,false,false,"{}"}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"uid","int",0,false,false,""}, + qgen.DBTableColumn{"element_id","int",0,false,false,""}, + qgen.DBTableColumn{"element_type","varchar",50,false,false,""}, //forum, profile?, and social_group. Leave blank for global. + qgen.DBTableColumn{"overrides","text",0,false,false,"{}"}, - qgen.DB_Table_Column{"mod_queue","boolean",0,false,false,"0"}, - qgen.DB_Table_Column{"shadow_ban","boolean",0,false,false,"0"}, - qgen.DB_Table_Column{"no_avatar","boolean",0,false,false,"0"}, // Coming Soon. Should this be a perm override instead? + qgen.DBTableColumn{"mod_queue","boolean",0,false,false,"0"}, + qgen.DBTableColumn{"shadow_ban","boolean",0,false,false,"0"}, + qgen.DBTableColumn{"no_avatar","boolean",0,false,false,"0"}, // Coming Soon. Should this be a perm override instead? // Do we *really* need rate-limit penalty types? Are we going to be allowing bots or something? - //qgen.DB_Table_Column{"posts_per_hour","int",0,false,false,"0"}, - //qgen.DB_Table_Column{"topics_per_hour","int",0,false,false,"0"}, - //qgen.DB_Table_Column{"posts_count","int",0,false,false,"0"}, - //qgen.DB_Table_Column{"topic_count","int",0,false,false,"0"}, - //qgen.DB_Table_Column{"last_hour","int",0,false,false,"0"}, // UNIX Time, as we don't need to do anything too fancy here. When an hour has elapsed since that time, reset the hourly penalty counters. + //qgen.DBTableColumn{"posts_per_hour","int",0,false,false,"0"}, + //qgen.DBTableColumn{"topics_per_hour","int",0,false,false,"0"}, + //qgen.DBTableColumn{"posts_count","int",0,false,false,"0"}, + //qgen.DBTableColumn{"topic_count","int",0,false,false,"0"}, + //qgen.DBTableColumn{"last_hour","int",0,false,false,"0"}, // UNIX Time, as we don't need to do anything too fancy here. When an hour has elapsed since that time, reset the hourly penalty counters. - qgen.DB_Table_Column{"issued_by","int",0,false,false,""}, - qgen.DB_Table_Column{"issued_at","createdAt",0,false,false,""}, - qgen.DB_Table_Column{"expires_at","datetime",0,false,false,""}, + qgen.DBTableColumn{"issued_by","int",0,false,false,""}, + qgen.DBTableColumn{"issued_at","createdAt",0,false,false,""}, + qgen.DBTableColumn{"expires_at","datetime",0,false,false,""}, }, - []qgen.DB_Table_Key{}, + []qgen.DBTableKey{}, )*/ qgen.Install.CreateTable("users_groups_scheduler", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"uid", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"set_group", "int", 0, false, false, ""}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"uid", "int", 0, false, false, ""}, + qgen.DBTableColumn{"set_group", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"issued_by", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"issued_at", "createdAt", 0, false, false, ""}, - qgen.DB_Table_Column{"revert_at", "datetime", 0, false, false, ""}, - qgen.DB_Table_Column{"temporary", "boolean", 0, false, false, ""}, // special case for permanent bans to do the necessary bookkeeping, might be removed in the future + qgen.DBTableColumn{"issued_by", "int", 0, false, false, ""}, + qgen.DBTableColumn{"issued_at", "createdAt", 0, false, false, ""}, + qgen.DBTableColumn{"revert_at", "datetime", 0, false, false, ""}, + qgen.DBTableColumn{"temporary", "boolean", 0, false, false, ""}, // special case for permanent bans to do the necessary bookkeeping, might be removed in the future }, - []qgen.DB_Table_Key{ - qgen.DB_Table_Key{"uid", "primary"}, + []qgen.DBTableKey{ + qgen.DBTableKey{"uid", "primary"}, }, ) qgen.Install.CreateTable("emails", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"email", "varchar", 200, false, false, ""}, - qgen.DB_Table_Column{"uid", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"validated", "boolean", 0, false, false, "0"}, - qgen.DB_Table_Column{"token", "varchar", 200, false, false, "''"}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"email", "varchar", 200, false, false, ""}, + qgen.DBTableColumn{"uid", "int", 0, false, false, ""}, + qgen.DBTableColumn{"validated", "boolean", 0, false, false, "0"}, + qgen.DBTableColumn{"token", "varchar", 200, false, false, "''"}, }, - []qgen.DB_Table_Key{}, + []qgen.DBTableKey{}, ) qgen.Install.CreateTable("forums", "utf8mb4", "utf8mb4_general_ci", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"fid", "int", 0, false, true, ""}, - qgen.DB_Table_Column{"name", "varchar", 100, false, false, ""}, - qgen.DB_Table_Column{"desc", "varchar", 200, false, false, ""}, - qgen.DB_Table_Column{"active", "boolean", 0, false, false, "1"}, - qgen.DB_Table_Column{"topicCount", "int", 0, false, false, "0"}, - qgen.DB_Table_Column{"preset", "varchar", 100, false, false, "''"}, - qgen.DB_Table_Column{"parentID", "int", 0, false, false, "0"}, - qgen.DB_Table_Column{"parentType", "varchar", 50, false, false, "''"}, - qgen.DB_Table_Column{"lastTopicID", "int", 0, false, false, "0"}, - qgen.DB_Table_Column{"lastReplyerID", "int", 0, false, false, "0"}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"fid", "int", 0, false, true, ""}, + qgen.DBTableColumn{"name", "varchar", 100, false, false, ""}, + qgen.DBTableColumn{"desc", "varchar", 200, false, false, ""}, + qgen.DBTableColumn{"active", "boolean", 0, false, false, "1"}, + qgen.DBTableColumn{"topicCount", "int", 0, false, false, "0"}, + qgen.DBTableColumn{"preset", "varchar", 100, false, false, "''"}, + qgen.DBTableColumn{"parentID", "int", 0, false, false, "0"}, + qgen.DBTableColumn{"parentType", "varchar", 50, false, false, "''"}, + qgen.DBTableColumn{"lastTopicID", "int", 0, false, false, "0"}, + qgen.DBTableColumn{"lastReplyerID", "int", 0, false, false, "0"}, }, - []qgen.DB_Table_Key{ - qgen.DB_Table_Key{"fid", "primary"}, + []qgen.DBTableKey{ + qgen.DBTableKey{"fid", "primary"}, }, ) qgen.Install.CreateTable("forums_permissions", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"fid", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"gid", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"preset", "varchar", 100, false, false, "''"}, - qgen.DB_Table_Column{"permissions", "text", 0, false, false, ""}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"fid", "int", 0, false, false, ""}, + qgen.DBTableColumn{"gid", "int", 0, false, false, ""}, + qgen.DBTableColumn{"preset", "varchar", 100, false, false, "''"}, + qgen.DBTableColumn{"permissions", "text", 0, false, false, ""}, }, - []qgen.DB_Table_Key{ + []qgen.DBTableKey{ // TODO: Test to see that the compound primary key works - qgen.DB_Table_Key{"fid,gid", "primary"}, + qgen.DBTableKey{"fid,gid", "primary"}, }, ) qgen.Install.CreateTable("topics", "utf8mb4", "utf8mb4_general_ci", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"tid", "int", 0, false, true, ""}, - qgen.DB_Table_Column{"title", "varchar", 100, false, false, ""}, - qgen.DB_Table_Column{"content", "text", 0, false, false, ""}, - qgen.DB_Table_Column{"parsed_content", "text", 0, false, false, ""}, - qgen.DB_Table_Column{"createdAt", "createdAt", 0, false, false, ""}, - qgen.DB_Table_Column{"lastReplyAt", "datetime", 0, false, false, ""}, - qgen.DB_Table_Column{"lastReplyBy", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"createdBy", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"is_closed", "boolean", 0, false, false, "0"}, - qgen.DB_Table_Column{"sticky", "boolean", 0, false, false, "0"}, - qgen.DB_Table_Column{"parentID", "int", 0, false, false, "2"}, - qgen.DB_Table_Column{"ipaddress", "varchar", 200, false, false, "0.0.0.0.0"}, - qgen.DB_Table_Column{"postCount", "int", 0, false, false, "1"}, - qgen.DB_Table_Column{"likeCount", "int", 0, false, false, "0"}, - qgen.DB_Table_Column{"words", "int", 0, false, false, "0"}, - qgen.DB_Table_Column{"css_class", "varchar", 100, false, false, "''"}, - qgen.DB_Table_Column{"data", "varchar", 200, false, false, "''"}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"tid", "int", 0, false, true, ""}, + qgen.DBTableColumn{"title", "varchar", 100, false, false, ""}, + qgen.DBTableColumn{"content", "text", 0, false, false, ""}, + qgen.DBTableColumn{"parsed_content", "text", 0, false, false, ""}, + qgen.DBTableColumn{"createdAt", "createdAt", 0, false, false, ""}, + qgen.DBTableColumn{"lastReplyAt", "datetime", 0, false, false, ""}, + qgen.DBTableColumn{"lastReplyBy", "int", 0, false, false, ""}, + qgen.DBTableColumn{"createdBy", "int", 0, false, false, ""}, + qgen.DBTableColumn{"is_closed", "boolean", 0, false, false, "0"}, + qgen.DBTableColumn{"sticky", "boolean", 0, false, false, "0"}, + qgen.DBTableColumn{"parentID", "int", 0, false, false, "2"}, + qgen.DBTableColumn{"ipaddress", "varchar", 200, false, false, "0.0.0.0.0"}, + qgen.DBTableColumn{"postCount", "int", 0, false, false, "1"}, + qgen.DBTableColumn{"likeCount", "int", 0, false, false, "0"}, + qgen.DBTableColumn{"words", "int", 0, false, false, "0"}, + qgen.DBTableColumn{"css_class", "varchar", 100, false, false, "''"}, + qgen.DBTableColumn{"data", "varchar", 200, false, false, "''"}, }, - []qgen.DB_Table_Key{ - qgen.DB_Table_Key{"tid", "primary"}, + []qgen.DBTableKey{ + qgen.DBTableKey{"tid", "primary"}, }, ) qgen.Install.CreateTable("replies", "utf8mb4", "utf8mb4_general_ci", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"rid", "int", 0, false, true, ""}, - qgen.DB_Table_Column{"tid", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"content", "text", 0, false, false, ""}, - qgen.DB_Table_Column{"parsed_content", "text", 0, false, false, ""}, - qgen.DB_Table_Column{"createdAt", "createdAt", 0, false, false, ""}, - qgen.DB_Table_Column{"createdBy", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"lastEdit", "int", 0, false, false, "0"}, - qgen.DB_Table_Column{"lastEditBy", "int", 0, false, false, "0"}, - qgen.DB_Table_Column{"lastUpdated", "datetime", 0, false, false, ""}, - qgen.DB_Table_Column{"ipaddress", "varchar", 200, false, false, "0.0.0.0.0"}, - qgen.DB_Table_Column{"likeCount", "int", 0, false, false, "0"}, - qgen.DB_Table_Column{"words", "int", 0, false, false, "1"}, // ? - replies has a default of 1 and topics has 0? why? - qgen.DB_Table_Column{"actionType", "varchar", 20, false, false, "''"}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"rid", "int", 0, false, true, ""}, + qgen.DBTableColumn{"tid", "int", 0, false, false, ""}, + qgen.DBTableColumn{"content", "text", 0, false, false, ""}, + qgen.DBTableColumn{"parsed_content", "text", 0, false, false, ""}, + qgen.DBTableColumn{"createdAt", "createdAt", 0, false, false, ""}, + qgen.DBTableColumn{"createdBy", "int", 0, false, false, ""}, + qgen.DBTableColumn{"lastEdit", "int", 0, false, false, "0"}, + qgen.DBTableColumn{"lastEditBy", "int", 0, false, false, "0"}, + qgen.DBTableColumn{"lastUpdated", "datetime", 0, false, false, ""}, + qgen.DBTableColumn{"ipaddress", "varchar", 200, false, false, "0.0.0.0.0"}, + qgen.DBTableColumn{"likeCount", "int", 0, false, false, "0"}, + qgen.DBTableColumn{"words", "int", 0, false, false, "1"}, // ? - replies has a default of 1 and topics has 0? why? + qgen.DBTableColumn{"actionType", "varchar", 20, false, false, "''"}, }, - []qgen.DB_Table_Key{ - qgen.DB_Table_Key{"rid", "primary"}, + []qgen.DBTableKey{ + qgen.DBTableKey{"rid", "primary"}, }, ) qgen.Install.CreateTable("attachments", "utf8mb4", "utf8mb4_general_ci", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"attachID", "int", 0, false, true, ""}, - qgen.DB_Table_Column{"sectionID", "int", 0, false, false, "0"}, - qgen.DB_Table_Column{"sectionTable", "varchar", 200, false, false, "forums"}, - qgen.DB_Table_Column{"originID", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"originTable", "varchar", 200, false, false, "replies"}, - qgen.DB_Table_Column{"uploadedBy", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"path", "varchar", 200, false, false, ""}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"attachID", "int", 0, false, true, ""}, + qgen.DBTableColumn{"sectionID", "int", 0, false, false, "0"}, + qgen.DBTableColumn{"sectionTable", "varchar", 200, false, false, "forums"}, + qgen.DBTableColumn{"originID", "int", 0, false, false, ""}, + qgen.DBTableColumn{"originTable", "varchar", 200, false, false, "replies"}, + qgen.DBTableColumn{"uploadedBy", "int", 0, false, false, ""}, + qgen.DBTableColumn{"path", "varchar", 200, false, false, ""}, }, - []qgen.DB_Table_Key{ - qgen.DB_Table_Key{"attachID", "primary"}, + []qgen.DBTableKey{ + qgen.DBTableKey{"attachID", "primary"}, }, ) qgen.Install.CreateTable("revisions", "utf8mb4", "utf8mb4_general_ci", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"index", "int", 0, false, false, ""}, // TODO: Replace this with a proper revision ID x.x - qgen.DB_Table_Column{"content", "text", 0, false, false, ""}, - qgen.DB_Table_Column{"contentID", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"contentType", "varchar", 100, false, false, "replies"}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"index", "int", 0, false, false, ""}, // TODO: Replace this with a proper revision ID x.x + qgen.DBTableColumn{"content", "text", 0, false, false, ""}, + qgen.DBTableColumn{"contentID", "int", 0, false, false, ""}, + qgen.DBTableColumn{"contentType", "varchar", 100, false, false, "replies"}, }, - []qgen.DB_Table_Key{}, + []qgen.DBTableKey{}, ) qgen.Install.CreateTable("users_replies", "utf8mb4", "utf8mb4_general_ci", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"rid", "int", 0, false, true, ""}, - qgen.DB_Table_Column{"uid", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"content", "text", 0, false, false, ""}, - qgen.DB_Table_Column{"parsed_content", "text", 0, false, false, ""}, - qgen.DB_Table_Column{"createdAt", "createdAt", 0, false, false, ""}, - qgen.DB_Table_Column{"createdBy", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"lastEdit", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"lastEditBy", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"ipaddress", "varchar", 200, false, false, "0.0.0.0.0"}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"rid", "int", 0, false, true, ""}, + qgen.DBTableColumn{"uid", "int", 0, false, false, ""}, + qgen.DBTableColumn{"content", "text", 0, false, false, ""}, + qgen.DBTableColumn{"parsed_content", "text", 0, false, false, ""}, + qgen.DBTableColumn{"createdAt", "createdAt", 0, false, false, ""}, + qgen.DBTableColumn{"createdBy", "int", 0, false, false, ""}, + qgen.DBTableColumn{"lastEdit", "int", 0, false, false, ""}, + qgen.DBTableColumn{"lastEditBy", "int", 0, false, false, ""}, + qgen.DBTableColumn{"ipaddress", "varchar", 200, false, false, "0.0.0.0.0"}, }, - []qgen.DB_Table_Key{ - qgen.DB_Table_Key{"rid", "primary"}, + []qgen.DBTableKey{ + qgen.DBTableKey{"rid", "primary"}, }, ) qgen.Install.CreateTable("likes", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"weight", "tinyint", 0, false, false, "1"}, - qgen.DB_Table_Column{"targetItem", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"targetType", "varchar", 50, false, false, "replies"}, - qgen.DB_Table_Column{"sentBy", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"recalc", "tinyint", 0, false, false, "0"}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"weight", "tinyint", 0, false, false, "1"}, + qgen.DBTableColumn{"targetItem", "int", 0, false, false, ""}, + qgen.DBTableColumn{"targetType", "varchar", 50, false, false, "replies"}, + qgen.DBTableColumn{"sentBy", "int", 0, false, false, ""}, + qgen.DBTableColumn{"recalc", "tinyint", 0, false, false, "0"}, }, - []qgen.DB_Table_Key{}, + []qgen.DBTableKey{}, ) qgen.Install.CreateTable("activity_stream_matches", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"watcher", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"asid", "int", 0, false, false, ""}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"watcher", "int", 0, false, false, ""}, + qgen.DBTableColumn{"asid", "int", 0, false, false, ""}, }, - []qgen.DB_Table_Key{}, + []qgen.DBTableKey{}, ) qgen.Install.CreateTable("activity_stream", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"asid", "int", 0, false, true, ""}, - qgen.DB_Table_Column{"actor", "int", 0, false, false, ""}, /* the one doing the act */ - qgen.DB_Table_Column{"targetUser", "int", 0, false, false, ""}, /* the user who created the item the actor is acting on, some items like forums may lack a targetUser field */ - qgen.DB_Table_Column{"event", "varchar", 50, false, false, ""}, /* mention, like, reply (as in the act of replying to an item, not the reply item type, you can "reply" to a forum by making a topic in it), friend_invite */ - qgen.DB_Table_Column{"elementType", "varchar", 50, false, false, ""}, /* topic, post (calling it post here to differentiate it from the 'reply' event), forum, user */ - qgen.DB_Table_Column{"elementID", "int", 0, false, false, ""}, /* the ID of the element being acted upon */ + []qgen.DBTableColumn{ + qgen.DBTableColumn{"asid", "int", 0, false, true, ""}, + qgen.DBTableColumn{"actor", "int", 0, false, false, ""}, /* the one doing the act */ + qgen.DBTableColumn{"targetUser", "int", 0, false, false, ""}, /* the user who created the item the actor is acting on, some items like forums may lack a targetUser field */ + qgen.DBTableColumn{"event", "varchar", 50, false, false, ""}, /* mention, like, reply (as in the act of replying to an item, not the reply item type, you can "reply" to a forum by making a topic in it), friend_invite */ + qgen.DBTableColumn{"elementType", "varchar", 50, false, false, ""}, /* topic, post (calling it post here to differentiate it from the 'reply' event), forum, user */ + qgen.DBTableColumn{"elementID", "int", 0, false, false, ""}, /* the ID of the element being acted upon */ }, - []qgen.DB_Table_Key{ - qgen.DB_Table_Key{"asid", "primary"}, + []qgen.DBTableKey{ + qgen.DBTableKey{"asid", "primary"}, }, ) qgen.Install.CreateTable("activity_subscriptions", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"user", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"targetID", "int", 0, false, false, ""}, /* the ID of the element being acted upon */ - qgen.DB_Table_Column{"targetType", "varchar", 50, false, false, ""}, /* topic, post (calling it post here to differentiate it from the 'reply' event), forum, user */ - qgen.DB_Table_Column{"level", "int", 0, false, false, "0"}, /* 0: Mentions (aka the global default for any post), 1: Replies To You, 2: All Replies*/ + []qgen.DBTableColumn{ + qgen.DBTableColumn{"user", "int", 0, false, false, ""}, + qgen.DBTableColumn{"targetID", "int", 0, false, false, ""}, /* the ID of the element being acted upon */ + qgen.DBTableColumn{"targetType", "varchar", 50, false, false, ""}, /* topic, post (calling it post here to differentiate it from the 'reply' event), forum, user */ + qgen.DBTableColumn{"level", "int", 0, false, false, "0"}, /* 0: Mentions (aka the global default for any post), 1: Replies To You, 2: All Replies*/ }, - []qgen.DB_Table_Key{}, + []qgen.DBTableKey{}, ) /* Due to MySQL's design, we have to drop the unique keys for table settings, plugins, and themes down from 200 to 180 or it will error */ qgen.Install.CreateTable("settings", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"name", "varchar", 180, false, false, ""}, - qgen.DB_Table_Column{"content", "varchar", 250, false, false, ""}, - qgen.DB_Table_Column{"type", "varchar", 50, false, false, ""}, - qgen.DB_Table_Column{"constraints", "varchar", 200, false, false, "''"}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"name", "varchar", 180, false, false, ""}, + qgen.DBTableColumn{"content", "varchar", 250, false, false, ""}, + qgen.DBTableColumn{"type", "varchar", 50, false, false, ""}, + qgen.DBTableColumn{"constraints", "varchar", 200, false, false, "''"}, }, - []qgen.DB_Table_Key{ - qgen.DB_Table_Key{"name", "unique"}, + []qgen.DBTableKey{ + qgen.DBTableKey{"name", "unique"}, }, ) qgen.Install.CreateTable("word_filters", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"wfid", "int", 0, false, true, ""}, - qgen.DB_Table_Column{"find", "varchar", 200, false, false, ""}, - qgen.DB_Table_Column{"replacement", "varchar", 200, false, false, ""}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"wfid", "int", 0, false, true, ""}, + qgen.DBTableColumn{"find", "varchar", 200, false, false, ""}, + qgen.DBTableColumn{"replacement", "varchar", 200, false, false, ""}, }, - []qgen.DB_Table_Key{ - qgen.DB_Table_Key{"wfid", "primary"}, + []qgen.DBTableKey{ + qgen.DBTableKey{"wfid", "primary"}, }, ) qgen.Install.CreateTable("plugins", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"uname", "varchar", 180, false, false, ""}, - qgen.DB_Table_Column{"active", "boolean", 0, false, false, "0"}, - qgen.DB_Table_Column{"installed", "boolean", 0, false, false, "0"}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"uname", "varchar", 180, false, false, ""}, + qgen.DBTableColumn{"active", "boolean", 0, false, false, "0"}, + qgen.DBTableColumn{"installed", "boolean", 0, false, false, "0"}, }, - []qgen.DB_Table_Key{ - qgen.DB_Table_Key{"uname", "unique"}, + []qgen.DBTableKey{ + qgen.DBTableKey{"uname", "unique"}, }, ) qgen.Install.CreateTable("themes", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"uname", "varchar", 180, false, false, ""}, - qgen.DB_Table_Column{"default", "boolean", 0, false, false, "0"}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"uname", "varchar", 180, false, false, ""}, + qgen.DBTableColumn{"default", "boolean", 0, false, false, "0"}, }, - []qgen.DB_Table_Key{ - qgen.DB_Table_Key{"uname", "unique"}, + []qgen.DBTableKey{ + qgen.DBTableKey{"uname", "unique"}, }, ) qgen.Install.CreateTable("widgets", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"position", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"side", "varchar", 100, false, false, ""}, - qgen.DB_Table_Column{"type", "varchar", 100, false, false, ""}, - qgen.DB_Table_Column{"active", "boolean", 0, false, false, "0"}, - qgen.DB_Table_Column{"location", "varchar", 100, false, false, ""}, - qgen.DB_Table_Column{"data", "text", 0, false, false, "''"}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"position", "int", 0, false, false, ""}, + qgen.DBTableColumn{"side", "varchar", 100, false, false, ""}, + qgen.DBTableColumn{"type", "varchar", 100, false, false, ""}, + qgen.DBTableColumn{"active", "boolean", 0, false, false, "0"}, + qgen.DBTableColumn{"location", "varchar", 100, false, false, ""}, + qgen.DBTableColumn{"data", "text", 0, false, false, "''"}, }, - []qgen.DB_Table_Key{}, + []qgen.DBTableKey{}, ) qgen.Install.CreateTable("moderation_logs", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"action", "varchar", 100, false, false, ""}, - qgen.DB_Table_Column{"elementID", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"elementType", "varchar", 100, false, false, ""}, - qgen.DB_Table_Column{"ipaddress", "varchar", 200, false, false, ""}, - qgen.DB_Table_Column{"actorID", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"doneAt", "datetime", 0, false, false, ""}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"action", "varchar", 100, false, false, ""}, + qgen.DBTableColumn{"elementID", "int", 0, false, false, ""}, + qgen.DBTableColumn{"elementType", "varchar", 100, false, false, ""}, + qgen.DBTableColumn{"ipaddress", "varchar", 200, false, false, ""}, + qgen.DBTableColumn{"actorID", "int", 0, false, false, ""}, + qgen.DBTableColumn{"doneAt", "datetime", 0, false, false, ""}, }, - []qgen.DB_Table_Key{}, + []qgen.DBTableKey{}, ) qgen.Install.CreateTable("administration_logs", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"action", "varchar", 100, false, false, ""}, - qgen.DB_Table_Column{"elementID", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"elementType", "varchar", 100, false, false, ""}, - qgen.DB_Table_Column{"ipaddress", "varchar", 200, false, false, ""}, - qgen.DB_Table_Column{"actorID", "int", 0, false, false, ""}, - qgen.DB_Table_Column{"doneAt", "datetime", 0, false, false, ""}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"action", "varchar", 100, false, false, ""}, + qgen.DBTableColumn{"elementID", "int", 0, false, false, ""}, + qgen.DBTableColumn{"elementType", "varchar", 100, false, false, ""}, + qgen.DBTableColumn{"ipaddress", "varchar", 200, false, false, ""}, + qgen.DBTableColumn{"actorID", "int", 0, false, false, ""}, + qgen.DBTableColumn{"doneAt", "datetime", 0, false, false, ""}, }, - []qgen.DB_Table_Key{}, + []qgen.DBTableKey{}, ) qgen.Install.CreateTable("sync", "", "", - []qgen.DB_Table_Column{ - qgen.DB_Table_Column{"last_update", "datetime", 0, false, false, ""}, + []qgen.DBTableColumn{ + qgen.DBTableColumn{"last_update", "datetime", 0, false, false, ""}, }, - []qgen.DB_Table_Key{}, + []qgen.DBTableKey{}, ) return nil