synchronize migrations with actual schema (#9965)

Этот коммит содержится в:
Jesse Hallam
2018-12-10 11:34:56 -05:00
коммит произвёл Christopher Speller
родитель ef04692b18
Коммит 204dde9f48
3 изменённых файлов: 71 добавлений и 1 удалений

Просмотреть файл

@@ -59,6 +59,7 @@ type SqlStore interface {
RenameColumnIfExists(tableName string, oldColumnName string, newColumnName string, colType string) bool RenameColumnIfExists(tableName string, oldColumnName string, newColumnName string, colType string) bool
GetMaxLengthOfColumnIfExists(tableName string, columnName string) string GetMaxLengthOfColumnIfExists(tableName string, columnName string) string
AlterColumnTypeIfExists(tableName string, columnName string, mySqlColType string, postgresColType string) bool AlterColumnTypeIfExists(tableName string, columnName string, mySqlColType string, postgresColType string) bool
AlterColumnDefaultIfExists(tableName string, columnName string, mySqlColDefault *string, postgresColDefault *string) bool
CreateUniqueIndexIfNotExists(indexName string, tableName string, columnName string) bool CreateUniqueIndexIfNotExists(indexName string, tableName string, columnName string) bool
CreateIndexIfNotExists(indexName string, tableName string, columnName string) bool CreateIndexIfNotExists(indexName string, tableName string, columnName string) bool
CreateCompositeIndexIfNotExists(indexName string, tableName string, columnNames []string) bool CreateCompositeIndexIfNotExists(indexName string, tableName string, columnNames []string) bool

Просмотреть файл

@@ -677,6 +677,52 @@ func (ss *SqlSupplier) AlterColumnTypeIfExists(tableName string, columnName stri
return true return true
} }
func (ss *SqlSupplier) AlterColumnDefaultIfExists(tableName string, columnName string, mySqlColDefault *string, postgresColDefault *string) bool {
if !ss.DoesColumnExist(tableName, columnName) {
return false
}
var defaultValue = ""
if ss.DriverName() == model.DATABASE_DRIVER_MYSQL {
// Some column types in MySQL cannot have defaults, so don't try to configure anything.
if mySqlColDefault == nil {
return true
}
defaultValue = *mySqlColDefault
} else if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES {
// Postgres doesn't have the same limitation, but preserve the interface.
if postgresColDefault == nil {
return true
}
tableName = strings.ToLower(tableName)
columnName = strings.ToLower(columnName)
defaultValue = *postgresColDefault
} else {
mlog.Critical("Failed to alter column default because of missing driver")
time.Sleep(time.Second)
os.Exit(EXIT_GENERIC_FAILURE)
return false
}
var err error
if defaultValue == "" {
_, err = ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " ALTER COLUMN " + columnName + " DROP DEFAULT")
} else {
_, err = ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " ALTER COLUMN " + columnName + " SET DEFAULT " + defaultValue)
}
if err != nil {
mlog.Critical(fmt.Sprintf("Failed to alter column %s.%s default %s: %v", tableName, columnName, defaultValue, err))
time.Sleep(time.Second)
os.Exit(EXIT_GENERIC_FAILURE)
return false
}
return true
}
func (ss *SqlSupplier) CreateUniqueIndexIfNotExists(indexName string, tableName string, columnName string) bool { func (ss *SqlSupplier) CreateUniqueIndexIfNotExists(indexName string, tableName string, columnName string) bool {
return ss.createIndexIfNotExists(indexName, tableName, []string{columnName}, INDEX_TYPE_DEFAULT, true) return ss.createIndexIfNotExists(indexName, tableName, []string{columnName}, INDEX_TYPE_DEFAULT, true)
} }

Просмотреть файл

@@ -92,6 +92,7 @@ func UpgradeDatabase(sqlStore SqlStore) {
UpgradeDatabaseToVersion55(sqlStore) UpgradeDatabaseToVersion55(sqlStore)
UpgradeDatabaseToVersion56(sqlStore) UpgradeDatabaseToVersion56(sqlStore)
UpgradeDatabaseToVersion57(sqlStore) UpgradeDatabaseToVersion57(sqlStore)
UpgradeDatabaseToVersion58(sqlStore)
// If the SchemaVersion is empty this this is the first time it has ran // If the SchemaVersion is empty this this is the first time it has ran
// so lets set it to the current version. // so lets set it to the current version.
@@ -536,9 +537,31 @@ func UpgradeDatabaseToVersion56(sqlStore SqlStore) {
} }
func UpgradeDatabaseToVersion57(sqlStore SqlStore) { func UpgradeDatabaseToVersion57(sqlStore SqlStore) {
// TODO: Uncomment following condition when version 5.5.0 is released // TODO: Uncomment following condition when version 5.7.0 is released
// if shouldPerformUpgrade(sqlStore, VERSION_5_6_0, VERSION_5_7_0) { // if shouldPerformUpgrade(sqlStore, VERSION_5_6_0, VERSION_5_7_0) {
// saveSchemaVersion(sqlStore, VERSION_5_7_0) // saveSchemaVersion(sqlStore, VERSION_5_7_0)
// } // }
} }
func UpgradeDatabaseToVersion58(sqlStore SqlStore) {
// TODO: Uncomment following condition when version 5.8.0 is released
// if shouldPerformUpgrade(sqlStore, VERSION_5_7_0, VERSION_5_8_0) {
// idx_channels_txt was removed in `UpgradeDatabaseToVersion50`, but merged as part of
// v5.1, so the migration wouldn't apply to anyone upgrading from v5.0. Remove it again to
// bring the upgraded (from v5.0) and fresh install schemas back in sync.
sqlStore.RemoveIndexIfExists("idx_channels_txt", "Channels")
// Fix column types and defaults where gorp converged on a different schema value than the
// original migration.
sqlStore.AlterColumnTypeIfExists("OutgoingWebhooks", "Description", "text", "VARCHAR(500)")
sqlStore.AlterColumnTypeIfExists("IncomingWebhooks", "Description", "text", "VARCHAR(500)")
sqlStore.AlterColumnTypeIfExists("OutgoingWebhooks", "IconURL", "text", "VARCHAR(1024)")
sqlStore.AlterColumnDefaultIfExists("OutgoingWebhooks", "Username", model.NewString("NULL"), model.NewString(""))
sqlStore.AlterColumnDefaultIfExists("OutgoingWebhooks", "IconURL", nil, model.NewString(""))
sqlStore.AlterColumnDefaultIfExists("PluginKeyValueStore", "ExpireAt", model.NewString("NULL"), model.NewString("NULL"))
// saveSchemaVersion(sqlStore, VERSION_5_8_0)
// }
}