github.com/spreadshirt/mattermost-server@v5.3.2-0.20180927191755-a257d501df3d+incompatible/store/sqlstore/upgrade.go (about) 1 // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package sqlstore 5 6 import ( 7 "encoding/json" 8 "fmt" 9 "os" 10 "strings" 11 "time" 12 13 "github.com/mattermost/mattermost-server/mlog" 14 "github.com/mattermost/mattermost-server/model" 15 ) 16 17 const ( 18 VERSION_5_4_0 = "5.4.0" 19 VERSION_5_3_0 = "5.3.0" 20 VERSION_5_2_0 = "5.2.0" 21 VERSION_5_1_0 = "5.1.0" 22 VERSION_5_0_0 = "5.0.0" 23 VERSION_4_10_0 = "4.10.0" 24 VERSION_4_9_0 = "4.9.0" 25 VERSION_4_8_1 = "4.8.1" 26 VERSION_4_8_0 = "4.8.0" 27 VERSION_4_7_2 = "4.7.2" 28 VERSION_4_7_1 = "4.7.1" 29 VERSION_4_7_0 = "4.7.0" 30 VERSION_4_6_0 = "4.6.0" 31 VERSION_4_5_0 = "4.5.0" 32 VERSION_4_4_0 = "4.4.0" 33 VERSION_4_3_0 = "4.3.0" 34 VERSION_4_2_0 = "4.2.0" 35 VERSION_4_1_0 = "4.1.0" 36 VERSION_4_0_0 = "4.0.0" 37 VERSION_3_10_0 = "3.10.0" 38 VERSION_3_9_0 = "3.9.0" 39 VERSION_3_8_0 = "3.8.0" 40 VERSION_3_7_0 = "3.7.0" 41 VERSION_3_6_0 = "3.6.0" 42 VERSION_3_5_0 = "3.5.0" 43 VERSION_3_4_0 = "3.4.0" 44 VERSION_3_3_0 = "3.3.0" 45 VERSION_3_2_0 = "3.2.0" 46 VERSION_3_1_0 = "3.1.0" 47 VERSION_3_0_0 = "3.0.0" 48 OLDEST_SUPPORTED_VERSION = VERSION_3_0_0 49 ) 50 51 const ( 52 EXIT_VERSION_SAVE_MISSING = 1001 53 EXIT_TOO_OLD = 1002 54 EXIT_VERSION_SAVE = 1003 55 EXIT_THEME_MIGRATION = 1004 56 ) 57 58 func UpgradeDatabase(sqlStore SqlStore) { 59 60 UpgradeDatabaseToVersion31(sqlStore) 61 UpgradeDatabaseToVersion32(sqlStore) 62 UpgradeDatabaseToVersion33(sqlStore) 63 UpgradeDatabaseToVersion34(sqlStore) 64 UpgradeDatabaseToVersion35(sqlStore) 65 UpgradeDatabaseToVersion36(sqlStore) 66 UpgradeDatabaseToVersion37(sqlStore) 67 UpgradeDatabaseToVersion38(sqlStore) 68 UpgradeDatabaseToVersion39(sqlStore) 69 UpgradeDatabaseToVersion310(sqlStore) 70 UpgradeDatabaseToVersion40(sqlStore) 71 UpgradeDatabaseToVersion41(sqlStore) 72 UpgradeDatabaseToVersion42(sqlStore) 73 UpgradeDatabaseToVersion43(sqlStore) 74 UpgradeDatabaseToVersion44(sqlStore) 75 UpgradeDatabaseToVersion45(sqlStore) 76 UpgradeDatabaseToVersion46(sqlStore) 77 UpgradeDatabaseToVersion47(sqlStore) 78 UpgradeDatabaseToVersion471(sqlStore) 79 UpgradeDatabaseToVersion472(sqlStore) 80 UpgradeDatabaseToVersion48(sqlStore) 81 UpgradeDatabaseToVersion481(sqlStore) 82 UpgradeDatabaseToVersion49(sqlStore) 83 UpgradeDatabaseToVersion410(sqlStore) 84 UpgradeDatabaseToVersion50(sqlStore) 85 UpgradeDatabaseToVersion51(sqlStore) 86 UpgradeDatabaseToVersion52(sqlStore) 87 UpgradeDatabaseToVersion53(sqlStore) 88 UpgradeDatabaseToVersion54(sqlStore) 89 90 // If the SchemaVersion is empty this this is the first time it has ran 91 // so lets set it to the current version. 92 if sqlStore.GetCurrentSchemaVersion() == "" { 93 if result := <-sqlStore.System().SaveOrUpdate(&model.System{Name: "Version", Value: model.CurrentVersion}); result.Err != nil { 94 mlog.Critical(result.Err.Error()) 95 time.Sleep(time.Second) 96 os.Exit(EXIT_VERSION_SAVE_MISSING) 97 } 98 99 mlog.Info(fmt.Sprintf("The database schema has been set to version %v", model.CurrentVersion)) 100 } 101 102 // If we're not on the current version then it's too old to be upgraded 103 if sqlStore.GetCurrentSchemaVersion() != model.CurrentVersion { 104 mlog.Critical(fmt.Sprintf("Database schema version %v is no longer supported. This Mattermost server supports automatic upgrades from schema version %v through schema version %v. Downgrades are not supported. Please manually upgrade to at least version %v before continuing", sqlStore.GetCurrentSchemaVersion(), OLDEST_SUPPORTED_VERSION, model.CurrentVersion, OLDEST_SUPPORTED_VERSION)) 105 time.Sleep(time.Second) 106 os.Exit(EXIT_TOO_OLD) 107 } 108 } 109 110 func saveSchemaVersion(sqlStore SqlStore, version string) { 111 if result := <-sqlStore.System().Update(&model.System{Name: "Version", Value: version}); result.Err != nil { 112 mlog.Critical(result.Err.Error()) 113 time.Sleep(time.Second) 114 os.Exit(EXIT_VERSION_SAVE) 115 } 116 117 mlog.Warn(fmt.Sprintf("The database schema has been upgraded to version %v", version)) 118 } 119 120 func shouldPerformUpgrade(sqlStore SqlStore, currentSchemaVersion string, expectedSchemaVersion string) bool { 121 if sqlStore.GetCurrentSchemaVersion() == currentSchemaVersion { 122 mlog.Warn(fmt.Sprintf("The database schema version of %v appears to be out of date", currentSchemaVersion)) 123 mlog.Warn(fmt.Sprintf("Attempting to upgrade the database schema version to %v", expectedSchemaVersion)) 124 125 return true 126 } 127 128 return false 129 } 130 131 func UpgradeDatabaseToVersion31(sqlStore SqlStore) { 132 if shouldPerformUpgrade(sqlStore, VERSION_3_0_0, VERSION_3_1_0) { 133 sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "ContentType", "varchar(128)", "varchar(128)", "") 134 saveSchemaVersion(sqlStore, VERSION_3_1_0) 135 } 136 } 137 138 func UpgradeDatabaseToVersion32(sqlStore SqlStore) { 139 if shouldPerformUpgrade(sqlStore, VERSION_3_1_0, VERSION_3_2_0) { 140 sqlStore.CreateColumnIfNotExists("TeamMembers", "DeleteAt", "bigint(20)", "bigint", "0") 141 142 saveSchemaVersion(sqlStore, VERSION_3_2_0) 143 } 144 } 145 146 func themeMigrationFailed(err error) { 147 mlog.Critical(fmt.Sprintf("Failed to migrate User.ThemeProps to Preferences table %v", err)) 148 time.Sleep(time.Second) 149 os.Exit(EXIT_THEME_MIGRATION) 150 } 151 152 func UpgradeDatabaseToVersion33(sqlStore SqlStore) { 153 if shouldPerformUpgrade(sqlStore, VERSION_3_2_0, VERSION_3_3_0) { 154 if sqlStore.DoesColumnExist("Users", "ThemeProps") { 155 params := map[string]interface{}{ 156 "Category": model.PREFERENCE_CATEGORY_THEME, 157 "Name": "", 158 } 159 160 transaction, err := sqlStore.GetMaster().Begin() 161 if err != nil { 162 themeMigrationFailed(err) 163 } 164 165 // increase size of Value column of Preferences table to match the size of the ThemeProps column 166 if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES { 167 if _, err := transaction.Exec("ALTER TABLE Preferences ALTER COLUMN Value TYPE varchar(2000)"); err != nil { 168 themeMigrationFailed(err) 169 } 170 } else if sqlStore.DriverName() == model.DATABASE_DRIVER_MYSQL { 171 if _, err := transaction.Exec("ALTER TABLE Preferences MODIFY Value text"); err != nil { 172 themeMigrationFailed(err) 173 } 174 } 175 176 // copy data across 177 if _, err := transaction.Exec( 178 `INSERT INTO 179 Preferences(UserId, Category, Name, Value) 180 SELECT 181 Id, '`+model.PREFERENCE_CATEGORY_THEME+`', '', ThemeProps 182 FROM 183 Users 184 WHERE 185 Users.ThemeProps != 'null'`, params); err != nil { 186 themeMigrationFailed(err) 187 } 188 189 // delete old data 190 if _, err := transaction.Exec("ALTER TABLE Users DROP COLUMN ThemeProps"); err != nil { 191 themeMigrationFailed(err) 192 } 193 194 if err := transaction.Commit(); err != nil { 195 themeMigrationFailed(err) 196 } 197 198 // rename solarized_* code themes to solarized-* to match client changes in 3.0 199 var data model.Preferences 200 if _, err := sqlStore.GetMaster().Select(&data, "SELECT * FROM Preferences WHERE Category = '"+model.PREFERENCE_CATEGORY_THEME+"' AND Value LIKE '%solarized_%'"); err == nil { 201 for i := range data { 202 data[i].Value = strings.Replace(data[i].Value, "solarized_", "solarized-", -1) 203 } 204 205 sqlStore.Preference().Save(&data) 206 } 207 } 208 209 sqlStore.CreateColumnIfNotExists("OAuthApps", "IsTrusted", "tinyint(1)", "boolean", "0") 210 sqlStore.CreateColumnIfNotExists("OAuthApps", "IconURL", "varchar(512)", "varchar(512)", "") 211 sqlStore.CreateColumnIfNotExists("OAuthAccessData", "ClientId", "varchar(26)", "varchar(26)", "") 212 sqlStore.CreateColumnIfNotExists("OAuthAccessData", "UserId", "varchar(26)", "varchar(26)", "") 213 sqlStore.CreateColumnIfNotExists("OAuthAccessData", "ExpiresAt", "bigint", "bigint", "0") 214 215 if sqlStore.DoesColumnExist("OAuthAccessData", "AuthCode") { 216 sqlStore.RemoveIndexIfExists("idx_oauthaccessdata_auth_code", "OAuthAccessData") 217 sqlStore.RemoveColumnIfExists("OAuthAccessData", "AuthCode") 218 } 219 220 sqlStore.RemoveColumnIfExists("Users", "LastActivityAt") 221 sqlStore.RemoveColumnIfExists("Users", "LastPingAt") 222 223 sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "TriggerWhen", "tinyint", "integer", "0") 224 225 saveSchemaVersion(sqlStore, VERSION_3_3_0) 226 } 227 } 228 229 func UpgradeDatabaseToVersion34(sqlStore SqlStore) { 230 if shouldPerformUpgrade(sqlStore, VERSION_3_3_0, VERSION_3_4_0) { 231 sqlStore.CreateColumnIfNotExists("Status", "Manual", "BOOLEAN", "BOOLEAN", "0") 232 sqlStore.CreateColumnIfNotExists("Status", "ActiveChannel", "varchar(26)", "varchar(26)", "") 233 234 saveSchemaVersion(sqlStore, VERSION_3_4_0) 235 } 236 } 237 238 func UpgradeDatabaseToVersion35(sqlStore SqlStore) { 239 if shouldPerformUpgrade(sqlStore, VERSION_3_4_0, VERSION_3_5_0) { 240 sqlStore.GetMaster().Exec("UPDATE Users SET Roles = 'system_user' WHERE Roles = ''") 241 sqlStore.GetMaster().Exec("UPDATE Users SET Roles = 'system_user system_admin' WHERE Roles = 'system_admin'") 242 sqlStore.GetMaster().Exec("UPDATE TeamMembers SET Roles = 'team_user' WHERE Roles = ''") 243 sqlStore.GetMaster().Exec("UPDATE TeamMembers SET Roles = 'team_user team_admin' WHERE Roles = 'admin'") 244 sqlStore.GetMaster().Exec("UPDATE ChannelMembers SET Roles = 'channel_user' WHERE Roles = ''") 245 sqlStore.GetMaster().Exec("UPDATE ChannelMembers SET Roles = 'channel_user channel_admin' WHERE Roles = 'admin'") 246 247 // The rest of the migration from Filenames -> FileIds is done lazily in api.GetFileInfosForPost 248 sqlStore.CreateColumnIfNotExists("Posts", "FileIds", "varchar(150)", "varchar(150)", "[]") 249 250 // Increase maximum length of the Channel table Purpose column. 251 if sqlStore.GetMaxLengthOfColumnIfExists("Channels", "Purpose") != "250" { 252 sqlStore.AlterColumnTypeIfExists("Channels", "Purpose", "varchar(250)", "varchar(250)") 253 } 254 255 sqlStore.Session().RemoveAllSessions() 256 257 saveSchemaVersion(sqlStore, VERSION_3_5_0) 258 } 259 } 260 261 func UpgradeDatabaseToVersion36(sqlStore SqlStore) { 262 if shouldPerformUpgrade(sqlStore, VERSION_3_5_0, VERSION_3_6_0) { 263 sqlStore.CreateColumnIfNotExists("Posts", "HasReactions", "tinyint", "boolean", "0") 264 265 // Create Team Description column 266 sqlStore.CreateColumnIfNotExists("Teams", "Description", "varchar(255)", "varchar(255)", "") 267 268 // Add a Position column to users. 269 sqlStore.CreateColumnIfNotExists("Users", "Position", "varchar(64)", "varchar(64)", "") 270 271 // Remove ActiveChannel column from Status 272 sqlStore.RemoveColumnIfExists("Status", "ActiveChannel") 273 274 saveSchemaVersion(sqlStore, VERSION_3_6_0) 275 } 276 } 277 278 func UpgradeDatabaseToVersion37(sqlStore SqlStore) { 279 if shouldPerformUpgrade(sqlStore, VERSION_3_6_0, VERSION_3_7_0) { 280 // Add EditAt column to Posts 281 sqlStore.CreateColumnIfNotExists("Posts", "EditAt", " bigint", " bigint", "0") 282 283 saveSchemaVersion(sqlStore, VERSION_3_7_0) 284 } 285 } 286 287 func UpgradeDatabaseToVersion38(sqlStore SqlStore) { 288 if shouldPerformUpgrade(sqlStore, VERSION_3_7_0, VERSION_3_8_0) { 289 // Add the IsPinned column to posts. 290 sqlStore.CreateColumnIfNotExists("Posts", "IsPinned", "boolean", "boolean", "0") 291 292 saveSchemaVersion(sqlStore, VERSION_3_8_0) 293 } 294 } 295 296 func UpgradeDatabaseToVersion39(sqlStore SqlStore) { 297 if shouldPerformUpgrade(sqlStore, VERSION_3_8_0, VERSION_3_9_0) { 298 sqlStore.CreateColumnIfNotExists("OAuthAccessData", "Scope", "varchar(128)", "varchar(128)", model.DEFAULT_SCOPE) 299 sqlStore.RemoveTableIfExists("PasswordRecovery") 300 301 saveSchemaVersion(sqlStore, VERSION_3_9_0) 302 } 303 } 304 305 func UpgradeDatabaseToVersion310(sqlStore SqlStore) { 306 if shouldPerformUpgrade(sqlStore, VERSION_3_9_0, VERSION_3_10_0) { 307 saveSchemaVersion(sqlStore, VERSION_3_10_0) 308 } 309 } 310 311 func UpgradeDatabaseToVersion40(sqlStore SqlStore) { 312 if shouldPerformUpgrade(sqlStore, VERSION_3_10_0, VERSION_4_0_0) { 313 saveSchemaVersion(sqlStore, VERSION_4_0_0) 314 } 315 } 316 317 func UpgradeDatabaseToVersion41(sqlStore SqlStore) { 318 if shouldPerformUpgrade(sqlStore, VERSION_4_0_0, VERSION_4_1_0) { 319 // Increase maximum length of the Users table Roles column. 320 if sqlStore.GetMaxLengthOfColumnIfExists("Users", "Roles") != "256" { 321 sqlStore.AlterColumnTypeIfExists("Users", "Roles", "varchar(256)", "varchar(256)") 322 } 323 324 sqlStore.RemoveTableIfExists("JobStatuses") 325 326 saveSchemaVersion(sqlStore, VERSION_4_1_0) 327 } 328 } 329 330 func UpgradeDatabaseToVersion42(sqlStore SqlStore) { 331 if shouldPerformUpgrade(sqlStore, VERSION_4_1_0, VERSION_4_2_0) { 332 saveSchemaVersion(sqlStore, VERSION_4_2_0) 333 } 334 } 335 336 func UpgradeDatabaseToVersion43(sqlStore SqlStore) { 337 if shouldPerformUpgrade(sqlStore, VERSION_4_2_0, VERSION_4_3_0) { 338 saveSchemaVersion(sqlStore, VERSION_4_3_0) 339 } 340 } 341 342 func UpgradeDatabaseToVersion44(sqlStore SqlStore) { 343 if shouldPerformUpgrade(sqlStore, VERSION_4_3_0, VERSION_4_4_0) { 344 // Add the IsActive column to UserAccessToken. 345 sqlStore.CreateColumnIfNotExists("UserAccessTokens", "IsActive", "boolean", "boolean", "1") 346 347 saveSchemaVersion(sqlStore, VERSION_4_4_0) 348 } 349 } 350 351 func UpgradeDatabaseToVersion45(sqlStore SqlStore) { 352 if shouldPerformUpgrade(sqlStore, VERSION_4_4_0, VERSION_4_5_0) { 353 saveSchemaVersion(sqlStore, VERSION_4_5_0) 354 } 355 } 356 357 func UpgradeDatabaseToVersion46(sqlStore SqlStore) { 358 if shouldPerformUpgrade(sqlStore, VERSION_4_5_0, VERSION_4_6_0) { 359 sqlStore.CreateColumnIfNotExists("IncomingWebhooks", "Username", "varchar(64)", "varchar(64)", "") 360 sqlStore.CreateColumnIfNotExists("IncomingWebhooks", "IconURL", "varchar(1024)", "varchar(1024)", "") 361 saveSchemaVersion(sqlStore, VERSION_4_6_0) 362 } 363 } 364 365 func UpgradeDatabaseToVersion47(sqlStore SqlStore) { 366 if shouldPerformUpgrade(sqlStore, VERSION_4_6_0, VERSION_4_7_0) { 367 sqlStore.AlterColumnTypeIfExists("Users", "Position", "varchar(128)", "varchar(128)") 368 sqlStore.AlterColumnTypeIfExists("OAuthAuthData", "State", "varchar(1024)", "varchar(1024)") 369 sqlStore.RemoveColumnIfExists("ChannelMemberHistory", "Email") 370 sqlStore.RemoveColumnIfExists("ChannelMemberHistory", "Username") 371 saveSchemaVersion(sqlStore, VERSION_4_7_0) 372 } 373 } 374 375 // If any new instances started with 4.7, they would have the bad Email column on the 376 // ChannelMemberHistory table. So for those cases we need to do an upgrade between 377 // 4.7.0 and 4.7.1 378 func UpgradeDatabaseToVersion471(sqlStore SqlStore) { 379 if shouldPerformUpgrade(sqlStore, VERSION_4_7_0, VERSION_4_7_1) { 380 sqlStore.RemoveColumnIfExists("ChannelMemberHistory", "Email") 381 saveSchemaVersion(sqlStore, VERSION_4_7_1) 382 } 383 } 384 385 func UpgradeDatabaseToVersion472(sqlStore SqlStore) { 386 if shouldPerformUpgrade(sqlStore, VERSION_4_7_1, VERSION_4_7_2) { 387 sqlStore.RemoveIndexIfExists("idx_channels_displayname", "Channels") 388 saveSchemaVersion(sqlStore, VERSION_4_7_2) 389 } 390 } 391 392 func UpgradeDatabaseToVersion48(sqlStore SqlStore) { 393 if shouldPerformUpgrade(sqlStore, VERSION_4_7_2, VERSION_4_8_0) { 394 saveSchemaVersion(sqlStore, VERSION_4_8_0) 395 } 396 } 397 398 func UpgradeDatabaseToVersion481(sqlStore SqlStore) { 399 if shouldPerformUpgrade(sqlStore, VERSION_4_8_0, VERSION_4_8_1) { 400 sqlStore.RemoveIndexIfExists("idx_channels_displayname", "Channels") 401 saveSchemaVersion(sqlStore, VERSION_4_8_1) 402 } 403 } 404 405 func UpgradeDatabaseToVersion49(sqlStore SqlStore) { 406 // This version of Mattermost includes an App-Layer migration which migrates from hard-coded roles configured by 407 // a number of parameters in `config.json` to a `Roles` table in the database. The migration code can be seen 408 // in the file `app/app.go` in the function `DoAdvancedPermissionsMigration()`. 409 410 if shouldPerformUpgrade(sqlStore, VERSION_4_8_1, VERSION_4_9_0) { 411 sqlStore.CreateColumnIfNotExists("Teams", "LastTeamIconUpdate", "bigint", "bigint", "0") 412 defaultTimezone := model.DefaultUserTimezone() 413 defaultTimezoneValue, err := json.Marshal(defaultTimezone) 414 if err != nil { 415 mlog.Critical(fmt.Sprint(err)) 416 } 417 sqlStore.CreateColumnIfNotExists("Users", "Timezone", "varchar(256)", "varchar(256)", string(defaultTimezoneValue)) 418 sqlStore.RemoveIndexIfExists("idx_channels_displayname", "Channels") 419 saveSchemaVersion(sqlStore, VERSION_4_9_0) 420 } 421 } 422 423 func UpgradeDatabaseToVersion410(sqlStore SqlStore) { 424 if shouldPerformUpgrade(sqlStore, VERSION_4_9_0, VERSION_4_10_0) { 425 426 sqlStore.RemoveIndexIfExists("Name_2", "Channels") 427 sqlStore.RemoveIndexIfExists("Name_2", "Emoji") 428 sqlStore.RemoveIndexIfExists("ClientId_2", "OAuthAccessData") 429 430 saveSchemaVersion(sqlStore, VERSION_4_10_0) 431 sqlStore.GetMaster().Exec("UPDATE Users SET AuthData=LOWER(AuthData) WHERE AuthService = 'saml'") 432 } 433 } 434 435 func UpgradeDatabaseToVersion50(sqlStore SqlStore) { 436 // This version of Mattermost includes an App-Layer migration which migrates from hard-coded emojis configured 437 // in `config.json` to a `Permission` in the database. The migration code can be seen 438 // in the file `app/app.go` in the function `DoEmojisPermissionsMigration()`. 439 440 // This version of Mattermost also includes a online-migration which migrates some roles from the `Roles` columns of 441 // TeamMember and ChannelMember rows to the new SchemeAdmin and SchemeUser columns. If you need to downgrade to a 442 // version of Mattermost prior to 5.0, you should take your server offline and run the following SQL statements 443 // prior to launching the downgraded version: 444 // 445 // UPDATE Teams SET SchemeId = NULL; 446 // UPDATE Channels SET SchemeId = NULL; 447 // UPDATE TeamMembers SET Roles = CONCAT(Roles, ' team_user'), SchemeUser = NULL where SchemeUser = 1; 448 // UPDATE TeamMembers SET Roles = CONCAT(Roles, ' team_admin'), SchemeAdmin = NULL where SchemeAdmin = 1; 449 // UPDATE ChannelMembers SET Roles = CONCAT(Roles, ' channel_user'), SchemeUser = NULL where SchemeUser = 1; 450 // UPDATE ChannelMembers SET Roles = CONCAT(Roles, ' channel_admin'), SchemeAdmin = NULL where SchemeAdmin = 1; 451 // DELETE from Systems WHERE Name = 'migration_advanced_permissions_phase_2'; 452 453 if shouldPerformUpgrade(sqlStore, VERSION_4_10_0, VERSION_5_0_0) { 454 455 sqlStore.CreateColumnIfNotExistsNoDefault("Teams", "SchemeId", "varchar(26)", "varchar(26)") 456 sqlStore.CreateColumnIfNotExistsNoDefault("Channels", "SchemeId", "varchar(26)", "varchar(26)") 457 458 sqlStore.CreateColumnIfNotExistsNoDefault("TeamMembers", "SchemeUser", "boolean", "boolean") 459 sqlStore.CreateColumnIfNotExistsNoDefault("TeamMembers", "SchemeAdmin", "boolean", "boolean") 460 sqlStore.CreateColumnIfNotExistsNoDefault("ChannelMembers", "SchemeUser", "boolean", "boolean") 461 sqlStore.CreateColumnIfNotExistsNoDefault("ChannelMembers", "SchemeAdmin", "boolean", "boolean") 462 463 sqlStore.CreateColumnIfNotExists("Roles", "BuiltIn", "boolean", "boolean", "0") 464 sqlStore.GetMaster().Exec("UPDATE Roles SET BuiltIn=true") 465 sqlStore.GetMaster().Exec("UPDATE Roles SET SchemeManaged=false WHERE Name NOT IN ('system_user', 'system_admin', 'team_user', 'team_admin', 'channel_user', 'channel_admin')") 466 sqlStore.CreateColumnIfNotExists("IncomingWebhooks", "ChannelLocked", "boolean", "boolean", "0") 467 468 sqlStore.RemoveIndexIfExists("idx_channels_txt", "Channels") 469 470 saveSchemaVersion(sqlStore, VERSION_5_0_0) 471 } 472 } 473 474 func UpgradeDatabaseToVersion51(sqlStore SqlStore) { 475 if shouldPerformUpgrade(sqlStore, VERSION_5_0_0, VERSION_5_1_0) { 476 saveSchemaVersion(sqlStore, VERSION_5_1_0) 477 } 478 } 479 480 func UpgradeDatabaseToVersion52(sqlStore SqlStore) { 481 if shouldPerformUpgrade(sqlStore, VERSION_5_1_0, VERSION_5_2_0) { 482 sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "Username", "varchar(64)", "varchar(64)", "") 483 sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "IconURL", "varchar(1024)", "varchar(1024)", "") 484 saveSchemaVersion(sqlStore, VERSION_5_2_0) 485 } 486 } 487 488 func UpgradeDatabaseToVersion53(sqlStore SqlStore) { 489 if shouldPerformUpgrade(sqlStore, VERSION_5_2_0, VERSION_5_3_0) { 490 saveSchemaVersion(sqlStore, VERSION_5_3_0) 491 } 492 } 493 494 func UpgradeDatabaseToVersion54(sqlStore SqlStore) { 495 if shouldPerformUpgrade(sqlStore, VERSION_5_3_0, VERSION_5_4_0) { 496 sqlStore.AlterColumnTypeIfExists("OutgoingWebhooks", "Description", "varchar(500)", "varchar(500)") 497 sqlStore.AlterColumnTypeIfExists("IncomingWebhooks", "Description", "varchar(500)", "varchar(500)") 498 if err := sqlStore.Channel().MigratePublicChannels(); err != nil { 499 mlog.Critical("Failed to migrate PublicChannels table", mlog.Err(err)) 500 time.Sleep(time.Second) 501 os.Exit(EXIT_GENERIC_FAILURE) 502 } 503 sqlStore.CreateColumnIfNotExists("Users", "AcceptedServiceTermsId", "varchar(64)", "varchar(64)", "") 504 saveSchemaVersion(sqlStore, VERSION_5_4_0) 505 } 506 }