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