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