diff --git a/gen_mysql.go b/gen_mysql.go index faa0d447..285659e5 100644 --- a/gen_mysql.go +++ b/gen_mysql.go @@ -11,6 +11,11 @@ var get_reply_stmt *sql.Stmt var login_stmt *sql.Stmt var get_password_stmt *sql.Stmt var username_exists_stmt *sql.Stmt +var get_settings_stmt *sql.Stmt +var get_setting_stmt *sql.Stmt +var get_full_setting_stmt *sql.Stmt +var is_plugin_active_stmt *sql.Stmt +var get_topic_list_stmt *sql.Stmt func gen_mysql() (err error) { if debug { @@ -18,43 +23,73 @@ func gen_mysql() (err error) { } log.Print("Preparing get_user statement.") - get_user_stmt, err = db.Prepare("SELECT `name`,`group`,`is_super_admin`,`avatar`,`message`,`url_prefix`,`url_name`,`level` FROM users WHERE `uid`= ?") + get_user_stmt, err = db.Prepare("SELECT `name`,`group`,`is_super_admin`,`avatar`,`message`,`url_prefix`,`url_name`,`level` FROM users WHERE `uid` = ?") if err != nil { return err } log.Print("Preparing get_full_user statement.") - get_full_user_stmt, err = db.Prepare("SELECT `name`,`group`,`is_super_admin`,`session`,`email`,`avatar`,`message`,`url_prefix`,`url_name`,`level`,`score`,`last_ip` FROM users WHERE `uid`= ?") + get_full_user_stmt, err = db.Prepare("SELECT `name`,`group`,`is_super_admin`,`session`,`email`,`avatar`,`message`,`url_prefix`,`url_name`,`level`,`score`,`last_ip` FROM users WHERE `uid` = ?") if err != nil { return err } log.Print("Preparing get_topic statement.") - get_topic_stmt, err = db.Prepare("SELECT `title`,`content`,`createdBy`,`createdAt`,`is_closed`,`sticky`,`parentID`,`ipaddress`,`postCount`,`likeCount` FROM topics WHERE `tid`= ?") + get_topic_stmt, err = db.Prepare("SELECT `title`,`content`,`createdBy`,`createdAt`,`is_closed`,`sticky`,`parentID`,`ipaddress`,`postCount`,`likeCount` FROM topics WHERE `tid` = ?") if err != nil { return err } log.Print("Preparing get_reply statement.") - get_reply_stmt, err = db.Prepare("SELECT `content`,`createdBy`,`createdAt`,`lastEdit`,`lastEditBy`,`ipaddress`,`likeCount` FROM replies WHERE `rid`= ?") + get_reply_stmt, err = db.Prepare("SELECT `content`,`createdBy`,`createdAt`,`lastEdit`,`lastEditBy`,`ipaddress`,`likeCount` FROM replies WHERE `rid` = ?") if err != nil { return err } log.Print("Preparing login statement.") - login_stmt, err = db.Prepare("SELECT `uid`,`name`,`password`,`salt` FROM users WHERE `name`= ?") + login_stmt, err = db.Prepare("SELECT `uid`,`name`,`password`,`salt` FROM users WHERE `name` = ?") if err != nil { return err } log.Print("Preparing get_password statement.") - get_password_stmt, err = db.Prepare("SELECT `password`,`salt` FROM users WHERE `uid`= ?") + get_password_stmt, err = db.Prepare("SELECT `password`,`salt` FROM users WHERE `uid` = ?") if err != nil { return err } log.Print("Preparing username_exists statement.") - username_exists_stmt, err = db.Prepare("SELECT `name` FROM users WHERE `name`= ?") + username_exists_stmt, err = db.Prepare("SELECT `name` FROM users WHERE `name` = ?") + if err != nil { + return err + } + + log.Print("Preparing get_settings statement.") + get_settings_stmt, err = db.Prepare("SELECT `name`,`content`,`type` FROM settings") + if err != nil { + return err + } + + log.Print("Preparing get_setting statement.") + get_setting_stmt, err = db.Prepare("SELECT `content`,`type` FROM settings WHERE `name` = ?") + if err != nil { + return err + } + + log.Print("Preparing get_full_setting statement.") + get_full_setting_stmt, err = db.Prepare("SELECT `name`,`type`,`constraints` FROM settings WHERE `name` = ?") + if err != nil { + return err + } + + log.Print("Preparing is_plugin_active statement.") + is_plugin_active_stmt, err = db.Prepare("SELECT `active` FROM plugins WHERE `uname` = ?") + if err != nil { + return err + } + + log.Print("Preparing get_topic_list statement.") + get_topic_list_stmt, err = db.Prepare("SELECT `topics`.`tid`,`topics`.`title`,`topics`.`content`,`topics`.`createdBy`,`topics`.`is_closed`,`topics`.`sticky`,`topics`.`createdAt`,`topics`.`parentID`,`users`.`name`,`users`.`avatar` FROM topics LEFT JOIN users ON `topics`.`createdBy`=`users`.`uid` ORDER BY topics.sticky DESC,topics.lastReplyAt DESC,topics.createdBy DESC") if err != nil { return err } diff --git a/install/install.go b/install/install.go index ebfd1248..1ba99948 100644 --- a/install/install.go +++ b/install/install.go @@ -1,25 +1,22 @@ /* Copyright Azareal 2017 - 2018 */ package main -import "fmt" -import "os" -import "bytes" -import "bufio" -import "strconv" -import "io/ioutil" -import "database/sql" -import _ "github.com/go-sql-driver/mysql" +import ( + "fmt" + "os" + "bytes" + "bufio" + "strconv" + "io/ioutil" + "database/sql" + _ "github.com/go-sql-driver/mysql" +) var scanner *bufio.Scanner -var db_host string -var db_username string -var db_password string -var db_name string +var db_host, db_username, db_password, db_name string //var db_collation string = "utf8mb4_general_ci" var db_port string = "3306" -var site_name string -var site_url string -var server_port string +var site_name, site_url, server_port string var default_host string = "localhost" var default_username string = "root" @@ -43,7 +40,7 @@ func main() { press_any_key() return } - + if !get_site_details() { err := scanner.Err() if err != nil { @@ -55,7 +52,7 @@ func main() { press_any_key() return } - + _db_password := db_password if(_db_password != ""){ _db_password = ":" + _db_password @@ -67,7 +64,7 @@ func main() { press_any_key() return } - + // Make sure that the connection is alive.. err = db.Ping() if err != nil { @@ -79,14 +76,14 @@ func main() { fmt.Println("Successfully connected to the database") fmt.Println("Opening the database seed file") - sqlContents, err := ioutil.ReadFile("./data.sql") + sqlContents, err := ioutil.ReadFile("./mysql.sql") if err != nil { fmt.Println(err) fmt.Println("Aborting installation...") press_any_key() return } - + var waste string err = db.QueryRow("SHOW DATABASES LIKE '" + db_name + "'").Scan(&waste) if err != nil && err != sql.ErrNoRows { @@ -95,7 +92,7 @@ func main() { press_any_key() return } - + if err == sql.ErrNoRows { fmt.Println("Unable to find the database. Attempting to create it") _,err = db.Exec("CREATE DATABASE IF NOT EXISTS " + db_name + "") @@ -107,7 +104,7 @@ func main() { } fmt.Println("The database was successfully created") } - + fmt.Println("Switching to database " + db_name) _, err = db.Exec("USE " + db_name) if err != nil { @@ -116,7 +113,7 @@ func main() { press_any_key() return } - + fmt.Println("Preparing installation queries") sqlContents = bytes.TrimSpace(sqlContents) statements := bytes.Split(sqlContents, []byte(";")) @@ -124,7 +121,7 @@ func main() { if len(statement) == 0 { continue } - + fmt.Println("Executing query #" + strconv.Itoa(key) + " " + string(statement)) _, err = db.Exec(string(statement)) if err != nil { @@ -135,7 +132,7 @@ func main() { } } fmt.Println("Finished inserting the database data") - + configContents := []byte(`package main // Site Info @@ -186,7 +183,7 @@ var debug = true var super_debug = false var profiling = false `) - + fmt.Println("Opening the configuration file") configFile, err := os.Create("./config.go") if err != nil { @@ -195,7 +192,7 @@ var profiling = false press_any_key() return } - + fmt.Println("Writing to the configuration file...") _, err = configFile.Write(configContents) if err != nil { @@ -204,11 +201,11 @@ var profiling = false press_any_key() return } - + configFile.Sync() configFile.Close() fmt.Println("Finished writing to the configuration file") - + fmt.Println("Yay, you have successfully installed Gosora!") fmt.Println("Your name is Admin and you can login with the password 'password'. Don't forget to change it! Seriously. It's really insecure.") press_any_key() @@ -224,7 +221,7 @@ func get_database_details() bool { db_host = default_host } fmt.Println("Set database host to " + db_host) - + fmt.Println("Database Username? Default: " + default_username) if !scanner.Scan() { return false @@ -234,7 +231,7 @@ func get_database_details() bool { db_username = default_username } fmt.Println("Set database username to " + db_username) - + fmt.Println("Database Password? Default: ''") if !scanner.Scan() { return false @@ -245,7 +242,7 @@ func get_database_details() bool { } else { fmt.Println("Set password to " + obfuscate_password(db_password)) } - + fmt.Println("Database Name? Pick a name you like or one provided to you. Default: " + default_dbname) if !scanner.Scan() { return false @@ -269,7 +266,7 @@ func get_site_details() bool { site_name = default_site_name } fmt.Println("Set the site name to " + site_name) - + fmt.Println("What's your site's url? Default: " + default_site_url) if !scanner.Scan() { return false @@ -279,7 +276,7 @@ func get_site_details() bool { site_url = default_site_url } fmt.Println("Set the site url to " + site_url) - + fmt.Println("What port do you want the server to listen on? If you don't know what this means, you should probably leave it on the default. Default: " + default_server_port) if !scanner.Scan() { return false @@ -311,4 +308,4 @@ func press_any_key() { _ = scanner.Text() return } -} \ No newline at end of file +} diff --git a/mysql.go b/mysql.go index 3a447c0c..6d30528b 100644 --- a/mysql.go +++ b/mysql.go @@ -12,7 +12,6 @@ var db *sql.DB var db_version string var db_collation string = "utf8mb4_general_ci" -var get_topic_list_stmt *sql.Stmt var get_topic_user_stmt *sql.Stmt var get_topic_by_reply_stmt *sql.Stmt var get_topic_replies_stmt *sql.Stmt @@ -119,12 +118,6 @@ func init_database() (err error) { return err } - log.Print("Preparing get_topic_list statement.") - get_topic_list_stmt, err = db.Prepare("select topics.tid, topics.title, topics.content, topics.createdBy, topics.is_closed, topics.sticky, topics.createdAt, topics.parentID, users.name, users.avatar from topics left join users ON topics.createdBy = users.uid order by topics.sticky DESC, topics.lastReplyAt DESC, topics.createdBy DESC") - if err != nil { - return err - } - log.Print("Preparing get_topic_user statement.") get_topic_user_stmt, err = db.Prepare("select topics.title, topics.content, topics.createdBy, topics.createdAt, topics.is_closed, topics.sticky, topics.parentID, topics.ipaddress, topics.postCount, topics.likeCount, users.name, users.avatar, users.group, users.url_prefix, users.url_name, users.level from topics left join users ON topics.createdBy = users.uid where tid = ?") if err != nil { diff --git a/data.sql b/mysql.sql similarity index 99% rename from data.sql rename to mysql.sql index 33b5169c..a023ae4f 100644 --- a/data.sql +++ b/mysql.sql @@ -62,7 +62,8 @@ CREATE TABLE `forums_permissions`( `fid` int not null, `gid` int not null, `preset` varchar(100) DEFAULT '' not null, - `permissions` text not null + `permissions` text not null, + primary key(fid, gid) ); CREATE TABLE `topics`( diff --git a/panel_routes.go b/panel_routes.go index cc9b7295..36bdb3b7 100644 --- a/panel_routes.go +++ b/panel_routes.go @@ -471,7 +471,7 @@ func route_panel_forums_edit_perms_submit(w http.ResponseWriter, r *http.Request return } - gid, err := strconv.Atoi("gid") + gid, err := strconv.Atoi(r.PostFormValue("gid")) if err != nil { LocalErrorJSQ("Invalid Group ID",w,r,user,is_js) return @@ -496,6 +496,13 @@ func route_panel_forums_edit_perms_submit(w http.ResponseWriter, r *http.Request return } permupdate_mutex.Unlock() + + _, err = update_forum_stmt.Exec(forums[fid].Name,forums[fid].Desc,forums[fid].Active,"",fid) + if err != nil { + InternalErrorJSQ(err,w,r,is_js) + return + } + forums[fid].Preset = "" } if is_js == "0" { @@ -516,7 +523,7 @@ func route_panel_settings(w http.ResponseWriter, r *http.Request){ } var settingList map[string]interface{} = make(map[string]interface{}) - rows, err := db.Query("select name, content, type from settings") + rows, err := get_settings_stmt.Query() if err != nil { InternalError(err,w,r) return @@ -570,7 +577,7 @@ func route_panel_setting(w http.ResponseWriter, r *http.Request, sname string){ } setting := Setting{sname,"","",""} - err := db.QueryRow("select content, type from settings where name = ?", setting.Name).Scan(&setting.Content,&setting.Type) + err := get_setting_stmt.QueryRow(setting.Name).Scan(&setting.Content,&setting.Type) if err == sql.ErrNoRows { LocalError("The setting you want to edit doesn't exist.",w,r,user) return @@ -627,11 +634,10 @@ func route_panel_setting_edit(w http.ResponseWriter, r *http.Request, sname stri return } - var stype string - var sconstraints string + var stype, sconstraints string scontent := r.PostFormValue("setting-value") - err = db.QueryRow("select name, type, constraints from settings where name = ?", sname).Scan(&sname, &stype, &sconstraints) + err = get_full_setting_stmt.QueryRow(sname).Scan(&sname, &stype, &sconstraints) if err == sql.ErrNoRows { LocalError("The setting you want to edit doesn't exist.",w,r,user) return @@ -702,7 +708,7 @@ func route_panel_plugins_activate(w http.ResponseWriter, r *http.Request, uname } var active bool - err := db.QueryRow("select active from plugins where uname = ?", uname).Scan(&active) + err := is_plugin_active_stmt.QueryRow(uname).Scan(&active) if err != nil && err != sql.ErrNoRows { InternalError(err,w,r) return diff --git a/public/global.js b/public/global.js index c698472f..357dc1b6 100644 --- a/public/global.js +++ b/public/global.js @@ -36,16 +36,12 @@ function load_alerts(menu_alerts) } } - if(mmsg.length > 46) mmsg = mmsg.substring(0,43) + "..."; - else if(mmsg.length > 35) size_dial = " smaller"; //9px - else size_dial = ""; // 10px - if("avatar" in msg) { - alist += "
"+mmsg+"
"; + alist += "
"+mmsg+"
"; anyAvatar = true } - else alist += "
"+mmsg+"
"; + else alist += "
"+mmsg+"
"; //console.log(msg); //console.log(mmsg); } @@ -219,6 +215,7 @@ $(document).ready(function(){ var block_parent = $(this).closest('.editable_parent'); //console.log(block_parent); block_parent.find('.hide_on_edit').hide(); + block_parent.find('.show_on_edit').show(); block_parent.find('.editable_block').show(); block_parent.find('.editable_block').each(function(){ var field_name = this.getAttribute("data-field"); @@ -246,7 +243,6 @@ $(document).ready(function(){ else if(field_type=="hidden") {} else this.innerHTML = ""; }); - block_parent.find('.show_on_edit').eq(0).show(); // Remove any handlers already attached to the submitter $(".submit_edit").unbind("click"); diff --git a/query_gen/main.go b/query_gen/main.go index 8839f14e..45598d42 100644 --- a/query_gen/main.go +++ b/query_gen/main.go @@ -1,7 +1,7 @@ /* WIP Under Construction */ package main -import "fmt" +//import "fmt" import "strings" import "log" import "os" @@ -9,6 +9,14 @@ import "os" var db_registry []DB_Adapter var blank_order []DB_Order +type DB_Column 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_Where struct { Left string @@ -20,8 +28,10 @@ type DB_Where struct type DB_Joiner struct { - Left string - Right string + LeftTable string + LeftColumn string + RightTable string + RightColumn string } type DB_Order struct @@ -35,8 +45,8 @@ type DB_Adapter interface { simple_insert(string,string,string,[]string,[]bool) error //simple_replace(string,string,[]string,[]string,[]bool) error simple_update() error - simple_select(string,string,string,string,[]DB_Order/*,int,int*/) error - simple_left_join(string,string,string,string,[]DB_Joiner,string,[]DB_Order/*,int,int*/) error + simple_select(string,string,string,string,string/*,int,int*/) error + simple_left_join(string,string,string,string,string,string,string/*,int,int*/) error write() error // TO-DO: Add a simple query builder } @@ -52,46 +62,108 @@ func main() { func write_statements(adapter DB_Adapter) error { // url_prefix and url_name will be removed from this query in a later commit - adapter.simple_select("get_user","users","name, group, is_super_admin, avatar, message, url_prefix, url_name, level","uid = ?",blank_order) + adapter.simple_select("get_user","users","name, group, is_super_admin, avatar, message, url_prefix, url_name, level","uid = ?","") - adapter.simple_select("get_full_user","users","name, group, is_super_admin, session, email, avatar, message, url_prefix, url_name, level, score, last_ip","uid = ?",blank_order) + adapter.simple_select("get_full_user","users","name, group, is_super_admin, session, email, avatar, message, url_prefix, url_name, level, score, last_ip","uid = ?","") - adapter.simple_select("get_topic","topics","title, content, createdBy, createdAt, is_closed, sticky, parentID, ipaddress, postCount, likeCount","tid = ?",blank_order) + adapter.simple_select("get_topic","topics","title, content, createdBy, createdAt, is_closed, sticky, parentID, ipaddress, postCount, likeCount","tid = ?","") - adapter.simple_select("get_reply","replies","content, createdBy, createdAt, lastEdit, lastEditBy, ipaddress, likeCount","rid = ?",blank_order) + adapter.simple_select("get_reply","replies","content, createdBy, createdAt, lastEdit, lastEditBy, ipaddress, likeCount","rid = ?","") - adapter.simple_select("login","users","uid, name, password, salt","name = ?",blank_order) + adapter.simple_select("login","users","uid, name, password, salt","name = ?","") - adapter.simple_select("get_password","users","password,salt","uid = ?",blank_order) + adapter.simple_select("get_password","users","password,salt","uid = ?","") - adapter.simple_select("username_exists","users","name","name = ?",blank_order) + adapter.simple_select("username_exists","users","name","name = ?","") + + adapter.simple_select("get_settings","settings","name, content, type","","") + + adapter.simple_select("get_setting","settings","content, type","name = ?","") + + adapter.simple_select("get_full_setting","settings","name, type, constraints","name = ?","") + + adapter.simple_select("is_plugin_active","plugins","active","uname = ?","") + + adapter.simple_left_join("get_topic_list","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") - /* -get_topic_list_stmt, err = db.Prepare("select topics.tid, topics.title, topics.content, topics.createdBy, topics.is_closed, topics.sticky, topics.createdAt, topics.parentID, users.name, users.avatar from topics left join users ON topics.createdBy = users.uid order by topics.sticky DESC, topics.lastReplyAt DESC, topics.createdBy DESC") -// A visual reference for me to glance at while I design this thing -*/ - //func (adapter *Mysql_Adapter) simple_left_join(name string, table1 string, table2 string, columns string, joiners []DB_Joiner, where []DB_Where, orderby []DB_Order/*, offset int, maxCount int*/) error { - /*adapter.simple_left_join("get_topic_list","topics","users", - "topics.tid, topics.title, topics.content, topics.createdBy, topics.is_closed, topics.sticky, topics.createdAt, topics.parentID, users.name, users.avatar", - []DB_Joiner{} - )*/ return nil } -func write_file(name string, content string) (err error) { - f, err := os.Create(name) - if err != nil { - return err +func _process_columns(colstr string) (columns []DB_Column) { + if colstr == "" { + return columns } - _, err = f.WriteString(content) - if err != nil { - return err + colstr = strings.Replace(colstr," as "," AS ",-1) + for _, segment := range strings.Split(colstr,",") { + var outcol DB_Column + dothalves := strings.Split(strings.TrimSpace(segment),".") + + var halves []string + if len(dothalves) == 2 { + outcol.Table = dothalves[0] + halves = strings.Split(dothalves[1]," AS ") + } else { + halves = strings.Split(dothalves[0]," AS ") + } + + halves[0] = strings.TrimSpace(halves[0]) + if len(halves) == 2 { + outcol.Alias = strings.TrimSpace(halves[1]) + } + if halves[0][len(halves[0]) - 1] == ')' { + outcol.Type = "function" + } else { + outcol.Type = "column" + } + + outcol.Left = halves[0] + columns = append(columns,outcol) } - f.Sync() - f.Close() - return + return columns +} + +func _process_orderby(orderstr string) (order []DB_Order) { + if orderstr == "" { + return order + } + for _, segment := range strings.Split(orderstr,",") { + var outorder DB_Order + halves := strings.Split(strings.TrimSpace(segment)," ") + if len(halves) != 2 { + continue + } + outorder.Column = halves[0] + outorder.Order = strings.ToLower(halves[1]) + order = append(order,outorder) + } + return order +} + +func _process_joiner(joinstr string) (joiner []DB_Joiner) { + 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 + halves := strings.Split(segment,"=") + if len(halves) != 2 { + continue + } + + left_column := strings.Split(halves[0],".") + right_column := strings.Split(halves[1],".") + outjoin.LeftTable = strings.TrimSpace(left_column[0]) + outjoin.RightTable = strings.TrimSpace(right_column[0]) + outjoin.LeftColumn = strings.TrimSpace(left_column[1]) + outjoin.RightColumn = strings.TrimSpace(right_column[1]) + + joiner = append(joiner,outjoin) + } + return joiner } func _process_where(wherestr string) (where []DB_Where) { @@ -127,7 +199,7 @@ func _get_identifier_type(identifier string) string { } func _get_identifier(segment string, startOffset int) (out string, i int) { - fmt.Println("entering _get_identifier") + //fmt.Println("entering _get_identifier") segment = strings.TrimSpace(segment) segment += " " // Avoid overflow bugs with slicing for i = startOffset; i < len(segment); i++ { @@ -136,10 +208,10 @@ func _get_identifier(segment string, startOffset int) (out string, i int) { return strings.TrimSpace(segment[startOffset:i]), (i - 1) } if segment[i] == ' ' && i != startOffset { - fmt.Println("segment[startOffset:i]",segment[startOffset:i]) - fmt.Println("startOffset",startOffset) - fmt.Println("segment[startOffset]",string(segment[startOffset])) - fmt.Println("i",i) + //fmt.Println("segment[startOffset:i]",segment[startOffset:i]) + //fmt.Println("startOffset",startOffset) + //fmt.Println("segment[startOffset]",string(segment[startOffset])) + //fmt.Println("i",i) return strings.TrimSpace(segment[startOffset:i]), (i - 1) } } @@ -171,3 +243,17 @@ func _skip_function_call(segment string, i int) int { } return i } + +func write_file(name string, content string) (err error) { + f, err := os.Create(name) + if err != nil { + return err + } + _, err = f.WriteString(content) + if err != nil { + return err + } + f.Sync() + f.Close() + return +} diff --git a/query_gen/mysql.go b/query_gen/mysql.go index b2664029..83596c79 100644 --- a/query_gen/mysql.go +++ b/query_gen/mysql.go @@ -1,7 +1,7 @@ /* WIP Under Construction */ package main -import "fmt" +//import "fmt" import "strings" import "errors" @@ -67,7 +67,7 @@ func (adapter *Mysql_Adapter) simple_update() error { return nil } -func (adapter *Mysql_Adapter) simple_select(name string, table string, columns string, where string, orderby []DB_Order/*, offset int, maxCount int*/) error { +func (adapter *Mysql_Adapter) simple_select(name string, table string, columns string, where string, orderby string/*, offset int, maxCount int*/) error { if name == "" { return errors.New("You need a name for this statement") } @@ -94,8 +94,8 @@ func (adapter *Mysql_Adapter) simple_select(name string, table string, columns s querystr += " FROM " + table if len(where) != 0 { querystr += " WHERE" - fmt.Println("where",where) - fmt.Println("_process_where(where)",_process_where(where)) + //fmt.Println("where",where) + //fmt.Println("_process_where(where)",_process_where(where)) for _, loc := range _process_where(where) { var lquote, rquote string if loc.LeftType == "column" { @@ -104,25 +104,25 @@ func (adapter *Mysql_Adapter) simple_select(name string, table string, columns s if loc.RightType == "column" { rquote = "`" } - querystr += " " + lquote + loc.Left + lquote + loc.Operator + " " + rquote + loc.Right + rquote + " AND " + querystr += " " + lquote + loc.Left + lquote + " " + loc.Operator + " " + rquote + loc.Right + rquote + " AND " } + // Remove the trailing AND + querystr = querystr[0:len(querystr) - 4] } - // Remove the trailing AND - querystr = querystr[0:len(querystr) - 4] if len(orderby) != 0 { querystr += " ORDER BY " - for _, column := range orderby { - querystr += column.Column + " " + column.Order + "," + for _, column := range _process_orderby(orderby) { + querystr += column.Column + " " + strings.ToUpper(column.Order) + "," } + querystr = querystr[0:len(querystr) - 1] } - querystr = querystr[0:len(querystr) - 1] - adapter.write_statement(name,querystr) + adapter.write_statement(name,strings.TrimSpace(querystr)) return nil } -func (adapter *Mysql_Adapter) simple_left_join(name string, table1 string, table2 string, columns string, joiners []DB_Joiner, where string, orderby []DB_Order/*, offset int, maxCount int*/) error { +func (adapter *Mysql_Adapter) simple_left_join(name string, table1 string, table2 string, columns string, joiners string, where string, orderby string/*, offset int, maxCount int*/) error { if name == "" { return errors.New("You need a name for this statement") } @@ -139,22 +139,32 @@ func (adapter *Mysql_Adapter) simple_left_join(name string, table1 string, table return errors.New("No joiners found for simple_left_join") } - // Slice up the user friendly strings into something easier to process - var colslice []string = strings.Split(strings.TrimSpace(columns),",") - var querystr string = "SELECT " - // Escape the column names, just in case we've used a reserved keyword - for _, column := range colslice { - querystr += "`" + strings.TrimSpace(column) + "`," + for _, column := range _process_columns(columns) { + var source, alias string + + // Escape the column names, just in case we've used a reserved keyword + if column.Table != "" { + source = "`" + column.Table + "`.`" + column.Left + "`" + } else if column.Type == "function" { + source = column.Left + } else { + source = "`" + column.Left + "`" + } + + if column.Alias != "" { + alias = " AS `" + column.Alias + "`" + } + querystr += source + alias + "," } // Remove the trailing comma querystr = querystr[0:len(querystr) - 1] querystr += " FROM " + table1 + " LEFT JOIN " + table2 + " ON " - for _, joiner := range joiners { - querystr += "`" + joiner.Left + "`=`" + joiner.Right + "` AND " + for _, joiner := range _process_joiner(joiners) { + querystr += "`" + joiner.LeftTable + "`.`" + joiner.LeftColumn + "`=`" + joiner.RightTable + "`.`" + joiner.RightColumn + "` AND " } // Remove the trailing AND querystr = querystr[0:len(querystr) - 4] @@ -169,20 +179,20 @@ func (adapter *Mysql_Adapter) simple_left_join(name string, table1 string, table if loc.RightType == "column" { rquote = "`" } - querystr += " " + lquote + loc.Left + lquote + loc.Operator + " " + rquote + loc.Right + rquote + " AND " + querystr += " " + lquote + loc.Left + lquote + " " + loc.Operator + " " + rquote + loc.Right + rquote + " AND " } + querystr = querystr[0:len(querystr) - 3] } - querystr = querystr[0:len(querystr) - 3] if len(orderby) != 0 { querystr += " ORDER BY " - for _, column := range orderby { - querystr += column.Column + " " + column.Order + "," + for _, column := range _process_orderby(orderby) { + querystr += column.Column + " " + strings.ToUpper(column.Order) + "," } + querystr = querystr[0:len(querystr) - 1] } - querystr = querystr[0:len(querystr) - 1] - adapter.write_statement(name,querystr) + adapter.write_statement(name,strings.TrimSpace(querystr)) return nil } diff --git a/themes/cosmo-conflux/public/main.css b/themes/cosmo-conflux/public/main.css index bfe75572..e9a9f199 100644 --- a/themes/cosmo-conflux/public/main.css +++ b/themes/cosmo-conflux/public/main.css @@ -141,7 +141,6 @@ li:hover { width: 100%; color: black; } -.alertItem .text.smaller { font-size: 9px; } #footer { clear: left; diff --git a/themes/cosmo/public/main.css b/themes/cosmo/public/main.css index 98a6d05f..8471bb62 100644 --- a/themes/cosmo/public/main.css +++ b/themes/cosmo/public/main.css @@ -136,7 +136,6 @@ li:hover { width: 100%; color: black; } -.alertItem .text.smaller { font-size: 9px; } hr { color: silver; border: 1px solid silver; } diff --git a/themes/tempra-conflux/public/main.css b/themes/tempra-conflux/public/main.css index 27d64d1d..8180cd14 100644 --- a/themes/tempra-conflux/public/main.css +++ b/themes/tempra-conflux/public/main.css @@ -636,7 +636,7 @@ button.username { li a { font-size: 14px; } ul { height: 26px; } .menu_left, .menu_right { padding-right: 7px; } - .menu_create_topic { display: none; } + .menu_create_topic, .hide_on_mobile { display: none; } .menu_alerts { padding-left: 4px; @@ -646,7 +646,6 @@ button.username { } .selectedAlert .alertList { top: 33px; } - .hide_on_mobile { display: none; } .prev_button, .next_button { top: auto;bottom: 5px; } .colstack_grid { grid-template-columns: none; grid-gap: 8px; } .grid_istat { margin-bottom: 0px; } @@ -672,7 +671,6 @@ button.username { font-weight: bold; white-space: normal; } - .alertItem .text.smaller { font-size: 9px; } .post_container { overflow: visible !important; } .post_item {