github.com/haalcala/mattermost-server-change-repo/v5@v5.33.2/store/sqlstore/upgrade.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package sqlstore 5 6 import ( 7 "database/sql" 8 "encoding/json" 9 "os" 10 "strings" 11 "time" 12 13 "github.com/blang/semver" 14 "github.com/pkg/errors" 15 16 "github.com/mattermost/mattermost-server/v5/mlog" 17 "github.com/mattermost/mattermost-server/v5/model" 18 "github.com/mattermost/mattermost-server/v5/services/timezones" 19 ) 20 21 const ( 22 CurrentSchemaVersion = Version5330 23 Version5330 = "5.33.0" 24 Version5320 = "5.32.0" 25 Version5310 = "5.31.0" 26 Version5300 = "5.30.0" 27 Version5291 = "5.29.1" 28 Version5290 = "5.29.0" 29 Version5281 = "5.28.1" 30 Version5280 = "5.28.0" 31 Version5270 = "5.27.0" 32 Version5260 = "5.26.0" 33 Version5250 = "5.25.0" 34 Version5240 = "5.24.0" 35 Version5230 = "5.23.0" 36 Version5220 = "5.22.0" 37 Version5210 = "5.21.0" 38 Version5200 = "5.20.0" 39 Version5190 = "5.19.0" 40 Version5180 = "5.18.0" 41 Version5170 = "5.17.0" 42 Version5160 = "5.16.0" 43 Version5150 = "5.15.0" 44 Version5140 = "5.14.0" 45 Version5130 = "5.13.0" 46 Version5120 = "5.12.0" 47 Version5110 = "5.11.0" 48 Version5100 = "5.10.0" 49 Version590 = "5.9.0" 50 Version580 = "5.8.0" 51 Version570 = "5.7.0" 52 Version560 = "5.6.0" 53 Version550 = "5.5.0" 54 Version540 = "5.4.0" 55 Version530 = "5.3.0" 56 Version520 = "5.2.0" 57 Version510 = "5.1.0" 58 Version500 = "5.0.0" 59 Version4100 = "4.10.0" 60 Version490 = "4.9.0" 61 Version481 = "4.8.1" 62 Version480 = "4.8.0" 63 Version472 = "4.7.2" 64 Version471 = "4.7.1" 65 Version470 = "4.7.0" 66 Version460 = "4.6.0" 67 Version450 = "4.5.0" 68 Version440 = "4.4.0" 69 Version430 = "4.3.0" 70 Version420 = "4.2.0" 71 Version410 = "4.1.0" 72 Version400 = "4.0.0" 73 Version3100 = "3.10.0" 74 Version390 = "3.9.0" 75 Version380 = "3.8.0" 76 Version370 = "3.7.0" 77 Version360 = "3.6.0" 78 Version350 = "3.5.0" 79 Version340 = "3.4.0" 80 Version330 = "3.3.0" 81 Version320 = "3.2.0" 82 Version310 = "3.1.0" 83 Version300 = "3.0.0" 84 OldestSupportedVersion = Version300 85 ) 86 87 const ( 88 ExitVersionSave = 1003 89 ExitThemeMigration = 1004 90 ExitTeamInviteIDMigrationFailed = 1006 91 ) 92 93 // upgradeDatabase attempts to migrate the schema to the latest supported version. 94 // The value of model.CurrentVersion is accepted as a parameter for unit testing, but it is not 95 // used to stop migrations at that version. 96 func upgradeDatabase(sqlStore *SqlStore, currentModelVersionString string) error { 97 currentModelVersion, err := semver.Parse(currentModelVersionString) 98 if err != nil { 99 return errors.Wrapf(err, "failed to parse current model version %s", currentModelVersionString) 100 } 101 102 nextUnsupportedMajorVersion := semver.Version{ 103 Major: currentModelVersion.Major + 1, 104 } 105 106 oldestSupportedVersion, err := semver.Parse(OldestSupportedVersion) 107 if err != nil { 108 return errors.Wrapf(err, "failed to parse oldest supported version %s", OldestSupportedVersion) 109 } 110 111 var currentSchemaVersion *semver.Version 112 currentSchemaVersionString := sqlStore.GetCurrentSchemaVersion() 113 if currentSchemaVersionString != "" { 114 currentSchemaVersion, err = semver.New(currentSchemaVersionString) 115 if err != nil { 116 return errors.Wrapf(err, "failed to parse database schema version %s", currentSchemaVersionString) 117 } 118 } 119 120 // Assume a fresh database if no schema version has been recorded. 121 if currentSchemaVersion == nil { 122 if err := sqlStore.System().SaveOrUpdate(&model.System{Name: "Version", Value: currentModelVersion.String()}); err != nil { 123 return errors.Wrap(err, "failed to initialize schema version for fresh database") 124 } 125 126 currentSchemaVersion = ¤tModelVersion 127 mlog.Info("The database schema version has been set", mlog.String("version", currentSchemaVersion.String())) 128 return nil 129 } 130 131 // Upgrades prior to the oldest supported version are not supported. 132 if currentSchemaVersion.LT(oldestSupportedVersion) { 133 return errors.Errorf("Database schema version %s is no longer supported. This Mattermost server supports automatic upgrades from schema version %s through schema version %s. Please manually upgrade to at least version %s before continuing.", *currentSchemaVersion, oldestSupportedVersion, currentModelVersion, oldestSupportedVersion) 134 } 135 136 // Allow forwards compatibility only within the same major version. 137 if currentSchemaVersion.GTE(nextUnsupportedMajorVersion) { 138 return errors.Errorf("Database schema version %s is not supported. This Mattermost server supports only >=%s, <%s. Please upgrade to at least version %s before continuing.", *currentSchemaVersion, currentModelVersion, nextUnsupportedMajorVersion, nextUnsupportedMajorVersion) 139 } else if currentSchemaVersion.GT(currentModelVersion) { 140 mlog.Warn("The database schema version and model versions do not match", mlog.String("schema_version", currentSchemaVersion.String()), mlog.String("model_version", currentModelVersion.String())) 141 } 142 143 // Otherwise, apply any necessary migrations. Note that these methods currently invoke 144 // os.Exit instead of returning an error. 145 upgradeDatabaseToVersion31(sqlStore) 146 upgradeDatabaseToVersion32(sqlStore) 147 upgradeDatabaseToVersion33(sqlStore) 148 upgradeDatabaseToVersion34(sqlStore) 149 upgradeDatabaseToVersion35(sqlStore) 150 upgradeDatabaseToVersion36(sqlStore) 151 upgradeDatabaseToVersion37(sqlStore) 152 upgradeDatabaseToVersion38(sqlStore) 153 upgradeDatabaseToVersion39(sqlStore) 154 upgradeDatabaseToVersion310(sqlStore) 155 upgradeDatabaseToVersion40(sqlStore) 156 upgradeDatabaseToVersion41(sqlStore) 157 upgradeDatabaseToVersion42(sqlStore) 158 upgradeDatabaseToVersion43(sqlStore) 159 upgradeDatabaseToVersion44(sqlStore) 160 upgradeDatabaseToVersion45(sqlStore) 161 upgradeDatabaseToVersion46(sqlStore) 162 upgradeDatabaseToVersion47(sqlStore) 163 upgradeDatabaseToVersion471(sqlStore) 164 upgradeDatabaseToVersion472(sqlStore) 165 upgradeDatabaseToVersion48(sqlStore) 166 upgradeDatabaseToVersion481(sqlStore) 167 upgradeDatabaseToVersion49(sqlStore) 168 upgradeDatabaseToVersion410(sqlStore) 169 upgradeDatabaseToVersion50(sqlStore) 170 upgradeDatabaseToVersion51(sqlStore) 171 upgradeDatabaseToVersion52(sqlStore) 172 upgradeDatabaseToVersion53(sqlStore) 173 upgradeDatabaseToVersion54(sqlStore) 174 upgradeDatabaseToVersion55(sqlStore) 175 upgradeDatabaseToVersion56(sqlStore) 176 upgradeDatabaseToVersion57(sqlStore) 177 upgradeDatabaseToVersion58(sqlStore) 178 upgradeDatabaseToVersion59(sqlStore) 179 upgradeDatabaseToVersion510(sqlStore) 180 upgradeDatabaseToVersion511(sqlStore) 181 upgradeDatabaseToVersion512(sqlStore) 182 upgradeDatabaseToVersion513(sqlStore) 183 upgradeDatabaseToVersion514(sqlStore) 184 upgradeDatabaseToVersion515(sqlStore) 185 upgradeDatabaseToVersion516(sqlStore) 186 upgradeDatabaseToVersion517(sqlStore) 187 upgradeDatabaseToVersion518(sqlStore) 188 upgradeDatabaseToVersion519(sqlStore) 189 upgradeDatabaseToVersion520(sqlStore) 190 upgradeDatabaseToVersion521(sqlStore) 191 upgradeDatabaseToVersion522(sqlStore) 192 upgradeDatabaseToVersion523(sqlStore) 193 upgradeDatabaseToVersion524(sqlStore) 194 upgradeDatabaseToVersion525(sqlStore) 195 upgradeDatabaseToVersion526(sqlStore) 196 upgradeDatabaseToVersion527(sqlStore) 197 upgradeDatabaseToVersion528(sqlStore) 198 upgradeDatabaseToVersion5281(sqlStore) 199 upgradeDatabaseToVersion529(sqlStore) 200 upgradeDatabaseToVersion5291(sqlStore) 201 upgradeDatabaseToVersion530(sqlStore) 202 upgradeDatabaseToVersion531(sqlStore) 203 upgradeDatabaseToVersion532(sqlStore) 204 upgradeDatabaseToVersion533(sqlStore) 205 206 return nil 207 } 208 209 func saveSchemaVersion(sqlStore *SqlStore, version string) { 210 if err := sqlStore.System().SaveOrUpdate(&model.System{Name: "Version", Value: version}); err != nil { 211 mlog.Critical(err.Error()) 212 time.Sleep(time.Second) 213 os.Exit(ExitVersionSave) 214 } 215 216 mlog.Warn("The database schema version has been upgraded", mlog.String("version", version)) 217 } 218 219 func shouldPerformUpgrade(sqlStore *SqlStore, currentSchemaVersion string, expectedSchemaVersion string) bool { 220 storedSchemaVersion := sqlStore.GetCurrentSchemaVersion() 221 222 storedVersion, err := semver.Parse(storedSchemaVersion) 223 if err != nil { 224 mlog.Error("Error parsing stored schema version", mlog.Err(err)) 225 return false 226 } 227 228 currentVersion, err := semver.Parse(currentSchemaVersion) 229 if err != nil { 230 mlog.Error("Error parsing current schema version", mlog.Err(err)) 231 return false 232 } 233 234 if storedVersion.Major == currentVersion.Major && storedVersion.Minor == currentVersion.Minor { 235 mlog.Warn("Attempting to upgrade the database schema version", 236 mlog.String("stored_version", storedSchemaVersion), mlog.String("current_version", currentSchemaVersion), mlog.String("new_version", expectedSchemaVersion)) 237 return true 238 } 239 240 return false 241 } 242 243 func upgradeDatabaseToVersion31(sqlStore *SqlStore) { 244 if shouldPerformUpgrade(sqlStore, Version300, Version310) { 245 sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "ContentType", "varchar(128)", "varchar(128)", "") 246 saveSchemaVersion(sqlStore, Version310) 247 } 248 } 249 250 func upgradeDatabaseToVersion32(sqlStore *SqlStore) { 251 if shouldPerformUpgrade(sqlStore, Version310, Version320) { 252 sqlStore.CreateColumnIfNotExists("TeamMembers", "DeleteAt", "bigint(20)", "bigint", "0") 253 254 saveSchemaVersion(sqlStore, Version320) 255 } 256 } 257 258 func themeMigrationFailed(err error) { 259 mlog.Critical("Failed to migrate User.ThemeProps to Preferences table", mlog.Err(err)) 260 time.Sleep(time.Second) 261 os.Exit(ExitThemeMigration) 262 } 263 264 func upgradeDatabaseToVersion33(sqlStore *SqlStore) { 265 if shouldPerformUpgrade(sqlStore, Version320, Version330) { 266 if sqlStore.DoesColumnExist("Users", "ThemeProps") { 267 params := map[string]interface{}{ 268 "Category": model.PREFERENCE_CATEGORY_THEME, 269 "Name": "", 270 } 271 272 transaction, err := sqlStore.GetMaster().Begin() 273 if err != nil { 274 themeMigrationFailed(err) 275 } 276 defer finalizeTransaction(transaction) 277 278 // increase size of Value column of Preferences table to match the size of the ThemeProps column 279 if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES { 280 if _, err := transaction.Exec("ALTER TABLE Preferences ALTER COLUMN Value TYPE varchar(2000)"); err != nil { 281 themeMigrationFailed(err) 282 return 283 } 284 } else if sqlStore.DriverName() == model.DATABASE_DRIVER_MYSQL { 285 if _, err := transaction.Exec("ALTER TABLE Preferences MODIFY Value text"); err != nil { 286 themeMigrationFailed(err) 287 return 288 } 289 } 290 291 // copy data across 292 if _, err := transaction.Exec( 293 `INSERT INTO 294 Preferences(UserId, Category, Name, Value) 295 SELECT 296 Id, '`+model.PREFERENCE_CATEGORY_THEME+`', '', ThemeProps 297 FROM 298 Users 299 WHERE 300 Users.ThemeProps != 'null'`, params); err != nil { 301 themeMigrationFailed(err) 302 return 303 } 304 305 // delete old data 306 if _, err := transaction.Exec("ALTER TABLE Users DROP COLUMN ThemeProps"); err != nil { 307 themeMigrationFailed(err) 308 return 309 } 310 311 if err := transaction.Commit(); err != nil { 312 themeMigrationFailed(err) 313 return 314 } 315 316 // rename solarized_* code themes to solarized-* to match client changes in 3.0 317 var data model.Preferences 318 if _, err := sqlStore.GetMaster().Select(&data, "SELECT * FROM Preferences WHERE Category = '"+model.PREFERENCE_CATEGORY_THEME+"' AND Value LIKE '%solarized_%'"); err == nil { 319 for i := range data { 320 data[i].Value = strings.Replace(data[i].Value, "solarized_", "solarized-", -1) 321 } 322 323 sqlStore.Preference().Save(&data) 324 } 325 } 326 327 sqlStore.CreateColumnIfNotExists("OAuthApps", "IsTrusted", "tinyint(1)", "boolean", "0") 328 sqlStore.CreateColumnIfNotExists("OAuthApps", "IconURL", "varchar(512)", "varchar(512)", "") 329 sqlStore.CreateColumnIfNotExists("OAuthAccessData", "ClientId", "varchar(26)", "varchar(26)", "") 330 sqlStore.CreateColumnIfNotExists("OAuthAccessData", "UserId", "varchar(26)", "varchar(26)", "") 331 sqlStore.CreateColumnIfNotExists("OAuthAccessData", "ExpiresAt", "bigint", "bigint", "0") 332 333 if sqlStore.DoesColumnExist("OAuthAccessData", "AuthCode") { 334 sqlStore.RemoveIndexIfExists("idx_oauthaccessdata_auth_code", "OAuthAccessData") 335 sqlStore.RemoveColumnIfExists("OAuthAccessData", "AuthCode") 336 } 337 338 sqlStore.RemoveColumnIfExists("Users", "LastActivityAt") 339 sqlStore.RemoveColumnIfExists("Users", "LastPingAt") 340 341 sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "TriggerWhen", "tinyint", "integer", "0") 342 343 saveSchemaVersion(sqlStore, Version330) 344 } 345 } 346 347 func upgradeDatabaseToVersion34(sqlStore *SqlStore) { 348 if shouldPerformUpgrade(sqlStore, Version330, Version340) { 349 sqlStore.CreateColumnIfNotExists("Status", "Manual", "BOOLEAN", "BOOLEAN", "0") 350 sqlStore.CreateColumnIfNotExists("Status", "ActiveChannel", "varchar(26)", "varchar(26)", "") 351 352 saveSchemaVersion(sqlStore, Version340) 353 } 354 } 355 356 func upgradeDatabaseToVersion35(sqlStore *SqlStore) { 357 if shouldPerformUpgrade(sqlStore, Version340, Version350) { 358 sqlStore.GetMaster().Exec("UPDATE Users SET Roles = 'system_user' WHERE Roles = ''") 359 sqlStore.GetMaster().Exec("UPDATE Users SET Roles = 'system_user system_admin' WHERE Roles = 'system_admin'") 360 sqlStore.GetMaster().Exec("UPDATE TeamMembers SET Roles = 'team_user' WHERE Roles = ''") 361 sqlStore.GetMaster().Exec("UPDATE TeamMembers SET Roles = 'team_user team_admin' WHERE Roles = 'admin'") 362 sqlStore.GetMaster().Exec("UPDATE ChannelMembers SET Roles = 'channel_user' WHERE Roles = ''") 363 sqlStore.GetMaster().Exec("UPDATE ChannelMembers SET Roles = 'channel_user channel_admin' WHERE Roles = 'admin'") 364 365 // The rest of the migration from Filenames -> FileIds is done lazily in api.GetFileInfosForPost 366 sqlStore.CreateColumnIfNotExists("Posts", "FileIds", "varchar(150)", "varchar(150)", "[]") 367 368 // Increase maximum length of the Channel table Purpose column. 369 if sqlStore.GetMaxLengthOfColumnIfExists("Channels", "Purpose") != "250" { 370 sqlStore.AlterColumnTypeIfExists("Channels", "Purpose", "varchar(250)", "varchar(250)") 371 } 372 373 sqlStore.Session().RemoveAllSessions() 374 375 saveSchemaVersion(sqlStore, Version350) 376 } 377 } 378 379 func upgradeDatabaseToVersion36(sqlStore *SqlStore) { 380 if shouldPerformUpgrade(sqlStore, Version350, Version360) { 381 sqlStore.CreateColumnIfNotExists("Posts", "HasReactions", "tinyint", "boolean", "0") 382 383 // Create Team Description column 384 sqlStore.CreateColumnIfNotExists("Teams", "Description", "varchar(255)", "varchar(255)", "") 385 386 // Add a Position column to users. 387 sqlStore.CreateColumnIfNotExists("Users", "Position", "varchar(64)", "varchar(64)", "") 388 389 // Remove ActiveChannel column from Status 390 sqlStore.RemoveColumnIfExists("Status", "ActiveChannel") 391 392 saveSchemaVersion(sqlStore, Version360) 393 } 394 } 395 396 func upgradeDatabaseToVersion37(sqlStore *SqlStore) { 397 if shouldPerformUpgrade(sqlStore, Version360, Version370) { 398 // Add EditAt column to Posts 399 sqlStore.CreateColumnIfNotExists("Posts", "EditAt", " bigint", " bigint", "0") 400 401 saveSchemaVersion(sqlStore, Version370) 402 } 403 } 404 405 func upgradeDatabaseToVersion38(sqlStore *SqlStore) { 406 if shouldPerformUpgrade(sqlStore, Version370, Version380) { 407 // Add the IsPinned column to posts. 408 sqlStore.CreateColumnIfNotExists("Posts", "IsPinned", "boolean", "boolean", "0") 409 410 saveSchemaVersion(sqlStore, Version380) 411 } 412 } 413 414 func upgradeDatabaseToVersion39(sqlStore *SqlStore) { 415 if shouldPerformUpgrade(sqlStore, Version380, Version390) { 416 sqlStore.CreateColumnIfNotExists("OAuthAccessData", "Scope", "varchar(128)", "varchar(128)", model.DEFAULT_SCOPE) 417 sqlStore.RemoveTableIfExists("PasswordRecovery") 418 419 saveSchemaVersion(sqlStore, Version390) 420 } 421 } 422 423 func upgradeDatabaseToVersion310(sqlStore *SqlStore) { 424 if shouldPerformUpgrade(sqlStore, Version390, Version3100) { 425 saveSchemaVersion(sqlStore, Version3100) 426 } 427 } 428 429 func upgradeDatabaseToVersion40(sqlStore *SqlStore) { 430 if shouldPerformUpgrade(sqlStore, Version3100, Version400) { 431 saveSchemaVersion(sqlStore, Version400) 432 } 433 } 434 435 func upgradeDatabaseToVersion41(sqlStore *SqlStore) { 436 if shouldPerformUpgrade(sqlStore, Version400, Version410) { 437 // Increase maximum length of the Users table Roles column. 438 if sqlStore.GetMaxLengthOfColumnIfExists("Users", "Roles") != "256" { 439 sqlStore.AlterColumnTypeIfExists("Users", "Roles", "varchar(256)", "varchar(256)") 440 } 441 442 sqlStore.RemoveTableIfExists("JobStatuses") 443 444 saveSchemaVersion(sqlStore, Version410) 445 } 446 } 447 448 func upgradeDatabaseToVersion42(sqlStore *SqlStore) { 449 if shouldPerformUpgrade(sqlStore, Version410, Version420) { 450 saveSchemaVersion(sqlStore, Version420) 451 } 452 } 453 454 func upgradeDatabaseToVersion43(sqlStore *SqlStore) { 455 if shouldPerformUpgrade(sqlStore, Version420, Version430) { 456 saveSchemaVersion(sqlStore, Version430) 457 } 458 } 459 460 func upgradeDatabaseToVersion44(sqlStore *SqlStore) { 461 if shouldPerformUpgrade(sqlStore, Version430, Version440) { 462 // Add the IsActive column to UserAccessToken. 463 sqlStore.CreateColumnIfNotExists("UserAccessTokens", "IsActive", "boolean", "boolean", "1") 464 465 saveSchemaVersion(sqlStore, Version440) 466 } 467 } 468 469 func upgradeDatabaseToVersion45(sqlStore *SqlStore) { 470 if shouldPerformUpgrade(sqlStore, Version440, Version450) { 471 saveSchemaVersion(sqlStore, Version450) 472 } 473 } 474 475 func upgradeDatabaseToVersion46(sqlStore *SqlStore) { 476 if shouldPerformUpgrade(sqlStore, Version450, Version460) { 477 sqlStore.CreateColumnIfNotExists("IncomingWebhooks", "Username", "varchar(64)", "varchar(64)", "") 478 sqlStore.CreateColumnIfNotExists("IncomingWebhooks", "IconURL", "varchar(1024)", "varchar(1024)", "") 479 saveSchemaVersion(sqlStore, Version460) 480 } 481 } 482 483 func upgradeDatabaseToVersion47(sqlStore *SqlStore) { 484 if shouldPerformUpgrade(sqlStore, Version460, Version470) { 485 sqlStore.AlterColumnTypeIfExists("Users", "Position", "varchar(128)", "varchar(128)") 486 sqlStore.AlterColumnTypeIfExists("OAuthAuthData", "State", "varchar(1024)", "varchar(1024)") 487 sqlStore.RemoveColumnIfExists("ChannelMemberHistory", "Email") 488 sqlStore.RemoveColumnIfExists("ChannelMemberHistory", "Username") 489 saveSchemaVersion(sqlStore, Version470) 490 } 491 } 492 493 func upgradeDatabaseToVersion471(sqlStore *SqlStore) { 494 // If any new instances started with 4.7, they would have the bad Email column on the 495 // ChannelMemberHistory table. So for those cases we need to do an upgrade between 496 // 4.7.0 and 4.7.1 497 if shouldPerformUpgrade(sqlStore, Version470, Version471) { 498 sqlStore.RemoveColumnIfExists("ChannelMemberHistory", "Email") 499 saveSchemaVersion(sqlStore, Version471) 500 } 501 } 502 503 func upgradeDatabaseToVersion472(sqlStore *SqlStore) { 504 if shouldPerformUpgrade(sqlStore, Version471, Version472) { 505 sqlStore.RemoveIndexIfExists("idx_channels_displayname", "Channels") 506 saveSchemaVersion(sqlStore, Version472) 507 } 508 } 509 510 func upgradeDatabaseToVersion48(sqlStore *SqlStore) { 511 if shouldPerformUpgrade(sqlStore, Version472, Version480) { 512 saveSchemaVersion(sqlStore, Version480) 513 } 514 } 515 516 func upgradeDatabaseToVersion481(sqlStore *SqlStore) { 517 if shouldPerformUpgrade(sqlStore, Version480, Version481) { 518 sqlStore.RemoveIndexIfExists("idx_channels_displayname", "Channels") 519 saveSchemaVersion(sqlStore, Version481) 520 } 521 } 522 523 func upgradeDatabaseToVersion49(sqlStore *SqlStore) { 524 // This version of Mattermost includes an App-Layer migration which migrates from hard-coded roles configured by 525 // a number of parameters in `config.json` to a `Roles` table in the database. The migration code can be seen 526 // in the file `app/app.go` in the function `DoAdvancedPermissionsMigration()`. 527 528 if shouldPerformUpgrade(sqlStore, Version481, Version490) { 529 sqlStore.CreateColumnIfNotExists("Teams", "LastTeamIconUpdate", "bigint", "bigint", "0") 530 defaultTimezone := timezones.DefaultUserTimezone() 531 defaultTimezoneValue, err := json.Marshal(defaultTimezone) 532 if err != nil { 533 mlog.Critical(err.Error()) 534 } 535 sqlStore.CreateColumnIfNotExists("Users", "Timezone", "varchar(256)", "varchar(256)", string(defaultTimezoneValue)) 536 sqlStore.RemoveIndexIfExists("idx_channels_displayname", "Channels") 537 saveSchemaVersion(sqlStore, Version490) 538 } 539 } 540 541 func upgradeDatabaseToVersion410(sqlStore *SqlStore) { 542 if shouldPerformUpgrade(sqlStore, Version490, Version4100) { 543 544 sqlStore.RemoveIndexIfExists("Name_2", "Channels") 545 sqlStore.RemoveIndexIfExists("Name_2", "Emoji") 546 sqlStore.RemoveIndexIfExists("ClientId_2", "OAuthAccessData") 547 548 saveSchemaVersion(sqlStore, Version4100) 549 sqlStore.GetMaster().Exec("UPDATE Users SET AuthData=LOWER(AuthData) WHERE AuthService = 'saml'") 550 } 551 } 552 553 func upgradeDatabaseToVersion50(sqlStore *SqlStore) { 554 // This version of Mattermost includes an App-Layer migration which migrates from hard-coded emojis configured 555 // in `config.json` to a `Permission` in the database. The migration code can be seen 556 // in the file `app/app.go` in the function `DoEmojisPermissionsMigration()`. 557 558 // This version of Mattermost also includes a online-migration which migrates some roles from the `Roles` columns of 559 // TeamMember and ChannelMember rows to the new SchemeAdmin and SchemeUser columns. If you need to downgrade to a 560 // version of Mattermost prior to 5.0, you should take your server offline and run the following SQL statements 561 // prior to launching the downgraded version: 562 // 563 // UPDATE Teams SET SchemeId = NULL; 564 // UPDATE Channels SET SchemeId = NULL; 565 // UPDATE TeamMembers SET Roles = CONCAT(Roles, ' team_user'), SchemeUser = NULL where SchemeUser = 1; 566 // UPDATE TeamMembers SET Roles = CONCAT(Roles, ' team_admin'), SchemeAdmin = NULL where SchemeAdmin = 1; 567 // UPDATE ChannelMembers SET Roles = CONCAT(Roles, ' channel_user'), SchemeUser = NULL where SchemeUser = 1; 568 // UPDATE ChannelMembers SET Roles = CONCAT(Roles, ' channel_admin'), SchemeAdmin = NULL where SchemeAdmin = 1; 569 // DELETE from Systems WHERE Name = 'migration_advanced_permissions_phase_2'; 570 571 if shouldPerformUpgrade(sqlStore, Version4100, Version500) { 572 573 sqlStore.CreateColumnIfNotExistsNoDefault("Teams", "SchemeId", "varchar(26)", "varchar(26)") 574 sqlStore.CreateColumnIfNotExistsNoDefault("Channels", "SchemeId", "varchar(26)", "varchar(26)") 575 576 sqlStore.CreateColumnIfNotExistsNoDefault("TeamMembers", "SchemeUser", "boolean", "boolean") 577 sqlStore.CreateColumnIfNotExistsNoDefault("TeamMembers", "SchemeAdmin", "boolean", "boolean") 578 sqlStore.CreateColumnIfNotExistsNoDefault("ChannelMembers", "SchemeUser", "boolean", "boolean") 579 sqlStore.CreateColumnIfNotExistsNoDefault("ChannelMembers", "SchemeAdmin", "boolean", "boolean") 580 581 sqlStore.CreateColumnIfNotExists("Roles", "BuiltIn", "boolean", "boolean", "0") 582 sqlStore.GetMaster().Exec("UPDATE Roles SET BuiltIn=true") 583 sqlStore.GetMaster().Exec("UPDATE Roles SET SchemeManaged=false WHERE Name NOT IN ('system_user', 'system_admin', 'team_user', 'team_admin', 'channel_user', 'channel_admin')") 584 sqlStore.CreateColumnIfNotExists("IncomingWebhooks", "ChannelLocked", "boolean", "boolean", "0") 585 586 sqlStore.RemoveIndexIfExists("idx_channels_txt", "Channels") 587 588 saveSchemaVersion(sqlStore, Version500) 589 } 590 } 591 592 func upgradeDatabaseToVersion51(sqlStore *SqlStore) { 593 if shouldPerformUpgrade(sqlStore, Version500, Version510) { 594 saveSchemaVersion(sqlStore, Version510) 595 } 596 } 597 598 func upgradeDatabaseToVersion52(sqlStore *SqlStore) { 599 if shouldPerformUpgrade(sqlStore, Version510, Version520) { 600 sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "Username", "varchar(64)", "varchar(64)", "") 601 sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "IconURL", "varchar(1024)", "varchar(1024)", "") 602 saveSchemaVersion(sqlStore, Version520) 603 } 604 } 605 606 func upgradeDatabaseToVersion53(sqlStore *SqlStore) { 607 if shouldPerformUpgrade(sqlStore, Version520, Version530) { 608 saveSchemaVersion(sqlStore, Version530) 609 } 610 } 611 612 func upgradeDatabaseToVersion54(sqlStore *SqlStore) { 613 if shouldPerformUpgrade(sqlStore, Version530, Version540) { 614 sqlStore.AlterColumnTypeIfExists("OutgoingWebhooks", "Description", "varchar(500)", "varchar(500)") 615 sqlStore.AlterColumnTypeIfExists("IncomingWebhooks", "Description", "varchar(500)", "varchar(500)") 616 if err := sqlStore.Channel().MigratePublicChannels(); err != nil { 617 mlog.Critical("Failed to migrate PublicChannels table", mlog.Err(err)) 618 time.Sleep(time.Second) 619 os.Exit(ExitGenericFailure) 620 } 621 saveSchemaVersion(sqlStore, Version540) 622 } 623 } 624 625 func upgradeDatabaseToVersion55(sqlStore *SqlStore) { 626 if shouldPerformUpgrade(sqlStore, Version540, Version550) { 627 saveSchemaVersion(sqlStore, Version550) 628 } 629 } 630 631 func upgradeDatabaseToVersion56(sqlStore *SqlStore) { 632 if shouldPerformUpgrade(sqlStore, Version550, Version560) { 633 sqlStore.CreateColumnIfNotExists("PluginKeyValueStore", "ExpireAt", "bigint(20)", "bigint", "0") 634 635 // migrating user's accepted terms of service data into the new table 636 sqlStore.GetMaster().Exec("INSERT INTO UserTermsOfService SELECT Id, AcceptedTermsOfServiceId as TermsOfServiceId, :CreateAt FROM Users WHERE AcceptedTermsOfServiceId != \"\" AND AcceptedTermsOfServiceId IS NOT NULL", map[string]interface{}{"CreateAt": model.GetMillis()}) 637 638 if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES { 639 sqlStore.RemoveIndexIfExists("idx_users_email_lower", "lower(Email)") 640 sqlStore.RemoveIndexIfExists("idx_users_username_lower", "lower(Username)") 641 sqlStore.RemoveIndexIfExists("idx_users_nickname_lower", "lower(Nickname)") 642 sqlStore.RemoveIndexIfExists("idx_users_firstname_lower", "lower(FirstName)") 643 sqlStore.RemoveIndexIfExists("idx_users_lastname_lower", "lower(LastName)") 644 } 645 646 saveSchemaVersion(sqlStore, Version560) 647 } 648 649 } 650 651 func upgradeDatabaseToVersion57(sqlStore *SqlStore) { 652 if shouldPerformUpgrade(sqlStore, Version560, Version570) { 653 saveSchemaVersion(sqlStore, Version570) 654 } 655 } 656 657 func upgradeDatabaseToVersion58(sqlStore *SqlStore) { 658 if shouldPerformUpgrade(sqlStore, Version570, Version580) { 659 // idx_channels_txt was removed in `upgradeDatabaseToVersion50`, but merged as part of 660 // v5.1, so the migration wouldn't apply to anyone upgrading from v5.0. Remove it again to 661 // bring the upgraded (from v5.0) and fresh install schemas back in sync. 662 sqlStore.RemoveIndexIfExists("idx_channels_txt", "Channels") 663 664 // Fix column types and defaults where gorp converged on a different schema value than the 665 // original migration. 666 sqlStore.AlterColumnTypeIfExists("OutgoingWebhooks", "Description", "text", "VARCHAR(500)") 667 sqlStore.AlterColumnTypeIfExists("IncomingWebhooks", "Description", "text", "VARCHAR(500)") 668 sqlStore.AlterColumnTypeIfExists("OutgoingWebhooks", "IconURL", "text", "VARCHAR(1024)") 669 sqlStore.AlterColumnDefaultIfExists("OutgoingWebhooks", "Username", model.NewString("NULL"), model.NewString("")) 670 sqlStore.AlterColumnDefaultIfExists("OutgoingWebhooks", "IconURL", nil, model.NewString("")) 671 sqlStore.AlterColumnDefaultIfExists("PluginKeyValueStore", "ExpireAt", model.NewString("NULL"), model.NewString("NULL")) 672 673 saveSchemaVersion(sqlStore, Version580) 674 } 675 } 676 677 func upgradeDatabaseToVersion59(sqlStore *SqlStore) { 678 if shouldPerformUpgrade(sqlStore, Version580, Version590) { 679 saveSchemaVersion(sqlStore, Version590) 680 } 681 } 682 683 func upgradeDatabaseToVersion510(sqlStore *SqlStore) { 684 if shouldPerformUpgrade(sqlStore, Version590, Version5100) { 685 sqlStore.CreateColumnIfNotExistsNoDefault("Channels", "GroupConstrained", "tinyint(4)", "boolean") 686 sqlStore.CreateColumnIfNotExistsNoDefault("Teams", "GroupConstrained", "tinyint(4)", "boolean") 687 688 sqlStore.CreateIndexIfNotExists("idx_groupteams_teamid", "GroupTeams", "TeamId") 689 sqlStore.CreateIndexIfNotExists("idx_groupchannels_channelid", "GroupChannels", "ChannelId") 690 691 saveSchemaVersion(sqlStore, Version5100) 692 } 693 } 694 695 func upgradeDatabaseToVersion511(sqlStore *SqlStore) { 696 if shouldPerformUpgrade(sqlStore, Version5100, Version5110) { 697 // Enforce all teams have an InviteID set 698 var teams []*model.Team 699 if _, err := sqlStore.GetReplica().Select(&teams, "SELECT * FROM Teams WHERE InviteId = ''"); err != nil { 700 mlog.Error("Error fetching Teams without InviteID", mlog.Err(err)) 701 } else { 702 for _, team := range teams { 703 team.InviteId = model.NewId() 704 if _, err := sqlStore.Team().Update(team); err != nil { 705 mlog.Error("Error updating Team InviteIDs", mlog.String("team_id", team.Id), mlog.Err(err)) 706 } 707 } 708 } 709 710 saveSchemaVersion(sqlStore, Version5110) 711 } 712 } 713 714 func upgradeDatabaseToVersion512(sqlStore *SqlStore) { 715 if shouldPerformUpgrade(sqlStore, Version5110, Version5120) { 716 sqlStore.CreateColumnIfNotExistsNoDefault("TeamMembers", "SchemeGuest", "boolean", "boolean") 717 sqlStore.CreateColumnIfNotExistsNoDefault("ChannelMembers", "SchemeGuest", "boolean", "boolean") 718 sqlStore.CreateColumnIfNotExistsNoDefault("Schemes", "DefaultTeamGuestRole", "text", "VARCHAR(64)") 719 sqlStore.CreateColumnIfNotExistsNoDefault("Schemes", "DefaultChannelGuestRole", "text", "VARCHAR(64)") 720 721 sqlStore.GetMaster().Exec("UPDATE Schemes SET DefaultTeamGuestRole = '', DefaultChannelGuestRole = ''") 722 723 // Saturday, January 24, 2065 5:20:00 AM GMT. To remove all personal access token sessions. 724 sqlStore.GetMaster().Exec("DELETE FROM Sessions WHERE ExpiresAt > 3000000000000") 725 726 saveSchemaVersion(sqlStore, Version5120) 727 } 728 } 729 730 func upgradeDatabaseToVersion513(sqlStore *SqlStore) { 731 if shouldPerformUpgrade(sqlStore, Version5120, Version5130) { 732 // The previous jobs ran once per minute, cluttering the Jobs table with somewhat useless entries. Clean that up. 733 sqlStore.GetMaster().Exec("DELETE FROM Jobs WHERE Type = 'plugins'") 734 735 saveSchemaVersion(sqlStore, Version5130) 736 } 737 } 738 739 func upgradeDatabaseToVersion514(sqlStore *SqlStore) { 740 if shouldPerformUpgrade(sqlStore, Version5130, Version5140) { 741 saveSchemaVersion(sqlStore, Version5140) 742 } 743 } 744 745 func upgradeDatabaseToVersion515(sqlStore *SqlStore) { 746 if shouldPerformUpgrade(sqlStore, Version5140, Version5150) { 747 saveSchemaVersion(sqlStore, Version5150) 748 } 749 } 750 751 func upgradeDatabaseToVersion516(sqlStore *SqlStore) { 752 if shouldPerformUpgrade(sqlStore, Version5150, Version5160) { 753 if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES { 754 sqlStore.GetMaster().Exec("ALTER TABLE Tokens ALTER COLUMN Extra TYPE varchar(2048)") 755 } else if sqlStore.DriverName() == model.DATABASE_DRIVER_MYSQL { 756 sqlStore.GetMaster().Exec("ALTER TABLE Tokens MODIFY Extra text") 757 } 758 saveSchemaVersion(sqlStore, Version5160) 759 760 // Fix mismatches between the canonical and migrated schemas. 761 sqlStore.AlterColumnTypeIfExists("TeamMembers", "SchemeGuest", "tinyint(4)", "boolean") 762 sqlStore.AlterColumnTypeIfExists("Schemes", "DefaultTeamGuestRole", "varchar(64)", "VARCHAR(64)") 763 sqlStore.AlterColumnTypeIfExists("Schemes", "DefaultChannelGuestRole", "varchar(64)", "VARCHAR(64)") 764 sqlStore.AlterColumnTypeIfExists("Teams", "AllowedDomains", "text", "VARCHAR(1000)") 765 sqlStore.AlterColumnTypeIfExists("Channels", "GroupConstrained", "tinyint(1)", "boolean") 766 sqlStore.AlterColumnTypeIfExists("Teams", "GroupConstrained", "tinyint(1)", "boolean") 767 768 // One known mismatch remains: ChannelMembers.SchemeGuest. The requisite migration 769 // is left here for posterity, but we're avoiding fix this given the corresponding 770 // table rewrite in most MySQL and Postgres instances. 771 // sqlStore.AlterColumnTypeIfExists("ChannelMembers", "SchemeGuest", "tinyint(4)", "boolean") 772 773 sqlStore.CreateIndexIfNotExists("idx_groupteams_teamid", "GroupTeams", "TeamId") 774 sqlStore.CreateIndexIfNotExists("idx_groupchannels_channelid", "GroupChannels", "ChannelId") 775 } 776 } 777 778 func upgradeDatabaseToVersion517(sqlStore *SqlStore) { 779 if shouldPerformUpgrade(sqlStore, Version5160, Version5170) { 780 saveSchemaVersion(sqlStore, Version5170) 781 } 782 } 783 784 func upgradeDatabaseToVersion518(sqlStore *SqlStore) { 785 if shouldPerformUpgrade(sqlStore, Version5170, Version5180) { 786 saveSchemaVersion(sqlStore, Version5180) 787 } 788 } 789 790 func upgradeDatabaseToVersion519(sqlStore *SqlStore) { 791 if shouldPerformUpgrade(sqlStore, Version5180, Version5190) { 792 saveSchemaVersion(sqlStore, Version5190) 793 } 794 } 795 796 func upgradeDatabaseToVersion520(sqlStore *SqlStore) { 797 if shouldPerformUpgrade(sqlStore, Version5190, Version5200) { 798 sqlStore.CreateColumnIfNotExistsNoDefault("Bots", "LastIconUpdate", "bigint", "bigint") 799 800 sqlStore.CreateColumnIfNotExists("GroupTeams", "SchemeAdmin", "boolean", "boolean", "0") 801 sqlStore.CreateIndexIfNotExists("idx_groupteams_schemeadmin", "GroupTeams", "SchemeAdmin") 802 803 sqlStore.CreateColumnIfNotExists("GroupChannels", "SchemeAdmin", "boolean", "boolean", "0") 804 sqlStore.CreateIndexIfNotExists("idx_groupchannels_schemeadmin", "GroupChannels", "SchemeAdmin") 805 806 saveSchemaVersion(sqlStore, Version5200) 807 } 808 } 809 810 func upgradeDatabaseToVersion521(sqlStore *SqlStore) { 811 if shouldPerformUpgrade(sqlStore, Version5200, Version5210) { 812 saveSchemaVersion(sqlStore, Version5210) 813 } 814 } 815 816 func upgradeDatabaseToVersion522(sqlStore *SqlStore) { 817 if shouldPerformUpgrade(sqlStore, Version5210, Version5220) { 818 sqlStore.CreateIndexIfNotExists("idx_teams_scheme_id", "Teams", "SchemeId") 819 sqlStore.CreateIndexIfNotExists("idx_channels_scheme_id", "Channels", "SchemeId") 820 sqlStore.CreateIndexIfNotExists("idx_channels_scheme_id", "Channels", "SchemeId") 821 sqlStore.CreateIndexIfNotExists("idx_schemes_channel_guest_role", "Schemes", "DefaultChannelGuestRole") 822 sqlStore.CreateIndexIfNotExists("idx_schemes_channel_user_role", "Schemes", "DefaultChannelUserRole") 823 sqlStore.CreateIndexIfNotExists("idx_schemes_channel_admin_role", "Schemes", "DefaultChannelAdminRole") 824 825 saveSchemaVersion(sqlStore, Version5220) 826 } 827 } 828 829 func upgradeDatabaseToVersion523(sqlStore *SqlStore) { 830 if shouldPerformUpgrade(sqlStore, Version5220, Version5230) { 831 saveSchemaVersion(sqlStore, Version5230) 832 } 833 } 834 835 func upgradeDatabaseToVersion524(sqlStore *SqlStore) { 836 if shouldPerformUpgrade(sqlStore, Version5230, Version5240) { 837 sqlStore.CreateColumnIfNotExists("UserGroups", "AllowReference", "boolean", "boolean", "0") 838 sqlStore.GetMaster().Exec("UPDATE UserGroups SET Name = null, AllowReference = false") 839 sqlStore.AlterPrimaryKey("Reactions", []string{"PostId", "UserId", "EmojiName"}) 840 841 saveSchemaVersion(sqlStore, Version5240) 842 } 843 } 844 845 func upgradeDatabaseToVersion525(sqlStore *SqlStore) { 846 if shouldPerformUpgrade(sqlStore, Version5240, Version5250) { 847 saveSchemaVersion(sqlStore, Version5250) 848 } 849 } 850 851 func upgradeDatabaseToVersion526(sqlStore *SqlStore) { 852 if shouldPerformUpgrade(sqlStore, Version5250, Version5260) { 853 sqlStore.CreateColumnIfNotExists("Sessions", "ExpiredNotify", "boolean", "boolean", "0") 854 855 saveSchemaVersion(sqlStore, Version5260) 856 } 857 } 858 859 func upgradeDatabaseToVersion527(sqlStore *SqlStore) { 860 if shouldPerformUpgrade(sqlStore, Version5260, Version5270) { 861 saveSchemaVersion(sqlStore, Version5270) 862 } 863 } 864 865 func upgradeDatabaseToVersion528(sqlStore *SqlStore) { 866 if shouldPerformUpgrade(sqlStore, Version5270, Version5280) { 867 if err := precheckMigrationToVersion528(sqlStore); err != nil { 868 mlog.Critical("Error upgrading DB schema to 5.28.0", mlog.Err(err)) 869 os.Exit(ExitGenericFailure) 870 } 871 872 sqlStore.CreateColumnIfNotExistsNoDefault("Commands", "PluginId", "VARCHAR(190)", "VARCHAR(190)") 873 sqlStore.GetMaster().Exec("UPDATE Commands SET PluginId = '' WHERE PluginId IS NULL") 874 875 sqlStore.AlterColumnTypeIfExists("Teams", "Type", "VARCHAR(255)", "VARCHAR(255)") 876 sqlStore.AlterColumnTypeIfExists("Teams", "SchemeId", "VARCHAR(26)", "VARCHAR(26)") 877 sqlStore.AlterColumnTypeIfExists("IncomingWebhooks", "Username", "varchar(255)", "varchar(255)") 878 sqlStore.AlterColumnTypeIfExists("IncomingWebhooks", "IconURL", "text", "varchar(1024)") 879 880 saveSchemaVersion(sqlStore, Version5280) 881 } 882 } 883 884 func upgradeDatabaseToVersion5281(sqlStore *SqlStore) { 885 if shouldPerformUpgrade(sqlStore, Version5280, Version5281) { 886 sqlStore.CreateColumnIfNotExistsNoDefault("FileInfo", "MiniPreview", "MEDIUMBLOB", "bytea") 887 888 saveSchemaVersion(sqlStore, Version5281) 889 } 890 } 891 892 func precheckMigrationToVersion528(sqlStore *SqlStore) error { 893 teamsQuery, _, err := sqlStore.getQueryBuilder().Select(`COALESCE(SUM(CASE 894 WHEN CHAR_LENGTH(SchemeId) > 26 THEN 1 895 ELSE 0 896 END),0) as schemeidwrong, 897 COALESCE(SUM(CASE 898 WHEN CHAR_LENGTH(Type) > 255 THEN 1 899 ELSE 0 900 END),0) as typewrong`). 901 From("Teams").ToSql() 902 if err != nil { 903 return err 904 } 905 webhooksQuery, _, err := sqlStore.getQueryBuilder().Select(`COALESCE(SUM(CASE 906 WHEN CHAR_LENGTH(Username) > 255 THEN 1 907 ELSE 0 908 END),0) as usernamewrong, 909 COALESCE(SUM(CASE 910 WHEN CHAR_LENGTH(IconURL) > 1024 THEN 1 911 ELSE 0 912 END),0) as iconurlwrong`). 913 From("IncomingWebhooks").ToSql() 914 if err != nil { 915 return err 916 } 917 918 var schemeIDWrong, typeWrong int 919 row := sqlStore.GetMaster().Db.QueryRow(teamsQuery) 920 if err = row.Scan(&schemeIDWrong, &typeWrong); err != nil && err != sql.ErrNoRows { 921 return err 922 } else if err == nil && schemeIDWrong > 0 { 923 return errors.New("Migration failure: " + 924 "Teams column SchemeId has data larger that 26 characters") 925 } else if err == nil && typeWrong > 0 { 926 return errors.New("Migration failure: " + 927 "Teams column Type has data larger that 255 characters") 928 } 929 930 var usernameWrong, iconURLWrong int 931 row = sqlStore.GetMaster().Db.QueryRow(webhooksQuery) 932 if err = row.Scan(&usernameWrong, &iconURLWrong); err != nil && err != sql.ErrNoRows { 933 mlog.Error("Error fetching IncomingWebhooks columns data", mlog.Err(err)) 934 } else if err == nil && usernameWrong > 0 { 935 return errors.New("Migration failure: " + 936 "IncomingWebhooks column Username has data larger that 255 characters") 937 } else if err == nil && iconURLWrong > 0 { 938 return errors.New("Migration failure: " + 939 "IncomingWebhooks column IconURL has data larger that 1024 characters") 940 } 941 942 return nil 943 } 944 945 func upgradeDatabaseToVersion529(sqlStore *SqlStore) { 946 if hasMissingMigrationsVersion529(sqlStore) { 947 mlog.Info("Applying migrations for version 5.29") 948 sqlStore.AlterColumnTypeIfExists("SidebarCategories", "Id", "VARCHAR(128)", "VARCHAR(128)") 949 sqlStore.AlterColumnDefaultIfExists("SidebarCategories", "Id", model.NewString(""), nil) 950 sqlStore.AlterColumnTypeIfExists("SidebarChannels", "CategoryId", "VARCHAR(128)", "VARCHAR(128)") 951 sqlStore.AlterColumnDefaultIfExists("SidebarChannels", "CategoryId", model.NewString(""), nil) 952 953 sqlStore.CreateColumnIfNotExistsNoDefault("Threads", "ChannelId", "VARCHAR(26)", "VARCHAR(26)") 954 955 updateThreadChannelsQuery := "UPDATE Threads INNER JOIN Posts ON Posts.Id=Threads.PostId SET Threads.ChannelId=Posts.ChannelId WHERE Threads.ChannelId IS NULL" 956 if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES { 957 updateThreadChannelsQuery = "UPDATE Threads SET ChannelId=Posts.ChannelId FROM Posts WHERE Posts.Id=Threads.PostId AND Threads.ChannelId IS NULL" 958 } 959 if _, err := sqlStore.GetMaster().Exec(updateThreadChannelsQuery); err != nil { 960 mlog.Error("Error updating ChannelId in Threads table", mlog.Err(err)) 961 } 962 } 963 964 if shouldPerformUpgrade(sqlStore, Version5281, Version5290) { 965 saveSchemaVersion(sqlStore, Version5290) 966 } 967 } 968 969 func hasMissingMigrationsVersion529(sqlStore *SqlStore) bool { 970 scIdInfo, err := sqlStore.GetColumnInfo("SidebarCategories", "Id") 971 if err != nil { 972 mlog.Error("Error getting column info for migration check", 973 mlog.String("table", "SidebarCategories"), 974 mlog.String("column", "Id"), 975 mlog.Err(err), 976 ) 977 return true 978 } 979 if !sqlStore.IsVarchar(scIdInfo.DataType) || scIdInfo.CharMaximumLength != 128 { 980 return true 981 } 982 scCategoryIdInfo, err := sqlStore.GetColumnInfo("SidebarChannels", "CategoryId") 983 if err != nil { 984 mlog.Error("Error getting column info for migration check", 985 mlog.String("table", "SidebarChannels"), 986 mlog.String("column", "CategoryId"), 987 mlog.Err(err), 988 ) 989 return true 990 } 991 if !sqlStore.IsVarchar(scCategoryIdInfo.DataType) || scCategoryIdInfo.CharMaximumLength != 128 { 992 return true 993 } 994 if !sqlStore.DoesColumnExist("Threads", "ChannelId") { 995 return true 996 } 997 return false 998 } 999 1000 func upgradeDatabaseToVersion5291(sqlStore *SqlStore) { 1001 if shouldPerformUpgrade(sqlStore, Version5290, Version5291) { 1002 saveSchemaVersion(sqlStore, Version5291) 1003 } 1004 } 1005 1006 func upgradeDatabaseToVersion530(sqlStore *SqlStore) { 1007 if hasMissingMigrationsVersion530(sqlStore) { 1008 mlog.Info("Applying migrations for version 5.30") 1009 sqlStore.CreateColumnIfNotExistsNoDefault("FileInfo", "Content", "longtext", "text") 1010 sqlStore.CreateColumnIfNotExists("SidebarCategories", "Muted", "tinyint(1)", "boolean", "0") 1011 } 1012 if shouldPerformUpgrade(sqlStore, Version5291, Version5300) { 1013 saveSchemaVersion(sqlStore, Version5300) 1014 } 1015 } 1016 1017 func hasMissingMigrationsVersion530(sqlStore *SqlStore) bool { 1018 if !sqlStore.DoesColumnExist("FileInfo", "Content") { 1019 return true 1020 } 1021 if !sqlStore.DoesColumnExist("SidebarCategories", "Muted") { 1022 return true 1023 } 1024 return false 1025 } 1026 1027 func upgradeDatabaseToVersion531(sqlStore *SqlStore) { 1028 if shouldPerformUpgrade(sqlStore, Version5300, Version5310) { 1029 saveSchemaVersion(sqlStore, Version5310) 1030 } 1031 } 1032 1033 func upgradeDatabaseToVersion532(sqlStore *SqlStore) { 1034 if hasMissingMigrationsVersion532(sqlStore) { 1035 sqlStore.CreateColumnIfNotExistsNoDefault("Channels", "Shared", "tinyint(1)", "boolean") 1036 sqlStore.CreateColumnIfNotExists("ThreadMemberships", "UnreadMentions", "bigint", "bigint", "0") 1037 sqlStore.CreateColumnIfNotExistsNoDefault("Reactions", "UpdateAt", "bigint", "bigint") 1038 sqlStore.CreateColumnIfNotExistsNoDefault("Reactions", "DeleteAt", "bigint", "bigint") 1039 } 1040 1041 if shouldPerformUpgrade(sqlStore, Version5310, Version5320) { 1042 saveSchemaVersion(sqlStore, Version5320) 1043 } 1044 } 1045 1046 func hasMissingMigrationsVersion532(sqlStore *SqlStore) bool { 1047 scIdInfo, err := sqlStore.GetColumnInfo("Posts", "FileIds") 1048 if err != nil { 1049 mlog.Error("Error getting column info for migration check", 1050 mlog.String("table", "Posts"), 1051 mlog.String("column", "FileIds"), 1052 mlog.Err(err), 1053 ) 1054 return true 1055 } 1056 1057 if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES { 1058 if !sqlStore.IsVarchar(scIdInfo.DataType) || scIdInfo.CharMaximumLength != 300 { 1059 return true 1060 } 1061 } else if sqlStore.DriverName() == model.DATABASE_DRIVER_MYSQL { 1062 if scIdInfo.DataType != "text" { 1063 return true 1064 } 1065 } 1066 1067 if !sqlStore.DoesColumnExist("Channels", "Shared") { 1068 return true 1069 } 1070 1071 if !sqlStore.DoesColumnExist("ThreadMemberships", "UnreadMentions") { 1072 return true 1073 } 1074 1075 if !sqlStore.DoesColumnExist("Reactions", "UpdateAt") { 1076 return true 1077 } 1078 1079 if !sqlStore.DoesColumnExist("Reactions", "DeleteAt") { 1080 return true 1081 } 1082 1083 return false 1084 } 1085 1086 func upgradeDatabaseToVersion533(sqlStore *SqlStore) { 1087 if shouldPerformUpgrade(sqlStore, Version5320, Version5330) { 1088 saveSchemaVersion(sqlStore, Version5330) 1089 } 1090 }