From f102c97606c51ea2a57affc9155017302d7d0993 Mon Sep 17 00:00:00 2001 From: Azareal Date: Sun, 22 Apr 2018 15:27:04 +0100 Subject: [PATCH] The patcher can now update the schema for MySQL. Added the adapter config value, to be used in the main system soon. Commented out the debug code for the menus. We're pushing some schema changes in this commit, so we'll see how well the patcher goes and whether it'll need to be patched. --- common/menus.go | 48 ++++++++--------- common/site.go | 2 + common/widgets.go | 4 -- dev-update-linux | 4 ++ dev-update.bat | 3 ++ install/install.go | 10 ++-- mysql.go | 3 +- patcher/common/filler.txt | 1 + patcher/main.go | 108 +++++++++++++++++++++++++++++++++++++- 9 files changed, 147 insertions(+), 36 deletions(-) create mode 100644 patcher/common/filler.txt diff --git a/common/menus.go b/common/menus.go index 2dffd39d..8fb73745 100644 --- a/common/menus.go +++ b/common/menus.go @@ -110,9 +110,9 @@ func (hold *MenuListHolder) Preparse() error { var addVariation = func(index int, callback func(mitem MenuItem) bool) { renderBuffer, variableIndices := hold.Scan(tmpls, callback) hold.Variations[index] = menuTmpl{renderBuffer, variableIndices} - fmt.Print("renderBuffer: ") - menuDumpSlice(renderBuffer) - fmt.Printf("\nvariableIndices: %+v\n", variableIndices) + //fmt.Print("renderBuffer: ") + //menuDumpSlice(renderBuffer) + //fmt.Printf("\nvariableIndices: %+v\n", variableIndices) } // Guest Menu @@ -243,12 +243,12 @@ func (hold *MenuListHolder) Parse(name string, tmplData []byte) (menuTmpl MenuTm renderList = append(renderList, menuRenderItem{0, len(textBuffer) - 1}) } - fmt.Println("name: ", name) - fmt.Print("textBuffer: ") - menuDumpSlice(textBuffer) - fmt.Print("\nvariableBuffer: ") - menuDumpSlice(variableBuffer) - fmt.Printf("\nrenderList: %+v\n", renderList) + //fmt.Println("name: ", name) + //fmt.Print("textBuffer: ") + //menuDumpSlice(textBuffer) + //fmt.Print("\nvariableBuffer: ") + //menuDumpSlice(variableBuffer) + //fmt.Printf("\nrenderList: %+v\n", renderList) return MenuTmpl{name, textBuffer, variableBuffer, renderList} } @@ -263,7 +263,7 @@ func (hold *MenuListHolder) Scan(menuTmpls map[string]MenuTmpl, showItem func(mi if !ok { menuTmpl = menuTmpls["menu_item"] } - fmt.Println("menuTmpl: ", menuTmpl) + //fmt.Println("menuTmpl: ", menuTmpl) for _, renderItem := range menuTmpl.RenderList { if renderItem.Type == 0 { renderBuffer = append(renderBuffer, menuTmpl.TextBuffer[renderItem.Index]) @@ -271,15 +271,15 @@ func (hold *MenuListHolder) Scan(menuTmpls map[string]MenuTmpl, showItem func(mi } variable := menuTmpl.VariableBuffer[renderItem.Index] - fmt.Println("initial variable: ", string(variable)) + //fmt.Println("initial variable: ", string(variable)) dotAt, hasDot := skipUntilIfExists(variable, 0, '.') if !hasDot { - fmt.Println("no dot") + //fmt.Println("no dot") continue } if bytes.Equal(variable[:dotAt], []byte("lang")) { - fmt.Println("lang: ", string(bytes.TrimPrefix(variable[dotAt:], []byte(".")))) + //fmt.Println("lang: ", string(bytes.TrimPrefix(variable[dotAt:], []byte(".")))) renderBuffer = append(renderBuffer, []byte(GetTmplPhrase(string(bytes.TrimPrefix(variable[dotAt:], []byte(".")))))) } else { var renderItem []byte @@ -300,7 +300,7 @@ func (hold *MenuListHolder) Scan(menuTmpls map[string]MenuTmpl, showItem func(mi _, hasInnerVar := skipUntilIfExists(renderItem, 0, '{') if hasInnerVar { - fmt.Println("inner var: ", string(renderItem)) + //fmt.Println("inner var: ", string(renderItem)) dotAt, hasDot := skipUntilIfExists(renderItem, 0, '.') endFence, hasEndFence := skipUntilIfExists(renderItem, dotAt, '}') if !hasDot || !hasEndFence || (endFence-dotAt) <= 1 { @@ -310,10 +310,10 @@ func (hold *MenuListHolder) Scan(menuTmpls map[string]MenuTmpl, showItem func(mi } if bytes.Equal(renderItem[1:dotAt], []byte("lang")) { - fmt.Println("lang var: ", string(renderItem[dotAt+1:endFence])) + //fmt.Println("lang var: ", string(renderItem[dotAt+1:endFence])) renderBuffer = append(renderBuffer, []byte(GetTmplPhrase(string(renderItem[dotAt+1:endFence])))) } else { - fmt.Println("other var: ", string(variable[:dotAt])) + //fmt.Println("other var: ", string(variable[:dotAt])) if len(renderItem) > 0 { renderBuffer = append(renderBuffer, renderItem) variableIndices = append(variableIndices, len(renderBuffer)-1) @@ -322,7 +322,7 @@ func (hold *MenuListHolder) Scan(menuTmpls map[string]MenuTmpl, showItem func(mi continue } - fmt.Println("normal var: ", string(variable[:dotAt])) + //fmt.Println("normal var: ", string(variable[:dotAt])) if len(renderItem) > 0 { renderBuffer = append(renderBuffer, renderItem) } @@ -347,9 +347,9 @@ func (hold *MenuListHolder) Build(w io.Writer, user *User) error { } if len(mTmpl.VariableIndices) == 0 { - fmt.Println("no variable indices") + //fmt.Println("no variable indices") for _, renderItem := range mTmpl.RenderBuffer { - fmt.Printf("renderItem: %+v\n", renderItem) + //fmt.Printf("renderItem: %+v\n", renderItem) w.Write(renderItem) } return nil @@ -358,12 +358,12 @@ func (hold *MenuListHolder) Build(w io.Writer, user *User) error { var nearIndex = 0 for index, renderItem := range mTmpl.RenderBuffer { if index != mTmpl.VariableIndices[nearIndex] { - fmt.Println("wrote text: ", string(renderItem)) + //fmt.Println("wrote text: ", string(renderItem)) w.Write(renderItem) continue } - fmt.Println("variable: ", string(renderItem)) + //fmt.Println("variable: ", string(renderItem)) variable := renderItem // ? - I can probably remove this check now that I've kicked it upstream, or we could keep it here for safety's sake? if len(variable) == 0 { @@ -386,7 +386,7 @@ func (hold *MenuListHolder) Build(w io.Writer, user *User) error { continue } if bytes.Equal(variable[fenceStart:dotAt], []byte("me")) { - fmt.Println("maybe me variable") + //fmt.Println("maybe me variable") w.Write(variable[prevIndex:fenceStart]) switch string(variable[dotAt:fenceEnd]) { case "Link": @@ -397,8 +397,8 @@ func (hold *MenuListHolder) Build(w io.Writer, user *User) error { prevIndex = fenceEnd } } - fmt.Println("prevIndex: ", prevIndex) - fmt.Println("len(variable)-1: ", len(variable)-1) + //fmt.Println("prevIndex: ", prevIndex) + //fmt.Println("len(variable)-1: ", len(variable)-1) w.Write(variable[prevIndex : len(variable)-1]) if len(mTmpl.VariableIndices) > (nearIndex + 1) { nearIndex++ diff --git a/common/site.go b/common/site.go index 554b2a92..22b237c5 100644 --- a/common/site.go +++ b/common/site.go @@ -32,6 +32,7 @@ type site struct { type dbConfig struct { // Production database + Adapter string Host string Username string Password string @@ -39,6 +40,7 @@ type dbConfig struct { Port string // Test database. Split this into a separate variable? + TestAdapter string TestHost string TestUsername string TestPassword string diff --git a/common/widgets.go b/common/widgets.go index 55d6f854..22818b0b 100644 --- a/common/widgets.go +++ b/common/widgets.go @@ -5,7 +5,6 @@ import ( "bytes" "database/sql" "encoding/json" - "fmt" "html/template" "strings" "sync" @@ -128,18 +127,15 @@ func BuildWidget(dock string, header *Header) (sbody string) { return sbody } - fmt.Println("dock: ", dock) switch dock { case "leftOfNav": widgets = Docks.LeftOfNav case "rightOfNav": widgets = Docks.RightOfNav case "topMenu": - fmt.Println("topMenu") // 1 = id for the default menu mhold := Menus.Get(1) if mhold != nil { - fmt.Println("header.Writer: ", header.Writer) err := mhold.Build(header.Writer, &header.CurrentUser) if err != nil { LogError(err) diff --git a/dev-update-linux b/dev-update-linux index 84eabc6a..60d18289 100644 --- a/dev-update-linux +++ b/dev-update-linux @@ -40,6 +40,10 @@ cp ./schema/schema.json ./schema/lastSchema.json git pull origin master echo "Patching Gosora" +rm ./patcher/config.go +cp ./config.go ./patcher/config.go +rm ./patcher/common/site.go +cp ./common/site.go ./patcher/common/site.go cd ./patcher go generate go build -o Patcher diff --git a/dev-update.bat b/dev-update.bat index ef4ebb5e..662758e4 100644 --- a/dev-update.bat +++ b/dev-update.bat @@ -109,6 +109,9 @@ if %errorlevel% neq 0 ( ) echo Patching Gosora +rem Temporary hack until we switch to JSON or TOML for config files +copy ./config.go ./patcher/config.go +copy ./common/site.go ./patcher/common/site.go go generate go build ./patcher patcher.exe \ No newline at end of file diff --git a/install/install.go b/install/install.go index 2ae1629b..47a7459a 100644 --- a/install/install.go +++ b/install/install.go @@ -114,6 +114,7 @@ func init() { common.Site.Language = "english" // Database details + common.DbConfig.Adapter = "` + adap.Name() + `" common.DbConfig.Host = "` + adap.DBHost() + `" common.DbConfig.Username = "` + adap.DBUsername() + `" common.DbConfig.Password = "` + adap.DBPassword() + `" @@ -121,10 +122,11 @@ func init() { common.DbConfig.Port = "` + adap.DBPort() + `" // You probably won't need to change this // Test Database details - common.DbConfig.TestHost = "" - common.DbConfig.TestUsername = "" - common.DbConfig.TestPassword = "" - common.DbConfig.TestDbname = "" // The name of the test database, leave blank to disable. DON'T USE YOUR PRODUCTION DATABASE FOR THIS. LEAVE BLANK IF YOU DON'T KNOW WHAT THIS MEANS. + common.DbConfig.TestAdapter = "` + adap.Name() + `" + common.DbConfig.TestHost = "" + common.DbConfig.TestUsername = "" + common.DbConfig.TestPassword = "" + common.DbConfig.TestDbname = "" // The name of the test database, leave blank to disable. DON'T USE YOUR PRODUCTION DATABASE FOR THIS. LEAVE BLANK IF YOU DON'T KNOW WHAT THIS MEANS. common.DbConfig.TestPort = "" // Limiters diff --git a/mysql.go b/mysql.go index 96998b06..81cd0e0f 100644 --- a/mysql.go +++ b/mysql.go @@ -3,7 +3,7 @@ /* * * Gosora MySQL Interface -* Copyright Azareal 2016 - 2018 +* Copyright Azareal 2016 - 2019 * */ package main @@ -51,7 +51,6 @@ func initMySQL() (err error) { } // Ready the query builder - qgen.Builder.SetConn(db) err = qgen.Builder.SetAdapter("mysql") if err != nil { return err diff --git a/patcher/common/filler.txt b/patcher/common/filler.txt new file mode 100644 index 00000000..20e14b1e --- /dev/null +++ b/patcher/common/filler.txt @@ -0,0 +1 @@ +This file is here so that Git will include this folder in the repository. \ No newline at end of file diff --git a/patcher/main.go b/patcher/main.go index 1c79a93c..982810a9 100644 --- a/patcher/main.go +++ b/patcher/main.go @@ -4,12 +4,17 @@ import ( "bufio" "database/sql" "fmt" + "log" "os" "runtime/debug" "../query_gen/lib" + "./common" + _ "github.com/go-sql-driver/mysql" ) +var db *sql.DB + func main() { scanner := bufio.NewScanner(os.Stdin) @@ -24,9 +29,27 @@ func main() { } }() - err := patcher(scanner) + if common.DbConfig != "mysql" && common.DbConfig != "" { + log.Fatal("Only MySQL is supported for upgrades right now, please wait for a newer build of the patcher") + } + + err := prepMySQL() if err != nil { - fmt.Println(err) + log.Fatal(err) + } + + err = patcher(scanner) + if err != nil { + log.Fatal(err) + } + + err = os.Remove("./patcher/config.go") + if err != nil { + log.Fatal(err) + } + err = os.Remove("./patcher/common/site.go") + if err != nil { + log.Fatal(err) } } @@ -38,7 +61,88 @@ func pressAnyKey(scanner *bufio.Scanner) { } } +func prepMySQL() error { + err := qgen.Builder.Init("mysql", map[string]string{ + "host": common.DbConfig.Host, + "port": common.DbConfig.Port, + "name": common.DbConfig.Dbname, + "username": common.DbConfig.Username, + "password": common.DbConfig.Password, + "collation": "utf8mb4_general_ci", + }) + if err != nil { + return err + } + + // Ready the query builder + db = qgen.Builder.GetConn() + return qgen.Builder.SetAdapter("mysql") +} + +func execStmt(stmt *sql.Stmt, err error) error { + if err != nil { + return err + } + _, err = stmt.Exec() + return err +} + func patcher(scanner *bufio.Scanner) error { + err := execStmt(qgen.Builder.CreateTable("menus", "", "", + []qgen.DBTableColumn{ + qgen.DBTableColumn{"mid", "int", 0, false, true, ""}, + }, + []qgen.DBTableKey{ + qgen.DBTableKey{"mid", "primary"}, + }, + )) + if err != nil { + return err + } + + err = execStmt(qgen.Builder.CreateTable("menu_items", "", "", + []qgen.DBTableColumn{ + qgen.DBTableColumn{"mid", "int", 0, false, false, ""}, + qgen.DBTableColumn{"htmlID", "varchar", 200, false, false, "''"}, + qgen.DBTableColumn{"cssClass", "varchar", 200, false, false, "''"}, + qgen.DBTableColumn{"position", "varchar", 100, false, false, ""}, + qgen.DBTableColumn{"path", "varchar", 200, false, false, "''"}, + qgen.DBTableColumn{"aria", "varchar", 200, false, false, "''"}, + qgen.DBTableColumn{"tooltip", "varchar", 200, false, false, "''"}, + qgen.DBTableColumn{"tmplName", "varchar", 200, false, false, "''"}, + qgen.DBTableColumn{"order", "int", 0, false, false, "0"}, + + qgen.DBTableColumn{"guestOnly", "boolean", 0, false, false, "0"}, + qgen.DBTableColumn{"memberOnly", "boolean", 0, false, false, "0"}, + qgen.DBTableColumn{"staffOnly", "boolean", 0, false, false, "0"}, + qgen.DBTableColumn{"adminOnly", "boolean", 0, false, false, "0"}, + }, + []qgen.DBTableKey{}, + )) + if err != nil { + return err + } + + err = execStmt(qgen.Builder.SimpleInsert("menus", "", "")) + if err != nil { + return err + } + + err = execStmt(qgen.Builder.SimpleInsert("menu_items", "mid, htmlID, position, path, aria, tooltip, order", "1,'menu_forums','left','/forums/','{lang.menu_forums_aria}','{lang.menu_forums_tooltip}',0")) + if err != nil { + return err + } + + err = execStmt(qgen.Builder.SimpleInsert("menu_items", "mid, htmlID, cssClass, position, path, aria, tooltip, order", "1,'menu_topics','menu_topics','left','/topics/','{lang.menu_topics_aria}','{lang.menu_topics_tooltip}',1")) + if err != nil { + return err + } + + stmt, err = execStmt(qgen.Builder.SimpleInsert("menu_items", "mid, htmlID, cssClass, position, tmplName, order", "1,'general_alerts','menu_alerts','right','menu_alerts',2")) + if err != nil { + return err + } + return nil }