2018-04-23 08:38:25 +00:00
package main
import (
"bufio"
2019-04-13 11:54:22 +00:00
"database/sql"
2018-04-23 08:38:25 +00:00
"strconv"
2019-10-18 00:35:13 +00:00
qgen "github.com/Azareal/Gosora/query_gen"
2018-04-23 08:38:25 +00:00
)
2018-12-27 05:42:41 +00:00
type tblColumn = qgen . DBTableColumn
2019-08-14 10:39:04 +00:00
type tC = tblColumn
2018-12-27 05:42:41 +00:00
type tblKey = qgen . DBTableKey
2019-11-10 02:37:53 +00:00
type tK = tblKey
2018-12-27 05:42:41 +00:00
2018-05-16 10:46:14 +00:00
func init ( ) {
addPatch ( 0 , patch0 )
addPatch ( 1 , patch1 )
addPatch ( 2 , patch2 )
addPatch ( 3 , patch3 )
2018-05-27 09:36:35 +00:00
addPatch ( 4 , patch4 )
2018-06-17 07:28:18 +00:00
addPatch ( 5 , patch5 )
2018-07-13 11:27:58 +00:00
addPatch ( 6 , patch6 )
2018-07-28 12:52:23 +00:00
addPatch ( 7 , patch7 )
2018-10-27 03:21:02 +00:00
addPatch ( 8 , patch8 )
2018-12-17 04:58:55 +00:00
addPatch ( 9 , patch9 )
2018-12-27 05:42:41 +00:00
addPatch ( 10 , patch10 )
2018-12-27 09:12:30 +00:00
addPatch ( 11 , patch11 )
2018-12-31 09:03:49 +00:00
addPatch ( 12 , patch12 )
2019-01-21 12:27:59 +00:00
addPatch ( 13 , patch13 )
2019-02-23 06:29:19 +00:00
addPatch ( 14 , patch14 )
2019-02-28 07:28:17 +00:00
addPatch ( 15 , patch15 )
2019-03-11 08:47:45 +00:00
addPatch ( 16 , patch16 )
2019-04-13 11:54:22 +00:00
addPatch ( 17 , patch17 )
2019-04-27 06:32:26 +00:00
addPatch ( 18 , patch18 )
2019-05-01 06:59:51 +00:00
addPatch ( 19 , patch19 )
2019-05-06 04:04:00 +00:00
addPatch ( 20 , patch20 )
2019-05-09 06:58:55 +00:00
addPatch ( 21 , patch21 )
2019-05-27 09:00:40 +00:00
addPatch ( 22 , patch22 )
2019-08-14 10:39:04 +00:00
addPatch ( 23 , patch23 )
2019-09-29 04:56:39 +00:00
addPatch ( 24 , patch24 )
2019-10-06 22:20:37 +00:00
addPatch ( 25 , patch25 )
2019-10-18 00:35:13 +00:00
addPatch ( 26 , patch26 )
2019-11-10 02:37:53 +00:00
addPatch ( 27 , patch27 )
2019-12-08 03:40:56 +00:00
addPatch ( 28 , patch28 )
2018-05-16 10:46:14 +00:00
}
2018-05-11 05:41:51 +00:00
func patch0 ( scanner * bufio . Scanner ) ( err error ) {
err = execStmt ( qgen . Builder . DropTable ( "menus" ) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . DropTable ( "menu_items" ) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . CreateTable ( "menus" , "" , "" ,
2019-08-14 10:39:04 +00:00
[ ] tC {
tC { "mid" , "int" , 0 , false , true , "" } ,
2018-04-23 08:38:25 +00:00
} ,
2019-11-10 02:37:53 +00:00
[ ] tK {
tK { "mid" , "primary" , "" , false } ,
2018-04-23 08:38:25 +00:00
} ,
) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . CreateTable ( "menu_items" , "" , "" ,
2019-08-14 10:39:04 +00:00
[ ] tC {
tC { "miid" , "int" , 0 , false , true , "" } ,
tC { "mid" , "int" , 0 , false , false , "" } ,
tC { "name" , "varchar" , 200 , false , false , "" } ,
tC { "htmlID" , "varchar" , 200 , false , false , "''" } ,
tC { "cssClass" , "varchar" , 200 , false , false , "''" } ,
tC { "position" , "varchar" , 100 , false , false , "" } ,
tC { "path" , "varchar" , 200 , false , false , "''" } ,
tC { "aria" , "varchar" , 200 , false , false , "''" } ,
tC { "tooltip" , "varchar" , 200 , false , false , "''" } ,
tC { "tmplName" , "varchar" , 200 , false , false , "''" } ,
tC { "order" , "int" , 0 , false , false , "0" } ,
tC { "guestOnly" , "boolean" , 0 , false , false , "0" } ,
tC { "memberOnly" , "boolean" , 0 , false , false , "0" } ,
tC { "staffOnly" , "boolean" , 0 , false , false , "0" } ,
tC { "adminOnly" , "boolean" , 0 , false , false , "0" } ,
2018-04-23 08:38:25 +00:00
} ,
2019-11-10 02:37:53 +00:00
[ ] tK {
tK { "miid" , "primary" , "" , false } ,
2018-05-11 05:41:51 +00:00
} ,
2018-04-23 08:38:25 +00:00
) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . SimpleInsert ( "menus" , "" , "" ) )
if err != nil {
return err
}
2018-04-23 21:08:31 +00:00
var order int
2019-10-18 00:35:13 +00:00
mOrder := "mid, name, htmlID, cssClass, position, path, aria, tooltip, guestOnly, memberOnly, staffOnly, adminOnly"
addMenuItem := func ( data map [ string ] interface { } ) error {
2018-04-23 08:38:25 +00:00
cols , values := qgen . InterfaceMapToInsertStrings ( data , mOrder )
2018-04-23 21:08:31 +00:00
err := execStmt ( qgen . Builder . SimpleInsert ( "menu_items" , cols + ", order" , values + "," + strconv . Itoa ( order ) ) )
order ++
2018-04-23 08:38:25 +00:00
return err
}
2018-05-11 05:41:51 +00:00
err = addMenuItem ( map [ string ] interface { } { "mid" : 1 , "name" : "{lang.menu_forums}" , "htmlID" : "menu_forums" , "position" : "left" , "path" : "/forums/" , "aria" : "{lang.menu_forums_aria}" , "tooltip" : "{lang.menu_forums_tooltip}" } )
2018-04-23 08:38:25 +00:00
if err != nil {
return err
}
2018-05-11 05:41:51 +00:00
err = addMenuItem ( map [ string ] interface { } { "mid" : 1 , "name" : "{lang.menu_topics}" , "htmlID" : "menu_topics" , "cssClass" : "menu_topics" , "position" : "left" , "path" : "/topics/" , "aria" : "{lang.menu_topics_aria}" , "tooltip" : "{lang.menu_topics_tooltip}" } )
2018-04-23 08:38:25 +00:00
if err != nil {
return err
}
err = addMenuItem ( map [ string ] interface { } { "mid" : 1 , "htmlID" : "general_alerts" , "cssClass" : "menu_alerts" , "position" : "right" , "tmplName" : "menu_alerts" } )
if err != nil {
return err
}
2018-05-11 05:41:51 +00:00
err = addMenuItem ( map [ string ] interface { } { "mid" : 1 , "name" : "{lang.menu_account}" , "cssClass" : "menu_account" , "position" : "left" , "path" : "/user/edit/critical/" , "aria" : "{lang.menu_account_aria}" , "tooltip" : "{lang.menu_account_tooltip}" , "memberOnly" : true } )
2018-04-23 08:38:25 +00:00
if err != nil {
return err
}
2018-05-11 05:41:51 +00:00
err = addMenuItem ( map [ string ] interface { } { "mid" : 1 , "name" : "{lang.menu_profile}" , "cssClass" : "menu_profile" , "position" : "left" , "path" : "{me.Link}" , "aria" : "{lang.menu_profile_aria}" , "tooltip" : "{lang.menu_profile_tooltip}" , "memberOnly" : true } )
2018-04-23 08:38:25 +00:00
if err != nil {
return err
}
2018-05-11 05:41:51 +00:00
err = addMenuItem ( map [ string ] interface { } { "mid" : 1 , "name" : "{lang.menu_panel}" , "cssClass" : "menu_panel menu_account" , "position" : "left" , "path" : "/panel/" , "aria" : "{lang.menu_panel_aria}" , "tooltip" : "{lang.menu_panel_tooltip}" , "memberOnly" : true , "staffOnly" : true } )
2018-04-23 08:38:25 +00:00
if err != nil {
return err
}
2018-05-11 05:41:51 +00:00
err = addMenuItem ( map [ string ] interface { } { "mid" : 1 , "name" : "{lang.menu_logout}" , "cssClass" : "menu_logout" , "position" : "left" , "path" : "/accounts/logout/?session={me.Session}" , "aria" : "{lang.menu_logout_aria}" , "tooltip" : "{lang.menu_logout_tooltip}" , "memberOnly" : true } )
2018-04-23 08:38:25 +00:00
if err != nil {
return err
}
2018-05-11 05:41:51 +00:00
err = addMenuItem ( map [ string ] interface { } { "mid" : 1 , "name" : "{lang.menu_register}" , "cssClass" : "menu_register" , "position" : "left" , "path" : "/accounts/create/" , "aria" : "{lang.menu_register_aria}" , "tooltip" : "{lang.menu_register_tooltip}" , "guestOnly" : true } )
2018-04-23 08:38:25 +00:00
if err != nil {
return err
}
2018-05-11 05:41:51 +00:00
err = addMenuItem ( map [ string ] interface { } { "mid" : 1 , "name" : "{lang.menu_login}" , "cssClass" : "menu_login" , "position" : "left" , "path" : "/accounts/login/" , "aria" : "{lang.menu_login_aria}" , "tooltip" : "{lang.menu_login_tooltip}" , "guestOnly" : true } )
2018-04-23 08:38:25 +00:00
if err != nil {
return err
}
return nil
}
2018-05-11 05:41:51 +00:00
func patch1 ( scanner * bufio . Scanner ) error {
2019-10-18 00:35:13 +00:00
routes := map [ string ] string {
2018-10-27 03:21:02 +00:00
"routeAccountEditCriticalSubmit" : "routes.AccountEditCriticalSubmit" ,
2018-12-17 04:58:55 +00:00
"routeAccountEditAvatar" : "routes.AccountEditAvatar" ,
"routeAccountEditAvatarSubmit" : "routes.AccountEditAvatarSubmit" ,
"routeAccountEditUsername" : "routes.AccountEditUsername" ,
2018-10-27 03:21:02 +00:00
"routeAccountEditUsernameSubmit" : "routes.AccountEditUsernameSubmit" ,
}
return renameRoutes ( routes )
2018-05-11 05:41:51 +00:00
}
2018-05-15 05:59:52 +00:00
func patch2 ( scanner * bufio . Scanner ) error {
2019-10-18 00:35:13 +00:00
routes := map [ string ] string {
2018-12-17 04:58:55 +00:00
"routeLogout" : "routes.AccountLogout" ,
"routeShowAttachment" : "routes.ShowAttachment" ,
"routeChangeTheme" : "routes.ChangeTheme" ,
2018-10-27 03:21:02 +00:00
"routeProfileReplyCreateSubmit" : "routes.ProfileReplyCreateSubmit" ,
2018-12-17 04:58:55 +00:00
"routeLikeTopicSubmit" : "routes.LikeTopicSubmit" ,
"routeReplyLikeSubmit" : "routes.ReplyLikeSubmit" ,
"routeDynamic" : "routes.DynamicRoute" ,
"routeUploads" : "routes.UploadedFile" ,
"BadRoute" : "routes.BadRoute" ,
2018-10-27 03:21:02 +00:00
}
return renameRoutes ( routes )
2018-05-15 05:59:52 +00:00
}
2018-05-16 10:46:14 +00:00
func patch3 ( scanner * bufio . Scanner ) error {
2018-12-27 05:42:41 +00:00
return execStmt ( qgen . Builder . CreateTable ( "registration_logs" , "" , "" ,
2019-08-14 10:39:04 +00:00
[ ] tC {
tC { "rlid" , "int" , 0 , false , true , "" } ,
tC { "username" , "varchar" , 100 , false , false , "" } ,
tC { "email" , "varchar" , 100 , false , false , "" } ,
tC { "failureReason" , "varchar" , 100 , false , false , "" } ,
tC { "success" , "bool" , 0 , false , false , "0" } , // Did this attempt succeed?
tC { "ipaddress" , "varchar" , 200 , false , false , "" } ,
tC { "doneAt" , "createdAt" , 0 , false , false , "" } ,
2018-05-16 10:46:14 +00:00
} ,
2019-11-10 02:37:53 +00:00
[ ] tK {
tK { "rlid" , "primary" , "" , false } ,
2018-05-16 10:46:14 +00:00
} ,
) )
}
2018-05-27 09:36:35 +00:00
func patch4 ( scanner * bufio . Scanner ) error {
2019-10-18 00:35:13 +00:00
routes := map [ string ] string {
2018-12-17 04:58:55 +00:00
"routeReportSubmit" : "routes.ReportSubmit" ,
"routeAccountEditEmail" : "routes.AccountEditEmail" ,
"routeAccountEditEmailTokenSubmit" : "routes.AccountEditEmailTokenSubmit" ,
"routePanelLogsRegs" : "panel.LogsRegs" ,
"routePanelLogsMod" : "panel.LogsMod" ,
"routePanelLogsAdmin" : "panel.LogsAdmin" ,
"routePanelDebug" : "panel.Debug" ,
"routePanelAnalyticsViews" : "panel.AnalyticsViews" ,
"routePanelAnalyticsRouteViews" : "panel.AnalyticsRouteViews" ,
"routePanelAnalyticsAgentViews" : "panel.AnalyticsAgentViews" ,
"routePanelAnalyticsForumViews" : "panel.AnalyticsForumViews" ,
"routePanelAnalyticsSystemViews" : "panel.AnalyticsSystemViews" ,
"routePanelAnalyticsLanguageViews" : "panel.AnalyticsLanguageViews" ,
"routePanelAnalyticsReferrerViews" : "panel.AnalyticsReferrerViews" ,
"routePanelAnalyticsTopics" : "panel.AnalyticsTopics" ,
"routePanelAnalyticsPosts" : "panel.AnalyticsPosts" ,
"routePanelAnalyticsForums" : "panel.AnalyticsForums" ,
"routePanelAnalyticsRoutes" : "panel.AnalyticsRoutes" ,
"routePanelAnalyticsAgents" : "panel.AnalyticsAgents" ,
"routePanelAnalyticsSystems" : "panel.AnalyticsSystems" ,
"routePanelAnalyticsLanguages" : "panel.AnalyticsLanguages" ,
"routePanelAnalyticsReferrers" : "panel.AnalyticsReferrers" ,
"routePanelSettings" : "panel.Settings" ,
"routePanelSettingEdit" : "panel.SettingEdit" ,
"routePanelSettingEditSubmit" : "panel.SettingEditSubmit" ,
"routePanelForums" : "panel.Forums" ,
"routePanelForumsCreateSubmit" : "panel.ForumsCreateSubmit" ,
"routePanelForumsDelete" : "panel.ForumsDelete" ,
"routePanelForumsDeleteSubmit" : "panel.ForumsDeleteSubmit" ,
"routePanelForumsEdit" : "panel.ForumsEdit" ,
"routePanelForumsEditSubmit" : "panel.ForumsEditSubmit" ,
"routePanelForumsEditPermsSubmit" : "panel.ForumsEditPermsSubmit" ,
"routePanelForumsEditPermsAdvance" : "panel.ForumsEditPermsAdvance" ,
2018-10-27 03:21:02 +00:00
"routePanelForumsEditPermsAdvanceSubmit" : "panel.ForumsEditPermsAdvanceSubmit" ,
2018-12-17 04:58:55 +00:00
"routePanelBackups" : "panel.Backups" ,
2018-10-27 03:21:02 +00:00
}
2018-10-27 03:55:02 +00:00
err := renameRoutes ( routes )
2018-05-27 09:36:35 +00:00
if err != nil {
return err
}
err = execStmt ( qgen . Builder . SimpleDelete ( "settings" , "name='url_tags'" ) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . CreateTable ( "pages" , "utf8mb4" , "utf8mb4_general_ci" ,
2019-08-14 10:39:04 +00:00
[ ] tC {
tC { "pid" , "int" , 0 , false , true , "" } ,
tC { "name" , "varchar" , 200 , false , false , "" } ,
tC { "title" , "varchar" , 200 , false , false , "" } ,
tC { "body" , "text" , 0 , false , false , "" } ,
tC { "allowedGroups" , "text" , 0 , false , false , "" } ,
tC { "menuID" , "int" , 0 , false , false , "-1" } ,
2018-05-27 09:36:35 +00:00
} ,
2019-11-10 02:37:53 +00:00
[ ] tK {
tK { "pid" , "primary" , "" , false } ,
2018-05-27 09:36:35 +00:00
} ,
) )
if err != nil {
return err
}
return nil
}
2018-06-17 07:28:18 +00:00
func patch5 ( scanner * bufio . Scanner ) error {
2019-10-18 00:35:13 +00:00
routes := map [ string ] string {
2018-12-17 04:58:55 +00:00
"routePanelUsers" : "panel.Users" ,
"routePanelUsersEdit" : "panel.UsersEdit" ,
"routePanelUsersEditSubmit" : "panel.UsersEditSubmit" ,
"routes.AccountEditCritical" : "routes.AccountEditPassword" ,
2018-10-27 03:21:02 +00:00
"routes.AccountEditCriticalSubmit" : "routes.AccountEditPasswordSubmit" ,
2018-06-17 07:28:18 +00:00
}
2018-10-27 03:55:02 +00:00
err := renameRoutes ( routes )
2018-06-17 07:28:18 +00:00
if err != nil {
return err
}
2019-11-10 02:37:53 +00:00
err = execStmt ( qgen . Builder . SimpleUpdate ( "menu_items" , "path='/user/edit/'" , "path='/user/edit/critical/'" ) )
2018-06-17 07:28:18 +00:00
if err != nil {
return err
}
err = execStmt ( qgen . Builder . CreateTable ( "users_2fa_keys" , "utf8mb4" , "utf8mb4_general_ci" ,
2019-08-14 10:39:04 +00:00
[ ] tC {
tC { "uid" , "int" , 0 , false , false , "" } ,
tC { "secret" , "varchar" , 100 , false , false , "" } ,
tC { "scratch1" , "varchar" , 50 , false , false , "" } ,
tC { "scratch2" , "varchar" , 50 , false , false , "" } ,
tC { "scratch3" , "varchar" , 50 , false , false , "" } ,
tC { "scratch4" , "varchar" , 50 , false , false , "" } ,
tC { "scratch5" , "varchar" , 50 , false , false , "" } ,
tC { "scratch6" , "varchar" , 50 , false , false , "" } ,
tC { "scratch7" , "varchar" , 50 , false , false , "" } ,
tC { "scratch8" , "varchar" , 50 , false , false , "" } ,
tC { "createdAt" , "createdAt" , 0 , false , false , "" } ,
2018-06-17 07:28:18 +00:00
} ,
2019-11-10 02:37:53 +00:00
[ ] tK {
tK { "uid" , "primary" , "" , false } ,
2018-06-17 07:28:18 +00:00
} ,
) )
if err != nil {
return err
}
return nil
}
2018-07-13 11:27:58 +00:00
func patch6 ( scanner * bufio . Scanner ) error {
2018-12-27 05:42:41 +00:00
return execStmt ( qgen . Builder . SimpleInsert ( "settings" , "name, content, type" , "'rapid_loading','1','bool'" ) )
2018-07-13 11:27:58 +00:00
}
2018-07-28 12:52:23 +00:00
func patch7 ( scanner * bufio . Scanner ) error {
2018-12-27 05:42:41 +00:00
return execStmt ( qgen . Builder . CreateTable ( "users_avatar_queue" , "" , "" ,
2019-08-14 10:39:04 +00:00
[ ] tC {
tC { "uid" , "int" , 0 , false , false , "" } , // TODO: Make this a foreign key
2018-07-28 12:52:23 +00:00
} ,
2019-11-10 02:37:53 +00:00
[ ] tK {
tK { "uid" , "primary" , "" , false } ,
2018-07-28 12:52:23 +00:00
} ,
) )
}
2018-10-27 03:21:02 +00:00
func renameRoutes ( routes map [ string ] string ) error {
// ! Don't reuse this function blindly, it doesn't escape apostrophes
2019-10-18 00:35:13 +00:00
replaceTextWhere := func ( replaceThis string , withThis string ) error {
2018-10-27 03:21:02 +00:00
return execStmt ( qgen . Builder . SimpleUpdate ( "viewchunks" , "route = '" + withThis + "'" , "route = '" + replaceThis + "'" ) )
}
for key , value := range routes {
2018-12-17 04:58:55 +00:00
err := replaceTextWhere ( key , value )
2018-10-27 03:21:02 +00:00
if err != nil {
return err
}
}
return nil
}
func patch8 ( scanner * bufio . Scanner ) error {
2019-10-18 00:35:13 +00:00
routes := map [ string ] string {
2018-12-17 04:58:55 +00:00
"routePanelWordFilter" : "panel.WordFilters" ,
"routePanelWordFiltersCreateSubmit" : "panel.WordFiltersCreateSubmit" ,
"routePanelWordFiltersEdit" : "panel.WordFiltersEdit" ,
"routePanelWordFiltersEditSubmit" : "panel.WordFiltersEditSubmit" ,
"routePanelWordFiltersDeleteSubmit" : "panel.WordFiltersDeleteSubmit" ,
"routePanelPlugins" : "panel.Plugins" ,
"routePanelPluginsActivate" : "panel.PluginsActivate" ,
"routePanelPluginsDeactivate" : "panel.PluginsDeactivate" ,
"routePanelPluginsInstall" : "panel.PluginsInstall" ,
"routePanelGroups" : "panel.Groups" ,
"routePanelGroupsEdit" : "panel.GroupsEdit" ,
"routePanelGroupsEditPerms" : "panel.GroupsEditPerms" ,
"routePanelGroupsEditSubmit" : "panel.GroupsEditSubmit" ,
"routePanelGroupsEditPermsSubmit" : "panel.GroupsEditPermsSubmit" ,
"routePanelGroupsCreateSubmit" : "panel.GroupsCreateSubmit" ,
"routePanelThemes" : "panel.Themes" ,
"routePanelThemesSetDefault" : "panel.ThemesSetDefault" ,
"routePanelThemesMenus" : "panel.ThemesMenus" ,
"routePanelThemesMenusEdit" : "panel.ThemesMenusEdit" ,
"routePanelThemesMenuItemEdit" : "panel.ThemesMenuItemEdit" ,
"routePanelThemesMenuItemEditSubmit" : "panel.ThemesMenuItemEditSubmit" ,
"routePanelThemesMenuItemCreateSubmit" : "panel.ThemesMenuItemCreateSubmit" ,
"routePanelThemesMenuItemDeleteSubmit" : "panel.ThemesMenuItemDeleteSubmit" ,
"routePanelThemesMenuItemOrderSubmit" : "panel.ThemesMenuItemOrderSubmit" ,
"routePanelDashboard" : "panel.Dashboard" ,
2018-10-27 03:21:02 +00:00
}
err := renameRoutes ( routes )
if err != nil {
return err
}
2018-12-17 04:58:55 +00:00
err = execStmt ( qgen . Builder . DropTable ( "updates" ) )
if err != nil {
return err
}
2018-12-27 05:42:41 +00:00
return execStmt ( qgen . Builder . CreateTable ( "updates" , "" , "" ,
2019-08-14 10:39:04 +00:00
[ ] tC {
tC { "dbVersion" , "int" , 0 , false , false , "0" } ,
2019-11-10 02:37:53 +00:00
} , nil ,
2018-10-27 03:21:02 +00:00
) )
}
2018-12-17 04:58:55 +00:00
func patch9 ( scanner * bufio . Scanner ) error {
// Table "updates" might not exist due to the installer, so drop it and remake it if so
err := patch8 ( scanner )
if err != nil {
return err
}
2018-12-27 05:42:41 +00:00
return execStmt ( qgen . Builder . CreateTable ( "login_logs" , "" , "" ,
2019-08-14 10:39:04 +00:00
[ ] tC {
tC { "lid" , "int" , 0 , false , true , "" } ,
tC { "uid" , "int" , 0 , false , false , "" } ,
tC { "success" , "bool" , 0 , false , false , "0" } , // Did this attempt succeed?
tC { "ipaddress" , "varchar" , 200 , false , false , "" } ,
tC { "doneAt" , "createdAt" , 0 , false , false , "" } ,
2018-12-17 04:58:55 +00:00
} ,
2019-11-10 02:37:53 +00:00
[ ] tK {
tK { "lid" , "primary" , "" , false } ,
2018-12-17 04:58:55 +00:00
} ,
) )
2018-12-27 05:42:41 +00:00
}
var acc = qgen . NewAcc
var itoa = strconv . Itoa
func patch10 ( scanner * bufio . Scanner ) error {
2019-08-14 10:39:04 +00:00
err := execStmt ( qgen . Builder . AddColumn ( "topics" , tC { "attachCount" , "int" , 0 , false , false , "0" } , nil ) )
2018-12-27 05:42:41 +00:00
if err != nil {
return err
}
2019-08-14 10:39:04 +00:00
err = execStmt ( qgen . Builder . AddColumn ( "topics" , tC { "lastReplyID" , "int" , 0 , false , false , "0" } , nil ) )
2018-12-17 04:58:55 +00:00
if err != nil {
return err
}
2018-12-27 05:42:41 +00:00
err = acc ( ) . Select ( "topics" ) . Cols ( "tid" ) . EachInt ( func ( tid int ) error {
stid := itoa ( tid )
count , err := acc ( ) . Count ( "attachments" ) . Where ( "originTable = 'topics' and originID = " + stid ) . Total ( )
if err != nil {
return err
}
2019-10-18 00:35:13 +00:00
hasReply := false
2018-12-27 05:42:41 +00:00
err = acc ( ) . Select ( "replies" ) . Cols ( "rid" ) . Where ( "tid = " + stid ) . Orderby ( "rid DESC" ) . Limit ( "1" ) . EachInt ( func ( rid int ) error {
hasReply = true
_ , err := acc ( ) . Update ( "topics" ) . Set ( "lastReplyID = ?, attachCount = ?" ) . Where ( "tid = " + stid ) . Exec ( rid , count )
return err
} )
if err != nil {
return err
}
if ! hasReply {
_ , err = acc ( ) . Update ( "topics" ) . Set ( "attachCount = ?" ) . Where ( "tid = " + stid ) . Exec ( count )
}
return err
} )
if err != nil {
return err
}
_ , err = acc ( ) . Insert ( "updates" ) . Columns ( "dbVersion" ) . Fields ( "0" ) . Exec ( )
return err
2018-12-17 04:58:55 +00:00
}
2018-12-27 09:12:30 +00:00
func patch11 ( scanner * bufio . Scanner ) error {
2019-08-14 10:39:04 +00:00
err := execStmt ( qgen . Builder . AddColumn ( "replies" , tC { "attachCount" , "int" , 0 , false , false , "0" } , nil ) )
2018-12-27 09:12:30 +00:00
if err != nil {
return err
}
// Attachments for replies got the topicID rather than the replyID for a while in error, so we want to separate these out
_ , err = acc ( ) . Update ( "attachments" ) . Set ( "originTable = 'freplies'" ) . Where ( "originTable = 'replies'" ) . Exec ( )
if err != nil {
return err
}
// We could probably do something more efficient, but as there shouldn't be too many sites right now, we can probably cheat a little, otherwise it'll take forever to get things done
return acc ( ) . Select ( "topics" ) . Cols ( "tid" ) . EachInt ( func ( tid int ) error {
stid := itoa ( tid )
2019-11-10 02:37:53 +00:00
count , err := acc ( ) . Count ( "attachments" ) . Where ( "originTable='topics' and originID=" + stid ) . Total ( )
2018-12-27 09:12:30 +00:00
if err != nil {
return err
}
_ , err = acc ( ) . Update ( "topics" ) . Set ( "attachCount = ?" ) . Where ( "tid = " + stid ) . Exec ( count )
return err
} )
/ * return acc ( ) . Select ( "replies" ) . Cols ( "rid" ) . EachInt ( func ( rid int ) error {
srid := itoa ( rid )
2019-11-10 02:37:53 +00:00
count , err := acc ( ) . Count ( "attachments" ) . Where ( "originTable='replies' and originID=" + srid ) . Total ( )
2018-12-27 09:12:30 +00:00
if err != nil {
return err
}
2019-11-10 02:37:53 +00:00
_ , err = acc ( ) . Update ( "replies" ) . Set ( "attachCount = ?" ) . Where ( "rid=" + srid ) . Exec ( count )
2018-12-27 09:12:30 +00:00
return err
} ) * /
}
2018-12-31 09:03:49 +00:00
func patch12 ( scanner * bufio . Scanner ) error {
err := execStmt ( qgen . Builder . AddIndex ( "topics" , "parentID" , "parentID" ) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . AddIndex ( "replies" , "tid" , "tid" ) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . AddIndex ( "polls" , "parentID" , "parentID" ) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . AddIndex ( "likes" , "targetItem" , "targetItem" ) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . AddIndex ( "emails" , "uid" , "uid" ) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . AddIndex ( "attachments" , "originID" , "originID" ) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . AddIndex ( "attachments" , "path" , "path" ) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . AddIndex ( "activity_stream_matches" , "watcher" , "watcher" ) )
if err != nil {
return err
}
return nil
}
2019-01-21 12:27:59 +00:00
func patch13 ( scanner * bufio . Scanner ) error {
2019-11-10 02:37:53 +00:00
return execStmt ( qgen . Builder . AddColumn ( "widgets" , tC { "wid" , "int" , 0 , false , true , "" } , & tK { "wid" , "primary" , "" , false } ) )
2019-01-21 12:27:59 +00:00
}
2019-02-23 06:29:19 +00:00
func patch14 ( scanner * bufio . Scanner ) error {
2019-11-10 02:37:53 +00:00
err := execStmt ( qgen . Builder . AddKey ( "topics" , "title" , tK { "title" , "fulltext" , "" , false } ) )
2019-02-23 06:29:19 +00:00
if err != nil {
return err
}
2019-11-10 02:37:53 +00:00
err = execStmt ( qgen . Builder . AddKey ( "topics" , "content" , tK { "content" , "fulltext" , "" , false } ) )
2019-02-23 06:29:19 +00:00
if err != nil {
return err
}
2019-11-10 02:37:53 +00:00
err = execStmt ( qgen . Builder . AddKey ( "replies" , "content" , tK { "content" , "fulltext" , "" , false } ) )
2019-02-23 06:29:19 +00:00
if err != nil {
return err
}
return nil
}
2019-02-28 07:28:17 +00:00
func patch15 ( scanner * bufio . Scanner ) error {
return execStmt ( qgen . Builder . SimpleInsert ( "settings" , "name, content, type" , "'google_site_verify','','html-attribute'" ) )
}
2019-03-11 08:47:45 +00:00
func patch16 ( scanner * bufio . Scanner ) error {
return execStmt ( qgen . Builder . CreateTable ( "password_resets" , "" , "" ,
2019-08-14 10:39:04 +00:00
[ ] tC {
tC { "email" , "varchar" , 200 , false , false , "" } ,
tC { "uid" , "int" , 0 , false , false , "" } , // TODO: Make this a foreign key
tC { "validated" , "varchar" , 200 , false , false , "" } , // Token given once the one-use token is consumed, used to prevent multiple people consuming the same one-use token
tC { "token" , "varchar" , 200 , false , false , "" } ,
tC { "createdAt" , "createdAt" , 0 , false , false , "" } ,
2019-03-11 08:47:45 +00:00
} , nil ,
) )
}
2019-04-13 11:54:22 +00:00
func patch17 ( scanner * bufio . Scanner ) error {
2019-08-14 10:39:04 +00:00
err := execStmt ( qgen . Builder . AddColumn ( "attachments" , tC { "extra" , "varchar" , 200 , false , false , "" } , nil ) )
2019-04-13 11:54:22 +00:00
if err != nil {
return err
}
err = acc ( ) . Select ( "topics" ) . Cols ( "tid, parentID" ) . Where ( "attachCount > 0" ) . Each ( func ( rows * sql . Rows ) error {
var tid , parentID int
err := rows . Scan ( & tid , & parentID )
if err != nil {
return err
}
_ , err = acc ( ) . Update ( "attachments" ) . Set ( "sectionID = ?" ) . Where ( "originTable = 'topics' AND originID = ?" ) . Exec ( parentID , tid )
return err
} )
if err != nil {
return err
}
return acc ( ) . Select ( "replies" ) . Cols ( "rid, tid" ) . Where ( "attachCount > 0" ) . Each ( func ( rows * sql . Rows ) error {
var rid , tid , sectionID int
err := rows . Scan ( & rid , & tid )
if err != nil {
return err
}
err = acc ( ) . Select ( "topics" ) . Cols ( "parentID" ) . Where ( "tid = ?" ) . QueryRow ( tid ) . Scan ( & sectionID )
if err != nil {
return err
}
_ , err = acc ( ) . Update ( "attachments" ) . Set ( "sectionID = ?, extra = ?" ) . Where ( "originTable = 'replies' AND originID = ?" ) . Exec ( sectionID , tid , rid )
return err
} )
}
2019-04-27 06:32:26 +00:00
func patch18 ( scanner * bufio . Scanner ) error {
2019-08-14 10:39:04 +00:00
return execStmt ( qgen . Builder . AddColumn ( "forums" , tC { "order" , "int" , 0 , false , false , "0" } , nil ) )
2019-05-01 06:59:51 +00:00
}
func patch19 ( scanner * bufio . Scanner ) error {
return execStmt ( qgen . Builder . CreateTable ( "memchunks" , "" , "" ,
2019-08-14 10:39:04 +00:00
[ ] tC {
tC { "count" , "int" , 0 , false , false , "0" } ,
tC { "createdAt" , "datetime" , 0 , false , false , "" } ,
2019-05-01 06:59:51 +00:00
} , nil ,
) )
2019-05-06 04:04:00 +00:00
}
func patch20 ( scanner * bufio . Scanner ) error {
err := acc ( ) . Select ( "activity_stream_matches" ) . Cols ( "asid" ) . Each ( func ( rows * sql . Rows ) error {
var asid int
err := rows . Scan ( & asid )
if err != nil {
return err
}
err = acc ( ) . Select ( "activity_stream" ) . Cols ( "asid" ) . Where ( "asid = ?" ) . QueryRow ( asid ) . Scan ( & asid )
if err != sql . ErrNoRows {
return err
}
_ , err = acc ( ) . Delete ( "activity_stream_matches" ) . Where ( "asid = ?" ) . Run ( asid )
return err
} )
if err != nil {
return err
}
2019-10-18 00:35:13 +00:00
return execStmt ( qgen . Builder . AddForeignKey ( "activity_stream_matches" , "asid" , "activity_stream" , "asid" , true ) )
2019-05-06 04:04:00 +00:00
}
2019-05-09 06:58:55 +00:00
func patch21 ( scanner * bufio . Scanner ) error {
2019-08-14 10:39:04 +00:00
err := execStmt ( qgen . Builder . AddColumn ( "memchunks" , tC { "stack" , "int" , 0 , false , false , "0" } , nil ) )
2019-05-09 06:58:55 +00:00
if err != nil {
return err
}
2019-10-18 00:35:13 +00:00
2019-08-14 10:39:04 +00:00
err = execStmt ( qgen . Builder . AddColumn ( "memchunks" , tC { "heap" , "int" , 0 , false , false , "0" } , nil ) )
2019-05-09 06:58:55 +00:00
if err != nil {
return err
}
2019-10-18 00:35:13 +00:00
2019-05-09 06:58:55 +00:00
err = execStmt ( qgen . Builder . CreateTable ( "meta" , "" , "" ,
2019-08-14 10:39:04 +00:00
[ ] tC {
tC { "name" , "varchar" , 200 , false , false , "" } ,
tC { "value" , "varchar" , 200 , false , false , "" } ,
2019-05-09 06:58:55 +00:00
} , nil ,
) )
if err != nil {
return err
}
2019-08-14 10:39:04 +00:00
return execStmt ( qgen . Builder . AddColumn ( "activity_stream" , tC { "createdAt" , "createdAt" , 0 , false , false , "" } , nil ) )
2019-05-27 09:00:40 +00:00
}
func patch22 ( scanner * bufio . Scanner ) error {
2019-08-14 10:39:04 +00:00
return execStmt ( qgen . Builder . AddColumn ( "forums" , tC { "tmpl" , "varchar" , 200 , false , false , "''" } , nil ) )
}
func patch23 ( scanner * bufio . Scanner ) error {
err := execStmt ( qgen . Builder . DropTable ( "conversations" ) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . CreateTable ( "conversations" , "" , "" ,
[ ] tC {
tC { "cid" , "int" , 0 , false , true , "" } ,
tC { "createdBy" , "int" , 0 , false , false , "" } , // TODO: Make this a foreign key
tC { "createdAt" , "createdAt" , 0 , false , false , "" } ,
tC { "lastReplyAt" , "datetime" , 0 , false , false , "" } ,
tC { "lastReplyBy" , "int" , 0 , false , false , "" } ,
} ,
2019-11-10 02:37:53 +00:00
[ ] tK {
tK { "cid" , "primary" , "" , false } ,
2019-08-14 10:39:04 +00:00
} ,
) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . DropTable ( "conversations_posts" ) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . CreateTable ( "conversations_posts" , "" , "" ,
[ ] tC {
tC { "pid" , "int" , 0 , false , true , "" } ,
tC { "cid" , "int" , 0 , false , false , "" } ,
tC { "createdBy" , "int" , 0 , false , false , "" } ,
tC { "body" , "varchar" , 50 , false , false , "" } ,
tC { "post" , "varchar" , 50 , false , false , "''" } ,
} ,
2019-11-10 02:37:53 +00:00
[ ] tK {
tK { "pid" , "primary" , "" , false } ,
2019-08-14 10:39:04 +00:00
} ,
) )
if err != nil {
return err
}
err = execStmt ( qgen . Builder . DropTable ( "conversations_participants" ) )
if err != nil {
return err
}
return execStmt ( qgen . Builder . CreateTable ( "conversations_participants" , "" , "" ,
[ ] tC {
tC { "uid" , "int" , 0 , false , false , "" } ,
tC { "cid" , "int" , 0 , false , false , "" } ,
} , nil ,
) )
2019-09-29 04:56:39 +00:00
}
func patch24 ( scanner * bufio . Scanner ) error {
err := execStmt ( qgen . Builder . DropTable ( "users_groups_promotions" ) )
if err != nil {
return err
}
return execStmt ( qgen . Builder . CreateTable ( "users_groups_promotions" , "" , "" ,
[ ] tC {
tC { "pid" , "int" , 0 , false , true , "" } ,
tC { "from_gid" , "int" , 0 , false , false , "" } ,
tC { "to_gid" , "int" , 0 , false , false , "" } ,
2019-10-18 00:35:13 +00:00
tC { "two_way" , "boolean" , 0 , false , false , "0" } , // If a user no longer meets the requirements for this promotion then they will be demoted if this flag is set
2019-09-29 04:56:39 +00:00
// Requirements
tC { "level" , "int" , 0 , false , false , "" } ,
tC { "minTime" , "int" , 0 , false , false , "" } , // How long someone needs to have been in their current group before being promoted
} ,
2019-11-10 02:37:53 +00:00
[ ] tK {
tK { "pid" , "primary" , "" , false } ,
2019-09-29 04:56:39 +00:00
} ,
) )
2019-10-06 22:20:37 +00:00
}
func patch25 ( scanner * bufio . Scanner ) error {
return execStmt ( qgen . Builder . AddColumn ( "users_groups_promotions" , tC { "posts" , "int" , 0 , false , false , "0" } , nil ) )
2019-10-18 00:35:13 +00:00
}
func patch26 ( scanner * bufio . Scanner ) error {
return execStmt ( qgen . Builder . CreateTable ( "users_blocks" , "" , "" ,
[ ] tC {
tC { "blocker" , "int" , 0 , false , false , "" } ,
tC { "blockedUser" , "int" , 0 , false , false , "" } ,
} , nil ,
) )
}
2019-11-10 02:37:53 +00:00
func patch27 ( scanner * bufio . Scanner ) error {
err := execStmt ( qgen . Builder . AddColumn ( "moderation_logs" , tC { "extra" , "text" , 0 , false , false , "" } , nil ) )
if err != nil {
return err
}
return execStmt ( qgen . Builder . AddColumn ( "administration_logs" , tC { "extra" , "text" , 0 , false , false , "" } , nil ) )
}
2019-12-08 03:40:56 +00:00
func patch28 ( scanner * bufio . Scanner ) error {
return execStmt ( qgen . Builder . AddColumn ( "users" , tC { "enable_embeds" , "int" , 0 , false , false , "-1" } , nil ) )
}