From 8ec053429958d142417d27077d916d2a12c25569 Mon Sep 17 00:00:00 2001 From: Azareal Date: Sun, 12 Nov 2017 11:29:23 +0000 Subject: [PATCH] Refactored the query generator subfunctions. Refactored more prebuilder queries to use the OO methods. Refactored the router generator. Added more query generator OO methods. More work on Cosora. --- query_gen/lib/accumulator.go | 2 + query_gen/lib/mssql.go | 10 +++ query_gen/lib/mysql.go | 10 +++ query_gen/lib/pgsql.go | 10 +++ query_gen/lib/querygen.go | 3 + query_gen/lib/utils.go | 118 +++++++++++++++------------------- query_gen/main.go | 54 ++++++++-------- router_gen/route_impl.go | 44 +++++++------ template_list.go | 12 ++-- themes/cosora/public/main.css | 19 +++++- 10 files changed, 163 insertions(+), 119 deletions(-) diff --git a/query_gen/lib/accumulator.go b/query_gen/lib/accumulator.go index 23b18b73..638b5b20 100644 --- a/query_gen/lib/accumulator.go +++ b/query_gen/lib/accumulator.go @@ -3,6 +3,7 @@ package qgen import ( "database/sql" + "log" ) type Accumulator struct { @@ -42,6 +43,7 @@ func (build *Accumulator) recordError(err error) { } func (build *Accumulator) prepare(res string, err error) *sql.Stmt { + log.Print("res: ", res) if err != nil { build.recordError(err) return nil diff --git a/query_gen/lib/mssql.go b/query_gen/lib/mssql.go index 0f9a0cdb..5182cd05 100644 --- a/query_gen/lib/mssql.go +++ b/query_gen/lib/mssql.go @@ -1076,6 +1076,16 @@ func (adapter *MssqlAdapter) Insert(nlist ...string) *insertPrebuilder { return &insertPrebuilder{name, "", "", "", adapter} } +func (adapter *MssqlAdapter) Update(nlist ...string) *updatePrebuilder { + name := optString(nlist, "_builder") + return &updatePrebuilder{name, "", "", "", adapter} +} + +func (adapter *MssqlAdapter) Delete(nlist ...string) *deletePrebuilder { + name := optString(nlist, "_builder") + return &deletePrebuilder{name, "", "", adapter} +} + func (adapter *MssqlAdapter) Write() error { var stmts, body string for _, name := range adapter.BufferOrder { diff --git a/query_gen/lib/mysql.go b/query_gen/lib/mysql.go index 5e41cbdd..92caeb01 100644 --- a/query_gen/lib/mysql.go +++ b/query_gen/lib/mysql.go @@ -562,6 +562,16 @@ func (adapter *MysqlAdapter) Insert(nlist ...string) *insertPrebuilder { return &insertPrebuilder{name, "", "", "", adapter} } +func (adapter *MysqlAdapter) Update(nlist ...string) *updatePrebuilder { + name := optString(nlist, "_builder") + return &updatePrebuilder{name, "", "", "", adapter} +} + +func (adapter *MysqlAdapter) Delete(nlist ...string) *deletePrebuilder { + name := optString(nlist, "_builder") + return &deletePrebuilder{name, "", "", adapter} +} + func (adapter *MysqlAdapter) Write() error { var stmts, body string for _, name := range adapter.BufferOrder { diff --git a/query_gen/lib/pgsql.go b/query_gen/lib/pgsql.go index 6d9952c5..b5b35ed8 100644 --- a/query_gen/lib/pgsql.go +++ b/query_gen/lib/pgsql.go @@ -328,6 +328,16 @@ func (adapter *PgsqlAdapter) Insert(nlist ...string) *insertPrebuilder { return &insertPrebuilder{name, "", "", "", adapter} } +func (adapter *PgsqlAdapter) Update(nlist ...string) *updatePrebuilder { + name := optString(nlist, "_builder") + return &updatePrebuilder{name, "", "", "", adapter} +} + +func (adapter *PgsqlAdapter) Delete(nlist ...string) *deletePrebuilder { + name := optString(nlist, "_builder") + return &deletePrebuilder{name, "", "", adapter} +} + func (adapter *PgsqlAdapter) Write() error { var stmts, body string for _, name := range adapter.BufferOrder { diff --git a/query_gen/lib/querygen.go b/query_gen/lib/querygen.go index 751a1a6a..7386f9b6 100644 --- a/query_gen/lib/querygen.go +++ b/query_gen/lib/querygen.go @@ -118,6 +118,9 @@ type Adapter interface { Select(name ...string) *selectPrebuilder Insert(name ...string) *insertPrebuilder + Update(name ...string) *updatePrebuilder + Delete(name ...string) *deletePrebuilder + Write() error } diff --git a/query_gen/lib/utils.go b/query_gen/lib/utils.go index 17138c0e..467bb327 100644 --- a/query_gen/lib/utils.go +++ b/query_gen/lib/utils.go @@ -93,6 +93,46 @@ func processJoiner(joinstr string) (joiner []DBJoiner) { return joiner } +func parseNumber(tmpWhere *DBWhere, segment string, i int) int { + var buffer string + for ; i < len(segment); i++ { + char := segment[i] + if '0' <= char && char <= '9' { + buffer += string(char) + } else { + i-- + tmpWhere.Expr = append(tmpWhere.Expr, DBToken{buffer, "number"}) + return i + } + } + return i +} + +func parseColumn(tmpWhere *DBWhere, segment string, i int) int { + var buffer string + for ; i < len(segment); i++ { + char := segment[i] + if ('a' <= char && char <= 'z') || ('A' <= char && char <= 'Z') || char == '.' || char == '_' { + buffer += string(char) + } else if char == '(' { + return parseFunction(tmpWhere, segment, buffer, i) + } else { + i-- + tmpWhere.Expr = append(tmpWhere.Expr, DBToken{buffer, "column"}) + return i + } + } + return i +} + +func parseFunction(tmpWhere *DBWhere, segment string, buffer string, i int) int { + var preI = i + i = skipFunctionCall(segment, i-1) + buffer += segment[preI:i] + string(segment[i]) + tmpWhere.Expr = append(tmpWhere.Expr, DBToken{buffer, "function"}) + return i +} + func processWhere(wherestr string) (where []DBWhere) { if wherestr == "" { return where @@ -102,20 +142,16 @@ func processWhere(wherestr string) (where []DBWhere) { 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 DBWhere + var tmpWhere = &DBWhere{[]DBToken{}} segment += ")" for i := 0; i < len(segment); i++ { char := segment[i] - //fmt.Println("optype", optype) switch optype { case 0: // unknown - //fmt.Println("case 0:", char, string(char)) if '0' <= char && char <= '9' { - optype = 1 - buffer = string(char) + i = parseNumber(tmpWhere, segment, i) } else if ('a' <= char && char <= 'z') || ('A' <= char && char <= 'Z') || char == '_' { - optype = 2 - buffer = string(char) + i = parseColumn(tmpWhere, segment, i) } else if char == '\'' { optype = 4 buffer = "" @@ -123,51 +159,13 @@ func processWhere(wherestr string) (where []DBWhere) { optype = 5 buffer = string(char) } else if char == '?' { - //fmt.Println("Expr:","?") tmpWhere.Expr = append(tmpWhere.Expr, DBToken{"?", "substitute"}) } - case 1: // number - if '0' <= char && char <= '9' { - buffer += string(char) - } else { - optype = 0 - i-- - //fmt.Println("Expr:",buffer) - tmpWhere.Expr = append(tmpWhere.Expr, DBToken{buffer, "number"}) - } - case 2: // column - if ('a' <= char && char <= 'z') || ('A' <= char && char <= 'Z') || char == '.' || char == '_' { - buffer += string(char) - } else if char == '(' { - optype = 3 - i-- - } else { - optype = 0 - i-- - //fmt.Println("Expr:", buffer) - tmpWhere.Expr = append(tmpWhere.Expr, DBToken{buffer, "column"}) - } - case 3: // function - var preI = i - //fmt.Println("buffer", buffer) - //fmt.Println("len(halves)", len(halves[1])) - //fmt.Println("preI", string(halves[1][preI])) - //fmt.Println("msg prior to preI", halves[1][0:preI]) - i = skipFunctionCall(segment, i-1) - //fmt.Println("i",i) - //fmt.Println("msg prior to i-1", halves[1][0:i-1]) - //fmt.Println("string(i-1)", string(halves[1][i-1])) - //fmt.Println("string(i)", string(halves[1][i])) - buffer += segment[preI:i] + string(segment[i]) - //fmt.Println("Expr:",buffer) - tmpWhere.Expr = append(tmpWhere.Expr, DBToken{buffer, "function"}) - optype = 0 case 4: // string if char != '\'' { buffer += string(char) } else { optype = 0 - //fmt.Println("Expr:",buffer) tmpWhere.Expr = append(tmpWhere.Expr, DBToken{buffer, "string"}) } case 5: // operator @@ -176,14 +174,13 @@ func processWhere(wherestr string) (where []DBWhere) { } else { optype = 0 i-- - //fmt.Println("Expr:",buffer) tmpWhere.Expr = append(tmpWhere.Expr, DBToken{buffer, "operator"}) } default: panic("Bad optype in processWhere") } } - where = append(where, tmpWhere) + where = append(where, *tmpWhere) } return where } @@ -222,13 +219,14 @@ func processSet(setstr string) (setter []DBSetter) { continue } tmpSetter.Column = strings.TrimSpace(halves[0]) + segment := halves[1] + ")" - halves[1] += ")" var optype int // 0: None, 1: Number, 2: Column, 3: Function, 4: String, 5: Operator - //fmt.Println("halves[1]",halves[1]) - for i := 0; i < len(halves[1]); i++ { - char := halves[1][i] + //fmt.Println("segment", segment) + for i := 0; i < len(segment); i++ { + char := segment[i] //fmt.Println("optype",optype) + //fmt.Println("Expr:",buffer) switch optype { case 0: // unknown if '0' <= char && char <= '9' { @@ -244,7 +242,6 @@ func processSet(setstr string) (setter []DBSetter) { optype = 5 buffer = string(char) } else if char == '?' { - //fmt.Println("Expr:","?") tmpSetter.Expr = append(tmpSetter.Expr, DBToken{"?", "substitute"}) } case 1: // number @@ -253,7 +250,6 @@ func processSet(setstr string) (setter []DBSetter) { } else { optype = 0 i-- - //fmt.Println("Expr:",buffer) tmpSetter.Expr = append(tmpSetter.Expr, DBToken{buffer, "number"}) } case 2: // column @@ -265,22 +261,12 @@ func processSet(setstr string) (setter []DBSetter) { } else { optype = 0 i-- - //fmt.Println("Expr:",buffer) tmpSetter.Expr = append(tmpSetter.Expr, DBToken{buffer, "column"}) } case 3: // function var preI = i - //fmt.Println("buffer",buffer) - //fmt.Println("len(halves)",len(halves[1])) - //fmt.Println("preI",string(halves[1][preI])) - //fmt.Println("msg prior to preI",halves[1][0:preI]) - i = skipFunctionCall(halves[1], i-1) - //fmt.Println("i",i) - //fmt.Println("msg prior to i-1",halves[1][0:i-1]) - //fmt.Println("string(i-1)",string(halves[1][i-1])) - //fmt.Println("string(i)",string(halves[1][i])) - buffer += halves[1][preI:i] + string(halves[1][i]) - //fmt.Println("Expr:",buffer) + i = skipFunctionCall(segment, i-1) + buffer += segment[preI:i] + string(segment[i]) tmpSetter.Expr = append(tmpSetter.Expr, DBToken{buffer, "function"}) optype = 0 case 4: // string @@ -288,7 +274,6 @@ func processSet(setstr string) (setter []DBSetter) { buffer += string(char) } else { optype = 0 - //fmt.Println("Expr:", buffer) tmpSetter.Expr = append(tmpSetter.Expr, DBToken{buffer, "string"}) } case 5: // operator @@ -297,7 +282,6 @@ func processSet(setstr string) (setter []DBSetter) { } else { optype = 0 i-- - //fmt.Println("Expr:", buffer) tmpSetter.Expr = append(tmpSetter.Expr, DBToken{buffer, "operator"}) } default: diff --git a/query_gen/main.go b/query_gen/main.go index 59556fef..aac90dc8 100644 --- a/query_gen/main.go +++ b/query_gen/main.go @@ -297,19 +297,19 @@ func writeInserts(adapter qgen.Adapter) error { adapter.Insert("notifyOne").Table("activity_stream_matches").Columns("watcher, asid").Fields("?,?").Parse() - adapter.SimpleInsert("addEmail", "emails", "email, uid, validated, token", "?,?,?,?") + adapter.Insert("addEmail").Table("emails").Columns("email, uid, validated, token").Fields("?,?,?,?").Parse() - adapter.SimpleInsert("addSubscription", "activity_subscriptions", "user, targetID, targetType, level", "?,?,?,2") + adapter.Insert("addSubscription").Table("activity_subscriptions").Columns("user, targetID, targetType, level").Fields("?,?,?,2").Parse() - adapter.SimpleInsert("addForumPermsToForum", "forums_permissions", "gid,fid,preset,permissions", "?,?,?,?") + adapter.Insert("addForumPermsToForum").Table("forums_permissions").Columns("gid,fid,preset,permissions").Fields("?,?,?,?").Parse() - adapter.SimpleInsert("addPlugin", "plugins", "uname, active, installed", "?,?,?") + adapter.Insert("addPlugin").Table("plugins").Columns("uname, active, installed").Fields("?,?,?").Parse() - adapter.SimpleInsert("addTheme", "themes", "uname, default", "?,?") + adapter.Insert("addTheme").Table("themes").Columns("uname, default").Fields("?,?").Parse() - adapter.SimpleInsert("addAttachment", "attachments", "sectionID, sectionTable, originID, originTable, uploadedBy, path", "?,?,?,?,?,?") + adapter.Insert("addAttachment").Table("attachments").Columns("sectionID, sectionTable, originID, originTable, uploadedBy, path").Fields("?,?,?,?,?,?").Parse() - adapter.SimpleInsert("createWordFilter", "word_filters", "find, replacement", "?,?") + adapter.Insert("createWordFilter").Table("word_filters").Columns("find, replacement").Fields("?,?").Parse() return nil } @@ -334,48 +334,48 @@ func writeReplaces(adapter qgen.Adapter) (err error) { }*/ func writeUpdates(adapter qgen.Adapter) error { - adapter.SimpleUpdate("editReply", "replies", "content = ?, parsed_content = ?", "rid = ?") + adapter.Update("editReply").Table("replies").Set("content = ?, parsed_content = ?").Where("rid = ?").Parse() - adapter.SimpleUpdate("editProfileReply", "users_replies", "content = ?, parsed_content = ?", "rid = ?") + adapter.Update("editProfileReply").Table("users_replies").Set("content = ?, parsed_content = ?").Where("rid = ?").Parse() - adapter.SimpleUpdate("updateSetting", "settings", "content = ?", "name = ?") + adapter.Update("updateSetting").Table("settings").Set("content = ?").Where("name = ?").Parse() - adapter.SimpleUpdate("updatePlugin", "plugins", "active = ?", "uname = ?") + adapter.Update("updatePlugin").Table("plugins").Set("active = ?").Where("uname = ?").Parse() - adapter.SimpleUpdate("updatePluginInstall", "plugins", "installed = ?", "uname = ?") + adapter.Update("updatePluginInstall").Table("plugins").Set("installed = ?").Where("uname = ?").Parse() - adapter.SimpleUpdate("updateTheme", "themes", "default = ?", "uname = ?") + adapter.Update("updateTheme").Table("themes").Set("default = ?").Where("uname = ?").Parse() - adapter.SimpleUpdate("updateForum", "forums", "name = ?, desc = ?, active = ?, preset = ?", "fid = ?") + adapter.Update("updateForum").Table("forums").Set("name = ?, desc = ?, active = ?, preset = ?").Where("fid = ?").Parse() - adapter.SimpleUpdate("updateUser", "users", "name = ?, email = ?, group = ?", "uid = ?") + adapter.Update("updateUser").Table("users").Set("name = ?, email = ?, group = ?").Where("uid = ?").Parse() - adapter.SimpleUpdate("updateGroupPerms", "users_groups", "permissions = ?", "gid = ?") + adapter.Update("updateGroupPerms").Table("users_groups").Set("permissions = ?").Where("gid = ?").Parse() - adapter.SimpleUpdate("updateGroup", "users_groups", "name = ?, tag = ?", "gid = ?") + adapter.Update("updateGroup").Table("users_groups").Set("name = ?, tag = ?").Where("gid = ?").Parse() - adapter.SimpleUpdate("updateEmail", "emails", "email = ?, uid = ?, validated = ?, token = ?", "email = ?") + adapter.Update("updateEmail").Table("emails").Set("email = ?, uid = ?, validated = ?, token = ?").Where("email = ?").Parse() - adapter.SimpleUpdate("verifyEmail", "emails", "validated = 1, token = ''", "email = ?") // Need to fix this: Empty string isn't working, it gets set to 1 instead x.x -- Has this been fixed? + adapter.Update("verifyEmail").Table("emails").Set("validated = 1, token = ''").Where("email = ?").Parse() // Need to fix this: Empty string isn't working, it gets set to 1 instead x.x -- Has this been fixed? - adapter.SimpleUpdate("setTempGroup", "users", "temp_group = ?", "uid = ?") + adapter.Update("setTempGroup").Table("users").Set("temp_group = ?").Where("uid = ?").Parse() - adapter.SimpleUpdate("updateWordFilter", "word_filters", "find = ?, replacement = ?", "wfid = ?") + adapter.Update("updateWordFilter").Table("word_filters").Set("find = ?, replacement = ?").Where("wfid = ?").Parse() - adapter.SimpleUpdate("bumpSync", "sync", "last_update = UTC_TIMESTAMP()", "") + adapter.Update("bumpSync").Table("sync").Set("last_update = UTC_TIMESTAMP()").Parse() return nil } func writeDeletes(adapter qgen.Adapter) error { - adapter.SimpleDelete("deleteProfileReply", "users_replies", "rid = ?") + adapter.Delete("deleteProfileReply").Table("users_replies").Where("rid = ?").Parse() - //adapter.SimpleDelete("deleteForumPermsByForum", "forums_permissions", "fid = ?") + //adapter.Delete("deleteForumPermsByForum").Table("forums_permissions").Where("fid = ?").Parse() - adapter.SimpleDelete("deleteActivityStreamMatch", "activity_stream_matches", "watcher = ? AND asid = ?") - //adapter.SimpleDelete("deleteActivityStreamMatchesByWatcher","activity_stream_matches","watcher = ?") + adapter.Delete("deleteActivityStreamMatch").Table("activity_stream_matches").Where("watcher = ? AND asid = ?").Parse() + //adapter.Delete("deleteActivityStreamMatchesByWatcher").Table("activity_stream_matches").Where("watcher = ?").Parse() - adapter.SimpleDelete("deleteWordFilter", "word_filters", "wfid = ?") + adapter.Delete("deleteWordFilter").Table("word_filters").Where("wfid = ?").Parse() return nil } diff --git a/router_gen/route_impl.go b/router_gen/route_impl.go index d79df0aa..d89f5d28 100644 --- a/router_gen/route_impl.go +++ b/router_gen/route_impl.go @@ -1,11 +1,10 @@ package main type RouteImpl struct { - Name string - Path string - Vars []string - MemberAction bool - RunBefore []Runnable + Name string + Path string + Vars []string + RunBefore []Runnable Parent *RouteGroup } @@ -35,10 +34,17 @@ func (route *RouteImpl) LitBefore(items ...string) *RouteImpl { func (route *RouteImpl) hasBefore(items ...string) bool { for _, item := range items { - for _, before := range route.RunBefore { - if before.Contents == item { - return true - } + if route.hasBeforeItem(item) { + return true + } + } + return false +} + +func (route *RouteImpl) hasBeforeItem(item string) bool { + for _, before := range route.RunBefore { + if before.Contents == item { + return true } } return false @@ -49,15 +55,19 @@ func addRouteGroup(routeGroup *RouteGroup) { } func blankRoute() *RouteImpl { - return &RouteImpl{"", "", []string{}, false, []Runnable{}, nil} + return &RouteImpl{"", "", []string{}, []Runnable{}, nil} +} + +func route(fname string, path string, args ...string) *RouteImpl { + return &RouteImpl{fname, path, args, []Runnable{}, nil} } func View(fname string, path string, args ...string) *RouteImpl { - return &RouteImpl{fname, path, args, false, []Runnable{}, nil} + return route(fname, path, args...) } func MemberView(fname string, path string, args ...string) *RouteImpl { - route := &RouteImpl{fname, path, args, false, []Runnable{}, nil} + route := route(fname, path, args...) if !route.hasBefore("SuperModOnly", "AdminOnly") { route.Before("MemberOnly") } @@ -65,7 +75,7 @@ func MemberView(fname string, path string, args ...string) *RouteImpl { } func ModView(fname string, path string, args ...string) *RouteImpl { - route := &RouteImpl{fname, path, args, false, []Runnable{}, nil} + route := route(fname, path, args...) if !route.hasBefore("AdminOnly") { route.Before("SuperModOnly") } @@ -73,7 +83,7 @@ func ModView(fname string, path string, args ...string) *RouteImpl { } func Action(fname string, path string, args ...string) *RouteImpl { - route := &RouteImpl{fname, path, args, true, []Runnable{}, nil} + route := route(fname, path, args...) route.Before("NoSessionMismatch") if !route.hasBefore("SuperModOnly", "AdminOnly") { route.Before("MemberOnly") @@ -82,13 +92,11 @@ func Action(fname string, path string, args ...string) *RouteImpl { } func AnonAction(fname string, path string, args ...string) *RouteImpl { - route := &RouteImpl{fname, path, args, false, []Runnable{}, nil} - route.Before("ParseForm") - return route + return route(fname, path, args...).Before("ParseForm") } func UploadAction(fname string, path string, args ...string) *RouteImpl { - route := &RouteImpl{fname, path, args, true, []Runnable{}, nil} + route := route(fname, path, args...) if !route.hasBefore("SuperModOnly", "AdminOnly") { route.Before("MemberOnly") } diff --git a/template_list.go b/template_list.go index 5676da27..1a7c456d 100644 --- a/template_list.go +++ b/template_list.go @@ -505,16 +505,18 @@ var profile_0 = []byte(`

Profile

-->
-
- +
+ -
-
- `) +
+
+ `) var profile_2 = []byte(``) var profile_3 = []byte(``) var profile_4 = []byte(``) var profile_5 = []byte(` +
diff --git a/themes/cosora/public/main.css b/themes/cosora/public/main.css index 7af25e9f..038fff9e 100644 --- a/themes/cosora/public/main.css +++ b/themes/cosora/public/main.css @@ -45,10 +45,14 @@ a { padding-top: 14px; display: flex; /*background-color: hsl(0,0%,97%);*/ + padding-left: 0px; + padding-right: 0px; } #main { width: 100%; + padding-left: 8px; + padding-right: 8px; } .sidebar { width: 200px; @@ -750,8 +754,19 @@ select, input, textarea { } .footer { - border: 1px solid var(--element-border-color); - border-bottom: 2px solid var(--element-border-color); + border-top: 1px solid var(--element-border-color); + padding: 12px; + padding-top: 10px; + padding-bottom: 10px; + margin-top: 14px; + margin-left: -8px; + margin-right: -8px; +} +.footer #poweredBy { + font-size: 17px; +} +.footer #poweredBy span { + font-size: 16px; } @media(max-width: 670px) {