diff --git a/api4/apitestlib.go b/api4/apitestlib.go index aa12985465..7dc756913b 100644 --- a/api4/apitestlib.go +++ b/api4/apitestlib.go @@ -328,7 +328,7 @@ func (me *TestHelper) InitLogin() *TestHelper { me.TeamAdminUser = userCache.TeamAdminUser.DeepCopy() me.BasicUser = userCache.BasicUser.DeepCopy() me.BasicUser2 = userCache.BasicUser2.DeepCopy() - mainHelper.GetSQLSupplier().GetMaster().Insert(me.SystemAdminUser, me.TeamAdminUser, me.BasicUser, me.BasicUser2) + mainHelper.GetSQLStore().GetMaster().Insert(me.SystemAdminUser, me.TeamAdminUser, me.BasicUser, me.BasicUser2) // restore non hashed password for login me.SystemAdminUser.Password = "Pa$$word11" me.TeamAdminUser.Password = "Pa$$word11" diff --git a/app/channel_category_test.go b/app/channel_category_test.go index a6999f852a..9cc4f0114e 100644 --- a/app/channel_category_test.go +++ b/app/channel_category_test.go @@ -122,11 +122,11 @@ func TestGetSidebarCategories(t *testing.T) { defer th.TearDown() // Temporarily renaming a table to force a DB error. - sqlSupplier := mainHelper.GetSQLSupplier() - _, err := sqlSupplier.GetMaster().Exec("ALTER TABLE SidebarCategories RENAME TO SidebarCategoriesTest") + sqlStore := mainHelper.GetSQLStore() + _, err := sqlStore.GetMaster().Exec("ALTER TABLE SidebarCategories RENAME TO SidebarCategoriesTest") require.Nil(t, err) defer func() { - _, err := sqlSupplier.GetMaster().Exec("ALTER TABLE SidebarCategoriesTest RENAME TO SidebarCategories") + _, err := sqlStore.GetMaster().Exec("ALTER TABLE SidebarCategoriesTest RENAME TO SidebarCategories") require.Nil(t, err) }() diff --git a/app/config_test.go b/app/config_test.go index b31f2a4c8c..8903072ecb 100644 --- a/app/config_test.go +++ b/app/config_test.go @@ -125,7 +125,7 @@ func TestEnsureInstallationDate(t *testing.T) { for _, tc := range tt { t.Run(tc.Name, func(t *testing.T) { - sqlStore := th.GetSqlSupplier() + sqlStore := th.GetSqlStore() sqlStore.GetMaster().Exec("DELETE FROM Users") for _, createAt := range tc.UsersCreationDates { diff --git a/app/helper_test.go b/app/helper_test.go index ac9d7dd9a9..d0643b067c 100644 --- a/app/helper_test.go +++ b/app/helper_test.go @@ -208,7 +208,7 @@ func (th *TestHelper) InitBasic() *TestHelper { th.SystemAdminUser = userCache.SystemAdminUser.DeepCopy() th.BasicUser = userCache.BasicUser.DeepCopy() th.BasicUser2 = userCache.BasicUser2.DeepCopy() - mainHelper.GetSQLSupplier().GetMaster().Insert(th.SystemAdminUser, th.BasicUser, th.BasicUser2) + mainHelper.GetSQLStore().GetMaster().Insert(th.SystemAdminUser, th.BasicUser, th.BasicUser2) th.BasicTeam = th.CreateTeam() @@ -574,40 +574,40 @@ func (th *TestHelper) TearDown() { } } -func (*TestHelper) GetSqlSupplier() *sqlstore.SqlSupplier { - return mainHelper.GetSQLSupplier() +func (*TestHelper) GetSqlStore() *sqlstore.SqlStore { + return mainHelper.GetSQLStore() } func (*TestHelper) ResetRoleMigration() { - sqlSupplier := mainHelper.GetSQLSupplier() - if _, err := sqlSupplier.GetMaster().Exec("DELETE from Roles"); err != nil { + sqlStore := mainHelper.GetSQLStore() + if _, err := sqlStore.GetMaster().Exec("DELETE from Roles"); err != nil { panic(err) } mainHelper.GetClusterInterface().SendClearRoleCacheMessage() - if _, err := sqlSupplier.GetMaster().Exec("DELETE from Systems where Name = :Name", map[string]interface{}{"Name": model.ADVANCED_PERMISSIONS_MIGRATION_KEY}); err != nil { + if _, err := sqlStore.GetMaster().Exec("DELETE from Systems where Name = :Name", map[string]interface{}{"Name": model.ADVANCED_PERMISSIONS_MIGRATION_KEY}); err != nil { panic(err) } } func (*TestHelper) ResetEmojisMigration() { - sqlSupplier := mainHelper.GetSQLSupplier() - if _, err := sqlSupplier.GetMaster().Exec("UPDATE Roles SET Permissions=REPLACE(Permissions, ' create_emojis', '') WHERE builtin=True"); err != nil { + sqlStore := mainHelper.GetSQLStore() + if _, err := sqlStore.GetMaster().Exec("UPDATE Roles SET Permissions=REPLACE(Permissions, ' create_emojis', '') WHERE builtin=True"); err != nil { panic(err) } - if _, err := sqlSupplier.GetMaster().Exec("UPDATE Roles SET Permissions=REPLACE(Permissions, ' delete_emojis', '') WHERE builtin=True"); err != nil { + if _, err := sqlStore.GetMaster().Exec("UPDATE Roles SET Permissions=REPLACE(Permissions, ' delete_emojis', '') WHERE builtin=True"); err != nil { panic(err) } - if _, err := sqlSupplier.GetMaster().Exec("UPDATE Roles SET Permissions=REPLACE(Permissions, ' delete_others_emojis', '') WHERE builtin=True"); err != nil { + if _, err := sqlStore.GetMaster().Exec("UPDATE Roles SET Permissions=REPLACE(Permissions, ' delete_others_emojis', '') WHERE builtin=True"); err != nil { panic(err) } mainHelper.GetClusterInterface().SendClearRoleCacheMessage() - if _, err := sqlSupplier.GetMaster().Exec("DELETE from Systems where Name = :Name", map[string]interface{}{"Name": EMOJIS_PERMISSIONS_MIGRATION_KEY}); err != nil { + if _, err := sqlStore.GetMaster().Exec("DELETE from Systems where Name = :Name", map[string]interface{}{"Name": EMOJIS_PERMISSIONS_MIGRATION_KEY}); err != nil { panic(err) } } diff --git a/app/server.go b/app/server.go index 505ac49689..bbe7a030dc 100644 --- a/app/server.go +++ b/app/server.go @@ -63,7 +63,7 @@ var MaxNotificationsPerChannelDefault int64 = 1000000 var SENTRY_DSN = "placeholder_sentry_dsn" type Server struct { - sqlStore *sqlstore.SqlSupplier + sqlStore *sqlstore.SqlStore Store store.Store WebSocketRouter *WebSocketRouter AppInitializedOnce sync.Once @@ -306,7 +306,7 @@ func NewServer(options ...Option) (*Server, error) { if s.newStore == nil { s.newStore = func() store.Store { - s.sqlStore = sqlstore.NewSqlSupplier(s.Config().SqlSettings, s.Metrics) + s.sqlStore = sqlstore.New(s.Config().SqlSettings, s.Metrics) searchStore := searchlayer.NewSearchLayer( localcachelayer.NewLocalCacheLayer( retrylayer.New(s.sqlStore), diff --git a/app/slashcommands/helper_test.go b/app/slashcommands/helper_test.go index c7a9f226f7..9a19fb8778 100644 --- a/app/slashcommands/helper_test.go +++ b/app/slashcommands/helper_test.go @@ -160,7 +160,7 @@ func (me *TestHelper) initBasic() *TestHelper { me.SystemAdminUser = userCache.SystemAdminUser.DeepCopy() me.BasicUser = userCache.BasicUser.DeepCopy() me.BasicUser2 = userCache.BasicUser2.DeepCopy() - mainHelper.GetSQLSupplier().GetMaster().Insert(me.SystemAdminUser, me.BasicUser, me.BasicUser2) + mainHelper.GetSQLStore().GetMaster().Insert(me.SystemAdminUser, me.BasicUser, me.BasicUser2) me.BasicTeam = me.createTeam() diff --git a/app/user_test.go b/app/user_test.go index ac38a51511..e68216e366 100644 --- a/app/user_test.go +++ b/app/user_test.go @@ -886,8 +886,8 @@ func TestPermanentDeleteUser(t *testing.T) { var bots1 []*model.Bot var bots2 []*model.Bot - sqlSupplier := mainHelper.GetSQLSupplier() - _, err1 := sqlSupplier.GetMaster().Select(&bots1, "SELECT * FROM Bots") + sqlStore := mainHelper.GetSQLStore() + _, err1 := sqlStore.GetMaster().Select(&bots1, "SELECT * FROM Bots") assert.Nil(t, err1) assert.Equal(t, 1, len(bots1)) @@ -898,7 +898,7 @@ func TestPermanentDeleteUser(t *testing.T) { err = th.App.PermanentDeleteUser(retUser1) assert.Nil(t, err) - _, err1 = sqlSupplier.GetMaster().Select(&bots2, "SELECT * FROM Bots") + _, err1 = sqlStore.GetMaster().Select(&bots2, "SELECT * FROM Bots") assert.Nil(t, err1) assert.Equal(t, 0, len(bots2)) diff --git a/config/database_test.go b/config/database_test.go index 127572945a..8f1572eec4 100644 --- a/config/database_test.go +++ b/config/database_test.go @@ -38,7 +38,7 @@ func setupConfigDatabase(t *testing.T, cfg *model.Config, files map[string][]byt cfgData, err := config.MarshalConfig(cfg) require.NoError(t, err) - db := sqlx.NewDb(mainHelper.GetSQLSupplier().GetMaster().Db, *mainHelper.GetSQLSettings().DriverName) + db := sqlx.NewDb(mainHelper.GetSQLStore().GetMaster().Db, *mainHelper.GetSQLSettings().DriverName) err = config.InitializeConfigurationsTable(db) require.NoError(t, err) @@ -76,7 +76,7 @@ func getActualDatabaseConfig(t *testing.T) (string, *model.Config) { ID string `db:"id"` Value []byte `db:"value"` } - db := sqlx.NewDb(mainHelper.GetSQLSupplier().GetMaster().Db, *mainHelper.GetSQLSettings().DriverName) + db := sqlx.NewDb(mainHelper.GetSQLStore().GetMaster().Db, *mainHelper.GetSQLSettings().DriverName) err := db.Get(&actual, "SELECT Id, Value FROM Configurations WHERE Active") require.NoError(t, err) @@ -89,7 +89,7 @@ func getActualDatabaseConfig(t *testing.T) (string, *model.Config) { ID string `db:"Id"` Value []byte `db:"Value"` } - db := sqlx.NewDb(mainHelper.GetSQLSupplier().GetMaster().Db, *mainHelper.GetSQLSettings().DriverName) + db := sqlx.NewDb(mainHelper.GetSQLStore().GetMaster().Db, *mainHelper.GetSQLSettings().DriverName) err := db.Get(&actual, "SELECT Id, Value FROM Configurations WHERE Active") require.NoError(t, err) @@ -546,7 +546,7 @@ func TestDatabaseStoreSet(t *testing.T) { defer ds.Close() sqlSettings := mainHelper.GetSQLSettings() - db := sqlx.NewDb(mainHelper.GetSQLSupplier().GetMaster().Db, *sqlSettings.DriverName) + db := sqlx.NewDb(mainHelper.GetSQLStore().GetMaster().Db, *sqlSettings.DriverName) _, err = db.Exec("DROP TABLE Configurations") require.NoError(t, err) @@ -794,7 +794,7 @@ func TestDatabaseStoreLoad(t *testing.T) { require.NoError(t, err) sqlSettings := mainHelper.GetSQLSettings() - db := sqlx.NewDb(mainHelper.GetSQLSupplier().GetMaster().Db, *sqlSettings.DriverName) + db := sqlx.NewDb(mainHelper.GetSQLStore().GetMaster().Db, *sqlSettings.DriverName) truncateTables(t) id := model.NewId() _, err = db.NamedExec("INSERT INTO Configurations (Id, Value, CreateAt, Active) VALUES(:Id, :Value, :CreateAt, TRUE)", map[string]interface{}{ diff --git a/config/main_test.go b/config/main_test.go index 1b03e9c31e..52a2750063 100644 --- a/config/main_test.go +++ b/config/main_test.go @@ -34,11 +34,11 @@ func TestMain(m *testing.M) { func truncateTable(t *testing.T, table string) { t.Helper() sqlSetting := mainHelper.GetSQLSettings() - sqlSupplier := mainHelper.GetSQLSupplier() + sqlStore := mainHelper.GetSQLStore() switch *sqlSetting.DriverName { case model.DATABASE_DRIVER_MYSQL: - _, err := sqlSupplier.GetMaster().Db.Exec(fmt.Sprintf("TRUNCATE TABLE %s", table)) + _, err := sqlStore.GetMaster().Db.Exec(fmt.Sprintf("TRUNCATE TABLE %s", table)) if err != nil { if driverErr, ok := err.(*mysql.MySQLError); ok { // Ignore if the Configurations table does not exist. @@ -50,7 +50,7 @@ func truncateTable(t *testing.T, table string) { require.NoError(t, err) case model.DATABASE_DRIVER_POSTGRES: - _, err := sqlSupplier.GetMaster().Db.Exec(fmt.Sprintf("TRUNCATE TABLE %s", table)) + _, err := sqlStore.GetMaster().Db.Exec(fmt.Sprintf("TRUNCATE TABLE %s", table)) if err != nil { if driverErr, ok := err.(*pq.Error); ok { // Ignore if the Configurations table does not exist. diff --git a/migrations/helper_test.go b/migrations/helper_test.go index 917903398d..507fdf0ad8 100644 --- a/migrations/helper_test.go +++ b/migrations/helper_test.go @@ -252,14 +252,14 @@ func (me *TestHelper) TearDown() { } func (me *TestHelper) ResetRoleMigration() { - sqlSupplier := mainHelper.GetSQLSupplier() - if _, err := sqlSupplier.GetMaster().Exec("DELETE from Roles"); err != nil { + sqlStore := mainHelper.GetSQLStore() + if _, err := sqlStore.GetMaster().Exec("DELETE from Roles"); err != nil { panic(err) } mainHelper.GetClusterInterface().SendClearRoleCacheMessage() - if _, err := sqlSupplier.GetMaster().Exec("DELETE from Systems where Name = :Name", map[string]interface{}{"Name": model.ADVANCED_PERMISSIONS_MIGRATION_KEY}); err != nil { + if _, err := sqlStore.GetMaster().Exec("DELETE from Systems where Name = :Name", map[string]interface{}{"Name": model.ADVANCED_PERMISSIONS_MIGRATION_KEY}); err != nil { panic(err) } } diff --git a/services/searchengine/bleveengine/bleve_test.go b/services/searchengine/bleveengine/bleve_test.go index ff1a38fa28..bf9c052643 100644 --- a/services/searchengine/bleveengine/bleve_test.go +++ b/services/searchengine/bleveengine/bleve_test.go @@ -25,7 +25,7 @@ type BleveEngineTestSuite struct { suite.Suite SQLSettings *model.SqlSettings - SQLSupplier *sqlstore.SqlSupplier + SQLStore *sqlstore.SqlStore SearchEngine *searchengine.Broker Store *searchlayer.SearchStore BleveEngine *BleveEngine @@ -50,7 +50,7 @@ func (s *BleveEngineTestSuite) setupStore() { driverName = model.DATABASE_DRIVER_POSTGRES } s.SQLSettings = storetest.MakeSqlSettings(driverName) - s.SQLSupplier = sqlstore.NewSqlSupplier(*s.SQLSettings, nil) + s.SQLStore = sqlstore.New(*s.SQLSettings, nil) cfg := &model.Config{} cfg.SetDefaults() @@ -61,7 +61,7 @@ func (s *BleveEngineTestSuite) setupStore() { cfg.SqlSettings.DisableDatabaseSearch = model.NewBool(true) s.SearchEngine = searchengine.NewBroker(cfg, nil) - s.Store = searchlayer.NewSearchLayer(&testlib.TestStore{Store: s.SQLSupplier}, s.SearchEngine, cfg) + s.Store = searchlayer.NewSearchLayer(&testlib.TestStore{Store: s.SQLStore}, s.SearchEngine, cfg) s.BleveEngine = NewBleveEngine(cfg, nil) s.BleveEngine.indexSync = true @@ -78,7 +78,7 @@ func (s *BleveEngineTestSuite) SetupSuite() { func (s *BleveEngineTestSuite) TearDownSuite() { os.RemoveAll(s.IndexDir) - s.SQLSupplier.Close() + s.SQLStore.Close() storetest.CleanupSqlSettings(s.SQLSettings) } diff --git a/store/localcachelayer/layer_test.go b/store/localcachelayer/layer_test.go index e780654edb..44b41a1e85 100644 --- a/store/localcachelayer/layer_test.go +++ b/store/localcachelayer/layer_test.go @@ -17,7 +17,7 @@ import ( type storeType struct { Name string SqlSettings *model.SqlSettings - SqlSupplier *sqlstore.SqlSupplier + SqlStore *sqlstore.SqlStore Store store.Store } @@ -48,7 +48,7 @@ func StoreTest(t *testing.T, f func(*testing.T, store.Store)) { } } -func StoreTestWithSqlSupplier(t *testing.T, f func(*testing.T, store.Store, storetest.SqlSupplier)) { +func StoreTestWithSqlStore(t *testing.T, f func(*testing.T, store.Store, storetest.SqlStore)) { defer func() { if err := recover(); err != nil { tearDownStores() @@ -61,7 +61,7 @@ func StoreTestWithSqlSupplier(t *testing.T, f func(*testing.T, store.Store, stor if testing.Short() { t.SkipNow() } - f(t, st.Store, st.SqlSupplier) + f(t, st.Store, st.SqlStore) }) } } @@ -97,8 +97,8 @@ func initStores() { wg.Add(1) go func() { defer wg.Done() - st.SqlSupplier = sqlstore.NewSqlSupplier(*st.SqlSettings, nil) - st.Store = NewLocalCacheLayer(st.SqlSupplier, nil, nil, getMockCacheProvider()) + st.SqlStore = sqlstore.New(*st.SqlSettings, nil) + st.Store = NewLocalCacheLayer(st.SqlStore, nil, nil, getMockCacheProvider()) st.Store.DropAllTables() st.Store.MarkSystemRanUnitTests() }() diff --git a/store/localcachelayer/post_layer_test.go b/store/localcachelayer/post_layer_test.go index 7d832be621..b4a05acd5e 100644 --- a/store/localcachelayer/post_layer_test.go +++ b/store/localcachelayer/post_layer_test.go @@ -15,7 +15,7 @@ import ( ) func TestPostStore(t *testing.T) { - StoreTestWithSqlSupplier(t, storetest.TestPostStore) + StoreTestWithSqlStore(t, storetest.TestPostStore) } func TestPostStoreLastPostTimeCache(t *testing.T) { diff --git a/store/localcachelayer/role_layer_test.go b/store/localcachelayer/role_layer_test.go index 7843a7c4b1..97a8a1d1e8 100644 --- a/store/localcachelayer/role_layer_test.go +++ b/store/localcachelayer/role_layer_test.go @@ -14,7 +14,7 @@ import ( ) func TestRoleStore(t *testing.T) { - StoreTestWithSqlSupplier(t, storetest.TestRoleStore) + StoreTestWithSqlStore(t, storetest.TestRoleStore) } func TestRoleStoreCache(t *testing.T) { diff --git a/store/localcachelayer/user_layer_test.go b/store/localcachelayer/user_layer_test.go index 74b28233b6..b3cac5a5c0 100644 --- a/store/localcachelayer/user_layer_test.go +++ b/store/localcachelayer/user_layer_test.go @@ -16,7 +16,7 @@ import ( ) func TestUserStore(t *testing.T) { - StoreTestWithSqlSupplier(t, storetest.TestUserStore) + StoreTestWithSqlStore(t, storetest.TestUserStore) } func TestUserStoreCache(t *testing.T) { diff --git a/store/searchlayer/layer_test.go b/store/searchlayer/layer_test.go index 3a820a9a40..1a47b953b6 100644 --- a/store/searchlayer/layer_test.go +++ b/store/searchlayer/layer_test.go @@ -24,7 +24,7 @@ func TestUpdateConfigRace(t *testing.T) { driverName = model.DATABASE_DRIVER_POSTGRES } settings := storetest.MakeSqlSettings(driverName) - store := sqlstore.NewSqlSupplier(*settings, nil) + store := sqlstore.New(*settings, nil) cfg := &model.Config{} cfg.SetDefaults() diff --git a/store/sqlstore/audit_store.go b/store/sqlstore/audit_store.go index c29be5df12..bcdf2ec7df 100644 --- a/store/sqlstore/audit_store.go +++ b/store/sqlstore/audit_store.go @@ -12,13 +12,13 @@ import ( ) type SqlAuditStore struct { - *SqlSupplier + *SqlStore } -func newSqlAuditStore(sqlSupplier *SqlSupplier) store.AuditStore { - s := &SqlAuditStore{sqlSupplier} +func newSqlAuditStore(sqlStore *SqlStore) store.AuditStore { + s := &SqlAuditStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.Audit{}, "Audits").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("UserId").SetMaxSize(26) diff --git a/store/sqlstore/bot_store.go b/store/sqlstore/bot_store.go index 62f380f6fd..6f28587506 100644 --- a/store/sqlstore/bot_store.go +++ b/store/sqlstore/bot_store.go @@ -42,18 +42,18 @@ func botFromModel(b *model.Bot) *bot { // Bots are otherwise normal users with extra metadata record in the Bots table. The primary key // for a bot matches the primary key value for corresponding User record. type SqlBotStore struct { - *SqlSupplier + *SqlStore metrics einterfaces.MetricsInterface } // newSqlBotStore creates an instance of SqlBotStore, registering the table schema in question. -func newSqlBotStore(sqlSupplier *SqlSupplier, metrics einterfaces.MetricsInterface) store.BotStore { +func newSqlBotStore(sqlStore *SqlStore, metrics einterfaces.MetricsInterface) store.BotStore { us := &SqlBotStore{ - SqlSupplier: sqlSupplier, - metrics: metrics, + SqlStore: sqlStore, + metrics: metrics, } - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(bot{}, "Bots").SetKeys(false, "UserId") table.ColMap("UserId").SetMaxSize(26) table.ColMap("Description").SetMaxSize(1024) diff --git a/store/sqlstore/bot_store_test.go b/store/sqlstore/bot_store_test.go index 691135f23d..b7f2464553 100644 --- a/store/sqlstore/bot_store_test.go +++ b/store/sqlstore/bot_store_test.go @@ -10,5 +10,5 @@ import ( ) func TestBotStore(t *testing.T) { - StoreTestWithSqlSupplier(t, storetest.TestBotStore) + StoreTestWithSqlStore(t, storetest.TestBotStore) } diff --git a/store/sqlstore/channel_member_history_store.go b/store/sqlstore/channel_member_history_store.go index bda88f5927..fa8d008aab 100644 --- a/store/sqlstore/channel_member_history_store.go +++ b/store/sqlstore/channel_member_history_store.go @@ -17,15 +17,15 @@ import ( ) type SqlChannelMemberHistoryStore struct { - *SqlSupplier + *SqlStore } -func newSqlChannelMemberHistoryStore(sqlSupplier *SqlSupplier) store.ChannelMemberHistoryStore { +func newSqlChannelMemberHistoryStore(sqlStore *SqlStore) store.ChannelMemberHistoryStore { s := &SqlChannelMemberHistoryStore{ - SqlSupplier: sqlSupplier, + SqlStore: sqlStore, } - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.ChannelMemberHistory{}, "ChannelMemberHistory").SetKeys(false, "ChannelId", "UserId", "JoinTime") table.ColMap("ChannelId").SetMaxSize(26) table.ColMap("UserId").SetMaxSize(26) diff --git a/store/sqlstore/channel_store.go b/store/sqlstore/channel_store.go index 176c51ec34..1eceae75d2 100644 --- a/store/sqlstore/channel_store.go +++ b/store/sqlstore/channel_store.go @@ -33,7 +33,7 @@ const ( ) type SqlChannelStore struct { - *SqlSupplier + *SqlStore metrics einterfaces.MetricsInterface } @@ -356,13 +356,13 @@ func (s SqlChannelStore) ClearCaches() { } } -func newSqlChannelStore(sqlSupplier *SqlSupplier, metrics einterfaces.MetricsInterface) store.ChannelStore { +func newSqlChannelStore(sqlStore *SqlStore, metrics einterfaces.MetricsInterface) store.ChannelStore { s := &SqlChannelStore{ - SqlSupplier: sqlSupplier, - metrics: metrics, + SqlStore: sqlStore, + metrics: metrics, } - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.Channel{}, "Channels").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("TeamId").SetMaxSize(26) diff --git a/store/sqlstore/channel_store_categories_test.go b/store/sqlstore/channel_store_categories_test.go index bf586ecbe6..51bfb7a78f 100644 --- a/store/sqlstore/channel_store_categories_test.go +++ b/store/sqlstore/channel_store_categories_test.go @@ -10,5 +10,5 @@ import ( ) func TestChannelStoreCategories(t *testing.T) { - StoreTestWithSqlSupplier(t, storetest.TestChannelStoreCategories) + StoreTestWithSqlStore(t, storetest.TestChannelStoreCategories) } diff --git a/store/sqlstore/channel_store_test.go b/store/sqlstore/channel_store_test.go index 5da518a407..0d697d669c 100644 --- a/store/sqlstore/channel_store_test.go +++ b/store/sqlstore/channel_store_test.go @@ -17,7 +17,7 @@ import ( ) func TestChannelStore(t *testing.T) { - StoreTestWithSqlSupplier(t, storetest.TestChannelStore) + StoreTestWithSqlStore(t, storetest.TestChannelStore) } func TestSearchChannelStore(t *testing.T) { @@ -28,7 +28,7 @@ func TestChannelSearchQuerySQLInjection(t *testing.T) { for _, st := range storeTypes { t.Run(st.Name, func(t *testing.T) { s := &SqlChannelStore{ - SqlSupplier: st.SqlSupplier, + SqlStore: st.SqlStore, } opts := store.ChannelSearchOpts{} diff --git a/store/sqlstore/cluster_discovery_store.go b/store/sqlstore/cluster_discovery_store.go index 453e57d9af..0fcc33ef14 100644 --- a/store/sqlstore/cluster_discovery_store.go +++ b/store/sqlstore/cluster_discovery_store.go @@ -12,13 +12,13 @@ import ( ) type sqlClusterDiscoveryStore struct { - *SqlSupplier + *SqlStore } -func newSqlClusterDiscoveryStore(sqlSupplier *SqlSupplier) store.ClusterDiscoveryStore { - s := &sqlClusterDiscoveryStore{sqlSupplier} +func newSqlClusterDiscoveryStore(sqlStore *SqlStore) store.ClusterDiscoveryStore { + s := &sqlClusterDiscoveryStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.ClusterDiscovery{}, "ClusterDiscovery").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("Type").SetMaxSize(64) diff --git a/store/sqlstore/command_store.go b/store/sqlstore/command_store.go index e1abd43e77..a34fe2760c 100644 --- a/store/sqlstore/command_store.go +++ b/store/sqlstore/command_store.go @@ -14,18 +14,18 @@ import ( ) type SqlCommandStore struct { - *SqlSupplier + *SqlStore commandsQuery sq.SelectBuilder } -func newSqlCommandStore(sqlSupplier *SqlSupplier) store.CommandStore { - s := &SqlCommandStore{SqlSupplier: sqlSupplier} +func newSqlCommandStore(sqlStore *SqlStore) store.CommandStore { + s := &SqlCommandStore{SqlStore: sqlStore} s.commandsQuery = s.getQueryBuilder(). Select("*"). From("Commands") - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { tableo := db.AddTableWithName(model.Command{}, "Commands").SetKeys(false, "Id") tableo.ColMap("Id").SetMaxSize(26) tableo.ColMap("Token").SetMaxSize(26) diff --git a/store/sqlstore/command_webhook_store.go b/store/sqlstore/command_webhook_store.go index 7055550baa..b79081e41c 100644 --- a/store/sqlstore/command_webhook_store.go +++ b/store/sqlstore/command_webhook_store.go @@ -16,13 +16,13 @@ import ( ) type SqlCommandWebhookStore struct { - *SqlSupplier + *SqlStore } -func newSqlCommandWebhookStore(sqlSupplier *SqlSupplier) store.CommandWebhookStore { - s := &SqlCommandWebhookStore{sqlSupplier} +func newSqlCommandWebhookStore(sqlStore *SqlStore) store.CommandWebhookStore { + s := &SqlCommandWebhookStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { tablec := db.AddTableWithName(model.CommandWebhook{}, "CommandWebhooks").SetKeys(false, "Id") tablec.ColMap("Id").SetMaxSize(26) tablec.ColMap("CommandId").SetMaxSize(26) diff --git a/store/sqlstore/compliance_store.go b/store/sqlstore/compliance_store.go index b34777f498..d915e3cbfd 100644 --- a/store/sqlstore/compliance_store.go +++ b/store/sqlstore/compliance_store.go @@ -14,13 +14,13 @@ import ( ) type SqlComplianceStore struct { - *SqlSupplier + *SqlStore } -func newSqlComplianceStore(sqlSupplier *SqlSupplier) store.ComplianceStore { - s := &SqlComplianceStore{sqlSupplier} +func newSqlComplianceStore(sqlStore *SqlStore) store.ComplianceStore { + s := &SqlComplianceStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.Compliance{}, "Compliances").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("UserId").SetMaxSize(26) diff --git a/store/sqlstore/emoji_store.go b/store/sqlstore/emoji_store.go index 36383e6c77..1faea67947 100644 --- a/store/sqlstore/emoji_store.go +++ b/store/sqlstore/emoji_store.go @@ -15,17 +15,17 @@ import ( ) type SqlEmojiStore struct { - *SqlSupplier + *SqlStore metrics einterfaces.MetricsInterface } -func newSqlEmojiStore(sqlSupplier *SqlSupplier, metrics einterfaces.MetricsInterface) store.EmojiStore { +func newSqlEmojiStore(sqlStore *SqlStore, metrics einterfaces.MetricsInterface) store.EmojiStore { s := &SqlEmojiStore{ - SqlSupplier: sqlSupplier, - metrics: metrics, + SqlStore: sqlStore, + metrics: metrics, } - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.Emoji{}, "Emoji").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("CreatorId").SetMaxSize(26) diff --git a/store/sqlstore/file_info_store.go b/store/sqlstore/file_info_store.go index d6158768ac..bf8e0e32e4 100644 --- a/store/sqlstore/file_info_store.go +++ b/store/sqlstore/file_info_store.go @@ -16,7 +16,7 @@ import ( ) type SqlFileInfoStore struct { - *SqlSupplier + *SqlStore metrics einterfaces.MetricsInterface queryFields []string } @@ -24,10 +24,10 @@ type SqlFileInfoStore struct { func (fs SqlFileInfoStore) ClearCaches() { } -func newSqlFileInfoStore(sqlSupplier *SqlSupplier, metrics einterfaces.MetricsInterface) store.FileInfoStore { +func newSqlFileInfoStore(sqlStore *SqlStore, metrics einterfaces.MetricsInterface) store.FileInfoStore { s := &SqlFileInfoStore{ - SqlSupplier: sqlSupplier, - metrics: metrics, + SqlStore: sqlStore, + metrics: metrics, } s.queryFields = []string{ @@ -51,7 +51,7 @@ func newSqlFileInfoStore(sqlSupplier *SqlSupplier, metrics einterfaces.MetricsIn "Coalesce(FileInfo.Content, '') AS Content", } - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.FileInfo{}, "FileInfo").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("CreatorId").SetMaxSize(26) diff --git a/store/sqlstore/group_store.go b/store/sqlstore/group_store.go index 006b076418..fb41d033bf 100644 --- a/store/sqlstore/group_store.go +++ b/store/sqlstore/group_store.go @@ -48,12 +48,12 @@ type groupChannelJoin struct { } type SqlGroupStore struct { - *SqlSupplier + *SqlStore } -func newSqlGroupStore(sqlSupplier *SqlSupplier) store.GroupStore { - s := &SqlGroupStore{SqlSupplier: sqlSupplier} - for _, db := range sqlSupplier.GetAllConns() { +func newSqlGroupStore(sqlStore *SqlStore) store.GroupStore { + s := &SqlGroupStore{SqlStore: sqlStore} + for _, db := range sqlStore.GetAllConns() { groups := db.AddTableWithName(model.Group{}, "UserGroups").SetKeys(false, "Id") groups.ColMap("Id").SetMaxSize(26) groups.ColMap("Name").SetMaxSize(model.GroupNameMaxLength).SetUnique(true) diff --git a/store/sqlstore/integrity.go b/store/sqlstore/integrity.go index 810f46e7d2..7be1112c44 100644 --- a/store/sqlstore/integrity.go +++ b/store/sqlstore/integrity.go @@ -20,7 +20,7 @@ type relationalCheckConfig struct { filter interface{} } -func getOrphanedRecords(ss *SqlSupplier, cfg relationalCheckConfig) ([]model.OrphanedRecord, error) { +func getOrphanedRecords(ss *SqlStore, cfg relationalCheckConfig) ([]model.OrphanedRecord, error) { var records []model.OrphanedRecord sub := ss.getQueryBuilder(). @@ -59,7 +59,7 @@ func getOrphanedRecords(ss *SqlSupplier, cfg relationalCheckConfig) ([]model.Orp return records, err } -func checkParentChildIntegrity(ss *SqlSupplier, config relationalCheckConfig) model.IntegrityCheckResult { +func checkParentChildIntegrity(ss *SqlStore, config relationalCheckConfig) model.IntegrityCheckResult { var result model.IntegrityCheckResult var data model.RelationalIntegrityCheckData @@ -78,7 +78,7 @@ func checkParentChildIntegrity(ss *SqlSupplier, config relationalCheckConfig) mo return result } -func checkChannelsCommandWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkChannelsCommandWebhooksIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Channels", parentIdAttr: "ChannelId", @@ -87,7 +87,7 @@ func checkChannelsCommandWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheck }) } -func checkChannelsChannelMemberHistoryIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkChannelsChannelMemberHistoryIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Channels", parentIdAttr: "ChannelId", @@ -96,7 +96,7 @@ func checkChannelsChannelMemberHistoryIntegrity(ss *SqlSupplier) model.Integrity }) } -func checkChannelsChannelMembersIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkChannelsChannelMembersIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Channels", parentIdAttr: "ChannelId", @@ -105,7 +105,7 @@ func checkChannelsChannelMembersIntegrity(ss *SqlSupplier) model.IntegrityCheckR }) } -func checkChannelsIncomingWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkChannelsIncomingWebhooksIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Channels", parentIdAttr: "ChannelId", @@ -114,7 +114,7 @@ func checkChannelsIncomingWebhooksIntegrity(ss *SqlSupplier) model.IntegrityChec }) } -func checkChannelsOutgoingWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkChannelsOutgoingWebhooksIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Channels", parentIdAttr: "ChannelId", @@ -123,7 +123,7 @@ func checkChannelsOutgoingWebhooksIntegrity(ss *SqlSupplier) model.IntegrityChec }) } -func checkChannelsPostsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkChannelsPostsIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Channels", parentIdAttr: "ChannelId", @@ -132,7 +132,7 @@ func checkChannelsPostsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkCommandsCommandWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkCommandsCommandWebhooksIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Commands", parentIdAttr: "CommandId", @@ -141,7 +141,7 @@ func checkCommandsCommandWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheck }) } -func checkPostsFileInfoIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkPostsFileInfoIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Posts", parentIdAttr: "PostId", @@ -150,7 +150,7 @@ func checkPostsFileInfoIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkPostsPostsParentIdIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkPostsPostsParentIdIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Posts", parentIdAttr: "ParentId", @@ -160,7 +160,7 @@ func checkPostsPostsParentIdIntegrity(ss *SqlSupplier) model.IntegrityCheckResul }) } -func checkPostsPostsRootIdIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkPostsPostsRootIdIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Posts", parentIdAttr: "RootId", @@ -170,7 +170,7 @@ func checkPostsPostsRootIdIntegrity(ss *SqlSupplier) model.IntegrityCheckResult }) } -func checkPostsReactionsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkPostsReactionsIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Posts", parentIdAttr: "PostId", @@ -179,7 +179,7 @@ func checkPostsReactionsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkSchemesChannelsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkSchemesChannelsIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Schemes", parentIdAttr: "SchemeId", @@ -189,7 +189,7 @@ func checkSchemesChannelsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkSchemesTeamsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkSchemesTeamsIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Schemes", parentIdAttr: "SchemeId", @@ -199,7 +199,7 @@ func checkSchemesTeamsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkSessionsAuditsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkSessionsAuditsIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Sessions", parentIdAttr: "SessionId", @@ -209,7 +209,7 @@ func checkSessionsAuditsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkTeamsChannelsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkTeamsChannelsIntegrity(ss *SqlStore) model.IntegrityCheckResult { res1 := checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Teams", parentIdAttr: "TeamId", @@ -232,7 +232,7 @@ func checkTeamsChannelsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { return res1 } -func checkTeamsCommandsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkTeamsCommandsIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Teams", parentIdAttr: "TeamId", @@ -241,7 +241,7 @@ func checkTeamsCommandsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkTeamsIncomingWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkTeamsIncomingWebhooksIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Teams", parentIdAttr: "TeamId", @@ -250,7 +250,7 @@ func checkTeamsIncomingWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheckRe }) } -func checkTeamsOutgoingWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkTeamsOutgoingWebhooksIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Teams", parentIdAttr: "TeamId", @@ -259,7 +259,7 @@ func checkTeamsOutgoingWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheckRe }) } -func checkTeamsTeamMembersIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkTeamsTeamMembersIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Teams", parentIdAttr: "TeamId", @@ -268,7 +268,7 @@ func checkTeamsTeamMembersIntegrity(ss *SqlSupplier) model.IntegrityCheckResult }) } -func checkUsersAuditsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersAuditsIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -278,7 +278,7 @@ func checkUsersAuditsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkUsersCommandWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersCommandWebhooksIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -287,7 +287,7 @@ func checkUsersCommandWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheckRes }) } -func checkUsersChannelMemberHistoryIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersChannelMemberHistoryIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -296,7 +296,7 @@ func checkUsersChannelMemberHistoryIntegrity(ss *SqlSupplier) model.IntegrityChe }) } -func checkUsersChannelMembersIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersChannelMembersIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -305,7 +305,7 @@ func checkUsersChannelMembersIntegrity(ss *SqlSupplier) model.IntegrityCheckResu }) } -func checkUsersChannelsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersChannelsIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "CreatorId", @@ -315,7 +315,7 @@ func checkUsersChannelsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkUsersCommandsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersCommandsIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "CreatorId", @@ -324,7 +324,7 @@ func checkUsersCommandsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkUsersCompliancesIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersCompliancesIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -333,7 +333,7 @@ func checkUsersCompliancesIntegrity(ss *SqlSupplier) model.IntegrityCheckResult }) } -func checkUsersEmojiIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersEmojiIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "CreatorId", @@ -342,7 +342,7 @@ func checkUsersEmojiIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkUsersFileInfoIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersFileInfoIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "CreatorId", @@ -351,7 +351,7 @@ func checkUsersFileInfoIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkUsersIncomingWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersIncomingWebhooksIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -360,7 +360,7 @@ func checkUsersIncomingWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheckRe }) } -func checkUsersOAuthAccessDataIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersOAuthAccessDataIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -369,7 +369,7 @@ func checkUsersOAuthAccessDataIntegrity(ss *SqlSupplier) model.IntegrityCheckRes }) } -func checkUsersOAuthAppsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersOAuthAppsIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "CreatorId", @@ -378,7 +378,7 @@ func checkUsersOAuthAppsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkUsersOAuthAuthDataIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersOAuthAuthDataIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -387,7 +387,7 @@ func checkUsersOAuthAuthDataIntegrity(ss *SqlSupplier) model.IntegrityCheckResul }) } -func checkUsersOutgoingWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersOutgoingWebhooksIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "CreatorId", @@ -396,7 +396,7 @@ func checkUsersOutgoingWebhooksIntegrity(ss *SqlSupplier) model.IntegrityCheckRe }) } -func checkUsersPostsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersPostsIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -405,7 +405,7 @@ func checkUsersPostsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkUsersPreferencesIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersPreferencesIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -414,7 +414,7 @@ func checkUsersPreferencesIntegrity(ss *SqlSupplier) model.IntegrityCheckResult }) } -func checkUsersReactionsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersReactionsIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -423,7 +423,7 @@ func checkUsersReactionsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkUsersSessionsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersSessionsIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -432,7 +432,7 @@ func checkUsersSessionsIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkUsersStatusIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersStatusIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -441,7 +441,7 @@ func checkUsersStatusIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { }) } -func checkUsersTeamMembersIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersTeamMembersIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -450,7 +450,7 @@ func checkUsersTeamMembersIntegrity(ss *SqlSupplier) model.IntegrityCheckResult }) } -func checkUsersUserAccessTokensIntegrity(ss *SqlSupplier) model.IntegrityCheckResult { +func checkUsersUserAccessTokensIntegrity(ss *SqlStore) model.IntegrityCheckResult { return checkParentChildIntegrity(ss, relationalCheckConfig{ parentName: "Users", parentIdAttr: "UserId", @@ -459,7 +459,7 @@ func checkUsersUserAccessTokensIntegrity(ss *SqlSupplier) model.IntegrityCheckRe }) } -func checkChannelsIntegrity(ss *SqlSupplier, results chan<- model.IntegrityCheckResult) { +func checkChannelsIntegrity(ss *SqlStore, results chan<- model.IntegrityCheckResult) { results <- checkChannelsCommandWebhooksIntegrity(ss) results <- checkChannelsChannelMemberHistoryIntegrity(ss) results <- checkChannelsChannelMembersIntegrity(ss) @@ -468,27 +468,27 @@ func checkChannelsIntegrity(ss *SqlSupplier, results chan<- model.IntegrityCheck results <- checkChannelsPostsIntegrity(ss) } -func checkCommandsIntegrity(ss *SqlSupplier, results chan<- model.IntegrityCheckResult) { +func checkCommandsIntegrity(ss *SqlStore, results chan<- model.IntegrityCheckResult) { results <- checkCommandsCommandWebhooksIntegrity(ss) } -func checkPostsIntegrity(ss *SqlSupplier, results chan<- model.IntegrityCheckResult) { +func checkPostsIntegrity(ss *SqlStore, results chan<- model.IntegrityCheckResult) { results <- checkPostsFileInfoIntegrity(ss) results <- checkPostsPostsParentIdIntegrity(ss) results <- checkPostsPostsRootIdIntegrity(ss) results <- checkPostsReactionsIntegrity(ss) } -func checkSchemesIntegrity(ss *SqlSupplier, results chan<- model.IntegrityCheckResult) { +func checkSchemesIntegrity(ss *SqlStore, results chan<- model.IntegrityCheckResult) { results <- checkSchemesChannelsIntegrity(ss) results <- checkSchemesTeamsIntegrity(ss) } -func checkSessionsIntegrity(ss *SqlSupplier, results chan<- model.IntegrityCheckResult) { +func checkSessionsIntegrity(ss *SqlStore, results chan<- model.IntegrityCheckResult) { results <- checkSessionsAuditsIntegrity(ss) } -func checkTeamsIntegrity(ss *SqlSupplier, results chan<- model.IntegrityCheckResult) { +func checkTeamsIntegrity(ss *SqlStore, results chan<- model.IntegrityCheckResult) { results <- checkTeamsChannelsIntegrity(ss) results <- checkTeamsCommandsIntegrity(ss) results <- checkTeamsIncomingWebhooksIntegrity(ss) @@ -496,7 +496,7 @@ func checkTeamsIntegrity(ss *SqlSupplier, results chan<- model.IntegrityCheckRes results <- checkTeamsTeamMembersIntegrity(ss) } -func checkUsersIntegrity(ss *SqlSupplier, results chan<- model.IntegrityCheckResult) { +func checkUsersIntegrity(ss *SqlStore, results chan<- model.IntegrityCheckResult) { results <- checkUsersAuditsIntegrity(ss) results <- checkUsersCommandWebhooksIntegrity(ss) results <- checkUsersChannelMemberHistoryIntegrity(ss) @@ -520,7 +520,7 @@ func checkUsersIntegrity(ss *SqlSupplier, results chan<- model.IntegrityCheckRes results <- checkUsersUserAccessTokensIntegrity(ss) } -func CheckRelationalIntegrity(ss *SqlSupplier, results chan<- model.IntegrityCheckResult) { +func CheckRelationalIntegrity(ss *SqlStore, results chan<- model.IntegrityCheckResult) { mlog.Info("Starting relational integrity checks...") checkChannelsIntegrity(ss, results) checkCommandsIntegrity(ss, results) diff --git a/store/sqlstore/integrity_test.go b/store/sqlstore/integrity_test.go index 0ec046b765..efab081fe9 100644 --- a/store/sqlstore/integrity_test.go +++ b/store/sqlstore/integrity_test.go @@ -362,7 +362,7 @@ func TestCheckIntegrity(t *testing.T) { func TestCheckParentChildIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) + store := ss.(*SqlStore) t.Run("should receive an error", func(t *testing.T) { config := relationalCheckConfig{ parentName: "NotValid", @@ -370,7 +370,7 @@ func TestCheckParentChildIntegrity(t *testing.T) { childName: "NotValid", childIdAttr: "NotValid", } - result := checkParentChildIntegrity(supplier, config) + result := checkParentChildIntegrity(store, config) require.NotNil(t, result.Err) require.Empty(t, result.Data) }) @@ -379,11 +379,11 @@ func TestCheckParentChildIntegrity(t *testing.T) { func TestCheckChannelsCommandWebhooksIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkChannelsCommandWebhooksIntegrity(supplier) + result := checkChannelsCommandWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -392,7 +392,7 @@ func TestCheckChannelsCommandWebhooksIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { channelId := model.NewId() cwh := createCommandWebhook(ss, model.NewId(), model.NewId(), channelId) - result := checkChannelsCommandWebhooksIntegrity(supplier) + result := checkChannelsCommandWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -407,11 +407,11 @@ func TestCheckChannelsCommandWebhooksIntegrity(t *testing.T) { func TestCheckChannelsChannelMemberHistoryIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkChannelsChannelMemberHistoryIntegrity(supplier) + result := checkChannelsChannelMemberHistoryIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -422,7 +422,7 @@ func TestCheckChannelsChannelMemberHistoryIntegrity(t *testing.T) { user := createUser(ss) cmh := createChannelMemberHistory(ss, channel.Id, user.Id) dbmap.Delete(channel) - result := checkChannelsChannelMemberHistoryIntegrity(supplier) + result := checkChannelsChannelMemberHistoryIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -437,11 +437,11 @@ func TestCheckChannelsChannelMemberHistoryIntegrity(t *testing.T) { func TestCheckChannelsChannelMembersIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkChannelsChannelMembersIntegrity(supplier) + result := checkChannelsChannelMembersIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -451,7 +451,7 @@ func TestCheckChannelsChannelMembersIntegrity(t *testing.T) { channel := createChannel(ss, model.NewId(), model.NewId()) member := createChannelMemberWithChannelId(ss, channel.Id) dbmap.Delete(channel) - result := checkChannelsChannelMembersIntegrity(supplier) + result := checkChannelsChannelMembersIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -465,11 +465,11 @@ func TestCheckChannelsChannelMembersIntegrity(t *testing.T) { func TestCheckChannelsIncomingWebhooksIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkChannelsIncomingWebhooksIntegrity(supplier) + result := checkChannelsIncomingWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -478,7 +478,7 @@ func TestCheckChannelsIncomingWebhooksIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { channelId := model.NewId() wh := createIncomingWebhook(ss, model.NewId(), channelId, model.NewId()) - result := checkChannelsIncomingWebhooksIntegrity(supplier) + result := checkChannelsIncomingWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -493,11 +493,11 @@ func TestCheckChannelsIncomingWebhooksIntegrity(t *testing.T) { func TestCheckChannelsOutgoingWebhooksIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkChannelsOutgoingWebhooksIntegrity(supplier) + result := checkChannelsOutgoingWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -508,7 +508,7 @@ func TestCheckChannelsOutgoingWebhooksIntegrity(t *testing.T) { channelId := channel.Id wh := createOutgoingWebhook(ss, model.NewId(), channelId, model.NewId()) dbmap.Delete(channel) - result := checkChannelsOutgoingWebhooksIntegrity(supplier) + result := checkChannelsOutgoingWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -523,11 +523,11 @@ func TestCheckChannelsOutgoingWebhooksIntegrity(t *testing.T) { func TestCheckChannelsPostsIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkChannelsPostsIntegrity(supplier) + result := checkChannelsPostsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -535,7 +535,7 @@ func TestCheckChannelsPostsIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { post := createPostWithChannelId(ss, model.NewId()) - result := checkChannelsPostsIntegrity(supplier) + result := checkChannelsPostsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -550,11 +550,11 @@ func TestCheckChannelsPostsIntegrity(t *testing.T) { func TestCheckCommandsCommandWebhooksIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkCommandsCommandWebhooksIntegrity(supplier) + result := checkCommandsCommandWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -563,7 +563,7 @@ func TestCheckCommandsCommandWebhooksIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { commandId := model.NewId() cwh := createCommandWebhook(ss, commandId, model.NewId(), model.NewId()) - result := checkCommandsCommandWebhooksIntegrity(supplier) + result := checkCommandsCommandWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -578,11 +578,11 @@ func TestCheckCommandsCommandWebhooksIntegrity(t *testing.T) { func TestCheckPostsFileInfoIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkPostsFileInfoIntegrity(supplier) + result := checkPostsFileInfoIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -591,7 +591,7 @@ func TestCheckPostsFileInfoIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { postId := model.NewId() info := createFileInfo(ss, postId, model.NewId()) - result := checkPostsFileInfoIntegrity(supplier) + result := checkPostsFileInfoIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -606,11 +606,11 @@ func TestCheckPostsFileInfoIntegrity(t *testing.T) { func TestCheckPostsPostsParentIdIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkPostsPostsParentIdIntegrity(supplier) + result := checkPostsPostsParentIdIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -620,7 +620,7 @@ func TestCheckPostsPostsParentIdIntegrity(t *testing.T) { root := createPost(ss, model.NewId(), model.NewId(), "", "") parent := createPost(ss, model.NewId(), model.NewId(), root.Id, root.Id) post := createPost(ss, model.NewId(), model.NewId(), root.Id, parent.Id) - result := checkPostsPostsParentIdIntegrity(supplier) + result := checkPostsPostsParentIdIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -635,7 +635,7 @@ func TestCheckPostsPostsParentIdIntegrity(t *testing.T) { parentId := parent.Id post := createPost(ss, model.NewId(), model.NewId(), root.Id, parent.Id) dbmap.Delete(parent) - result := checkPostsPostsParentIdIntegrity(supplier) + result := checkPostsPostsParentIdIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -651,11 +651,11 @@ func TestCheckPostsPostsParentIdIntegrity(t *testing.T) { func TestCheckPostsPostsRootIdIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkPostsPostsRootIdIntegrity(supplier) + result := checkPostsPostsRootIdIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -666,7 +666,7 @@ func TestCheckPostsPostsRootIdIntegrity(t *testing.T) { rootId := root.Id post := createPost(ss, model.NewId(), model.NewId(), root.Id, root.Id) dbmap.Delete(root) - result := checkPostsPostsRootIdIntegrity(supplier) + result := checkPostsPostsRootIdIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -681,11 +681,11 @@ func TestCheckPostsPostsRootIdIntegrity(t *testing.T) { func TestCheckPostsReactionsIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkPostsReactionsIntegrity(supplier) + result := checkPostsReactionsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -694,7 +694,7 @@ func TestCheckPostsReactionsIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { postId := model.NewId() reaction := createReaction(ss, model.NewId(), postId) - result := checkPostsReactionsIntegrity(supplier) + result := checkPostsReactionsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -708,11 +708,11 @@ func TestCheckPostsReactionsIntegrity(t *testing.T) { func TestCheckSchemesChannelsIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkSchemesChannelsIntegrity(supplier) + result := checkSchemesChannelsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -724,7 +724,7 @@ func TestCheckSchemesChannelsIntegrity(t *testing.T) { schemeId := scheme.Id channel := createChannelWithSchemeId(ss, &schemeId) dbmap.Delete(scheme) - result := checkSchemesChannelsIntegrity(supplier) + result := checkSchemesChannelsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -739,11 +739,11 @@ func TestCheckSchemesChannelsIntegrity(t *testing.T) { func TestCheckSchemesTeamsIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkSchemesTeamsIntegrity(supplier) + result := checkSchemesTeamsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -755,7 +755,7 @@ func TestCheckSchemesTeamsIntegrity(t *testing.T) { schemeId := scheme.Id team := createTeamWithSchemeId(ss, &schemeId) dbmap.Delete(scheme) - result := checkSchemesTeamsIntegrity(supplier) + result := checkSchemesTeamsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -770,11 +770,11 @@ func TestCheckSchemesTeamsIntegrity(t *testing.T) { func TestCheckSessionsAuditsIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkSessionsAuditsIntegrity(supplier) + result := checkSessionsAuditsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -786,7 +786,7 @@ func TestCheckSessionsAuditsIntegrity(t *testing.T) { sessionId := session.Id audit := createAudit(ss, userId, sessionId) dbmap.Delete(session) - result := checkSessionsAuditsIntegrity(supplier) + result := checkSessionsAuditsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -801,11 +801,11 @@ func TestCheckSessionsAuditsIntegrity(t *testing.T) { func TestCheckTeamsChannelsIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkTeamsChannelsIntegrity(supplier) + result := checkTeamsChannelsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -813,7 +813,7 @@ func TestCheckTeamsChannelsIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { channel := createChannelWithTeamId(ss, model.NewId()) - result := checkTeamsChannelsIntegrity(supplier) + result := checkTeamsChannelsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -831,7 +831,7 @@ func TestCheckTeamsChannelsIntegrity(t *testing.T) { direct, err := ss.Channel().CreateDirectChannel(userA, userB) require.NoError(t, err) require.NotNil(t, direct) - result := checkTeamsChannelsIntegrity(supplier) + result := checkTeamsChannelsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -854,7 +854,7 @@ func TestCheckTeamsChannelsIntegrity(t *testing.T) { require.NotNil(t, direct) _, err = dbmap.Exec(`UPDATE Channels SET TeamId = 'test' WHERE Id = '` + direct.Id + `'`) require.NoError(t, err) - result := checkTeamsChannelsIntegrity(supplier) + result := checkTeamsChannelsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 2) @@ -877,11 +877,11 @@ func TestCheckTeamsChannelsIntegrity(t *testing.T) { func TestCheckTeamsCommandsIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkTeamsCommandsIntegrity(supplier) + result := checkTeamsCommandsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -890,7 +890,7 @@ func TestCheckTeamsCommandsIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { teamId := model.NewId() cmd := createCommand(ss, model.NewId(), teamId) - result := checkTeamsCommandsIntegrity(supplier) + result := checkTeamsCommandsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -905,11 +905,11 @@ func TestCheckTeamsCommandsIntegrity(t *testing.T) { func TestCheckTeamsIncomingWebhooksIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkTeamsIncomingWebhooksIntegrity(supplier) + result := checkTeamsIncomingWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -918,7 +918,7 @@ func TestCheckTeamsIncomingWebhooksIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { teamId := model.NewId() wh := createIncomingWebhook(ss, model.NewId(), model.NewId(), teamId) - result := checkTeamsIncomingWebhooksIntegrity(supplier) + result := checkTeamsIncomingWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -933,11 +933,11 @@ func TestCheckTeamsIncomingWebhooksIntegrity(t *testing.T) { func TestCheckTeamsOutgoingWebhooksIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkTeamsOutgoingWebhooksIntegrity(supplier) + result := checkTeamsOutgoingWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -946,7 +946,7 @@ func TestCheckTeamsOutgoingWebhooksIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { teamId := model.NewId() wh := createOutgoingWebhook(ss, model.NewId(), model.NewId(), teamId) - result := checkTeamsOutgoingWebhooksIntegrity(supplier) + result := checkTeamsOutgoingWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -961,11 +961,11 @@ func TestCheckTeamsOutgoingWebhooksIntegrity(t *testing.T) { func TestCheckTeamsTeamMembersIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkTeamsTeamMembersIntegrity(supplier) + result := checkTeamsTeamMembersIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -975,7 +975,7 @@ func TestCheckTeamsTeamMembersIntegrity(t *testing.T) { team := createTeam(ss, model.NewId()) member := createTeamMember(ss, team.Id, model.NewId()) dbmap.Delete(team) - result := checkTeamsTeamMembersIntegrity(supplier) + result := checkTeamsTeamMembersIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -989,11 +989,11 @@ func TestCheckTeamsTeamMembersIntegrity(t *testing.T) { func TestCheckUsersAuditsIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersAuditsIntegrity(supplier) + result := checkUsersAuditsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1004,7 +1004,7 @@ func TestCheckUsersAuditsIntegrity(t *testing.T) { userId := user.Id audit := createAudit(ss, userId, model.NewId()) dbmap.Delete(user) - result := checkUsersAuditsIntegrity(supplier) + result := checkUsersAuditsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1019,11 +1019,11 @@ func TestCheckUsersAuditsIntegrity(t *testing.T) { func TestCheckUsersCommandWebhooksIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersCommandWebhooksIntegrity(supplier) + result := checkUsersCommandWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1032,7 +1032,7 @@ func TestCheckUsersCommandWebhooksIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { userId := model.NewId() cwh := createCommandWebhook(ss, model.NewId(), userId, model.NewId()) - result := checkUsersCommandWebhooksIntegrity(supplier) + result := checkUsersCommandWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1047,11 +1047,11 @@ func TestCheckUsersCommandWebhooksIntegrity(t *testing.T) { func TestCheckUsersChannelsIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersChannelsIntegrity(supplier) + result := checkUsersChannelsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1059,7 +1059,7 @@ func TestCheckUsersChannelsIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { channel := createChannelWithCreatorId(ss, model.NewId()) - result := checkUsersChannelsIntegrity(supplier) + result := checkUsersChannelsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1074,11 +1074,11 @@ func TestCheckUsersChannelsIntegrity(t *testing.T) { func TestCheckUsersChannelMemberHistoryIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersChannelMemberHistoryIntegrity(supplier) + result := checkUsersChannelMemberHistoryIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1089,7 +1089,7 @@ func TestCheckUsersChannelMemberHistoryIntegrity(t *testing.T) { channel := createChannel(ss, model.NewId(), model.NewId()) cmh := createChannelMemberHistory(ss, channel.Id, user.Id) dbmap.Delete(user) - result := checkUsersChannelMemberHistoryIntegrity(supplier) + result := checkUsersChannelMemberHistoryIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1104,11 +1104,11 @@ func TestCheckUsersChannelMemberHistoryIntegrity(t *testing.T) { func TestCheckUsersChannelMembersIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersChannelMembersIntegrity(supplier) + result := checkUsersChannelMembersIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1119,7 +1119,7 @@ func TestCheckUsersChannelMembersIntegrity(t *testing.T) { channel := createChannelWithCreatorId(ss, user.Id) member := createChannelMember(ss, channel.Id, user.Id) dbmap.Delete(user) - result := checkUsersChannelMembersIntegrity(supplier) + result := checkUsersChannelMembersIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1134,11 +1134,11 @@ func TestCheckUsersChannelMembersIntegrity(t *testing.T) { func TestCheckUsersCommandsIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersCommandsIntegrity(supplier) + result := checkUsersCommandsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1147,7 +1147,7 @@ func TestCheckUsersCommandsIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { userId := model.NewId() cmd := createCommand(ss, userId, model.NewId()) - result := checkUsersCommandsIntegrity(supplier) + result := checkUsersCommandsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1162,11 +1162,11 @@ func TestCheckUsersCommandsIntegrity(t *testing.T) { func TestCheckUsersCompliancesIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersCompliancesIntegrity(supplier) + result := checkUsersCompliancesIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1177,7 +1177,7 @@ func TestCheckUsersCompliancesIntegrity(t *testing.T) { userId := user.Id compliance := createCompliance(ss, userId) dbmap.Delete(user) - result := checkUsersCompliancesIntegrity(supplier) + result := checkUsersCompliancesIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1192,11 +1192,11 @@ func TestCheckUsersCompliancesIntegrity(t *testing.T) { func TestCheckUsersEmojiIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersEmojiIntegrity(supplier) + result := checkUsersEmojiIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1207,7 +1207,7 @@ func TestCheckUsersEmojiIntegrity(t *testing.T) { userId := user.Id emoji := createEmoji(ss, userId) dbmap.Delete(user) - result := checkUsersEmojiIntegrity(supplier) + result := checkUsersEmojiIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1222,11 +1222,11 @@ func TestCheckUsersEmojiIntegrity(t *testing.T) { func TestCheckUsersFileInfoIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersFileInfoIntegrity(supplier) + result := checkUsersFileInfoIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1237,7 +1237,7 @@ func TestCheckUsersFileInfoIntegrity(t *testing.T) { userId := user.Id info := createFileInfo(ss, model.NewId(), userId) dbmap.Delete(user) - result := checkUsersFileInfoIntegrity(supplier) + result := checkUsersFileInfoIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1252,11 +1252,11 @@ func TestCheckUsersFileInfoIntegrity(t *testing.T) { func TestCheckUsersIncomingWebhooksIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersIncomingWebhooksIntegrity(supplier) + result := checkUsersIncomingWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1265,7 +1265,7 @@ func TestCheckUsersIncomingWebhooksIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { userId := model.NewId() wh := createIncomingWebhook(ss, userId, model.NewId(), model.NewId()) - result := checkUsersIncomingWebhooksIntegrity(supplier) + result := checkUsersIncomingWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1280,11 +1280,11 @@ func TestCheckUsersIncomingWebhooksIntegrity(t *testing.T) { func TestCheckUsersOAuthAccessDataIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersOAuthAccessDataIntegrity(supplier) + result := checkUsersOAuthAccessDataIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1295,7 +1295,7 @@ func TestCheckUsersOAuthAccessDataIntegrity(t *testing.T) { userId := user.Id ad := createOAuthAccessData(ss, userId) dbmap.Delete(user) - result := checkUsersOAuthAccessDataIntegrity(supplier) + result := checkUsersOAuthAccessDataIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1310,11 +1310,11 @@ func TestCheckUsersOAuthAccessDataIntegrity(t *testing.T) { func TestCheckUsersOAuthAppsIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersOAuthAppsIntegrity(supplier) + result := checkUsersOAuthAppsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1325,7 +1325,7 @@ func TestCheckUsersOAuthAppsIntegrity(t *testing.T) { userId := user.Id app := createOAuthApp(ss, userId) dbmap.Delete(user) - result := checkUsersOAuthAppsIntegrity(supplier) + result := checkUsersOAuthAppsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1340,11 +1340,11 @@ func TestCheckUsersOAuthAppsIntegrity(t *testing.T) { func TestCheckUsersOAuthAuthDataIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersOAuthAuthDataIntegrity(supplier) + result := checkUsersOAuthAuthDataIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1355,7 +1355,7 @@ func TestCheckUsersOAuthAuthDataIntegrity(t *testing.T) { userId := user.Id ad := createOAuthAuthData(ss, userId) dbmap.Delete(user) - result := checkUsersOAuthAuthDataIntegrity(supplier) + result := checkUsersOAuthAuthDataIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1370,11 +1370,11 @@ func TestCheckUsersOAuthAuthDataIntegrity(t *testing.T) { func TestCheckUsersOutgoingWebhooksIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersOutgoingWebhooksIntegrity(supplier) + result := checkUsersOutgoingWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1383,7 +1383,7 @@ func TestCheckUsersOutgoingWebhooksIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { userId := model.NewId() wh := createOutgoingWebhook(ss, userId, model.NewId(), model.NewId()) - result := checkUsersOutgoingWebhooksIntegrity(supplier) + result := checkUsersOutgoingWebhooksIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1398,11 +1398,11 @@ func TestCheckUsersOutgoingWebhooksIntegrity(t *testing.T) { func TestCheckUsersPostsIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersPostsIntegrity(supplier) + result := checkUsersPostsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1410,7 +1410,7 @@ func TestCheckUsersPostsIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { post := createPostWithUserId(ss, model.NewId()) - result := checkUsersPostsIntegrity(supplier) + result := checkUsersPostsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1425,11 +1425,11 @@ func TestCheckUsersPostsIntegrity(t *testing.T) { func TestCheckUsersPreferencesIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersPreferencesIntegrity(supplier) + result := checkUsersPreferencesIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1441,7 +1441,7 @@ func TestCheckUsersPreferencesIntegrity(t *testing.T) { userId := user.Id preferences := createPreferences(ss, userId) require.NotNil(t, preferences) - result := checkUsersPreferencesIntegrity(supplier) + result := checkUsersPreferencesIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1456,7 +1456,7 @@ func TestCheckUsersPreferencesIntegrity(t *testing.T) { preferences := createPreferences(ss, userId) require.NotNil(t, preferences) dbmap.Delete(user) - result := checkUsersPreferencesIntegrity(supplier) + result := checkUsersPreferencesIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1471,11 +1471,11 @@ func TestCheckUsersPreferencesIntegrity(t *testing.T) { func TestCheckUsersReactionsIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersReactionsIntegrity(supplier) + result := checkUsersReactionsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1486,7 +1486,7 @@ func TestCheckUsersReactionsIntegrity(t *testing.T) { userId := user.Id reaction := createReaction(ss, user.Id, model.NewId()) dbmap.Delete(user) - result := checkUsersReactionsIntegrity(supplier) + result := checkUsersReactionsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1500,11 +1500,11 @@ func TestCheckUsersReactionsIntegrity(t *testing.T) { func TestCheckUsersSessionsIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersSessionsIntegrity(supplier) + result := checkUsersSessionsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1513,7 +1513,7 @@ func TestCheckUsersSessionsIntegrity(t *testing.T) { t.Run("should generate a report with one record", func(t *testing.T) { userId := model.NewId() session := createSession(ss, userId) - result := checkUsersSessionsIntegrity(supplier) + result := checkUsersSessionsIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1528,11 +1528,11 @@ func TestCheckUsersSessionsIntegrity(t *testing.T) { func TestCheckUsersStatusIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersStatusIntegrity(supplier) + result := checkUsersStatusIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1543,7 +1543,7 @@ func TestCheckUsersStatusIntegrity(t *testing.T) { userId := user.Id status := createStatus(ss, user.Id) dbmap.Delete(user) - result := checkUsersStatusIntegrity(supplier) + result := checkUsersStatusIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1557,11 +1557,11 @@ func TestCheckUsersStatusIntegrity(t *testing.T) { func TestCheckUsersTeamMembersIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersTeamMembersIntegrity(supplier) + result := checkUsersTeamMembersIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1572,7 +1572,7 @@ func TestCheckUsersTeamMembersIntegrity(t *testing.T) { team := createTeam(ss, user.Id) member := createTeamMember(ss, team.Id, user.Id) dbmap.Delete(user) - result := checkUsersTeamMembersIntegrity(supplier) + result := checkUsersTeamMembersIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) @@ -1587,11 +1587,11 @@ func TestCheckUsersTeamMembersIntegrity(t *testing.T) { func TestCheckUsersUserAccessTokensIntegrity(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - supplier := ss.(*SqlSupplier) - dbmap := supplier.GetMaster() + store := ss.(*SqlStore) + dbmap := store.GetMaster() t.Run("should generate a report with no records", func(t *testing.T) { - result := checkUsersUserAccessTokensIntegrity(supplier) + result := checkUsersUserAccessTokensIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Empty(t, data.Records) @@ -1602,7 +1602,7 @@ func TestCheckUsersUserAccessTokensIntegrity(t *testing.T) { userId := user.Id uat := createUserAccessToken(ss, user.Id) dbmap.Delete(user) - result := checkUsersUserAccessTokensIntegrity(supplier) + result := checkUsersUserAccessTokensIntegrity(store) require.Nil(t, result.Err) data := result.Data.(model.RelationalIntegrityCheckData) require.Len(t, data.Records, 1) diff --git a/store/sqlstore/job_store.go b/store/sqlstore/job_store.go index 68d16a02bb..47ab3c670b 100644 --- a/store/sqlstore/job_store.go +++ b/store/sqlstore/job_store.go @@ -17,13 +17,13 @@ import ( ) type SqlJobStore struct { - *SqlSupplier + *SqlStore } -func newSqlJobStore(sqlSupplier *SqlSupplier) store.JobStore { - s := &SqlJobStore{sqlSupplier} +func newSqlJobStore(sqlStore *SqlStore) store.JobStore { + s := &SqlJobStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.Job{}, "Jobs").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("Type").SetMaxSize(32) diff --git a/store/sqlstore/license_store.go b/store/sqlstore/license_store.go index 2b64790a1b..8c948bfd76 100644 --- a/store/sqlstore/license_store.go +++ b/store/sqlstore/license_store.go @@ -15,13 +15,13 @@ import ( // SqlLicenseStore encapsulates the database writes and reads for // model.LicenseRecord objects. type SqlLicenseStore struct { - *SqlSupplier + *SqlStore } -func newSqlLicenseStore(sqlSupplier *SqlSupplier) store.LicenseStore { - ls := &SqlLicenseStore{sqlSupplier} +func newSqlLicenseStore(sqlStore *SqlStore) store.LicenseStore { + ls := &SqlLicenseStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.LicenseRecord{}, "Licenses").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("Bytes").SetMaxSize(10000) diff --git a/store/sqlstore/link_metadata_store.go b/store/sqlstore/link_metadata_store.go index 5ba2a41737..8fbfe4b34f 100644 --- a/store/sqlstore/link_metadata_store.go +++ b/store/sqlstore/link_metadata_store.go @@ -14,13 +14,13 @@ import ( ) type SqlLinkMetadataStore struct { - *SqlSupplier + *SqlStore } -func newSqlLinkMetadataStore(sqlSupplier *SqlSupplier) store.LinkMetadataStore { - s := &SqlLinkMetadataStore{sqlSupplier} +func newSqlLinkMetadataStore(sqlStore *SqlStore) store.LinkMetadataStore { + s := &SqlLinkMetadataStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.LinkMetadata{}, "LinkMetadata").SetKeys(false, "Hash") table.ColMap("URL").SetMaxSize(2048) table.ColMap("Type").SetMaxSize(16) diff --git a/store/sqlstore/oauth_store.go b/store/sqlstore/oauth_store.go index 6e274ff9de..bc02e4f6cc 100644 --- a/store/sqlstore/oauth_store.go +++ b/store/sqlstore/oauth_store.go @@ -15,13 +15,13 @@ import ( ) type SqlOAuthStore struct { - *SqlSupplier + *SqlStore } -func newSqlOAuthStore(sqlSupplier *SqlSupplier) store.OAuthStore { - as := &SqlOAuthStore{sqlSupplier} +func newSqlOAuthStore(sqlStore *SqlStore) store.OAuthStore { + as := &SqlOAuthStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.OAuthApp{}, "OAuthApps").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("CreatorId").SetMaxSize(26) diff --git a/store/sqlstore/plugin_store.go b/store/sqlstore/plugin_store.go index a858535a96..533fde5c5e 100644 --- a/store/sqlstore/plugin_store.go +++ b/store/sqlstore/plugin_store.go @@ -20,13 +20,13 @@ const ( ) type SqlPluginStore struct { - *SqlSupplier + *SqlStore } -func newSqlPluginStore(sqlSupplier *SqlSupplier) store.PluginStore { - s := &SqlPluginStore{sqlSupplier} +func newSqlPluginStore(sqlStore *SqlStore) store.PluginStore { + s := &SqlPluginStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.PluginKeyValue{}, "PluginKeyValueStore").SetKeys(false, "PluginId", "Key") table.ColMap("PluginId").SetMaxSize(190) table.ColMap("Key").SetMaxSize(50) diff --git a/store/sqlstore/plugin_store_test.go b/store/sqlstore/plugin_store_test.go index 26884cbcb9..d71931822f 100644 --- a/store/sqlstore/plugin_store_test.go +++ b/store/sqlstore/plugin_store_test.go @@ -10,5 +10,5 @@ import ( ) func TestPluginStore(t *testing.T) { - StoreTestWithSqlSupplier(t, storetest.TestPluginStore) + StoreTestWithSqlStore(t, storetest.TestPluginStore) } diff --git a/store/sqlstore/post_store.go b/store/sqlstore/post_store.go index cdd3145640..63b5036ef8 100644 --- a/store/sqlstore/post_store.go +++ b/store/sqlstore/post_store.go @@ -24,7 +24,7 @@ import ( ) type SqlPostStore struct { - *SqlSupplier + *SqlStore metrics einterfaces.MetricsInterface maxPostSizeOnce sync.Once maxPostSizeCached int @@ -60,14 +60,14 @@ func postToSlice(post *model.Post) []interface{} { } } -func newSqlPostStore(sqlSupplier *SqlSupplier, metrics einterfaces.MetricsInterface) store.PostStore { +func newSqlPostStore(sqlStore *SqlStore, metrics einterfaces.MetricsInterface) store.PostStore { s := &SqlPostStore{ - SqlSupplier: sqlSupplier, + SqlStore: sqlStore, metrics: metrics, maxPostSizeCached: model.POST_MESSAGE_MAX_RUNES_V1, } - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.Post{}, "Posts").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("UserId").SetMaxSize(26) diff --git a/store/sqlstore/post_store_test.go b/store/sqlstore/post_store_test.go index 3facace247..f2e4ee3e25 100644 --- a/store/sqlstore/post_store_test.go +++ b/store/sqlstore/post_store_test.go @@ -12,7 +12,7 @@ import ( ) func TestPostStore(t *testing.T) { - StoreTestWithSqlSupplier(t, storetest.TestPostStore) + StoreTestWithSqlStore(t, storetest.TestPostStore) } func TestSearchPostStore(t *testing.T) { diff --git a/store/sqlstore/preference_store.go b/store/sqlstore/preference_store.go index 81c380e02a..49eecbf04a 100644 --- a/store/sqlstore/preference_store.go +++ b/store/sqlstore/preference_store.go @@ -15,13 +15,13 @@ import ( ) type SqlPreferenceStore struct { - *SqlSupplier + *SqlStore } -func newSqlPreferenceStore(sqlSupplier *SqlSupplier) store.PreferenceStore { - s := &SqlPreferenceStore{sqlSupplier} +func newSqlPreferenceStore(sqlStore *SqlStore) store.PreferenceStore { + s := &SqlPreferenceStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.Preference{}, "Preferences").SetKeys(false, "UserId", "Category", "Name") table.ColMap("UserId").SetMaxSize(26) table.ColMap("Category").SetMaxSize(32) diff --git a/store/sqlstore/product_notices_store.go b/store/sqlstore/product_notices_store.go index 2965cc90ea..f9c76bbfb8 100644 --- a/store/sqlstore/product_notices_store.go +++ b/store/sqlstore/product_notices_store.go @@ -14,13 +14,13 @@ import ( ) type SqlProductNoticesStore struct { - *SqlSupplier + *SqlStore } -func newSqlProductNoticesStore(sqlSupplier *SqlSupplier) store.ProductNoticesStore { - s := SqlProductNoticesStore{sqlSupplier} +func newSqlProductNoticesStore(sqlStore *SqlStore) store.ProductNoticesStore { + s := SqlProductNoticesStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.ProductNoticeViewState{}, "ProductNoticeViewState").SetKeys(false, "UserId", "NoticeId") table.ColMap("UserId").SetMaxSize(26) table.ColMap("NoticeId").SetMaxSize(26) diff --git a/store/sqlstore/supplier_reactions.go b/store/sqlstore/reaction_store.go similarity index 97% rename from store/sqlstore/supplier_reactions.go rename to store/sqlstore/reaction_store.go index 31beb2b4e4..ac929d33c9 100644 --- a/store/sqlstore/supplier_reactions.go +++ b/store/sqlstore/reaction_store.go @@ -13,13 +13,13 @@ import ( ) type SqlReactionStore struct { - *SqlSupplier + *SqlStore } -func newSqlReactionStore(sqlSupplier *SqlSupplier) store.ReactionStore { - s := &SqlReactionStore{sqlSupplier} +func newSqlReactionStore(sqlStore *SqlStore) store.ReactionStore { + s := &SqlReactionStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.Reaction{}, "Reactions").SetKeys(false, "PostId", "UserId", "EmojiName") table.ColMap("UserId").SetMaxSize(26) table.ColMap("PostId").SetMaxSize(26) diff --git a/store/sqlstore/role_store.go b/store/sqlstore/role_store.go index df0c4bc8c6..4074f84b60 100644 --- a/store/sqlstore/role_store.go +++ b/store/sqlstore/role_store.go @@ -17,7 +17,7 @@ import ( ) type SqlRoleStore struct { - *SqlSupplier + *SqlStore } type Role struct { @@ -82,10 +82,10 @@ func (role Role) ToModel() *model.Role { } } -func newSqlRoleStore(sqlSupplier *SqlSupplier) store.RoleStore { - s := &SqlRoleStore{sqlSupplier} +func newSqlRoleStore(sqlStore *SqlStore) store.RoleStore { + s := &SqlRoleStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(Role{}, "Roles").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("Name").SetMaxSize(64).SetUnique(true) diff --git a/store/sqlstore/role_store_test.go b/store/sqlstore/role_store_test.go index ad882618cc..870c9ce67d 100644 --- a/store/sqlstore/role_store_test.go +++ b/store/sqlstore/role_store_test.go @@ -10,5 +10,5 @@ import ( ) func TestRoleStore(t *testing.T) { - StoreTestWithSqlSupplier(t, storetest.TestRoleStore) + StoreTestWithSqlStore(t, storetest.TestRoleStore) } diff --git a/store/sqlstore/scheme_store.go b/store/sqlstore/scheme_store.go index 384835dde9..e7e2d35a39 100644 --- a/store/sqlstore/scheme_store.go +++ b/store/sqlstore/scheme_store.go @@ -16,13 +16,13 @@ import ( ) type SqlSchemeStore struct { - *SqlSupplier + *SqlStore } -func newSqlSchemeStore(sqlSupplier *SqlSupplier) store.SchemeStore { - s := &SqlSchemeStore{sqlSupplier} +func newSqlSchemeStore(sqlStore *SqlStore) store.SchemeStore { + s := &SqlSchemeStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.Scheme{}, "Schemes").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("Name").SetMaxSize(model.SCHEME_NAME_MAX_LENGTH).SetUnique(true) @@ -85,7 +85,7 @@ func (s *SqlSchemeStore) createScheme(scheme *model.Scheme, transaction *gorp.Tr // Fetch the default system scheme roles to populate default permissions. defaultRoleNames := []string{model.TEAM_ADMIN_ROLE_ID, model.TEAM_USER_ROLE_ID, model.TEAM_GUEST_ROLE_ID, model.CHANNEL_ADMIN_ROLE_ID, model.CHANNEL_USER_ROLE_ID, model.CHANNEL_GUEST_ROLE_ID} defaultRoles := make(map[string]*model.Role) - roles, appErr := s.SqlSupplier.Role().GetByNames(defaultRoleNames) + roles, appErr := s.SqlStore.Role().GetByNames(defaultRoleNames) if appErr != nil { return nil, appErr } @@ -121,7 +121,7 @@ func (s *SqlSchemeStore) createScheme(scheme *model.Scheme, transaction *gorp.Tr SchemeManaged: true, } - savedRole, err := s.SqlSupplier.Role().(*SqlRoleStore).createRole(teamAdminRole, transaction) + savedRole, err := s.SqlStore.Role().(*SqlRoleStore).createRole(teamAdminRole, transaction) if err != nil { return nil, err } @@ -135,7 +135,7 @@ func (s *SqlSchemeStore) createScheme(scheme *model.Scheme, transaction *gorp.Tr SchemeManaged: true, } - savedRole, err = s.SqlSupplier.Role().(*SqlRoleStore).createRole(teamUserRole, transaction) + savedRole, err = s.SqlStore.Role().(*SqlRoleStore).createRole(teamUserRole, transaction) if err != nil { return nil, err } @@ -149,7 +149,7 @@ func (s *SqlSchemeStore) createScheme(scheme *model.Scheme, transaction *gorp.Tr SchemeManaged: true, } - savedRole, err = s.SqlSupplier.Role().(*SqlRoleStore).createRole(teamGuestRole, transaction) + savedRole, err = s.SqlStore.Role().(*SqlRoleStore).createRole(teamGuestRole, transaction) if err != nil { return nil, err } @@ -169,7 +169,7 @@ func (s *SqlSchemeStore) createScheme(scheme *model.Scheme, transaction *gorp.Tr channelAdminRole.Permissions = []string{} } - savedRole, err := s.SqlSupplier.Role().(*SqlRoleStore).createRole(channelAdminRole, transaction) + savedRole, err := s.SqlStore.Role().(*SqlRoleStore).createRole(channelAdminRole, transaction) if err != nil { return nil, err } @@ -187,7 +187,7 @@ func (s *SqlSchemeStore) createScheme(scheme *model.Scheme, transaction *gorp.Tr channelUserRole.Permissions = filterModerated(channelUserRole.Permissions) } - savedRole, err = s.SqlSupplier.Role().(*SqlRoleStore).createRole(channelUserRole, transaction) + savedRole, err = s.SqlStore.Role().(*SqlRoleStore).createRole(channelUserRole, transaction) if err != nil { return nil, err } @@ -205,7 +205,7 @@ func (s *SqlSchemeStore) createScheme(scheme *model.Scheme, transaction *gorp.Tr channelGuestRole.Permissions = filterModerated(channelGuestRole.Permissions) } - savedRole, err = s.SqlSupplier.Role().(*SqlRoleStore).createRole(channelGuestRole, transaction) + savedRole, err = s.SqlStore.Role().(*SqlRoleStore).createRole(channelGuestRole, transaction) if err != nil { return nil, err } diff --git a/store/sqlstore/session_store.go b/store/sqlstore/session_store.go index 4dc5a3f162..11518e721e 100644 --- a/store/sqlstore/session_store.go +++ b/store/sqlstore/session_store.go @@ -21,13 +21,13 @@ const ( ) type SqlSessionStore struct { - *SqlSupplier + *SqlStore } -func newSqlSessionStore(sqlSupplier *SqlSupplier) store.SessionStore { - us := &SqlSessionStore{sqlSupplier} +func newSqlSessionStore(sqlStore *SqlStore) store.SessionStore { + us := &SqlSessionStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.Session{}, "Sessions").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("Token").SetMaxSize(26) diff --git a/store/sqlstore/status_store.go b/store/sqlstore/status_store.go index c8d4bdc331..162acbf956 100644 --- a/store/sqlstore/status_store.go +++ b/store/sqlstore/status_store.go @@ -16,13 +16,13 @@ import ( ) type SqlStatusStore struct { - *SqlSupplier + *SqlStore } -func newSqlStatusStore(sqlSupplier *SqlSupplier) store.StatusStore { - s := &SqlStatusStore{sqlSupplier} +func newSqlStatusStore(sqlStore *SqlStore) store.StatusStore { + s := &SqlStatusStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.Status{}, "Status").SetKeys(false, "UserId") table.ColMap("UserId").SetMaxSize(26) table.ColMap("Status").SetMaxSize(32) diff --git a/store/sqlstore/store.go b/store/sqlstore/store.go index f4e996cebc..a50a733870 100644 --- a/store/sqlstore/store.go +++ b/store/sqlstore/store.go @@ -4,6 +4,1346 @@ package sqlstore import ( + "context" + dbsql "database/sql" + "encoding/json" + "fmt" + "os" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/pkg/errors" + + sq "github.com/Masterminds/squirrel" + "github.com/dyatlov/go-opengraph/opengraph" + "github.com/go-sql-driver/mysql" + "github.com/lib/pq" + "github.com/mattermost/gorp" + "github.com/mattermost/mattermost-server/v5/einterfaces" + "github.com/mattermost/mattermost-server/v5/mlog" + "github.com/mattermost/mattermost-server/v5/model" + "github.com/mattermost/mattermost-server/v5/store" + "github.com/mattermost/mattermost-server/v5/utils" + _ "github.com/go-sql-driver/mysql" _ "github.com/lib/pq" ) + +const ( + INDEX_TYPE_FULL_TEXT = "full_text" + INDEX_TYPE_DEFAULT = "default" + PG_DUP_TABLE_ERROR_CODE = "42P07" // see https://github.com/lib/pq/blob/master/error.go#L268 + MYSQL_DUP_TABLE_ERROR_CODE = uint16(1050) // see https://dev.mysql.com/doc/mysql-errors/5.7/en/server-error-reference.html#error_er_table_exists_error + DB_PING_ATTEMPTS = 18 + DB_PING_TIMEOUT_SECS = 10 +) + +const ( + EXIT_GENERIC_FAILURE = 1 + EXIT_CREATE_TABLE = 100 + EXIT_DB_OPEN = 101 + EXIT_PING = 102 + EXIT_NO_DRIVER = 103 + EXIT_TABLE_EXISTS = 104 + EXIT_TABLE_EXISTS_MYSQL = 105 + EXIT_COLUMN_EXISTS = 106 + EXIT_DOES_COLUMN_EXISTS_POSTGRES = 107 + EXIT_DOES_COLUMN_EXISTS_MYSQL = 108 + EXIT_DOES_COLUMN_EXISTS_MISSING = 109 + EXIT_CREATE_COLUMN_POSTGRES = 110 + EXIT_CREATE_COLUMN_MYSQL = 111 + EXIT_CREATE_COLUMN_MISSING = 112 + EXIT_REMOVE_COLUMN = 113 + EXIT_RENAME_COLUMN = 114 + EXIT_MAX_COLUMN = 115 + EXIT_ALTER_COLUMN = 116 + EXIT_CREATE_INDEX_POSTGRES = 117 + EXIT_CREATE_INDEX_MYSQL = 118 + EXIT_CREATE_INDEX_FULL_MYSQL = 119 + EXIT_CREATE_INDEX_MISSING = 120 + EXIT_REMOVE_INDEX_POSTGRES = 121 + EXIT_REMOVE_INDEX_MYSQL = 122 + EXIT_REMOVE_INDEX_MISSING = 123 + EXIT_REMOVE_TABLE = 134 + EXIT_CREATE_INDEX_SQLITE = 135 + EXIT_REMOVE_INDEX_SQLITE = 136 + EXIT_TABLE_EXISTS_SQLITE = 137 + EXIT_DOES_COLUMN_EXISTS_SQLITE = 138 + EXIT_ALTER_PRIMARY_KEY = 139 +) + +type SqlStoreStores struct { + team store.TeamStore + channel store.ChannelStore + post store.PostStore + thread store.ThreadStore + user store.UserStore + bot store.BotStore + audit store.AuditStore + cluster store.ClusterDiscoveryStore + compliance store.ComplianceStore + session store.SessionStore + oauth store.OAuthStore + system store.SystemStore + webhook store.WebhookStore + command store.CommandStore + commandWebhook store.CommandWebhookStore + preference store.PreferenceStore + license store.LicenseStore + token store.TokenStore + emoji store.EmojiStore + status store.StatusStore + fileInfo store.FileInfoStore + uploadSession store.UploadSessionStore + reaction store.ReactionStore + job store.JobStore + userAccessToken store.UserAccessTokenStore + plugin store.PluginStore + channelMemberHistory store.ChannelMemberHistoryStore + role store.RoleStore + scheme store.SchemeStore + TermsOfService store.TermsOfServiceStore + productNotices store.ProductNoticesStore + group store.GroupStore + UserTermsOfService store.UserTermsOfServiceStore + linkMetadata store.LinkMetadataStore +} + +type SqlStore struct { + // rrCounter and srCounter should be kept first. + // See https://github.com/mattermost/mattermost-server/v5/pull/7281 + rrCounter int64 + srCounter int64 + master *gorp.DbMap + replicas []*gorp.DbMap + searchReplicas []*gorp.DbMap + stores SqlStoreStores + settings *model.SqlSettings + lockedToMaster bool + context context.Context + license *model.License + licenseMutex sync.RWMutex +} + +type TraceOnAdapter struct{} + +func (t *TraceOnAdapter) Printf(format string, v ...interface{}) { + originalString := fmt.Sprintf(format, v...) + newString := strings.ReplaceAll(originalString, "\n", " ") + newString = strings.ReplaceAll(newString, "\t", " ") + newString = strings.ReplaceAll(newString, "\"", "") + mlog.Debug(newString) +} + +func New(settings model.SqlSettings, metrics einterfaces.MetricsInterface) *SqlStore { + store := &SqlStore{ + rrCounter: 0, + srCounter: 0, + settings: &settings, + } + + store.initConnection() + + store.stores.team = newSqlTeamStore(store) + store.stores.channel = newSqlChannelStore(store, metrics) + store.stores.post = newSqlPostStore(store, metrics) + store.stores.user = newSqlUserStore(store, metrics) + store.stores.bot = newSqlBotStore(store, metrics) + store.stores.audit = newSqlAuditStore(store) + store.stores.cluster = newSqlClusterDiscoveryStore(store) + store.stores.compliance = newSqlComplianceStore(store) + store.stores.session = newSqlSessionStore(store) + store.stores.oauth = newSqlOAuthStore(store) + store.stores.system = newSqlSystemStore(store) + store.stores.webhook = newSqlWebhookStore(store, metrics) + store.stores.command = newSqlCommandStore(store) + store.stores.commandWebhook = newSqlCommandWebhookStore(store) + store.stores.preference = newSqlPreferenceStore(store) + store.stores.license = newSqlLicenseStore(store) + store.stores.token = newSqlTokenStore(store) + store.stores.emoji = newSqlEmojiStore(store, metrics) + store.stores.status = newSqlStatusStore(store) + store.stores.fileInfo = newSqlFileInfoStore(store, metrics) + store.stores.uploadSession = newSqlUploadSessionStore(store) + store.stores.thread = newSqlThreadStore(store) + store.stores.job = newSqlJobStore(store) + store.stores.userAccessToken = newSqlUserAccessTokenStore(store) + store.stores.channelMemberHistory = newSqlChannelMemberHistoryStore(store) + store.stores.plugin = newSqlPluginStore(store) + store.stores.TermsOfService = newSqlTermsOfServiceStore(store, metrics) + store.stores.UserTermsOfService = newSqlUserTermsOfServiceStore(store) + store.stores.linkMetadata = newSqlLinkMetadataStore(store) + store.stores.reaction = newSqlReactionStore(store) + store.stores.role = newSqlRoleStore(store) + store.stores.scheme = newSqlSchemeStore(store) + store.stores.group = newSqlGroupStore(store) + store.stores.productNotices = newSqlProductNoticesStore(store) + err := store.GetMaster().CreateTablesIfNotExists() + if err != nil { + if IsDuplicate(err) { + mlog.Warn("Duplicate key error occurred; assuming table already created and proceeding.", mlog.Err(err)) + } else { + mlog.Critical("Error creating database tables.", mlog.Err(err)) + os.Exit(EXIT_CREATE_TABLE) + } + } + + err = upgradeDatabase(store, model.CurrentVersion) + if err != nil { + mlog.Critical("Failed to upgrade database.", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_GENERIC_FAILURE) + } + + store.stores.team.(*SqlTeamStore).createIndexesIfNotExists() + store.stores.channel.(*SqlChannelStore).createIndexesIfNotExists() + store.stores.post.(*SqlPostStore).createIndexesIfNotExists() + store.stores.thread.(*SqlThreadStore).createIndexesIfNotExists() + store.stores.user.(*SqlUserStore).createIndexesIfNotExists() + store.stores.bot.(*SqlBotStore).createIndexesIfNotExists() + store.stores.audit.(*SqlAuditStore).createIndexesIfNotExists() + store.stores.compliance.(*SqlComplianceStore).createIndexesIfNotExists() + store.stores.session.(*SqlSessionStore).createIndexesIfNotExists() + store.stores.oauth.(*SqlOAuthStore).createIndexesIfNotExists() + store.stores.system.(*SqlSystemStore).createIndexesIfNotExists() + store.stores.webhook.(*SqlWebhookStore).createIndexesIfNotExists() + store.stores.command.(*SqlCommandStore).createIndexesIfNotExists() + store.stores.commandWebhook.(*SqlCommandWebhookStore).createIndexesIfNotExists() + store.stores.preference.(*SqlPreferenceStore).createIndexesIfNotExists() + store.stores.license.(*SqlLicenseStore).createIndexesIfNotExists() + store.stores.token.(*SqlTokenStore).createIndexesIfNotExists() + store.stores.emoji.(*SqlEmojiStore).createIndexesIfNotExists() + store.stores.status.(*SqlStatusStore).createIndexesIfNotExists() + store.stores.fileInfo.(*SqlFileInfoStore).createIndexesIfNotExists() + store.stores.uploadSession.(*SqlUploadSessionStore).createIndexesIfNotExists() + store.stores.job.(*SqlJobStore).createIndexesIfNotExists() + store.stores.userAccessToken.(*SqlUserAccessTokenStore).createIndexesIfNotExists() + store.stores.plugin.(*SqlPluginStore).createIndexesIfNotExists() + store.stores.TermsOfService.(SqlTermsOfServiceStore).createIndexesIfNotExists() + store.stores.productNotices.(SqlProductNoticesStore).createIndexesIfNotExists() + store.stores.UserTermsOfService.(SqlUserTermsOfServiceStore).createIndexesIfNotExists() + store.stores.linkMetadata.(*SqlLinkMetadataStore).createIndexesIfNotExists() + store.stores.group.(*SqlGroupStore).createIndexesIfNotExists() + store.stores.scheme.(*SqlSchemeStore).createIndexesIfNotExists() + store.stores.preference.(*SqlPreferenceStore).deleteUnusedFeatures() + + return store +} + +func setupConnection(con_type string, dataSource string, settings *model.SqlSettings) *gorp.DbMap { + db, err := dbsql.Open(*settings.DriverName, dataSource) + if err != nil { + mlog.Critical("Failed to open SQL connection to err.", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_DB_OPEN) + } + + for i := 0; i < DB_PING_ATTEMPTS; i++ { + mlog.Info("Pinging SQL", mlog.String("database", con_type)) + ctx, cancel := context.WithTimeout(context.Background(), DB_PING_TIMEOUT_SECS*time.Second) + defer cancel() + err = db.PingContext(ctx) + if err == nil { + break + } else { + if i == DB_PING_ATTEMPTS-1 { + mlog.Critical("Failed to ping DB, server will exit.", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_PING) + } else { + mlog.Error("Failed to ping DB", mlog.Err(err), mlog.Int("retrying in seconds", DB_PING_TIMEOUT_SECS)) + time.Sleep(DB_PING_TIMEOUT_SECS * time.Second) + } + } + } + + db.SetMaxIdleConns(*settings.MaxIdleConns) + db.SetMaxOpenConns(*settings.MaxOpenConns) + db.SetConnMaxLifetime(time.Duration(*settings.ConnMaxLifetimeMilliseconds) * time.Millisecond) + + var dbmap *gorp.DbMap + + connectionTimeout := time.Duration(*settings.QueryTimeout) * time.Second + + if *settings.DriverName == model.DATABASE_DRIVER_SQLITE { + dbmap = &gorp.DbMap{Db: db, TypeConverter: mattermConverter{}, Dialect: gorp.SqliteDialect{}, QueryTimeout: connectionTimeout} + } else if *settings.DriverName == model.DATABASE_DRIVER_MYSQL { + dbmap = &gorp.DbMap{Db: db, TypeConverter: mattermConverter{}, Dialect: gorp.MySQLDialect{Engine: "InnoDB", Encoding: "UTF8MB4"}, QueryTimeout: connectionTimeout} + } else if *settings.DriverName == model.DATABASE_DRIVER_POSTGRES { + dbmap = &gorp.DbMap{Db: db, TypeConverter: mattermConverter{}, Dialect: gorp.PostgresDialect{}, QueryTimeout: connectionTimeout} + } else { + mlog.Critical("Failed to create dialect specific driver") + time.Sleep(time.Second) + os.Exit(EXIT_NO_DRIVER) + } + + if settings.Trace != nil && *settings.Trace { + dbmap.TraceOn("sql-trace:", &TraceOnAdapter{}) + } + + return dbmap +} + +func (ss *SqlStore) SetContext(context context.Context) { + ss.context = context +} + +func (ss *SqlStore) Context() context.Context { + return ss.context +} + +func (ss *SqlStore) initConnection() { + ss.master = setupConnection("master", *ss.settings.DataSource, ss.settings) + + if len(ss.settings.DataSourceReplicas) > 0 { + ss.replicas = make([]*gorp.DbMap, len(ss.settings.DataSourceReplicas)) + for i, replica := range ss.settings.DataSourceReplicas { + ss.replicas[i] = setupConnection(fmt.Sprintf("replica-%v", i), replica, ss.settings) + } + } + + if len(ss.settings.DataSourceSearchReplicas) > 0 { + ss.searchReplicas = make([]*gorp.DbMap, len(ss.settings.DataSourceSearchReplicas)) + for i, replica := range ss.settings.DataSourceSearchReplicas { + ss.searchReplicas[i] = setupConnection(fmt.Sprintf("search-replica-%v", i), replica, ss.settings) + } + } +} + +func (ss *SqlStore) DriverName() string { + return *ss.settings.DriverName +} + +func (ss *SqlStore) GetCurrentSchemaVersion() string { + version, _ := ss.GetMaster().SelectStr("SELECT Value FROM Systems WHERE Name='Version'") + return version +} + +func (ss *SqlStore) GetDbVersion() (string, error) { + var sqlVersion string + if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { + sqlVersion = `SHOW server_version` + } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { + sqlVersion = `SELECT version()` + } else if ss.DriverName() == model.DATABASE_DRIVER_SQLITE { + sqlVersion = `SELECT sqlite_version()` + } else { + return "", errors.New("Not supported driver") + } + + version, err := ss.GetReplica().SelectStr(sqlVersion) + if err != nil { + return "", err + } + + return version, nil + +} + +func (ss *SqlStore) GetMaster() *gorp.DbMap { + return ss.master +} + +func (ss *SqlStore) GetSearchReplica() *gorp.DbMap { + ss.licenseMutex.RLock() + license := ss.license + ss.licenseMutex.RUnlock() + if license == nil { + return ss.GetMaster() + } + + if len(ss.settings.DataSourceSearchReplicas) == 0 { + return ss.GetReplica() + } + + rrNum := atomic.AddInt64(&ss.srCounter, 1) % int64(len(ss.searchReplicas)) + return ss.searchReplicas[rrNum] +} + +func (ss *SqlStore) GetReplica() *gorp.DbMap { + ss.licenseMutex.RLock() + license := ss.license + ss.licenseMutex.RUnlock() + if len(ss.settings.DataSourceReplicas) == 0 || ss.lockedToMaster || license == nil { + return ss.GetMaster() + } + + rrNum := atomic.AddInt64(&ss.rrCounter, 1) % int64(len(ss.replicas)) + return ss.replicas[rrNum] +} + +func (ss *SqlStore) TotalMasterDbConnections() int { + return ss.GetMaster().Db.Stats().OpenConnections +} + +func (ss *SqlStore) TotalReadDbConnections() int { + if len(ss.settings.DataSourceReplicas) == 0 { + return 0 + } + + count := 0 + for _, db := range ss.replicas { + count = count + db.Db.Stats().OpenConnections + } + + return count +} + +func (ss *SqlStore) TotalSearchDbConnections() int { + if len(ss.settings.DataSourceSearchReplicas) == 0 { + return 0 + } + + count := 0 + for _, db := range ss.searchReplicas { + count = count + db.Db.Stats().OpenConnections + } + + return count +} + +func (ss *SqlStore) MarkSystemRanUnitTests() { + props, err := ss.System().Get() + if err != nil { + return + } + + unitTests := props[model.SYSTEM_RAN_UNIT_TESTS] + if len(unitTests) == 0 { + systemTests := &model.System{Name: model.SYSTEM_RAN_UNIT_TESTS, Value: "1"} + ss.System().Save(systemTests) + } +} + +func (ss *SqlStore) DoesTableExist(tableName string) bool { + if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { + count, err := ss.GetMaster().SelectInt( + `SELECT count(relname) FROM pg_class WHERE relname=$1`, + strings.ToLower(tableName), + ) + + if err != nil { + mlog.Critical("Failed to check if table exists", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_TABLE_EXISTS) + } + + return count > 0 + + } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { + + count, err := ss.GetMaster().SelectInt( + `SELECT + COUNT(0) AS table_exists + FROM + information_schema.TABLES + WHERE + TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = ? + `, + tableName, + ) + + if err != nil { + mlog.Critical("Failed to check if table exists", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_TABLE_EXISTS_MYSQL) + } + + return count > 0 + + } else if ss.DriverName() == model.DATABASE_DRIVER_SQLITE { + count, err := ss.GetMaster().SelectInt( + `SELECT count(name) FROM sqlite_master WHERE type='table' AND name=?`, + tableName, + ) + + if err != nil { + mlog.Critical("Failed to check if table exists", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_TABLE_EXISTS_SQLITE) + } + + return count > 0 + + } else { + mlog.Critical("Failed to check if column exists because of missing driver") + time.Sleep(time.Second) + os.Exit(EXIT_COLUMN_EXISTS) + return false + } +} + +func (ss *SqlStore) DoesColumnExist(tableName string, columnName string) bool { + if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { + count, err := ss.GetMaster().SelectInt( + `SELECT COUNT(0) + FROM pg_attribute + WHERE attrelid = $1::regclass + AND attname = $2 + AND NOT attisdropped`, + strings.ToLower(tableName), + strings.ToLower(columnName), + ) + + if err != nil { + if err.Error() == "pq: relation \""+strings.ToLower(tableName)+"\" does not exist" { + return false + } + + mlog.Critical("Failed to check if column exists", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_DOES_COLUMN_EXISTS_POSTGRES) + } + + return count > 0 + + } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { + + count, err := ss.GetMaster().SelectInt( + `SELECT + COUNT(0) AS column_exists + FROM + information_schema.COLUMNS + WHERE + TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = ? + AND COLUMN_NAME = ?`, + tableName, + columnName, + ) + + if err != nil { + mlog.Critical("Failed to check if column exists", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_DOES_COLUMN_EXISTS_MYSQL) + } + + return count > 0 + + } else if ss.DriverName() == model.DATABASE_DRIVER_SQLITE { + count, err := ss.GetMaster().SelectInt( + `SELECT COUNT(*) FROM pragma_table_info(?) WHERE name=?`, + tableName, + columnName, + ) + + if err != nil { + mlog.Critical("Failed to check if column exists", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_DOES_COLUMN_EXISTS_SQLITE) + } + + return count > 0 + + } else { + mlog.Critical("Failed to check if column exists because of missing driver") + time.Sleep(time.Second) + os.Exit(EXIT_DOES_COLUMN_EXISTS_MISSING) + return false + } +} + +func (ss *SqlStore) DoesTriggerExist(triggerName string) bool { + if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { + count, err := ss.GetMaster().SelectInt(` + SELECT + COUNT(0) + FROM + pg_trigger + WHERE + tgname = $1 + `, triggerName) + + if err != nil { + mlog.Critical("Failed to check if trigger exists", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_GENERIC_FAILURE) + } + + return count > 0 + + } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { + count, err := ss.GetMaster().SelectInt(` + SELECT + COUNT(0) + FROM + information_schema.triggers + WHERE + trigger_schema = DATABASE() + AND trigger_name = ? + `, triggerName) + + if err != nil { + mlog.Critical("Failed to check if trigger exists", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_GENERIC_FAILURE) + } + + return count > 0 + + } else { + mlog.Critical("Failed to check if column exists because of missing driver") + time.Sleep(time.Second) + os.Exit(EXIT_GENERIC_FAILURE) + return false + } +} + +func (ss *SqlStore) CreateColumnIfNotExists(tableName string, columnName string, mySqlColType string, postgresColType string, defaultValue string) bool { + + if ss.DoesColumnExist(tableName, columnName) { + return false + } + + if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { + _, err := ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " ADD " + columnName + " " + postgresColType + " DEFAULT '" + defaultValue + "'") + if err != nil { + mlog.Critical("Failed to create column", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_CREATE_COLUMN_POSTGRES) + } + + return true + + } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { + _, err := ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " ADD " + columnName + " " + mySqlColType + " DEFAULT '" + defaultValue + "'") + if err != nil { + mlog.Critical("Failed to create column", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_CREATE_COLUMN_MYSQL) + } + + return true + + } else { + mlog.Critical("Failed to create column because of missing driver") + time.Sleep(time.Second) + os.Exit(EXIT_CREATE_COLUMN_MISSING) + return false + } +} + +func (ss *SqlStore) CreateColumnIfNotExistsNoDefault(tableName string, columnName string, mySqlColType string, postgresColType string) bool { + + if ss.DoesColumnExist(tableName, columnName) { + return false + } + + if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { + _, err := ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " ADD " + columnName + " " + postgresColType) + if err != nil { + mlog.Critical("Failed to create column", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_CREATE_COLUMN_POSTGRES) + } + + return true + + } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { + _, err := ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " ADD " + columnName + " " + mySqlColType) + if err != nil { + mlog.Critical("Failed to create column", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_CREATE_COLUMN_MYSQL) + } + + return true + + } else { + mlog.Critical("Failed to create column because of missing driver") + time.Sleep(time.Second) + os.Exit(EXIT_CREATE_COLUMN_MISSING) + return false + } +} + +func (ss *SqlStore) RemoveColumnIfExists(tableName string, columnName string) bool { + + if !ss.DoesColumnExist(tableName, columnName) { + return false + } + + _, err := ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " DROP COLUMN " + columnName) + if err != nil { + mlog.Critical("Failed to drop column", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_REMOVE_COLUMN) + } + + return true +} + +func (ss *SqlStore) RemoveTableIfExists(tableName string) bool { + if !ss.DoesTableExist(tableName) { + return false + } + + _, err := ss.GetMaster().ExecNoTimeout("DROP TABLE " + tableName) + if err != nil { + mlog.Critical("Failed to drop table", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_REMOVE_TABLE) + } + + return true +} + +func (ss *SqlStore) RenameColumnIfExists(tableName string, oldColumnName string, newColumnName string, colType string) bool { + if !ss.DoesColumnExist(tableName, oldColumnName) { + return false + } + + var err error + if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { + _, err = ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " CHANGE " + oldColumnName + " " + newColumnName + " " + colType) + } else if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { + _, err = ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " RENAME COLUMN " + oldColumnName + " TO " + newColumnName) + } + + if err != nil { + mlog.Critical("Failed to rename column", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_RENAME_COLUMN) + } + + return true +} + +func (ss *SqlStore) GetMaxLengthOfColumnIfExists(tableName string, columnName string) string { + if !ss.DoesColumnExist(tableName, columnName) { + return "" + } + + var result string + var err error + if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { + result, err = ss.GetMaster().SelectStr("SELECT CHARACTER_MAXIMUM_LENGTH FROM information_schema.columns WHERE table_name = '" + tableName + "' AND COLUMN_NAME = '" + columnName + "'") + } else if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { + result, err = ss.GetMaster().SelectStr("SELECT character_maximum_length FROM information_schema.columns WHERE table_name = '" + strings.ToLower(tableName) + "' AND column_name = '" + strings.ToLower(columnName) + "'") + } + + if err != nil { + mlog.Critical("Failed to get max length of column", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_MAX_COLUMN) + } + + return result +} + +func (ss *SqlStore) AlterColumnTypeIfExists(tableName string, columnName string, mySqlColType string, postgresColType string) bool { + if !ss.DoesColumnExist(tableName, columnName) { + return false + } + + var err error + if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { + _, err = ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " MODIFY " + columnName + " " + mySqlColType) + } else if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { + _, err = ss.GetMaster().ExecNoTimeout("ALTER TABLE " + strings.ToLower(tableName) + " ALTER COLUMN " + strings.ToLower(columnName) + " TYPE " + postgresColType) + } + + if err != nil { + mlog.Critical("Failed to alter column type", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_ALTER_COLUMN) + } + + return true +} + +func (ss *SqlStore) AlterColumnDefaultIfExists(tableName string, columnName string, mySqlColDefault *string, postgresColDefault *string) bool { + if !ss.DoesColumnExist(tableName, columnName) { + return false + } + + var defaultValue string + 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 if ss.DriverName() == model.DATABASE_DRIVER_SQLITE { + // SQLite doesn't support altering column defaults, but we don't use this in + // production so just ignore. + return true + } 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("Failed to alter column", mlog.String("table", tableName), mlog.String("column", columnName), mlog.String("default value", defaultValue), mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_GENERIC_FAILURE) + return false + } + + return true +} + +func (ss *SqlStore) AlterPrimaryKey(tableName string, columnNames []string) bool { + var currentPrimaryKey string + var err error + // get the current primary key as a comma separated list of columns + switch ss.DriverName() { + case model.DATABASE_DRIVER_MYSQL: + query := ` + SELECT GROUP_CONCAT(column_name ORDER BY seq_in_index) AS PK + FROM + information_schema.statistics + WHERE + table_schema = DATABASE() + AND table_name = ? + AND index_name = 'PRIMARY' + GROUP BY + index_name` + currentPrimaryKey, err = ss.GetMaster().SelectStr(query, tableName) + case model.DATABASE_DRIVER_POSTGRES: + query := ` + SELECT string_agg(a.attname, ',') AS pk + FROM + pg_constraint AS c + CROSS JOIN + (SELECT unnest(conkey) FROM pg_constraint WHERE conrelid='` + strings.ToLower(tableName) + `'::REGCLASS AND contype='p') AS cols(colnum) + INNER JOIN + pg_attribute AS a ON a.attrelid = c.conrelid + AND cols.colnum = a.attnum + WHERE + c.contype = 'p' + AND c.conrelid = '` + strings.ToLower(tableName) + `'::REGCLASS` + currentPrimaryKey, err = ss.GetMaster().SelectStr(query) + case model.DATABASE_DRIVER_SQLITE: + // SQLite doesn't support altering primary key + return true + } + if err != nil { + mlog.Critical("Failed to get current primary key", mlog.String("table", tableName), mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_ALTER_PRIMARY_KEY) + } + + primaryKey := strings.Join(columnNames, ",") + if strings.EqualFold(currentPrimaryKey, primaryKey) { + return false + } + // alter primary key + var alterQuery string + if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { + alterQuery = "ALTER TABLE " + tableName + " DROP PRIMARY KEY, ADD PRIMARY KEY (" + primaryKey + ")" + } else if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { + alterQuery = "ALTER TABLE " + tableName + " DROP CONSTRAINT " + strings.ToLower(tableName) + "_pkey, ADD PRIMARY KEY (" + strings.ToLower(primaryKey) + ")" + } + _, err = ss.GetMaster().ExecNoTimeout(alterQuery) + if err != nil { + mlog.Critical("Failed to alter primary key", mlog.String("table", tableName), mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_ALTER_PRIMARY_KEY) + } + return true +} + +func (ss *SqlStore) CreateUniqueIndexIfNotExists(indexName string, tableName string, columnName string) bool { + return ss.createIndexIfNotExists(indexName, tableName, []string{columnName}, INDEX_TYPE_DEFAULT, true) +} + +func (ss *SqlStore) CreateIndexIfNotExists(indexName string, tableName string, columnName string) bool { + return ss.createIndexIfNotExists(indexName, tableName, []string{columnName}, INDEX_TYPE_DEFAULT, false) +} + +func (ss *SqlStore) CreateCompositeIndexIfNotExists(indexName string, tableName string, columnNames []string) bool { + return ss.createIndexIfNotExists(indexName, tableName, columnNames, INDEX_TYPE_DEFAULT, false) +} + +func (ss *SqlStore) CreateUniqueCompositeIndexIfNotExists(indexName string, tableName string, columnNames []string) bool { + return ss.createIndexIfNotExists(indexName, tableName, columnNames, INDEX_TYPE_DEFAULT, true) +} + +func (ss *SqlStore) CreateFullTextIndexIfNotExists(indexName string, tableName string, columnName string) bool { + return ss.createIndexIfNotExists(indexName, tableName, []string{columnName}, INDEX_TYPE_FULL_TEXT, false) +} + +func (ss *SqlStore) createIndexIfNotExists(indexName string, tableName string, columnNames []string, indexType string, unique bool) bool { + + uniqueStr := "" + if unique { + uniqueStr = "UNIQUE " + } + + if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { + _, errExists := ss.GetMaster().SelectStr("SELECT $1::regclass", indexName) + // It should fail if the index does not exist + if errExists == nil { + return false + } + + query := "" + if indexType == INDEX_TYPE_FULL_TEXT { + if len(columnNames) != 1 { + mlog.Critical("Unable to create multi column full text index") + os.Exit(EXIT_CREATE_INDEX_POSTGRES) + } + columnName := columnNames[0] + postgresColumnNames := convertMySQLFullTextColumnsToPostgres(columnName) + query = "CREATE INDEX " + indexName + " ON " + tableName + " USING gin(to_tsvector('english', " + postgresColumnNames + "))" + } else { + query = "CREATE " + uniqueStr + "INDEX " + indexName + " ON " + tableName + " (" + strings.Join(columnNames, ", ") + ")" + } + + _, err := ss.GetMaster().ExecNoTimeout(query) + if err != nil { + mlog.Critical("Failed to create index", mlog.Err(errExists), mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_CREATE_INDEX_POSTGRES) + } + } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { + + count, err := ss.GetMaster().SelectInt("SELECT COUNT(0) AS index_exists FROM information_schema.statistics WHERE TABLE_SCHEMA = DATABASE() and table_name = ? AND index_name = ?", tableName, indexName) + if err != nil { + mlog.Critical("Failed to check index", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_CREATE_INDEX_MYSQL) + } + + if count > 0 { + return false + } + + fullTextIndex := "" + if indexType == INDEX_TYPE_FULL_TEXT { + fullTextIndex = " FULLTEXT " + } + + _, err = ss.GetMaster().ExecNoTimeout("CREATE " + uniqueStr + fullTextIndex + " INDEX " + indexName + " ON " + tableName + " (" + strings.Join(columnNames, ", ") + ")") + if err != nil { + mlog.Critical("Failed to create index", mlog.String("table", tableName), mlog.String("index_name", indexName), mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_CREATE_INDEX_FULL_MYSQL) + } + } else if ss.DriverName() == model.DATABASE_DRIVER_SQLITE { + _, err := ss.GetMaster().ExecNoTimeout("CREATE INDEX IF NOT EXISTS " + indexName + " ON " + tableName + " (" + strings.Join(columnNames, ", ") + ")") + if err != nil { + mlog.Critical("Failed to create index", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_CREATE_INDEX_SQLITE) + } + } else { + mlog.Critical("Failed to create index because of missing driver") + time.Sleep(time.Second) + os.Exit(EXIT_CREATE_INDEX_MISSING) + } + + return true +} + +func (ss *SqlStore) RemoveIndexIfExists(indexName string, tableName string) bool { + + if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { + _, err := ss.GetMaster().SelectStr("SELECT $1::regclass", indexName) + // It should fail if the index does not exist + if err != nil { + return false + } + + _, err = ss.GetMaster().ExecNoTimeout("DROP INDEX " + indexName) + if err != nil { + mlog.Critical("Failed to remove index", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_REMOVE_INDEX_POSTGRES) + } + + return true + } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { + + count, err := ss.GetMaster().SelectInt("SELECT COUNT(0) AS index_exists FROM information_schema.statistics WHERE TABLE_SCHEMA = DATABASE() and table_name = ? AND index_name = ?", tableName, indexName) + if err != nil { + mlog.Critical("Failed to check index", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_REMOVE_INDEX_MYSQL) + } + + if count <= 0 { + return false + } + + _, err = ss.GetMaster().ExecNoTimeout("DROP INDEX " + indexName + " ON " + tableName) + if err != nil { + mlog.Critical("Failed to remove index", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_REMOVE_INDEX_MYSQL) + } + } else if ss.DriverName() == model.DATABASE_DRIVER_SQLITE { + _, err := ss.GetMaster().ExecNoTimeout("DROP INDEX IF EXISTS " + indexName) + if err != nil { + mlog.Critical("Failed to remove index", mlog.Err(err)) + time.Sleep(time.Second) + os.Exit(EXIT_REMOVE_INDEX_SQLITE) + } + } else { + mlog.Critical("Failed to create index because of missing driver") + time.Sleep(time.Second) + os.Exit(EXIT_REMOVE_INDEX_MISSING) + } + + return true +} + +func IsUniqueConstraintError(err error, indexName []string) bool { + unique := false + if pqErr, ok := err.(*pq.Error); ok && pqErr.Code == "23505" { + unique = true + } + + if mysqlErr, ok := err.(*mysql.MySQLError); ok && mysqlErr.Number == 1062 { + unique = true + } + + field := false + for _, contain := range indexName { + if strings.Contains(err.Error(), contain) { + field = true + break + } + } + + return unique && field +} + +func (ss *SqlStore) GetAllConns() []*gorp.DbMap { + all := make([]*gorp.DbMap, len(ss.replicas)+1) + copy(all, ss.replicas) + all[len(ss.replicas)] = ss.master + return all +} + +// RecycleDBConnections closes active connections by setting the max conn lifetime +// to d, and then resets them back to their original duration. +func (ss *SqlStore) RecycleDBConnections(d time.Duration) { + // Get old time. + originalDuration := time.Duration(*ss.settings.ConnMaxLifetimeMilliseconds) * time.Millisecond + // Set the max lifetimes for all connections. + for _, conn := range ss.GetAllConns() { + conn.Db.SetConnMaxLifetime(d) + } + // Wait for that period with an additional 2 seconds of scheduling delay. + time.Sleep(d + 2*time.Second) + // Reset max lifetime back to original value. + for _, conn := range ss.GetAllConns() { + conn.Db.SetConnMaxLifetime(originalDuration) + } +} + +func (ss *SqlStore) Close() { + ss.master.Db.Close() + for _, replica := range ss.replicas { + replica.Db.Close() + } +} + +func (ss *SqlStore) LockToMaster() { + ss.lockedToMaster = true +} + +func (ss *SqlStore) UnlockFromMaster() { + ss.lockedToMaster = false +} + +func (ss *SqlStore) Team() store.TeamStore { + return ss.stores.team +} + +func (ss *SqlStore) Channel() store.ChannelStore { + return ss.stores.channel +} + +func (ss *SqlStore) Post() store.PostStore { + return ss.stores.post +} + +func (ss *SqlStore) User() store.UserStore { + return ss.stores.user +} + +func (ss *SqlStore) Bot() store.BotStore { + return ss.stores.bot +} + +func (ss *SqlStore) Session() store.SessionStore { + return ss.stores.session +} + +func (ss *SqlStore) Audit() store.AuditStore { + return ss.stores.audit +} + +func (ss *SqlStore) ClusterDiscovery() store.ClusterDiscoveryStore { + return ss.stores.cluster +} + +func (ss *SqlStore) Compliance() store.ComplianceStore { + return ss.stores.compliance +} + +func (ss *SqlStore) OAuth() store.OAuthStore { + return ss.stores.oauth +} + +func (ss *SqlStore) System() store.SystemStore { + return ss.stores.system +} + +func (ss *SqlStore) Webhook() store.WebhookStore { + return ss.stores.webhook +} + +func (ss *SqlStore) Command() store.CommandStore { + return ss.stores.command +} + +func (ss *SqlStore) CommandWebhook() store.CommandWebhookStore { + return ss.stores.commandWebhook +} + +func (ss *SqlStore) Preference() store.PreferenceStore { + return ss.stores.preference +} + +func (ss *SqlStore) License() store.LicenseStore { + return ss.stores.license +} + +func (ss *SqlStore) Token() store.TokenStore { + return ss.stores.token +} + +func (ss *SqlStore) Emoji() store.EmojiStore { + return ss.stores.emoji +} + +func (ss *SqlStore) Status() store.StatusStore { + return ss.stores.status +} + +func (ss *SqlStore) FileInfo() store.FileInfoStore { + return ss.stores.fileInfo +} + +func (ss *SqlStore) UploadSession() store.UploadSessionStore { + return ss.stores.uploadSession +} + +func (ss *SqlStore) Reaction() store.ReactionStore { + return ss.stores.reaction +} + +func (ss *SqlStore) Job() store.JobStore { + return ss.stores.job +} + +func (ss *SqlStore) UserAccessToken() store.UserAccessTokenStore { + return ss.stores.userAccessToken +} + +func (ss *SqlStore) ChannelMemberHistory() store.ChannelMemberHistoryStore { + return ss.stores.channelMemberHistory +} + +func (ss *SqlStore) Plugin() store.PluginStore { + return ss.stores.plugin +} + +func (ss *SqlStore) Thread() store.ThreadStore { + return ss.stores.thread +} + +func (ss *SqlStore) Role() store.RoleStore { + return ss.stores.role +} + +func (ss *SqlStore) TermsOfService() store.TermsOfServiceStore { + return ss.stores.TermsOfService +} + +func (ss *SqlStore) ProductNotices() store.ProductNoticesStore { + return ss.stores.productNotices +} + +func (ss *SqlStore) UserTermsOfService() store.UserTermsOfServiceStore { + return ss.stores.UserTermsOfService +} + +func (ss *SqlStore) Scheme() store.SchemeStore { + return ss.stores.scheme +} + +func (ss *SqlStore) Group() store.GroupStore { + return ss.stores.group +} + +func (ss *SqlStore) LinkMetadata() store.LinkMetadataStore { + return ss.stores.linkMetadata +} + +func (ss *SqlStore) DropAllTables() { + ss.master.TruncateTables() +} + +func (ss *SqlStore) getQueryBuilder() sq.StatementBuilderType { + builder := sq.StatementBuilder.PlaceholderFormat(sq.Question) + if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { + builder = builder.PlaceholderFormat(sq.Dollar) + } + return builder +} + +func (ss *SqlStore) CheckIntegrity() <-chan model.IntegrityCheckResult { + results := make(chan model.IntegrityCheckResult) + go CheckRelationalIntegrity(ss, results) + return results +} + +func (ss *SqlStore) UpdateLicense(license *model.License) { + ss.licenseMutex.Lock() + defer ss.licenseMutex.Unlock() + ss.license = license +} + +type mattermConverter struct{} + +func (me mattermConverter) ToDb(val interface{}) (interface{}, error) { + + switch t := val.(type) { + case model.StringMap: + return model.MapToJson(t), nil + case map[string]string: + return model.MapToJson(model.StringMap(t)), nil + case model.StringArray: + return model.ArrayToJson(t), nil + case model.StringInterface: + return model.StringInterfaceToJson(t), nil + case map[string]interface{}: + return model.StringInterfaceToJson(model.StringInterface(t)), nil + case JSONSerializable: + return t.ToJson(), nil + case *opengraph.OpenGraph: + return json.Marshal(t) + } + + return val, nil +} + +func (me mattermConverter) FromDb(target interface{}) (gorp.CustomScanner, bool) { + switch target.(type) { + case *model.StringMap: + binder := func(holder, target interface{}) error { + s, ok := holder.(*string) + if !ok { + return errors.New(utils.T("store.sql.convert_string_map")) + } + b := []byte(*s) + return json.Unmarshal(b, target) + } + return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true + case *map[string]string: + binder := func(holder, target interface{}) error { + s, ok := holder.(*string) + if !ok { + return errors.New(utils.T("store.sql.convert_string_map")) + } + b := []byte(*s) + return json.Unmarshal(b, target) + } + return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true + case *model.StringArray: + binder := func(holder, target interface{}) error { + s, ok := holder.(*string) + if !ok { + return errors.New(utils.T("store.sql.convert_string_array")) + } + b := []byte(*s) + return json.Unmarshal(b, target) + } + return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true + case *model.StringInterface: + binder := func(holder, target interface{}) error { + s, ok := holder.(*string) + if !ok { + return errors.New(utils.T("store.sql.convert_string_interface")) + } + b := []byte(*s) + return json.Unmarshal(b, target) + } + return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true + case *map[string]interface{}: + binder := func(holder, target interface{}) error { + s, ok := holder.(*string) + if !ok { + return errors.New(utils.T("store.sql.convert_string_interface")) + } + b := []byte(*s) + return json.Unmarshal(b, target) + } + return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true + } + + return gorp.CustomScanner{}, false +} + +type JSONSerializable interface { + ToJson() string +} + +func convertMySQLFullTextColumnsToPostgres(columnNames string) string { + columns := strings.Split(columnNames, ", ") + concatenatedColumnNames := "" + for i, c := range columns { + concatenatedColumnNames += c + if i < len(columns)-1 { + concatenatedColumnNames += " || ' ' || " + } + } + + return concatenatedColumnNames +} + +// IsDuplicate checks whether an error is a duplicate key error, which comes when processes are competing on creating the same +// tables in the database. +func IsDuplicate(err error) bool { + var pqErr *pq.Error + var mysqlErr *mysql.MySQLError + switch { + case errors.As(errors.Cause(err), &pqErr): + if pqErr.Code == PG_DUP_TABLE_ERROR_CODE { + return true + } + case errors.As(errors.Cause(err), &mysqlErr): + if mysqlErr.Number == MYSQL_DUP_TABLE_ERROR_CODE { + return true + } + } + + return false +} diff --git a/store/sqlstore/store_test.go b/store/sqlstore/store_test.go index ebccade658..2ef881b949 100644 --- a/store/sqlstore/store_test.go +++ b/store/sqlstore/store_test.go @@ -4,20 +4,30 @@ package sqlstore import ( + "fmt" "os" + "regexp" "sync" "testing" + "github.com/go-sql-driver/mysql" + "github.com/lib/pq" + "github.com/mattermost/gorp" "github.com/mattermost/mattermost-server/v5/model" "github.com/mattermost/mattermost-server/v5/store" "github.com/mattermost/mattermost-server/v5/store/searchtest" "github.com/mattermost/mattermost-server/v5/store/storetest" + "github.com/pkg/errors" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + _ "github.com/mattn/go-sqlite3" ) type storeType struct { Name string SqlSettings *model.SqlSettings - SqlSupplier *SqlSupplier + SqlStore *SqlStore Store store.Store } @@ -66,7 +76,7 @@ func StoreTestWithSearchTestEngine(t *testing.T, f func(*testing.T, store.Store, } } -func StoreTestWithSqlSupplier(t *testing.T, f func(*testing.T, store.Store, storetest.SqlSupplier)) { +func StoreTestWithSqlStore(t *testing.T, f func(*testing.T, store.Store, storetest.SqlStore)) { defer func() { if err := recover(); err != nil { tearDownStores() @@ -79,7 +89,7 @@ func StoreTestWithSqlSupplier(t *testing.T, f func(*testing.T, store.Store, stor if testing.Short() { t.SkipNow() } - f(t, st.Store, st.SqlSupplier) + f(t, st.Store, st.SqlStore) }) } } @@ -114,8 +124,8 @@ func initStores() { wg.Add(1) go func() { defer wg.Done() - st.SqlSupplier = NewSqlSupplier(*st.SqlSettings, nil) - st.Store = st.SqlSupplier + st.SqlStore = New(*st.SqlSettings, nil) + st.Store = st.SqlStore st.Store.DropAllTables() st.Store.MarkSystemRanUnitTests() }() @@ -147,3 +157,347 @@ func tearDownStores() { wg.Wait() }) } + +// This test was used to consistently reproduce the race +// before the fix in MM-28397. +// Keeping it here to help avoiding future regressions. +func TestStoreLicenseRace(t *testing.T) { + settings := makeSqlSettings(model.DATABASE_DRIVER_SQLITE) + settings.DataSourceReplicas = []string{":memory:"} + settings.DataSourceSearchReplicas = []string{":memory:"} + store := New(*settings, nil) + + wg := sync.WaitGroup{} + wg.Add(3) + + go func() { + store.UpdateLicense(&model.License{}) + wg.Done() + }() + + go func() { + store.GetReplica() + wg.Done() + }() + + go func() { + store.GetSearchReplica() + wg.Done() + }() + + wg.Wait() +} + +func TestGetReplica(t *testing.T) { + t.Parallel() + testCases := []struct { + Description string + DataSourceReplicas []string + DataSourceSearchReplicas []string + }{ + { + "no replicas", + []string{}, + []string{}, + }, + { + "one source replica", + []string{":memory:"}, + []string{}, + }, + { + "multiple source replicas", + []string{":memory:", ":memory:", ":memory:"}, + []string{}, + }, + { + "one source search replica", + []string{}, + []string{":memory:"}, + }, + { + "multiple source search replicas", + []string{}, + []string{":memory:", ":memory:", ":memory:"}, + }, + { + "one source replica, one source search replica", + []string{":memory:"}, + []string{":memory:"}, + }, + { + "one source replica, multiple source search replicas", + []string{":memory:"}, + []string{":memory:", ":memory:", ":memory:"}, + }, + { + "multiple source replica, one source search replica", + []string{":memory:", ":memory:", ":memory:"}, + []string{":memory:"}, + }, + { + "multiple source replica, multiple source search replicas", + []string{":memory:", ":memory:", ":memory:"}, + []string{":memory:", ":memory:", ":memory:"}, + }, + } + + for _, testCase := range testCases { + testCase := testCase + t.Run(testCase.Description+" with license", func(t *testing.T) { + t.Parallel() + + settings := makeSqlSettings(model.DATABASE_DRIVER_SQLITE) + settings.DataSourceReplicas = testCase.DataSourceReplicas + settings.DataSourceSearchReplicas = testCase.DataSourceSearchReplicas + store := New(*settings, nil) + store.UpdateLicense(&model.License{}) + + replicas := make(map[*gorp.DbMap]bool) + for i := 0; i < 5; i++ { + replicas[store.GetReplica()] = true + } + + searchReplicas := make(map[*gorp.DbMap]bool) + for i := 0; i < 5; i++ { + searchReplicas[store.GetSearchReplica()] = true + } + + if len(testCase.DataSourceReplicas) > 0 { + // If replicas were defined, ensure none are the master. + assert.Len(t, replicas, len(testCase.DataSourceReplicas)) + + for replica := range replicas { + assert.NotEqual(t, store.GetMaster(), replica) + } + + } else if assert.Len(t, replicas, 1) { + // Otherwise ensure the replicas contains only the master. + for replica := range replicas { + assert.Equal(t, store.GetMaster(), replica) + } + } + + if len(testCase.DataSourceSearchReplicas) > 0 { + // If search replicas were defined, ensure none are the master nor the replicas. + assert.Len(t, searchReplicas, len(testCase.DataSourceSearchReplicas)) + + for searchReplica := range searchReplicas { + assert.NotEqual(t, store.GetMaster(), searchReplica) + for replica := range replicas { + assert.NotEqual(t, searchReplica, replica) + } + } + + } else if len(testCase.DataSourceReplicas) > 0 { + // If no search replicas were defined, but replicas were, ensure they are equal. + assert.Equal(t, replicas, searchReplicas) + + } else if assert.Len(t, searchReplicas, 1) { + // Otherwise ensure the search replicas contains the master. + for searchReplica := range searchReplicas { + assert.Equal(t, store.GetMaster(), searchReplica) + } + } + }) + + t.Run(testCase.Description+" without license", func(t *testing.T) { + t.Parallel() + + settings := makeSqlSettings(model.DATABASE_DRIVER_SQLITE) + settings.DataSourceReplicas = testCase.DataSourceReplicas + settings.DataSourceSearchReplicas = testCase.DataSourceSearchReplicas + store := New(*settings, nil) + + replicas := make(map[*gorp.DbMap]bool) + for i := 0; i < 5; i++ { + replicas[store.GetReplica()] = true + } + + searchReplicas := make(map[*gorp.DbMap]bool) + for i := 0; i < 5; i++ { + searchReplicas[store.GetSearchReplica()] = true + } + + if len(testCase.DataSourceReplicas) > 0 { + // If replicas were defined, ensure none are the master. + assert.Len(t, replicas, 1) + + for replica := range replicas { + assert.Same(t, store.GetMaster(), replica) + } + + } else if assert.Len(t, replicas, 1) { + // Otherwise ensure the replicas contains only the master. + for replica := range replicas { + assert.Equal(t, store.GetMaster(), replica) + } + } + + if len(testCase.DataSourceSearchReplicas) > 0 { + // If search replicas were defined, ensure none are the master nor the replicas. + assert.Len(t, searchReplicas, 1) + + for searchReplica := range searchReplicas { + assert.Same(t, store.GetMaster(), searchReplica) + } + + } else if len(testCase.DataSourceReplicas) > 0 { + // If no search replicas were defined, but replicas were, ensure they are equal. + assert.Equal(t, replicas, searchReplicas) + + } else if assert.Len(t, searchReplicas, 1) { + // Otherwise ensure the search replicas contains the master. + for searchReplica := range searchReplicas { + assert.Equal(t, store.GetMaster(), searchReplica) + } + } + }) + } +} + +func TestGetDbVersion(t *testing.T) { + testDrivers := []string{ + model.DATABASE_DRIVER_POSTGRES, + model.DATABASE_DRIVER_MYSQL, + model.DATABASE_DRIVER_SQLITE, + } + + for _, driver := range testDrivers { + t.Run("Should return db version for "+driver, func(t *testing.T) { + t.Parallel() + settings := makeSqlSettings(driver) + store := New(*settings, nil) + + version, err := store.GetDbVersion() + require.Nil(t, err) + require.Regexp(t, regexp.MustCompile(`\d+\.\d+(\.\d+)?`), version) + }) + } +} + +func TestGetAllConns(t *testing.T) { + t.Parallel() + testCases := []struct { + Description string + DataSourceReplicas []string + DataSourceSearchReplicas []string + ExpectedNumConnections int + }{ + { + "no replicas", + []string{}, + []string{}, + 1, + }, + { + "one source replica", + []string{":memory:"}, + []string{}, + 2, + }, + { + "multiple source replicas", + []string{":memory:", ":memory:", ":memory:"}, + []string{}, + 4, + }, + { + "one source search replica", + []string{}, + []string{":memory:"}, + 1, + }, + { + "multiple source search replicas", + []string{}, + []string{":memory:", ":memory:", ":memory:"}, + 1, + }, + { + "one source replica, one source search replica", + []string{":memory:"}, + []string{":memory:"}, + 2, + }, + { + "one source replica, multiple source search replicas", + []string{":memory:"}, + []string{":memory:", ":memory:", ":memory:"}, + 2, + }, + { + "multiple source replica, one source search replica", + []string{":memory:", ":memory:", ":memory:"}, + []string{":memory:"}, + 4, + }, + { + "multiple source replica, multiple source search replicas", + []string{":memory:", ":memory:", ":memory:"}, + []string{":memory:", ":memory:", ":memory:"}, + 4, + }, + } + + for _, testCase := range testCases { + testCase := testCase + t.Run(testCase.Description, func(t *testing.T) { + t.Parallel() + settings := makeSqlSettings(model.DATABASE_DRIVER_SQLITE) + settings.DataSourceReplicas = testCase.DataSourceReplicas + settings.DataSourceSearchReplicas = testCase.DataSourceSearchReplicas + store := New(*settings, nil) + + assert.Len(t, store.GetAllConns(), testCase.ExpectedNumConnections) + }) + } +} + +func TestIsDuplicate(t *testing.T) { + testErrors := map[error]bool{ + &pq.Error{Code: "42P06"}: false, + &pq.Error{Code: PG_DUP_TABLE_ERROR_CODE}: true, + &mysql.MySQLError{Number: uint16(1000)}: false, + &mysql.MySQLError{Number: MYSQL_DUP_TABLE_ERROR_CODE}: true, + errors.New("Random error"): false, + } + + for err, expected := range testErrors { + t.Run(fmt.Sprintf("Should return %t for %s", expected, err.Error()), func(t *testing.T) { + t.Parallel() + assert.Equal(t, expected, IsDuplicate(err)) + }) + } +} + +func makeSqlSettings(driver string) *model.SqlSettings { + switch driver { + case model.DATABASE_DRIVER_POSTGRES: + return storetest.MakeSqlSettings(driver) + case model.DATABASE_DRIVER_MYSQL: + return storetest.MakeSqlSettings(driver) + case model.DATABASE_DRIVER_SQLITE: + return makeSqliteSettings() + } + + return nil +} + +func makeSqliteSettings() *model.SqlSettings { + driverName := model.DATABASE_DRIVER_SQLITE + dataSource := ":memory:" + maxIdleConns := 1 + connMaxLifetimeMilliseconds := 3600000 + maxOpenConns := 1 + queryTimeout := 5 + + return &model.SqlSettings{ + DriverName: &driverName, + DataSource: &dataSource, + MaxIdleConns: &maxIdleConns, + ConnMaxLifetimeMilliseconds: &connMaxLifetimeMilliseconds, + MaxOpenConns: &maxOpenConns, + QueryTimeout: &queryTimeout, + } +} diff --git a/store/sqlstore/supplier.go b/store/sqlstore/supplier.go deleted file mode 100644 index 3fb03cbc46..0000000000 --- a/store/sqlstore/supplier.go +++ /dev/null @@ -1,1346 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -package sqlstore - -import ( - "context" - dbsql "database/sql" - "encoding/json" - "fmt" - "os" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/pkg/errors" - - sq "github.com/Masterminds/squirrel" - "github.com/dyatlov/go-opengraph/opengraph" - "github.com/go-sql-driver/mysql" - "github.com/lib/pq" - "github.com/mattermost/gorp" - "github.com/mattermost/mattermost-server/v5/einterfaces" - "github.com/mattermost/mattermost-server/v5/mlog" - "github.com/mattermost/mattermost-server/v5/model" - "github.com/mattermost/mattermost-server/v5/store" - "github.com/mattermost/mattermost-server/v5/utils" -) - -const ( - INDEX_TYPE_FULL_TEXT = "full_text" - INDEX_TYPE_DEFAULT = "default" - PG_DUP_TABLE_ERROR_CODE = "42P07" // see https://github.com/lib/pq/blob/master/error.go#L268 - MYSQL_DUP_TABLE_ERROR_CODE = uint16(1050) // see https://dev.mysql.com/doc/mysql-errors/5.7/en/server-error-reference.html#error_er_table_exists_error - DB_PING_ATTEMPTS = 18 - DB_PING_TIMEOUT_SECS = 10 -) - -const ( - EXIT_GENERIC_FAILURE = 1 - EXIT_CREATE_TABLE = 100 - EXIT_DB_OPEN = 101 - EXIT_PING = 102 - EXIT_NO_DRIVER = 103 - EXIT_TABLE_EXISTS = 104 - EXIT_TABLE_EXISTS_MYSQL = 105 - EXIT_COLUMN_EXISTS = 106 - EXIT_DOES_COLUMN_EXISTS_POSTGRES = 107 - EXIT_DOES_COLUMN_EXISTS_MYSQL = 108 - EXIT_DOES_COLUMN_EXISTS_MISSING = 109 - EXIT_CREATE_COLUMN_POSTGRES = 110 - EXIT_CREATE_COLUMN_MYSQL = 111 - EXIT_CREATE_COLUMN_MISSING = 112 - EXIT_REMOVE_COLUMN = 113 - EXIT_RENAME_COLUMN = 114 - EXIT_MAX_COLUMN = 115 - EXIT_ALTER_COLUMN = 116 - EXIT_CREATE_INDEX_POSTGRES = 117 - EXIT_CREATE_INDEX_MYSQL = 118 - EXIT_CREATE_INDEX_FULL_MYSQL = 119 - EXIT_CREATE_INDEX_MISSING = 120 - EXIT_REMOVE_INDEX_POSTGRES = 121 - EXIT_REMOVE_INDEX_MYSQL = 122 - EXIT_REMOVE_INDEX_MISSING = 123 - EXIT_REMOVE_TABLE = 134 - EXIT_CREATE_INDEX_SQLITE = 135 - EXIT_REMOVE_INDEX_SQLITE = 136 - EXIT_TABLE_EXISTS_SQLITE = 137 - EXIT_DOES_COLUMN_EXISTS_SQLITE = 138 - EXIT_ALTER_PRIMARY_KEY = 139 -) - -type SqlSupplierStores struct { - team store.TeamStore - channel store.ChannelStore - post store.PostStore - thread store.ThreadStore - user store.UserStore - bot store.BotStore - audit store.AuditStore - cluster store.ClusterDiscoveryStore - compliance store.ComplianceStore - session store.SessionStore - oauth store.OAuthStore - system store.SystemStore - webhook store.WebhookStore - command store.CommandStore - commandWebhook store.CommandWebhookStore - preference store.PreferenceStore - license store.LicenseStore - token store.TokenStore - emoji store.EmojiStore - status store.StatusStore - fileInfo store.FileInfoStore - uploadSession store.UploadSessionStore - reaction store.ReactionStore - job store.JobStore - userAccessToken store.UserAccessTokenStore - plugin store.PluginStore - channelMemberHistory store.ChannelMemberHistoryStore - role store.RoleStore - scheme store.SchemeStore - TermsOfService store.TermsOfServiceStore - productNotices store.ProductNoticesStore - group store.GroupStore - UserTermsOfService store.UserTermsOfServiceStore - linkMetadata store.LinkMetadataStore -} - -type SqlSupplier struct { - // rrCounter and srCounter should be kept first. - // See https://github.com/mattermost/mattermost-server/v5/pull/7281 - rrCounter int64 - srCounter int64 - master *gorp.DbMap - replicas []*gorp.DbMap - searchReplicas []*gorp.DbMap - stores SqlSupplierStores - settings *model.SqlSettings - lockedToMaster bool - context context.Context - license *model.License - licenseMutex sync.RWMutex -} - -type TraceOnAdapter struct{} - -func (t *TraceOnAdapter) Printf(format string, v ...interface{}) { - originalString := fmt.Sprintf(format, v...) - newString := strings.ReplaceAll(originalString, "\n", " ") - newString = strings.ReplaceAll(newString, "\t", " ") - newString = strings.ReplaceAll(newString, "\"", "") - mlog.Debug(newString) -} - -func NewSqlSupplier(settings model.SqlSettings, metrics einterfaces.MetricsInterface) *SqlSupplier { - supplier := &SqlSupplier{ - rrCounter: 0, - srCounter: 0, - settings: &settings, - } - - supplier.initConnection() - - supplier.stores.team = newSqlTeamStore(supplier) - supplier.stores.channel = newSqlChannelStore(supplier, metrics) - supplier.stores.post = newSqlPostStore(supplier, metrics) - supplier.stores.user = newSqlUserStore(supplier, metrics) - supplier.stores.bot = newSqlBotStore(supplier, metrics) - supplier.stores.audit = newSqlAuditStore(supplier) - supplier.stores.cluster = newSqlClusterDiscoveryStore(supplier) - supplier.stores.compliance = newSqlComplianceStore(supplier) - supplier.stores.session = newSqlSessionStore(supplier) - supplier.stores.oauth = newSqlOAuthStore(supplier) - supplier.stores.system = newSqlSystemStore(supplier) - supplier.stores.webhook = newSqlWebhookStore(supplier, metrics) - supplier.stores.command = newSqlCommandStore(supplier) - supplier.stores.commandWebhook = newSqlCommandWebhookStore(supplier) - supplier.stores.preference = newSqlPreferenceStore(supplier) - supplier.stores.license = newSqlLicenseStore(supplier) - supplier.stores.token = newSqlTokenStore(supplier) - supplier.stores.emoji = newSqlEmojiStore(supplier, metrics) - supplier.stores.status = newSqlStatusStore(supplier) - supplier.stores.fileInfo = newSqlFileInfoStore(supplier, metrics) - supplier.stores.uploadSession = newSqlUploadSessionStore(supplier) - supplier.stores.thread = newSqlThreadStore(supplier) - supplier.stores.job = newSqlJobStore(supplier) - supplier.stores.userAccessToken = newSqlUserAccessTokenStore(supplier) - supplier.stores.channelMemberHistory = newSqlChannelMemberHistoryStore(supplier) - supplier.stores.plugin = newSqlPluginStore(supplier) - supplier.stores.TermsOfService = newSqlTermsOfServiceStore(supplier, metrics) - supplier.stores.UserTermsOfService = newSqlUserTermsOfServiceStore(supplier) - supplier.stores.linkMetadata = newSqlLinkMetadataStore(supplier) - supplier.stores.reaction = newSqlReactionStore(supplier) - supplier.stores.role = newSqlRoleStore(supplier) - supplier.stores.scheme = newSqlSchemeStore(supplier) - supplier.stores.group = newSqlGroupStore(supplier) - supplier.stores.productNotices = newSqlProductNoticesStore(supplier) - err := supplier.GetMaster().CreateTablesIfNotExists() - if err != nil { - if IsDuplicate(err) { - mlog.Warn("Duplicate key error occurred; assuming table already created and proceeding.", mlog.Err(err)) - } else { - mlog.Critical("Error creating database tables.", mlog.Err(err)) - os.Exit(EXIT_CREATE_TABLE) - } - } - - err = upgradeDatabase(supplier, model.CurrentVersion) - if err != nil { - mlog.Critical("Failed to upgrade database.", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_GENERIC_FAILURE) - } - - supplier.stores.team.(*SqlTeamStore).createIndexesIfNotExists() - supplier.stores.channel.(*SqlChannelStore).createIndexesIfNotExists() - supplier.stores.post.(*SqlPostStore).createIndexesIfNotExists() - supplier.stores.thread.(*SqlThreadStore).createIndexesIfNotExists() - supplier.stores.user.(*SqlUserStore).createIndexesIfNotExists() - supplier.stores.bot.(*SqlBotStore).createIndexesIfNotExists() - supplier.stores.audit.(*SqlAuditStore).createIndexesIfNotExists() - supplier.stores.compliance.(*SqlComplianceStore).createIndexesIfNotExists() - supplier.stores.session.(*SqlSessionStore).createIndexesIfNotExists() - supplier.stores.oauth.(*SqlOAuthStore).createIndexesIfNotExists() - supplier.stores.system.(*SqlSystemStore).createIndexesIfNotExists() - supplier.stores.webhook.(*SqlWebhookStore).createIndexesIfNotExists() - supplier.stores.command.(*SqlCommandStore).createIndexesIfNotExists() - supplier.stores.commandWebhook.(*SqlCommandWebhookStore).createIndexesIfNotExists() - supplier.stores.preference.(*SqlPreferenceStore).createIndexesIfNotExists() - supplier.stores.license.(*SqlLicenseStore).createIndexesIfNotExists() - supplier.stores.token.(*SqlTokenStore).createIndexesIfNotExists() - supplier.stores.emoji.(*SqlEmojiStore).createIndexesIfNotExists() - supplier.stores.status.(*SqlStatusStore).createIndexesIfNotExists() - supplier.stores.fileInfo.(*SqlFileInfoStore).createIndexesIfNotExists() - supplier.stores.uploadSession.(*SqlUploadSessionStore).createIndexesIfNotExists() - supplier.stores.job.(*SqlJobStore).createIndexesIfNotExists() - supplier.stores.userAccessToken.(*SqlUserAccessTokenStore).createIndexesIfNotExists() - supplier.stores.plugin.(*SqlPluginStore).createIndexesIfNotExists() - supplier.stores.TermsOfService.(SqlTermsOfServiceStore).createIndexesIfNotExists() - supplier.stores.productNotices.(SqlProductNoticesStore).createIndexesIfNotExists() - supplier.stores.UserTermsOfService.(SqlUserTermsOfServiceStore).createIndexesIfNotExists() - supplier.stores.linkMetadata.(*SqlLinkMetadataStore).createIndexesIfNotExists() - supplier.stores.group.(*SqlGroupStore).createIndexesIfNotExists() - supplier.stores.scheme.(*SqlSchemeStore).createIndexesIfNotExists() - supplier.stores.preference.(*SqlPreferenceStore).deleteUnusedFeatures() - - return supplier -} - -func setupConnection(con_type string, dataSource string, settings *model.SqlSettings) *gorp.DbMap { - db, err := dbsql.Open(*settings.DriverName, dataSource) - if err != nil { - mlog.Critical("Failed to open SQL connection to err.", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_DB_OPEN) - } - - for i := 0; i < DB_PING_ATTEMPTS; i++ { - mlog.Info("Pinging SQL", mlog.String("database", con_type)) - ctx, cancel := context.WithTimeout(context.Background(), DB_PING_TIMEOUT_SECS*time.Second) - defer cancel() - err = db.PingContext(ctx) - if err == nil { - break - } else { - if i == DB_PING_ATTEMPTS-1 { - mlog.Critical("Failed to ping DB, server will exit.", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_PING) - } else { - mlog.Error("Failed to ping DB", mlog.Err(err), mlog.Int("retrying in seconds", DB_PING_TIMEOUT_SECS)) - time.Sleep(DB_PING_TIMEOUT_SECS * time.Second) - } - } - } - - db.SetMaxIdleConns(*settings.MaxIdleConns) - db.SetMaxOpenConns(*settings.MaxOpenConns) - db.SetConnMaxLifetime(time.Duration(*settings.ConnMaxLifetimeMilliseconds) * time.Millisecond) - - var dbmap *gorp.DbMap - - connectionTimeout := time.Duration(*settings.QueryTimeout) * time.Second - - if *settings.DriverName == model.DATABASE_DRIVER_SQLITE { - dbmap = &gorp.DbMap{Db: db, TypeConverter: mattermConverter{}, Dialect: gorp.SqliteDialect{}, QueryTimeout: connectionTimeout} - } else if *settings.DriverName == model.DATABASE_DRIVER_MYSQL { - dbmap = &gorp.DbMap{Db: db, TypeConverter: mattermConverter{}, Dialect: gorp.MySQLDialect{Engine: "InnoDB", Encoding: "UTF8MB4"}, QueryTimeout: connectionTimeout} - } else if *settings.DriverName == model.DATABASE_DRIVER_POSTGRES { - dbmap = &gorp.DbMap{Db: db, TypeConverter: mattermConverter{}, Dialect: gorp.PostgresDialect{}, QueryTimeout: connectionTimeout} - } else { - mlog.Critical("Failed to create dialect specific driver") - time.Sleep(time.Second) - os.Exit(EXIT_NO_DRIVER) - } - - if settings.Trace != nil && *settings.Trace { - dbmap.TraceOn("sql-trace:", &TraceOnAdapter{}) - } - - return dbmap -} - -func (ss *SqlSupplier) SetContext(context context.Context) { - ss.context = context -} - -func (ss *SqlSupplier) Context() context.Context { - return ss.context -} - -func (ss *SqlSupplier) initConnection() { - ss.master = setupConnection("master", *ss.settings.DataSource, ss.settings) - - if len(ss.settings.DataSourceReplicas) > 0 { - ss.replicas = make([]*gorp.DbMap, len(ss.settings.DataSourceReplicas)) - for i, replica := range ss.settings.DataSourceReplicas { - ss.replicas[i] = setupConnection(fmt.Sprintf("replica-%v", i), replica, ss.settings) - } - } - - if len(ss.settings.DataSourceSearchReplicas) > 0 { - ss.searchReplicas = make([]*gorp.DbMap, len(ss.settings.DataSourceSearchReplicas)) - for i, replica := range ss.settings.DataSourceSearchReplicas { - ss.searchReplicas[i] = setupConnection(fmt.Sprintf("search-replica-%v", i), replica, ss.settings) - } - } -} - -func (ss *SqlSupplier) DriverName() string { - return *ss.settings.DriverName -} - -func (ss *SqlSupplier) GetCurrentSchemaVersion() string { - version, _ := ss.GetMaster().SelectStr("SELECT Value FROM Systems WHERE Name='Version'") - return version -} - -func (ss *SqlSupplier) GetDbVersion() (string, error) { - var sqlVersion string - if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { - sqlVersion = `SHOW server_version` - } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { - sqlVersion = `SELECT version()` - } else if ss.DriverName() == model.DATABASE_DRIVER_SQLITE { - sqlVersion = `SELECT sqlite_version()` - } else { - return "", errors.New("Not supported driver") - } - - version, err := ss.GetReplica().SelectStr(sqlVersion) - if err != nil { - return "", err - } - - return version, nil - -} - -func (ss *SqlSupplier) GetMaster() *gorp.DbMap { - return ss.master -} - -func (ss *SqlSupplier) GetSearchReplica() *gorp.DbMap { - ss.licenseMutex.RLock() - license := ss.license - ss.licenseMutex.RUnlock() - if license == nil { - return ss.GetMaster() - } - - if len(ss.settings.DataSourceSearchReplicas) == 0 { - return ss.GetReplica() - } - - rrNum := atomic.AddInt64(&ss.srCounter, 1) % int64(len(ss.searchReplicas)) - return ss.searchReplicas[rrNum] -} - -func (ss *SqlSupplier) GetReplica() *gorp.DbMap { - ss.licenseMutex.RLock() - license := ss.license - ss.licenseMutex.RUnlock() - if len(ss.settings.DataSourceReplicas) == 0 || ss.lockedToMaster || license == nil { - return ss.GetMaster() - } - - rrNum := atomic.AddInt64(&ss.rrCounter, 1) % int64(len(ss.replicas)) - return ss.replicas[rrNum] -} - -func (ss *SqlSupplier) TotalMasterDbConnections() int { - return ss.GetMaster().Db.Stats().OpenConnections -} - -func (ss *SqlSupplier) TotalReadDbConnections() int { - if len(ss.settings.DataSourceReplicas) == 0 { - return 0 - } - - count := 0 - for _, db := range ss.replicas { - count = count + db.Db.Stats().OpenConnections - } - - return count -} - -func (ss *SqlSupplier) TotalSearchDbConnections() int { - if len(ss.settings.DataSourceSearchReplicas) == 0 { - return 0 - } - - count := 0 - for _, db := range ss.searchReplicas { - count = count + db.Db.Stats().OpenConnections - } - - return count -} - -func (ss *SqlSupplier) MarkSystemRanUnitTests() { - props, err := ss.System().Get() - if err != nil { - return - } - - unitTests := props[model.SYSTEM_RAN_UNIT_TESTS] - if len(unitTests) == 0 { - systemTests := &model.System{Name: model.SYSTEM_RAN_UNIT_TESTS, Value: "1"} - ss.System().Save(systemTests) - } -} - -func (ss *SqlSupplier) DoesTableExist(tableName string) bool { - if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { - count, err := ss.GetMaster().SelectInt( - `SELECT count(relname) FROM pg_class WHERE relname=$1`, - strings.ToLower(tableName), - ) - - if err != nil { - mlog.Critical("Failed to check if table exists", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_TABLE_EXISTS) - } - - return count > 0 - - } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { - - count, err := ss.GetMaster().SelectInt( - `SELECT - COUNT(0) AS table_exists - FROM - information_schema.TABLES - WHERE - TABLE_SCHEMA = DATABASE() - AND TABLE_NAME = ? - `, - tableName, - ) - - if err != nil { - mlog.Critical("Failed to check if table exists", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_TABLE_EXISTS_MYSQL) - } - - return count > 0 - - } else if ss.DriverName() == model.DATABASE_DRIVER_SQLITE { - count, err := ss.GetMaster().SelectInt( - `SELECT count(name) FROM sqlite_master WHERE type='table' AND name=?`, - tableName, - ) - - if err != nil { - mlog.Critical("Failed to check if table exists", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_TABLE_EXISTS_SQLITE) - } - - return count > 0 - - } else { - mlog.Critical("Failed to check if column exists because of missing driver") - time.Sleep(time.Second) - os.Exit(EXIT_COLUMN_EXISTS) - return false - } -} - -func (ss *SqlSupplier) DoesColumnExist(tableName string, columnName string) bool { - if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { - count, err := ss.GetMaster().SelectInt( - `SELECT COUNT(0) - FROM pg_attribute - WHERE attrelid = $1::regclass - AND attname = $2 - AND NOT attisdropped`, - strings.ToLower(tableName), - strings.ToLower(columnName), - ) - - if err != nil { - if err.Error() == "pq: relation \""+strings.ToLower(tableName)+"\" does not exist" { - return false - } - - mlog.Critical("Failed to check if column exists", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_DOES_COLUMN_EXISTS_POSTGRES) - } - - return count > 0 - - } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { - - count, err := ss.GetMaster().SelectInt( - `SELECT - COUNT(0) AS column_exists - FROM - information_schema.COLUMNS - WHERE - TABLE_SCHEMA = DATABASE() - AND TABLE_NAME = ? - AND COLUMN_NAME = ?`, - tableName, - columnName, - ) - - if err != nil { - mlog.Critical("Failed to check if column exists", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_DOES_COLUMN_EXISTS_MYSQL) - } - - return count > 0 - - } else if ss.DriverName() == model.DATABASE_DRIVER_SQLITE { - count, err := ss.GetMaster().SelectInt( - `SELECT COUNT(*) FROM pragma_table_info(?) WHERE name=?`, - tableName, - columnName, - ) - - if err != nil { - mlog.Critical("Failed to check if column exists", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_DOES_COLUMN_EXISTS_SQLITE) - } - - return count > 0 - - } else { - mlog.Critical("Failed to check if column exists because of missing driver") - time.Sleep(time.Second) - os.Exit(EXIT_DOES_COLUMN_EXISTS_MISSING) - return false - } -} - -func (ss *SqlSupplier) DoesTriggerExist(triggerName string) bool { - if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { - count, err := ss.GetMaster().SelectInt(` - SELECT - COUNT(0) - FROM - pg_trigger - WHERE - tgname = $1 - `, triggerName) - - if err != nil { - mlog.Critical("Failed to check if trigger exists", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_GENERIC_FAILURE) - } - - return count > 0 - - } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { - count, err := ss.GetMaster().SelectInt(` - SELECT - COUNT(0) - FROM - information_schema.triggers - WHERE - trigger_schema = DATABASE() - AND trigger_name = ? - `, triggerName) - - if err != nil { - mlog.Critical("Failed to check if trigger exists", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_GENERIC_FAILURE) - } - - return count > 0 - - } else { - mlog.Critical("Failed to check if column exists because of missing driver") - time.Sleep(time.Second) - os.Exit(EXIT_GENERIC_FAILURE) - return false - } -} - -func (ss *SqlSupplier) CreateColumnIfNotExists(tableName string, columnName string, mySqlColType string, postgresColType string, defaultValue string) bool { - - if ss.DoesColumnExist(tableName, columnName) { - return false - } - - if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { - _, err := ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " ADD " + columnName + " " + postgresColType + " DEFAULT '" + defaultValue + "'") - if err != nil { - mlog.Critical("Failed to create column", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_CREATE_COLUMN_POSTGRES) - } - - return true - - } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { - _, err := ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " ADD " + columnName + " " + mySqlColType + " DEFAULT '" + defaultValue + "'") - if err != nil { - mlog.Critical("Failed to create column", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_CREATE_COLUMN_MYSQL) - } - - return true - - } else { - mlog.Critical("Failed to create column because of missing driver") - time.Sleep(time.Second) - os.Exit(EXIT_CREATE_COLUMN_MISSING) - return false - } -} - -func (ss *SqlSupplier) CreateColumnIfNotExistsNoDefault(tableName string, columnName string, mySqlColType string, postgresColType string) bool { - - if ss.DoesColumnExist(tableName, columnName) { - return false - } - - if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { - _, err := ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " ADD " + columnName + " " + postgresColType) - if err != nil { - mlog.Critical("Failed to create column", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_CREATE_COLUMN_POSTGRES) - } - - return true - - } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { - _, err := ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " ADD " + columnName + " " + mySqlColType) - if err != nil { - mlog.Critical("Failed to create column", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_CREATE_COLUMN_MYSQL) - } - - return true - - } else { - mlog.Critical("Failed to create column because of missing driver") - time.Sleep(time.Second) - os.Exit(EXIT_CREATE_COLUMN_MISSING) - return false - } -} - -func (ss *SqlSupplier) RemoveColumnIfExists(tableName string, columnName string) bool { - - if !ss.DoesColumnExist(tableName, columnName) { - return false - } - - _, err := ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " DROP COLUMN " + columnName) - if err != nil { - mlog.Critical("Failed to drop column", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_REMOVE_COLUMN) - } - - return true -} - -func (ss *SqlSupplier) RemoveTableIfExists(tableName string) bool { - if !ss.DoesTableExist(tableName) { - return false - } - - _, err := ss.GetMaster().ExecNoTimeout("DROP TABLE " + tableName) - if err != nil { - mlog.Critical("Failed to drop table", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_REMOVE_TABLE) - } - - return true -} - -func (ss *SqlSupplier) RenameColumnIfExists(tableName string, oldColumnName string, newColumnName string, colType string) bool { - if !ss.DoesColumnExist(tableName, oldColumnName) { - return false - } - - var err error - if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { - _, err = ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " CHANGE " + oldColumnName + " " + newColumnName + " " + colType) - } else if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { - _, err = ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " RENAME COLUMN " + oldColumnName + " TO " + newColumnName) - } - - if err != nil { - mlog.Critical("Failed to rename column", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_RENAME_COLUMN) - } - - return true -} - -func (ss *SqlSupplier) GetMaxLengthOfColumnIfExists(tableName string, columnName string) string { - if !ss.DoesColumnExist(tableName, columnName) { - return "" - } - - var result string - var err error - if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { - result, err = ss.GetMaster().SelectStr("SELECT CHARACTER_MAXIMUM_LENGTH FROM information_schema.columns WHERE table_name = '" + tableName + "' AND COLUMN_NAME = '" + columnName + "'") - } else if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { - result, err = ss.GetMaster().SelectStr("SELECT character_maximum_length FROM information_schema.columns WHERE table_name = '" + strings.ToLower(tableName) + "' AND column_name = '" + strings.ToLower(columnName) + "'") - } - - if err != nil { - mlog.Critical("Failed to get max length of column", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_MAX_COLUMN) - } - - return result -} - -func (ss *SqlSupplier) AlterColumnTypeIfExists(tableName string, columnName string, mySqlColType string, postgresColType string) bool { - if !ss.DoesColumnExist(tableName, columnName) { - return false - } - - var err error - if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { - _, err = ss.GetMaster().ExecNoTimeout("ALTER TABLE " + tableName + " MODIFY " + columnName + " " + mySqlColType) - } else if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { - _, err = ss.GetMaster().ExecNoTimeout("ALTER TABLE " + strings.ToLower(tableName) + " ALTER COLUMN " + strings.ToLower(columnName) + " TYPE " + postgresColType) - } - - if err != nil { - mlog.Critical("Failed to alter column type", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_ALTER_COLUMN) - } - - return true -} - -func (ss *SqlSupplier) AlterColumnDefaultIfExists(tableName string, columnName string, mySqlColDefault *string, postgresColDefault *string) bool { - if !ss.DoesColumnExist(tableName, columnName) { - return false - } - - var defaultValue string - 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 if ss.DriverName() == model.DATABASE_DRIVER_SQLITE { - // SQLite doesn't support altering column defaults, but we don't use this in - // production so just ignore. - return true - } 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("Failed to alter column", mlog.String("table", tableName), mlog.String("column", columnName), mlog.String("default value", defaultValue), mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_GENERIC_FAILURE) - return false - } - - return true -} - -func (ss *SqlSupplier) AlterPrimaryKey(tableName string, columnNames []string) bool { - var currentPrimaryKey string - var err error - // get the current primary key as a comma separated list of columns - switch ss.DriverName() { - case model.DATABASE_DRIVER_MYSQL: - query := ` - SELECT GROUP_CONCAT(column_name ORDER BY seq_in_index) AS PK - FROM - information_schema.statistics - WHERE - table_schema = DATABASE() - AND table_name = ? - AND index_name = 'PRIMARY' - GROUP BY - index_name` - currentPrimaryKey, err = ss.GetMaster().SelectStr(query, tableName) - case model.DATABASE_DRIVER_POSTGRES: - query := ` - SELECT string_agg(a.attname, ',') AS pk - FROM - pg_constraint AS c - CROSS JOIN - (SELECT unnest(conkey) FROM pg_constraint WHERE conrelid='` + strings.ToLower(tableName) + `'::REGCLASS AND contype='p') AS cols(colnum) - INNER JOIN - pg_attribute AS a ON a.attrelid = c.conrelid - AND cols.colnum = a.attnum - WHERE - c.contype = 'p' - AND c.conrelid = '` + strings.ToLower(tableName) + `'::REGCLASS` - currentPrimaryKey, err = ss.GetMaster().SelectStr(query) - case model.DATABASE_DRIVER_SQLITE: - // SQLite doesn't support altering primary key - return true - } - if err != nil { - mlog.Critical("Failed to get current primary key", mlog.String("table", tableName), mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_ALTER_PRIMARY_KEY) - } - - primaryKey := strings.Join(columnNames, ",") - if strings.EqualFold(currentPrimaryKey, primaryKey) { - return false - } - // alter primary key - var alterQuery string - if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { - alterQuery = "ALTER TABLE " + tableName + " DROP PRIMARY KEY, ADD PRIMARY KEY (" + primaryKey + ")" - } else if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { - alterQuery = "ALTER TABLE " + tableName + " DROP CONSTRAINT " + strings.ToLower(tableName) + "_pkey, ADD PRIMARY KEY (" + strings.ToLower(primaryKey) + ")" - } - _, err = ss.GetMaster().ExecNoTimeout(alterQuery) - if err != nil { - mlog.Critical("Failed to alter primary key", mlog.String("table", tableName), mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_ALTER_PRIMARY_KEY) - } - return true -} - -func (ss *SqlSupplier) CreateUniqueIndexIfNotExists(indexName string, tableName string, columnName string) bool { - return ss.createIndexIfNotExists(indexName, tableName, []string{columnName}, INDEX_TYPE_DEFAULT, true) -} - -func (ss *SqlSupplier) CreateIndexIfNotExists(indexName string, tableName string, columnName string) bool { - return ss.createIndexIfNotExists(indexName, tableName, []string{columnName}, INDEX_TYPE_DEFAULT, false) -} - -func (ss *SqlSupplier) CreateCompositeIndexIfNotExists(indexName string, tableName string, columnNames []string) bool { - return ss.createIndexIfNotExists(indexName, tableName, columnNames, INDEX_TYPE_DEFAULT, false) -} - -func (ss *SqlSupplier) CreateUniqueCompositeIndexIfNotExists(indexName string, tableName string, columnNames []string) bool { - return ss.createIndexIfNotExists(indexName, tableName, columnNames, INDEX_TYPE_DEFAULT, true) -} - -func (ss *SqlSupplier) CreateFullTextIndexIfNotExists(indexName string, tableName string, columnName string) bool { - return ss.createIndexIfNotExists(indexName, tableName, []string{columnName}, INDEX_TYPE_FULL_TEXT, false) -} - -func (ss *SqlSupplier) createIndexIfNotExists(indexName string, tableName string, columnNames []string, indexType string, unique bool) bool { - - uniqueStr := "" - if unique { - uniqueStr = "UNIQUE " - } - - if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { - _, errExists := ss.GetMaster().SelectStr("SELECT $1::regclass", indexName) - // It should fail if the index does not exist - if errExists == nil { - return false - } - - query := "" - if indexType == INDEX_TYPE_FULL_TEXT { - if len(columnNames) != 1 { - mlog.Critical("Unable to create multi column full text index") - os.Exit(EXIT_CREATE_INDEX_POSTGRES) - } - columnName := columnNames[0] - postgresColumnNames := convertMySQLFullTextColumnsToPostgres(columnName) - query = "CREATE INDEX " + indexName + " ON " + tableName + " USING gin(to_tsvector('english', " + postgresColumnNames + "))" - } else { - query = "CREATE " + uniqueStr + "INDEX " + indexName + " ON " + tableName + " (" + strings.Join(columnNames, ", ") + ")" - } - - _, err := ss.GetMaster().ExecNoTimeout(query) - if err != nil { - mlog.Critical("Failed to create index", mlog.Err(errExists), mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_CREATE_INDEX_POSTGRES) - } - } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { - - count, err := ss.GetMaster().SelectInt("SELECT COUNT(0) AS index_exists FROM information_schema.statistics WHERE TABLE_SCHEMA = DATABASE() and table_name = ? AND index_name = ?", tableName, indexName) - if err != nil { - mlog.Critical("Failed to check index", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_CREATE_INDEX_MYSQL) - } - - if count > 0 { - return false - } - - fullTextIndex := "" - if indexType == INDEX_TYPE_FULL_TEXT { - fullTextIndex = " FULLTEXT " - } - - _, err = ss.GetMaster().ExecNoTimeout("CREATE " + uniqueStr + fullTextIndex + " INDEX " + indexName + " ON " + tableName + " (" + strings.Join(columnNames, ", ") + ")") - if err != nil { - mlog.Critical("Failed to create index", mlog.String("table", tableName), mlog.String("index_name", indexName), mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_CREATE_INDEX_FULL_MYSQL) - } - } else if ss.DriverName() == model.DATABASE_DRIVER_SQLITE { - _, err := ss.GetMaster().ExecNoTimeout("CREATE INDEX IF NOT EXISTS " + indexName + " ON " + tableName + " (" + strings.Join(columnNames, ", ") + ")") - if err != nil { - mlog.Critical("Failed to create index", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_CREATE_INDEX_SQLITE) - } - } else { - mlog.Critical("Failed to create index because of missing driver") - time.Sleep(time.Second) - os.Exit(EXIT_CREATE_INDEX_MISSING) - } - - return true -} - -func (ss *SqlSupplier) RemoveIndexIfExists(indexName string, tableName string) bool { - - if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { - _, err := ss.GetMaster().SelectStr("SELECT $1::regclass", indexName) - // It should fail if the index does not exist - if err != nil { - return false - } - - _, err = ss.GetMaster().ExecNoTimeout("DROP INDEX " + indexName) - if err != nil { - mlog.Critical("Failed to remove index", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_REMOVE_INDEX_POSTGRES) - } - - return true - } else if ss.DriverName() == model.DATABASE_DRIVER_MYSQL { - - count, err := ss.GetMaster().SelectInt("SELECT COUNT(0) AS index_exists FROM information_schema.statistics WHERE TABLE_SCHEMA = DATABASE() and table_name = ? AND index_name = ?", tableName, indexName) - if err != nil { - mlog.Critical("Failed to check index", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_REMOVE_INDEX_MYSQL) - } - - if count <= 0 { - return false - } - - _, err = ss.GetMaster().ExecNoTimeout("DROP INDEX " + indexName + " ON " + tableName) - if err != nil { - mlog.Critical("Failed to remove index", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_REMOVE_INDEX_MYSQL) - } - } else if ss.DriverName() == model.DATABASE_DRIVER_SQLITE { - _, err := ss.GetMaster().ExecNoTimeout("DROP INDEX IF EXISTS " + indexName) - if err != nil { - mlog.Critical("Failed to remove index", mlog.Err(err)) - time.Sleep(time.Second) - os.Exit(EXIT_REMOVE_INDEX_SQLITE) - } - } else { - mlog.Critical("Failed to create index because of missing driver") - time.Sleep(time.Second) - os.Exit(EXIT_REMOVE_INDEX_MISSING) - } - - return true -} - -func IsUniqueConstraintError(err error, indexName []string) bool { - unique := false - if pqErr, ok := err.(*pq.Error); ok && pqErr.Code == "23505" { - unique = true - } - - if mysqlErr, ok := err.(*mysql.MySQLError); ok && mysqlErr.Number == 1062 { - unique = true - } - - field := false - for _, contain := range indexName { - if strings.Contains(err.Error(), contain) { - field = true - break - } - } - - return unique && field -} - -func (ss *SqlSupplier) GetAllConns() []*gorp.DbMap { - all := make([]*gorp.DbMap, len(ss.replicas)+1) - copy(all, ss.replicas) - all[len(ss.replicas)] = ss.master - return all -} - -// RecycleDBConnections closes active connections by setting the max conn lifetime -// to d, and then resets them back to their original duration. -func (ss *SqlSupplier) RecycleDBConnections(d time.Duration) { - // Get old time. - originalDuration := time.Duration(*ss.settings.ConnMaxLifetimeMilliseconds) * time.Millisecond - // Set the max lifetimes for all connections. - for _, conn := range ss.GetAllConns() { - conn.Db.SetConnMaxLifetime(d) - } - // Wait for that period with an additional 2 seconds of scheduling delay. - time.Sleep(d + 2*time.Second) - // Reset max lifetime back to original value. - for _, conn := range ss.GetAllConns() { - conn.Db.SetConnMaxLifetime(originalDuration) - } -} - -func (ss *SqlSupplier) Close() { - ss.master.Db.Close() - for _, replica := range ss.replicas { - replica.Db.Close() - } -} - -func (ss *SqlSupplier) LockToMaster() { - ss.lockedToMaster = true -} - -func (ss *SqlSupplier) UnlockFromMaster() { - ss.lockedToMaster = false -} - -func (ss *SqlSupplier) Team() store.TeamStore { - return ss.stores.team -} - -func (ss *SqlSupplier) Channel() store.ChannelStore { - return ss.stores.channel -} - -func (ss *SqlSupplier) Post() store.PostStore { - return ss.stores.post -} - -func (ss *SqlSupplier) User() store.UserStore { - return ss.stores.user -} - -func (ss *SqlSupplier) Bot() store.BotStore { - return ss.stores.bot -} - -func (ss *SqlSupplier) Session() store.SessionStore { - return ss.stores.session -} - -func (ss *SqlSupplier) Audit() store.AuditStore { - return ss.stores.audit -} - -func (ss *SqlSupplier) ClusterDiscovery() store.ClusterDiscoveryStore { - return ss.stores.cluster -} - -func (ss *SqlSupplier) Compliance() store.ComplianceStore { - return ss.stores.compliance -} - -func (ss *SqlSupplier) OAuth() store.OAuthStore { - return ss.stores.oauth -} - -func (ss *SqlSupplier) System() store.SystemStore { - return ss.stores.system -} - -func (ss *SqlSupplier) Webhook() store.WebhookStore { - return ss.stores.webhook -} - -func (ss *SqlSupplier) Command() store.CommandStore { - return ss.stores.command -} - -func (ss *SqlSupplier) CommandWebhook() store.CommandWebhookStore { - return ss.stores.commandWebhook -} - -func (ss *SqlSupplier) Preference() store.PreferenceStore { - return ss.stores.preference -} - -func (ss *SqlSupplier) License() store.LicenseStore { - return ss.stores.license -} - -func (ss *SqlSupplier) Token() store.TokenStore { - return ss.stores.token -} - -func (ss *SqlSupplier) Emoji() store.EmojiStore { - return ss.stores.emoji -} - -func (ss *SqlSupplier) Status() store.StatusStore { - return ss.stores.status -} - -func (ss *SqlSupplier) FileInfo() store.FileInfoStore { - return ss.stores.fileInfo -} - -func (ss *SqlSupplier) UploadSession() store.UploadSessionStore { - return ss.stores.uploadSession -} - -func (ss *SqlSupplier) Reaction() store.ReactionStore { - return ss.stores.reaction -} - -func (ss *SqlSupplier) Job() store.JobStore { - return ss.stores.job -} - -func (ss *SqlSupplier) UserAccessToken() store.UserAccessTokenStore { - return ss.stores.userAccessToken -} - -func (ss *SqlSupplier) ChannelMemberHistory() store.ChannelMemberHistoryStore { - return ss.stores.channelMemberHistory -} - -func (ss *SqlSupplier) Plugin() store.PluginStore { - return ss.stores.plugin -} - -func (ss *SqlSupplier) Thread() store.ThreadStore { - return ss.stores.thread -} - -func (ss *SqlSupplier) Role() store.RoleStore { - return ss.stores.role -} - -func (ss *SqlSupplier) TermsOfService() store.TermsOfServiceStore { - return ss.stores.TermsOfService -} - -func (ss *SqlSupplier) ProductNotices() store.ProductNoticesStore { - return ss.stores.productNotices -} - -func (ss *SqlSupplier) UserTermsOfService() store.UserTermsOfServiceStore { - return ss.stores.UserTermsOfService -} - -func (ss *SqlSupplier) Scheme() store.SchemeStore { - return ss.stores.scheme -} - -func (ss *SqlSupplier) Group() store.GroupStore { - return ss.stores.group -} - -func (ss *SqlSupplier) LinkMetadata() store.LinkMetadataStore { - return ss.stores.linkMetadata -} - -func (ss *SqlSupplier) DropAllTables() { - ss.master.TruncateTables() -} - -func (ss *SqlSupplier) getQueryBuilder() sq.StatementBuilderType { - builder := sq.StatementBuilder.PlaceholderFormat(sq.Question) - if ss.DriverName() == model.DATABASE_DRIVER_POSTGRES { - builder = builder.PlaceholderFormat(sq.Dollar) - } - return builder -} - -func (ss *SqlSupplier) CheckIntegrity() <-chan model.IntegrityCheckResult { - results := make(chan model.IntegrityCheckResult) - go CheckRelationalIntegrity(ss, results) - return results -} - -func (ss *SqlSupplier) UpdateLicense(license *model.License) { - ss.licenseMutex.Lock() - defer ss.licenseMutex.Unlock() - ss.license = license -} - -type mattermConverter struct{} - -func (me mattermConverter) ToDb(val interface{}) (interface{}, error) { - - switch t := val.(type) { - case model.StringMap: - return model.MapToJson(t), nil - case map[string]string: - return model.MapToJson(model.StringMap(t)), nil - case model.StringArray: - return model.ArrayToJson(t), nil - case model.StringInterface: - return model.StringInterfaceToJson(t), nil - case map[string]interface{}: - return model.StringInterfaceToJson(model.StringInterface(t)), nil - case JSONSerializable: - return t.ToJson(), nil - case *opengraph.OpenGraph: - return json.Marshal(t) - } - - return val, nil -} - -func (me mattermConverter) FromDb(target interface{}) (gorp.CustomScanner, bool) { - switch target.(type) { - case *model.StringMap: - binder := func(holder, target interface{}) error { - s, ok := holder.(*string) - if !ok { - return errors.New(utils.T("store.sql.convert_string_map")) - } - b := []byte(*s) - return json.Unmarshal(b, target) - } - return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true - case *map[string]string: - binder := func(holder, target interface{}) error { - s, ok := holder.(*string) - if !ok { - return errors.New(utils.T("store.sql.convert_string_map")) - } - b := []byte(*s) - return json.Unmarshal(b, target) - } - return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true - case *model.StringArray: - binder := func(holder, target interface{}) error { - s, ok := holder.(*string) - if !ok { - return errors.New(utils.T("store.sql.convert_string_array")) - } - b := []byte(*s) - return json.Unmarshal(b, target) - } - return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true - case *model.StringInterface: - binder := func(holder, target interface{}) error { - s, ok := holder.(*string) - if !ok { - return errors.New(utils.T("store.sql.convert_string_interface")) - } - b := []byte(*s) - return json.Unmarshal(b, target) - } - return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true - case *map[string]interface{}: - binder := func(holder, target interface{}) error { - s, ok := holder.(*string) - if !ok { - return errors.New(utils.T("store.sql.convert_string_interface")) - } - b := []byte(*s) - return json.Unmarshal(b, target) - } - return gorp.CustomScanner{Holder: new(string), Target: target, Binder: binder}, true - } - - return gorp.CustomScanner{}, false -} - -type JSONSerializable interface { - ToJson() string -} - -func convertMySQLFullTextColumnsToPostgres(columnNames string) string { - columns := strings.Split(columnNames, ", ") - concatenatedColumnNames := "" - for i, c := range columns { - concatenatedColumnNames += c - if i < len(columns)-1 { - concatenatedColumnNames += " || ' ' || " - } - } - - return concatenatedColumnNames -} - -// IsDuplicate checks whether an error is a duplicate key error, which comes when processes are competing on creating the same -// tables in the database. -func IsDuplicate(err error) bool { - var pqErr *pq.Error - var mysqlErr *mysql.MySQLError - switch { - case errors.As(errors.Cause(err), &pqErr): - if pqErr.Code == PG_DUP_TABLE_ERROR_CODE { - return true - } - case errors.As(errors.Cause(err), &mysqlErr): - if mysqlErr.Number == MYSQL_DUP_TABLE_ERROR_CODE { - return true - } - } - - return false -} diff --git a/store/sqlstore/supplier_test.go b/store/sqlstore/supplier_test.go deleted file mode 100644 index 87fc4474bc..0000000000 --- a/store/sqlstore/supplier_test.go +++ /dev/null @@ -1,367 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See LICENSE.txt for license information. - -package sqlstore_test - -import ( - "fmt" - "regexp" - "sync" - "testing" - - "github.com/go-sql-driver/mysql" - "github.com/lib/pq" - "github.com/mattermost/gorp" - _ "github.com/mattn/go-sqlite3" - "github.com/pkg/errors" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/mattermost/mattermost-server/v5/model" - "github.com/mattermost/mattermost-server/v5/store/sqlstore" - "github.com/mattermost/mattermost-server/v5/store/storetest" -) - -// This test was used to consistently reproduce the race -// before the fix in MM-28397. -// Keeping it here to help avoiding future regressions. -func TestSupplierLicenseRace(t *testing.T) { - settings := makeSqlSettings(model.DATABASE_DRIVER_SQLITE) - settings.DataSourceReplicas = []string{":memory:"} - settings.DataSourceSearchReplicas = []string{":memory:"} - supplier := sqlstore.NewSqlSupplier(*settings, nil) - - wg := sync.WaitGroup{} - wg.Add(3) - - go func() { - supplier.UpdateLicense(&model.License{}) - wg.Done() - }() - - go func() { - supplier.GetReplica() - wg.Done() - }() - - go func() { - supplier.GetSearchReplica() - wg.Done() - }() - - wg.Wait() -} - -func TestGetReplica(t *testing.T) { - t.Parallel() - testCases := []struct { - Description string - DataSourceReplicas []string - DataSourceSearchReplicas []string - }{ - { - "no replicas", - []string{}, - []string{}, - }, - { - "one source replica", - []string{":memory:"}, - []string{}, - }, - { - "multiple source replicas", - []string{":memory:", ":memory:", ":memory:"}, - []string{}, - }, - { - "one source search replica", - []string{}, - []string{":memory:"}, - }, - { - "multiple source search replicas", - []string{}, - []string{":memory:", ":memory:", ":memory:"}, - }, - { - "one source replica, one source search replica", - []string{":memory:"}, - []string{":memory:"}, - }, - { - "one source replica, multiple source search replicas", - []string{":memory:"}, - []string{":memory:", ":memory:", ":memory:"}, - }, - { - "multiple source replica, one source search replica", - []string{":memory:", ":memory:", ":memory:"}, - []string{":memory:"}, - }, - { - "multiple source replica, multiple source search replicas", - []string{":memory:", ":memory:", ":memory:"}, - []string{":memory:", ":memory:", ":memory:"}, - }, - } - - for _, testCase := range testCases { - testCase := testCase - t.Run(testCase.Description+" with license", func(t *testing.T) { - t.Parallel() - - settings := makeSqlSettings(model.DATABASE_DRIVER_SQLITE) - settings.DataSourceReplicas = testCase.DataSourceReplicas - settings.DataSourceSearchReplicas = testCase.DataSourceSearchReplicas - supplier := sqlstore.NewSqlSupplier(*settings, nil) - supplier.UpdateLicense(&model.License{}) - - replicas := make(map[*gorp.DbMap]bool) - for i := 0; i < 5; i++ { - replicas[supplier.GetReplica()] = true - } - - searchReplicas := make(map[*gorp.DbMap]bool) - for i := 0; i < 5; i++ { - searchReplicas[supplier.GetSearchReplica()] = true - } - - if len(testCase.DataSourceReplicas) > 0 { - // If replicas were defined, ensure none are the master. - assert.Len(t, replicas, len(testCase.DataSourceReplicas)) - - for replica := range replicas { - assert.NotEqual(t, supplier.GetMaster(), replica) - } - - } else if assert.Len(t, replicas, 1) { - // Otherwise ensure the replicas contains only the master. - for replica := range replicas { - assert.Equal(t, supplier.GetMaster(), replica) - } - } - - if len(testCase.DataSourceSearchReplicas) > 0 { - // If search replicas were defined, ensure none are the master nor the replicas. - assert.Len(t, searchReplicas, len(testCase.DataSourceSearchReplicas)) - - for searchReplica := range searchReplicas { - assert.NotEqual(t, supplier.GetMaster(), searchReplica) - for replica := range replicas { - assert.NotEqual(t, searchReplica, replica) - } - } - - } else if len(testCase.DataSourceReplicas) > 0 { - // If no search replicas were defined, but replicas were, ensure they are equal. - assert.Equal(t, replicas, searchReplicas) - - } else if assert.Len(t, searchReplicas, 1) { - // Otherwise ensure the search replicas contains the master. - for searchReplica := range searchReplicas { - assert.Equal(t, supplier.GetMaster(), searchReplica) - } - } - }) - - t.Run(testCase.Description+" without license", func(t *testing.T) { - t.Parallel() - - settings := makeSqlSettings(model.DATABASE_DRIVER_SQLITE) - settings.DataSourceReplicas = testCase.DataSourceReplicas - settings.DataSourceSearchReplicas = testCase.DataSourceSearchReplicas - supplier := sqlstore.NewSqlSupplier(*settings, nil) - - replicas := make(map[*gorp.DbMap]bool) - for i := 0; i < 5; i++ { - replicas[supplier.GetReplica()] = true - } - - searchReplicas := make(map[*gorp.DbMap]bool) - for i := 0; i < 5; i++ { - searchReplicas[supplier.GetSearchReplica()] = true - } - - if len(testCase.DataSourceReplicas) > 0 { - // If replicas were defined, ensure none are the master. - assert.Len(t, replicas, 1) - - for replica := range replicas { - assert.Same(t, supplier.GetMaster(), replica) - } - - } else if assert.Len(t, replicas, 1) { - // Otherwise ensure the replicas contains only the master. - for replica := range replicas { - assert.Equal(t, supplier.GetMaster(), replica) - } - } - - if len(testCase.DataSourceSearchReplicas) > 0 { - // If search replicas were defined, ensure none are the master nor the replicas. - assert.Len(t, searchReplicas, 1) - - for searchReplica := range searchReplicas { - assert.Same(t, supplier.GetMaster(), searchReplica) - } - - } else if len(testCase.DataSourceReplicas) > 0 { - // If no search replicas were defined, but replicas were, ensure they are equal. - assert.Equal(t, replicas, searchReplicas) - - } else if assert.Len(t, searchReplicas, 1) { - // Otherwise ensure the search replicas contains the master. - for searchReplica := range searchReplicas { - assert.Equal(t, supplier.GetMaster(), searchReplica) - } - } - }) - } -} - -func TestGetDbVersion(t *testing.T) { - testDrivers := []string{ - model.DATABASE_DRIVER_POSTGRES, - model.DATABASE_DRIVER_MYSQL, - model.DATABASE_DRIVER_SQLITE, - } - - for _, driver := range testDrivers { - t.Run("Should return db version for "+driver, func(t *testing.T) { - t.Parallel() - settings := makeSqlSettings(driver) - supplier := sqlstore.NewSqlSupplier(*settings, nil) - - version, err := supplier.GetDbVersion() - require.Nil(t, err) - require.Regexp(t, regexp.MustCompile(`\d+\.\d+(\.\d+)?`), version) - }) - } -} - -func TestGetAllConns(t *testing.T) { - t.Parallel() - testCases := []struct { - Description string - DataSourceReplicas []string - DataSourceSearchReplicas []string - ExpectedNumConnections int - }{ - { - "no replicas", - []string{}, - []string{}, - 1, - }, - { - "one source replica", - []string{":memory:"}, - []string{}, - 2, - }, - { - "multiple source replicas", - []string{":memory:", ":memory:", ":memory:"}, - []string{}, - 4, - }, - { - "one source search replica", - []string{}, - []string{":memory:"}, - 1, - }, - { - "multiple source search replicas", - []string{}, - []string{":memory:", ":memory:", ":memory:"}, - 1, - }, - { - "one source replica, one source search replica", - []string{":memory:"}, - []string{":memory:"}, - 2, - }, - { - "one source replica, multiple source search replicas", - []string{":memory:"}, - []string{":memory:", ":memory:", ":memory:"}, - 2, - }, - { - "multiple source replica, one source search replica", - []string{":memory:", ":memory:", ":memory:"}, - []string{":memory:"}, - 4, - }, - { - "multiple source replica, multiple source search replicas", - []string{":memory:", ":memory:", ":memory:"}, - []string{":memory:", ":memory:", ":memory:"}, - 4, - }, - } - - for _, testCase := range testCases { - testCase := testCase - t.Run(testCase.Description, func(t *testing.T) { - t.Parallel() - settings := makeSqlSettings(model.DATABASE_DRIVER_SQLITE) - settings.DataSourceReplicas = testCase.DataSourceReplicas - settings.DataSourceSearchReplicas = testCase.DataSourceSearchReplicas - supplier := sqlstore.NewSqlSupplier(*settings, nil) - - assert.Len(t, supplier.GetAllConns(), testCase.ExpectedNumConnections) - }) - } -} - -func TestIsDuplicate(t *testing.T) { - testErrors := map[error]bool{ - &pq.Error{Code: "42P06"}: false, - &pq.Error{Code: sqlstore.PG_DUP_TABLE_ERROR_CODE}: true, - &mysql.MySQLError{Number: uint16(1000)}: false, - &mysql.MySQLError{Number: sqlstore.MYSQL_DUP_TABLE_ERROR_CODE}: true, - errors.New("Random error"): false, - } - - for err, expected := range testErrors { - t.Run(fmt.Sprintf("Should return %t for %s", expected, err.Error()), func(t *testing.T) { - t.Parallel() - assert.Equal(t, expected, sqlstore.IsDuplicate(err)) - }) - } -} - -func makeSqlSettings(driver string) *model.SqlSettings { - switch driver { - case model.DATABASE_DRIVER_POSTGRES: - return storetest.MakeSqlSettings(driver) - case model.DATABASE_DRIVER_MYSQL: - return storetest.MakeSqlSettings(driver) - case model.DATABASE_DRIVER_SQLITE: - return makeSqliteSettings() - } - - return nil -} - -func makeSqliteSettings() *model.SqlSettings { - driverName := model.DATABASE_DRIVER_SQLITE - dataSource := ":memory:" - maxIdleConns := 1 - connMaxLifetimeMilliseconds := 3600000 - maxOpenConns := 1 - queryTimeout := 5 - - return &model.SqlSettings{ - DriverName: &driverName, - DataSource: &dataSource, - MaxIdleConns: &maxIdleConns, - ConnMaxLifetimeMilliseconds: &connMaxLifetimeMilliseconds, - MaxOpenConns: &maxOpenConns, - QueryTimeout: &queryTimeout, - } -} diff --git a/store/sqlstore/system_store.go b/store/sqlstore/system_store.go index 6039278495..9fb8147377 100644 --- a/store/sqlstore/system_store.go +++ b/store/sqlstore/system_store.go @@ -18,13 +18,13 @@ import ( ) type SqlSystemStore struct { - *SqlSupplier + *SqlStore } -func newSqlSystemStore(sqlSupplier *SqlSupplier) store.SystemStore { - s := &SqlSystemStore{sqlSupplier} +func newSqlSystemStore(sqlStore *SqlStore) store.SystemStore { + s := &SqlSystemStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.System{}, "Systems").SetKeys(false, "Name") table.ColMap("Name").SetMaxSize(64) table.ColMap("Value").SetMaxSize(1024) diff --git a/store/sqlstore/team_store.go b/store/sqlstore/team_store.go index 0207be538d..86d8f91356 100644 --- a/store/sqlstore/team_store.go +++ b/store/sqlstore/team_store.go @@ -23,7 +23,7 @@ const ( ) type SqlTeamStore struct { - *SqlSupplier + *SqlStore teamsQuery sq.SelectBuilder } @@ -202,16 +202,16 @@ func (db teamMemberWithSchemeRolesList) ToModel() []*model.TeamMember { return tms } -func newSqlTeamStore(sqlSupplier *SqlSupplier) store.TeamStore { +func newSqlTeamStore(sqlStore *SqlStore) store.TeamStore { s := &SqlTeamStore{ - SqlSupplier: sqlSupplier, + SqlStore: sqlStore, } s.teamsQuery = s.getQueryBuilder(). Select("Teams.*"). From("Teams") - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.Team{}, "Teams").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("DisplayName").SetMaxSize(64) diff --git a/store/sqlstore/terms_of_service_store.go b/store/sqlstore/terms_of_service_store.go index 05818ed12c..3478897950 100644 --- a/store/sqlstore/terms_of_service_store.go +++ b/store/sqlstore/terms_of_service_store.go @@ -14,14 +14,14 @@ import ( ) type SqlTermsOfServiceStore struct { - *SqlSupplier + *SqlStore metrics einterfaces.MetricsInterface } -func newSqlTermsOfServiceStore(sqlSupplier *SqlSupplier, metrics einterfaces.MetricsInterface) store.TermsOfServiceStore { - s := SqlTermsOfServiceStore{sqlSupplier, metrics} +func newSqlTermsOfServiceStore(sqlStore *SqlStore, metrics einterfaces.MetricsInterface) store.TermsOfServiceStore { + s := SqlTermsOfServiceStore{sqlStore, metrics} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.TermsOfService{}, "TermsOfService").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("UserId").SetMaxSize(26) diff --git a/store/sqlstore/thread_store.go b/store/sqlstore/thread_store.go index a7b671a1c8..76b3d14587 100644 --- a/store/sqlstore/thread_store.go +++ b/store/sqlstore/thread_store.go @@ -16,18 +16,18 @@ import ( ) type SqlThreadStore struct { - *SqlSupplier + *SqlStore } func (s *SqlThreadStore) ClearCaches() { } -func newSqlThreadStore(sqlSupplier *SqlSupplier) store.ThreadStore { +func newSqlThreadStore(sqlStore *SqlStore) store.ThreadStore { s := &SqlThreadStore{ - SqlSupplier: sqlSupplier, + SqlStore: sqlStore, } - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { tableThreads := db.AddTableWithName(model.Thread{}, "Threads").SetKeys(false, "PostId") tableThreads.ColMap("PostId").SetMaxSize(26) tableThreads.ColMap("ChannelId").SetMaxSize(26) diff --git a/store/sqlstore/thread_store_test.go b/store/sqlstore/thread_store_test.go index 82b399b3cb..e65f53a6a1 100644 --- a/store/sqlstore/thread_store_test.go +++ b/store/sqlstore/thread_store_test.go @@ -10,5 +10,5 @@ import ( ) func TestThreadStore(t *testing.T) { - StoreTestWithSqlSupplier(t, storetest.TestThreadStore) + StoreTestWithSqlStore(t, storetest.TestThreadStore) } diff --git a/store/sqlstore/tokens_store.go b/store/sqlstore/tokens_store.go index 964b9ca5d1..b9d3d1f4d9 100644 --- a/store/sqlstore/tokens_store.go +++ b/store/sqlstore/tokens_store.go @@ -15,13 +15,13 @@ import ( ) type SqlTokenStore struct { - *SqlSupplier + *SqlStore } -func newSqlTokenStore(sqlSupplier *SqlSupplier) store.TokenStore { - s := &SqlTokenStore{sqlSupplier} +func newSqlTokenStore(sqlStore *SqlStore) store.TokenStore { + s := &SqlTokenStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.Token{}, "Tokens").SetKeys(false, "Token") table.ColMap("Token").SetMaxSize(64) table.ColMap("Type").SetMaxSize(64) diff --git a/store/sqlstore/upgrade.go b/store/sqlstore/upgrade.go index ed443e4aad..e52fe89bde 100644 --- a/store/sqlstore/upgrade.go +++ b/store/sqlstore/upgrade.go @@ -89,7 +89,7 @@ const ( // upgradeDatabase attempts to migrate the schema to the latest supported version. // The value of model.CurrentVersion is accepted as a parameter for unit testing, but it is not // used to stop migrations at that version. -func upgradeDatabase(sqlSupplier *SqlSupplier, currentModelVersionString string) error { +func upgradeDatabase(sqlStore *SqlStore, currentModelVersionString string) error { currentModelVersion, err := semver.Parse(currentModelVersionString) if err != nil { return errors.Wrapf(err, "failed to parse current model version %s", currentModelVersionString) @@ -105,7 +105,7 @@ func upgradeDatabase(sqlSupplier *SqlSupplier, currentModelVersionString string) } var currentSchemaVersion *semver.Version - currentSchemaVersionString := sqlSupplier.GetCurrentSchemaVersion() + currentSchemaVersionString := sqlStore.GetCurrentSchemaVersion() if currentSchemaVersionString != "" { currentSchemaVersion, err = semver.New(currentSchemaVersionString) if err != nil { @@ -115,7 +115,7 @@ func upgradeDatabase(sqlSupplier *SqlSupplier, currentModelVersionString string) // Assume a fresh database if no schema version has been recorded. if currentSchemaVersion == nil { - if err := sqlSupplier.System().SaveOrUpdate(&model.System{Name: "Version", Value: currentModelVersion.String()}); err != nil { + if err := sqlStore.System().SaveOrUpdate(&model.System{Name: "Version", Value: currentModelVersion.String()}); err != nil { return errors.Wrap(err, "failed to initialize schema version for fresh database") } @@ -138,68 +138,68 @@ func upgradeDatabase(sqlSupplier *SqlSupplier, currentModelVersionString string) // Otherwise, apply any necessary migrations. Note that these methods currently invoke // os.Exit instead of returning an error. - upgradeDatabaseToVersion31(sqlSupplier) - upgradeDatabaseToVersion32(sqlSupplier) - upgradeDatabaseToVersion33(sqlSupplier) - upgradeDatabaseToVersion34(sqlSupplier) - upgradeDatabaseToVersion35(sqlSupplier) - upgradeDatabaseToVersion36(sqlSupplier) - upgradeDatabaseToVersion37(sqlSupplier) - upgradeDatabaseToVersion38(sqlSupplier) - upgradeDatabaseToVersion39(sqlSupplier) - upgradeDatabaseToVersion310(sqlSupplier) - upgradeDatabaseToVersion40(sqlSupplier) - upgradeDatabaseToVersion41(sqlSupplier) - upgradeDatabaseToVersion42(sqlSupplier) - upgradeDatabaseToVersion43(sqlSupplier) - upgradeDatabaseToVersion44(sqlSupplier) - upgradeDatabaseToVersion45(sqlSupplier) - upgradeDatabaseToVersion46(sqlSupplier) - upgradeDatabaseToVersion47(sqlSupplier) - upgradeDatabaseToVersion471(sqlSupplier) - upgradeDatabaseToVersion472(sqlSupplier) - upgradeDatabaseToVersion48(sqlSupplier) - upgradeDatabaseToVersion481(sqlSupplier) - upgradeDatabaseToVersion49(sqlSupplier) - upgradeDatabaseToVersion410(sqlSupplier) - upgradeDatabaseToVersion50(sqlSupplier) - upgradeDatabaseToVersion51(sqlSupplier) - upgradeDatabaseToVersion52(sqlSupplier) - upgradeDatabaseToVersion53(sqlSupplier) - upgradeDatabaseToVersion54(sqlSupplier) - upgradeDatabaseToVersion55(sqlSupplier) - upgradeDatabaseToVersion56(sqlSupplier) - upgradeDatabaseToVersion57(sqlSupplier) - upgradeDatabaseToVersion58(sqlSupplier) - upgradeDatabaseToVersion59(sqlSupplier) - upgradeDatabaseToVersion510(sqlSupplier) - upgradeDatabaseToVersion511(sqlSupplier) - upgradeDatabaseToVersion512(sqlSupplier) - upgradeDatabaseToVersion513(sqlSupplier) - upgradeDatabaseToVersion514(sqlSupplier) - upgradeDatabaseToVersion515(sqlSupplier) - upgradeDatabaseToVersion516(sqlSupplier) - upgradeDatabaseToVersion517(sqlSupplier) - upgradeDatabaseToVersion518(sqlSupplier) - upgradeDatabaseToVersion519(sqlSupplier) - upgradeDatabaseToVersion520(sqlSupplier) - upgradeDatabaseToVersion521(sqlSupplier) - upgradeDatabaseToVersion522(sqlSupplier) - upgradeDatabaseToVersion523(sqlSupplier) - upgradeDatabaseToVersion524(sqlSupplier) - upgradeDatabaseToVersion525(sqlSupplier) - upgradeDatabaseToVersion526(sqlSupplier) - upgradeDatabaseToVersion527(sqlSupplier) - upgradeDatabaseToVersion528(sqlSupplier) - upgradeDatabaseToVersion5281(sqlSupplier) - upgradeDatabaseToVersion529(sqlSupplier) - upgradeDatabaseToVersion530(sqlSupplier) + upgradeDatabaseToVersion31(sqlStore) + upgradeDatabaseToVersion32(sqlStore) + upgradeDatabaseToVersion33(sqlStore) + upgradeDatabaseToVersion34(sqlStore) + upgradeDatabaseToVersion35(sqlStore) + upgradeDatabaseToVersion36(sqlStore) + upgradeDatabaseToVersion37(sqlStore) + upgradeDatabaseToVersion38(sqlStore) + upgradeDatabaseToVersion39(sqlStore) + upgradeDatabaseToVersion310(sqlStore) + upgradeDatabaseToVersion40(sqlStore) + upgradeDatabaseToVersion41(sqlStore) + upgradeDatabaseToVersion42(sqlStore) + upgradeDatabaseToVersion43(sqlStore) + upgradeDatabaseToVersion44(sqlStore) + upgradeDatabaseToVersion45(sqlStore) + upgradeDatabaseToVersion46(sqlStore) + upgradeDatabaseToVersion47(sqlStore) + upgradeDatabaseToVersion471(sqlStore) + upgradeDatabaseToVersion472(sqlStore) + upgradeDatabaseToVersion48(sqlStore) + upgradeDatabaseToVersion481(sqlStore) + upgradeDatabaseToVersion49(sqlStore) + upgradeDatabaseToVersion410(sqlStore) + upgradeDatabaseToVersion50(sqlStore) + upgradeDatabaseToVersion51(sqlStore) + upgradeDatabaseToVersion52(sqlStore) + upgradeDatabaseToVersion53(sqlStore) + upgradeDatabaseToVersion54(sqlStore) + upgradeDatabaseToVersion55(sqlStore) + upgradeDatabaseToVersion56(sqlStore) + upgradeDatabaseToVersion57(sqlStore) + upgradeDatabaseToVersion58(sqlStore) + upgradeDatabaseToVersion59(sqlStore) + upgradeDatabaseToVersion510(sqlStore) + upgradeDatabaseToVersion511(sqlStore) + upgradeDatabaseToVersion512(sqlStore) + upgradeDatabaseToVersion513(sqlStore) + upgradeDatabaseToVersion514(sqlStore) + upgradeDatabaseToVersion515(sqlStore) + upgradeDatabaseToVersion516(sqlStore) + upgradeDatabaseToVersion517(sqlStore) + upgradeDatabaseToVersion518(sqlStore) + upgradeDatabaseToVersion519(sqlStore) + upgradeDatabaseToVersion520(sqlStore) + upgradeDatabaseToVersion521(sqlStore) + upgradeDatabaseToVersion522(sqlStore) + upgradeDatabaseToVersion523(sqlStore) + upgradeDatabaseToVersion524(sqlStore) + upgradeDatabaseToVersion525(sqlStore) + upgradeDatabaseToVersion526(sqlStore) + upgradeDatabaseToVersion527(sqlStore) + upgradeDatabaseToVersion528(sqlStore) + upgradeDatabaseToVersion5281(sqlStore) + upgradeDatabaseToVersion529(sqlStore) + upgradeDatabaseToVersion530(sqlStore) return nil } -func saveSchemaVersion(sqlSupplier *SqlSupplier, version string) { - if err := sqlSupplier.System().SaveOrUpdate(&model.System{Name: "Version", Value: version}); err != nil { +func saveSchemaVersion(sqlStore *SqlStore, version string) { + if err := sqlStore.System().SaveOrUpdate(&model.System{Name: "Version", Value: version}); err != nil { mlog.Critical(err.Error()) time.Sleep(time.Second) os.Exit(EXIT_VERSION_SAVE) @@ -208,8 +208,8 @@ func saveSchemaVersion(sqlSupplier *SqlSupplier, version string) { mlog.Warn("The database schema version has been upgraded", mlog.String("version", version)) } -func shouldPerformUpgrade(sqlSupplier *SqlSupplier, currentSchemaVersion string, expectedSchemaVersion string) bool { - if sqlSupplier.GetCurrentSchemaVersion() == currentSchemaVersion { +func shouldPerformUpgrade(sqlStore *SqlStore, currentSchemaVersion string, expectedSchemaVersion string) bool { + if sqlStore.GetCurrentSchemaVersion() == currentSchemaVersion { mlog.Warn("Attempting to upgrade the database schema version", mlog.String("current_version", currentSchemaVersion), mlog.String("new_version", expectedSchemaVersion)) return true @@ -218,18 +218,18 @@ func shouldPerformUpgrade(sqlSupplier *SqlSupplier, currentSchemaVersion string, return false } -func upgradeDatabaseToVersion31(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_3_0_0, VERSION_3_1_0) { - sqlSupplier.CreateColumnIfNotExists("OutgoingWebhooks", "ContentType", "varchar(128)", "varchar(128)", "") - saveSchemaVersion(sqlSupplier, VERSION_3_1_0) +func upgradeDatabaseToVersion31(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_3_0_0, VERSION_3_1_0) { + sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "ContentType", "varchar(128)", "varchar(128)", "") + saveSchemaVersion(sqlStore, VERSION_3_1_0) } } -func upgradeDatabaseToVersion32(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_3_1_0, VERSION_3_2_0) { - sqlSupplier.CreateColumnIfNotExists("TeamMembers", "DeleteAt", "bigint(20)", "bigint", "0") +func upgradeDatabaseToVersion32(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_3_1_0, VERSION_3_2_0) { + sqlStore.CreateColumnIfNotExists("TeamMembers", "DeleteAt", "bigint(20)", "bigint", "0") - saveSchemaVersion(sqlSupplier, VERSION_3_2_0) + saveSchemaVersion(sqlStore, VERSION_3_2_0) } } @@ -239,27 +239,27 @@ func themeMigrationFailed(err error) { os.Exit(EXIT_THEME_MIGRATION) } -func upgradeDatabaseToVersion33(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_3_2_0, VERSION_3_3_0) { - if sqlSupplier.DoesColumnExist("Users", "ThemeProps") { +func upgradeDatabaseToVersion33(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_3_2_0, VERSION_3_3_0) { + if sqlStore.DoesColumnExist("Users", "ThemeProps") { params := map[string]interface{}{ "Category": model.PREFERENCE_CATEGORY_THEME, "Name": "", } - transaction, err := sqlSupplier.GetMaster().Begin() + transaction, err := sqlStore.GetMaster().Begin() if err != nil { themeMigrationFailed(err) } defer finalizeTransaction(transaction) // increase size of Value column of Preferences table to match the size of the ThemeProps column - if sqlSupplier.DriverName() == model.DATABASE_DRIVER_POSTGRES { + if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES { if _, err := transaction.Exec("ALTER TABLE Preferences ALTER COLUMN Value TYPE varchar(2000)"); err != nil { themeMigrationFailed(err) return } - } else if sqlSupplier.DriverName() == model.DATABASE_DRIVER_MYSQL { + } else if sqlStore.DriverName() == model.DATABASE_DRIVER_MYSQL { if _, err := transaction.Exec("ALTER TABLE Preferences MODIFY Value text"); err != nil { themeMigrationFailed(err) return @@ -293,242 +293,242 @@ func upgradeDatabaseToVersion33(sqlSupplier *SqlSupplier) { // rename solarized_* code themes to solarized-* to match client changes in 3.0 var data model.Preferences - if _, err := sqlSupplier.GetMaster().Select(&data, "SELECT * FROM Preferences WHERE Category = '"+model.PREFERENCE_CATEGORY_THEME+"' AND Value LIKE '%solarized_%'"); err == nil { + if _, err := sqlStore.GetMaster().Select(&data, "SELECT * FROM Preferences WHERE Category = '"+model.PREFERENCE_CATEGORY_THEME+"' AND Value LIKE '%solarized_%'"); err == nil { for i := range data { data[i].Value = strings.Replace(data[i].Value, "solarized_", "solarized-", -1) } - sqlSupplier.Preference().Save(&data) + sqlStore.Preference().Save(&data) } } - sqlSupplier.CreateColumnIfNotExists("OAuthApps", "IsTrusted", "tinyint(1)", "boolean", "0") - sqlSupplier.CreateColumnIfNotExists("OAuthApps", "IconURL", "varchar(512)", "varchar(512)", "") - sqlSupplier.CreateColumnIfNotExists("OAuthAccessData", "ClientId", "varchar(26)", "varchar(26)", "") - sqlSupplier.CreateColumnIfNotExists("OAuthAccessData", "UserId", "varchar(26)", "varchar(26)", "") - sqlSupplier.CreateColumnIfNotExists("OAuthAccessData", "ExpiresAt", "bigint", "bigint", "0") + sqlStore.CreateColumnIfNotExists("OAuthApps", "IsTrusted", "tinyint(1)", "boolean", "0") + sqlStore.CreateColumnIfNotExists("OAuthApps", "IconURL", "varchar(512)", "varchar(512)", "") + sqlStore.CreateColumnIfNotExists("OAuthAccessData", "ClientId", "varchar(26)", "varchar(26)", "") + sqlStore.CreateColumnIfNotExists("OAuthAccessData", "UserId", "varchar(26)", "varchar(26)", "") + sqlStore.CreateColumnIfNotExists("OAuthAccessData", "ExpiresAt", "bigint", "bigint", "0") - if sqlSupplier.DoesColumnExist("OAuthAccessData", "AuthCode") { - sqlSupplier.RemoveIndexIfExists("idx_oauthaccessdata_auth_code", "OAuthAccessData") - sqlSupplier.RemoveColumnIfExists("OAuthAccessData", "AuthCode") + if sqlStore.DoesColumnExist("OAuthAccessData", "AuthCode") { + sqlStore.RemoveIndexIfExists("idx_oauthaccessdata_auth_code", "OAuthAccessData") + sqlStore.RemoveColumnIfExists("OAuthAccessData", "AuthCode") } - sqlSupplier.RemoveColumnIfExists("Users", "LastActivityAt") - sqlSupplier.RemoveColumnIfExists("Users", "LastPingAt") + sqlStore.RemoveColumnIfExists("Users", "LastActivityAt") + sqlStore.RemoveColumnIfExists("Users", "LastPingAt") - sqlSupplier.CreateColumnIfNotExists("OutgoingWebhooks", "TriggerWhen", "tinyint", "integer", "0") + sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "TriggerWhen", "tinyint", "integer", "0") - saveSchemaVersion(sqlSupplier, VERSION_3_3_0) + saveSchemaVersion(sqlStore, VERSION_3_3_0) } } -func upgradeDatabaseToVersion34(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_3_3_0, VERSION_3_4_0) { - sqlSupplier.CreateColumnIfNotExists("Status", "Manual", "BOOLEAN", "BOOLEAN", "0") - sqlSupplier.CreateColumnIfNotExists("Status", "ActiveChannel", "varchar(26)", "varchar(26)", "") +func upgradeDatabaseToVersion34(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_3_3_0, VERSION_3_4_0) { + sqlStore.CreateColumnIfNotExists("Status", "Manual", "BOOLEAN", "BOOLEAN", "0") + sqlStore.CreateColumnIfNotExists("Status", "ActiveChannel", "varchar(26)", "varchar(26)", "") - saveSchemaVersion(sqlSupplier, VERSION_3_4_0) + saveSchemaVersion(sqlStore, VERSION_3_4_0) } } -func upgradeDatabaseToVersion35(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_3_4_0, VERSION_3_5_0) { - sqlSupplier.GetMaster().Exec("UPDATE Users SET Roles = 'system_user' WHERE Roles = ''") - sqlSupplier.GetMaster().Exec("UPDATE Users SET Roles = 'system_user system_admin' WHERE Roles = 'system_admin'") - sqlSupplier.GetMaster().Exec("UPDATE TeamMembers SET Roles = 'team_user' WHERE Roles = ''") - sqlSupplier.GetMaster().Exec("UPDATE TeamMembers SET Roles = 'team_user team_admin' WHERE Roles = 'admin'") - sqlSupplier.GetMaster().Exec("UPDATE ChannelMembers SET Roles = 'channel_user' WHERE Roles = ''") - sqlSupplier.GetMaster().Exec("UPDATE ChannelMembers SET Roles = 'channel_user channel_admin' WHERE Roles = 'admin'") +func upgradeDatabaseToVersion35(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_3_4_0, VERSION_3_5_0) { + sqlStore.GetMaster().Exec("UPDATE Users SET Roles = 'system_user' WHERE Roles = ''") + sqlStore.GetMaster().Exec("UPDATE Users SET Roles = 'system_user system_admin' WHERE Roles = 'system_admin'") + sqlStore.GetMaster().Exec("UPDATE TeamMembers SET Roles = 'team_user' WHERE Roles = ''") + sqlStore.GetMaster().Exec("UPDATE TeamMembers SET Roles = 'team_user team_admin' WHERE Roles = 'admin'") + sqlStore.GetMaster().Exec("UPDATE ChannelMembers SET Roles = 'channel_user' WHERE Roles = ''") + sqlStore.GetMaster().Exec("UPDATE ChannelMembers SET Roles = 'channel_user channel_admin' WHERE Roles = 'admin'") // The rest of the migration from Filenames -> FileIds is done lazily in api.GetFileInfosForPost - sqlSupplier.CreateColumnIfNotExists("Posts", "FileIds", "varchar(150)", "varchar(150)", "[]") + sqlStore.CreateColumnIfNotExists("Posts", "FileIds", "varchar(150)", "varchar(150)", "[]") // Increase maximum length of the Channel table Purpose column. - if sqlSupplier.GetMaxLengthOfColumnIfExists("Channels", "Purpose") != "250" { - sqlSupplier.AlterColumnTypeIfExists("Channels", "Purpose", "varchar(250)", "varchar(250)") + if sqlStore.GetMaxLengthOfColumnIfExists("Channels", "Purpose") != "250" { + sqlStore.AlterColumnTypeIfExists("Channels", "Purpose", "varchar(250)", "varchar(250)") } - sqlSupplier.Session().RemoveAllSessions() + sqlStore.Session().RemoveAllSessions() - saveSchemaVersion(sqlSupplier, VERSION_3_5_0) + saveSchemaVersion(sqlStore, VERSION_3_5_0) } } -func upgradeDatabaseToVersion36(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_3_5_0, VERSION_3_6_0) { - sqlSupplier.CreateColumnIfNotExists("Posts", "HasReactions", "tinyint", "boolean", "0") +func upgradeDatabaseToVersion36(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_3_5_0, VERSION_3_6_0) { + sqlStore.CreateColumnIfNotExists("Posts", "HasReactions", "tinyint", "boolean", "0") // Create Team Description column - sqlSupplier.CreateColumnIfNotExists("Teams", "Description", "varchar(255)", "varchar(255)", "") + sqlStore.CreateColumnIfNotExists("Teams", "Description", "varchar(255)", "varchar(255)", "") // Add a Position column to users. - sqlSupplier.CreateColumnIfNotExists("Users", "Position", "varchar(64)", "varchar(64)", "") + sqlStore.CreateColumnIfNotExists("Users", "Position", "varchar(64)", "varchar(64)", "") // Remove ActiveChannel column from Status - sqlSupplier.RemoveColumnIfExists("Status", "ActiveChannel") + sqlStore.RemoveColumnIfExists("Status", "ActiveChannel") - saveSchemaVersion(sqlSupplier, VERSION_3_6_0) + saveSchemaVersion(sqlStore, VERSION_3_6_0) } } -func upgradeDatabaseToVersion37(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_3_6_0, VERSION_3_7_0) { +func upgradeDatabaseToVersion37(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_3_6_0, VERSION_3_7_0) { // Add EditAt column to Posts - sqlSupplier.CreateColumnIfNotExists("Posts", "EditAt", " bigint", " bigint", "0") + sqlStore.CreateColumnIfNotExists("Posts", "EditAt", " bigint", " bigint", "0") - saveSchemaVersion(sqlSupplier, VERSION_3_7_0) + saveSchemaVersion(sqlStore, VERSION_3_7_0) } } -func upgradeDatabaseToVersion38(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_3_7_0, VERSION_3_8_0) { +func upgradeDatabaseToVersion38(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_3_7_0, VERSION_3_8_0) { // Add the IsPinned column to posts. - sqlSupplier.CreateColumnIfNotExists("Posts", "IsPinned", "boolean", "boolean", "0") + sqlStore.CreateColumnIfNotExists("Posts", "IsPinned", "boolean", "boolean", "0") - saveSchemaVersion(sqlSupplier, VERSION_3_8_0) + saveSchemaVersion(sqlStore, VERSION_3_8_0) } } -func upgradeDatabaseToVersion39(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_3_8_0, VERSION_3_9_0) { - sqlSupplier.CreateColumnIfNotExists("OAuthAccessData", "Scope", "varchar(128)", "varchar(128)", model.DEFAULT_SCOPE) - sqlSupplier.RemoveTableIfExists("PasswordRecovery") +func upgradeDatabaseToVersion39(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_3_8_0, VERSION_3_9_0) { + sqlStore.CreateColumnIfNotExists("OAuthAccessData", "Scope", "varchar(128)", "varchar(128)", model.DEFAULT_SCOPE) + sqlStore.RemoveTableIfExists("PasswordRecovery") - saveSchemaVersion(sqlSupplier, VERSION_3_9_0) + saveSchemaVersion(sqlStore, VERSION_3_9_0) } } -func upgradeDatabaseToVersion310(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_3_9_0, VERSION_3_10_0) { - saveSchemaVersion(sqlSupplier, VERSION_3_10_0) +func upgradeDatabaseToVersion310(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_3_9_0, VERSION_3_10_0) { + saveSchemaVersion(sqlStore, VERSION_3_10_0) } } -func upgradeDatabaseToVersion40(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_3_10_0, VERSION_4_0_0) { - saveSchemaVersion(sqlSupplier, VERSION_4_0_0) +func upgradeDatabaseToVersion40(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_3_10_0, VERSION_4_0_0) { + saveSchemaVersion(sqlStore, VERSION_4_0_0) } } -func upgradeDatabaseToVersion41(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_4_0_0, VERSION_4_1_0) { +func upgradeDatabaseToVersion41(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_4_0_0, VERSION_4_1_0) { // Increase maximum length of the Users table Roles column. - if sqlSupplier.GetMaxLengthOfColumnIfExists("Users", "Roles") != "256" { - sqlSupplier.AlterColumnTypeIfExists("Users", "Roles", "varchar(256)", "varchar(256)") + if sqlStore.GetMaxLengthOfColumnIfExists("Users", "Roles") != "256" { + sqlStore.AlterColumnTypeIfExists("Users", "Roles", "varchar(256)", "varchar(256)") } - sqlSupplier.RemoveTableIfExists("JobStatuses") + sqlStore.RemoveTableIfExists("JobStatuses") - saveSchemaVersion(sqlSupplier, VERSION_4_1_0) + saveSchemaVersion(sqlStore, VERSION_4_1_0) } } -func upgradeDatabaseToVersion42(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_4_1_0, VERSION_4_2_0) { - saveSchemaVersion(sqlSupplier, VERSION_4_2_0) +func upgradeDatabaseToVersion42(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_4_1_0, VERSION_4_2_0) { + saveSchemaVersion(sqlStore, VERSION_4_2_0) } } -func upgradeDatabaseToVersion43(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_4_2_0, VERSION_4_3_0) { - saveSchemaVersion(sqlSupplier, VERSION_4_3_0) +func upgradeDatabaseToVersion43(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_4_2_0, VERSION_4_3_0) { + saveSchemaVersion(sqlStore, VERSION_4_3_0) } } -func upgradeDatabaseToVersion44(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_4_3_0, VERSION_4_4_0) { +func upgradeDatabaseToVersion44(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_4_3_0, VERSION_4_4_0) { // Add the IsActive column to UserAccessToken. - sqlSupplier.CreateColumnIfNotExists("UserAccessTokens", "IsActive", "boolean", "boolean", "1") + sqlStore.CreateColumnIfNotExists("UserAccessTokens", "IsActive", "boolean", "boolean", "1") - saveSchemaVersion(sqlSupplier, VERSION_4_4_0) + saveSchemaVersion(sqlStore, VERSION_4_4_0) } } -func upgradeDatabaseToVersion45(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_4_4_0, VERSION_4_5_0) { - saveSchemaVersion(sqlSupplier, VERSION_4_5_0) +func upgradeDatabaseToVersion45(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_4_4_0, VERSION_4_5_0) { + saveSchemaVersion(sqlStore, VERSION_4_5_0) } } -func upgradeDatabaseToVersion46(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_4_5_0, VERSION_4_6_0) { - sqlSupplier.CreateColumnIfNotExists("IncomingWebhooks", "Username", "varchar(64)", "varchar(64)", "") - sqlSupplier.CreateColumnIfNotExists("IncomingWebhooks", "IconURL", "varchar(1024)", "varchar(1024)", "") - saveSchemaVersion(sqlSupplier, VERSION_4_6_0) +func upgradeDatabaseToVersion46(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_4_5_0, VERSION_4_6_0) { + sqlStore.CreateColumnIfNotExists("IncomingWebhooks", "Username", "varchar(64)", "varchar(64)", "") + sqlStore.CreateColumnIfNotExists("IncomingWebhooks", "IconURL", "varchar(1024)", "varchar(1024)", "") + saveSchemaVersion(sqlStore, VERSION_4_6_0) } } -func upgradeDatabaseToVersion47(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_4_6_0, VERSION_4_7_0) { - sqlSupplier.AlterColumnTypeIfExists("Users", "Position", "varchar(128)", "varchar(128)") - sqlSupplier.AlterColumnTypeIfExists("OAuthAuthData", "State", "varchar(1024)", "varchar(1024)") - sqlSupplier.RemoveColumnIfExists("ChannelMemberHistory", "Email") - sqlSupplier.RemoveColumnIfExists("ChannelMemberHistory", "Username") - saveSchemaVersion(sqlSupplier, VERSION_4_7_0) +func upgradeDatabaseToVersion47(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_4_6_0, VERSION_4_7_0) { + sqlStore.AlterColumnTypeIfExists("Users", "Position", "varchar(128)", "varchar(128)") + sqlStore.AlterColumnTypeIfExists("OAuthAuthData", "State", "varchar(1024)", "varchar(1024)") + sqlStore.RemoveColumnIfExists("ChannelMemberHistory", "Email") + sqlStore.RemoveColumnIfExists("ChannelMemberHistory", "Username") + saveSchemaVersion(sqlStore, VERSION_4_7_0) } } -func upgradeDatabaseToVersion471(sqlSupplier *SqlSupplier) { +func upgradeDatabaseToVersion471(sqlStore *SqlStore) { // If any new instances started with 4.7, they would have the bad Email column on the // ChannelMemberHistory table. So for those cases we need to do an upgrade between // 4.7.0 and 4.7.1 - if shouldPerformUpgrade(sqlSupplier, VERSION_4_7_0, VERSION_4_7_1) { - sqlSupplier.RemoveColumnIfExists("ChannelMemberHistory", "Email") - saveSchemaVersion(sqlSupplier, VERSION_4_7_1) + if shouldPerformUpgrade(sqlStore, VERSION_4_7_0, VERSION_4_7_1) { + sqlStore.RemoveColumnIfExists("ChannelMemberHistory", "Email") + saveSchemaVersion(sqlStore, VERSION_4_7_1) } } -func upgradeDatabaseToVersion472(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_4_7_1, VERSION_4_7_2) { - sqlSupplier.RemoveIndexIfExists("idx_channels_displayname", "Channels") - saveSchemaVersion(sqlSupplier, VERSION_4_7_2) +func upgradeDatabaseToVersion472(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_4_7_1, VERSION_4_7_2) { + sqlStore.RemoveIndexIfExists("idx_channels_displayname", "Channels") + saveSchemaVersion(sqlStore, VERSION_4_7_2) } } -func upgradeDatabaseToVersion48(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_4_7_2, VERSION_4_8_0) { - saveSchemaVersion(sqlSupplier, VERSION_4_8_0) +func upgradeDatabaseToVersion48(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_4_7_2, VERSION_4_8_0) { + saveSchemaVersion(sqlStore, VERSION_4_8_0) } } -func upgradeDatabaseToVersion481(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_4_8_0, VERSION_4_8_1) { - sqlSupplier.RemoveIndexIfExists("idx_channels_displayname", "Channels") - saveSchemaVersion(sqlSupplier, VERSION_4_8_1) +func upgradeDatabaseToVersion481(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_4_8_0, VERSION_4_8_1) { + sqlStore.RemoveIndexIfExists("idx_channels_displayname", "Channels") + saveSchemaVersion(sqlStore, VERSION_4_8_1) } } -func upgradeDatabaseToVersion49(sqlSupplier *SqlSupplier) { +func upgradeDatabaseToVersion49(sqlStore *SqlStore) { // This version of Mattermost includes an App-Layer migration which migrates from hard-coded roles configured by // a number of parameters in `config.json` to a `Roles` table in the database. The migration code can be seen // in the file `app/app.go` in the function `DoAdvancedPermissionsMigration()`. - if shouldPerformUpgrade(sqlSupplier, VERSION_4_8_1, VERSION_4_9_0) { - sqlSupplier.CreateColumnIfNotExists("Teams", "LastTeamIconUpdate", "bigint", "bigint", "0") + if shouldPerformUpgrade(sqlStore, VERSION_4_8_1, VERSION_4_9_0) { + sqlStore.CreateColumnIfNotExists("Teams", "LastTeamIconUpdate", "bigint", "bigint", "0") defaultTimezone := timezones.DefaultUserTimezone() defaultTimezoneValue, err := json.Marshal(defaultTimezone) if err != nil { mlog.Critical(err.Error()) } - sqlSupplier.CreateColumnIfNotExists("Users", "Timezone", "varchar(256)", "varchar(256)", string(defaultTimezoneValue)) - sqlSupplier.RemoveIndexIfExists("idx_channels_displayname", "Channels") - saveSchemaVersion(sqlSupplier, VERSION_4_9_0) + sqlStore.CreateColumnIfNotExists("Users", "Timezone", "varchar(256)", "varchar(256)", string(defaultTimezoneValue)) + sqlStore.RemoveIndexIfExists("idx_channels_displayname", "Channels") + saveSchemaVersion(sqlStore, VERSION_4_9_0) } } -func upgradeDatabaseToVersion410(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_4_9_0, VERSION_4_10_0) { +func upgradeDatabaseToVersion410(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_4_9_0, VERSION_4_10_0) { - sqlSupplier.RemoveIndexIfExists("Name_2", "Channels") - sqlSupplier.RemoveIndexIfExists("Name_2", "Emoji") - sqlSupplier.RemoveIndexIfExists("ClientId_2", "OAuthAccessData") + sqlStore.RemoveIndexIfExists("Name_2", "Channels") + sqlStore.RemoveIndexIfExists("Name_2", "Emoji") + sqlStore.RemoveIndexIfExists("ClientId_2", "OAuthAccessData") - saveSchemaVersion(sqlSupplier, VERSION_4_10_0) - sqlSupplier.GetMaster().Exec("UPDATE Users SET AuthData=LOWER(AuthData) WHERE AuthService = 'saml'") + saveSchemaVersion(sqlStore, VERSION_4_10_0) + sqlStore.GetMaster().Exec("UPDATE Users SET AuthData=LOWER(AuthData) WHERE AuthService = 'saml'") } } -func upgradeDatabaseToVersion50(sqlSupplier *SqlSupplier) { +func upgradeDatabaseToVersion50(sqlStore *SqlStore) { // This version of Mattermost includes an App-Layer migration which migrates from hard-coded emojis configured // in `config.json` to a `Permission` in the database. The migration code can be seen // in the file `app/app.go` in the function `DoEmojisPermissionsMigration()`. @@ -546,329 +546,329 @@ func upgradeDatabaseToVersion50(sqlSupplier *SqlSupplier) { // UPDATE ChannelMembers SET Roles = CONCAT(Roles, ' channel_admin'), SchemeAdmin = NULL where SchemeAdmin = 1; // DELETE from Systems WHERE Name = 'migration_advanced_permissions_phase_2'; - if shouldPerformUpgrade(sqlSupplier, VERSION_4_10_0, VERSION_5_0_0) { + if shouldPerformUpgrade(sqlStore, VERSION_4_10_0, VERSION_5_0_0) { - sqlSupplier.CreateColumnIfNotExistsNoDefault("Teams", "SchemeId", "varchar(26)", "varchar(26)") - sqlSupplier.CreateColumnIfNotExistsNoDefault("Channels", "SchemeId", "varchar(26)", "varchar(26)") + sqlStore.CreateColumnIfNotExistsNoDefault("Teams", "SchemeId", "varchar(26)", "varchar(26)") + sqlStore.CreateColumnIfNotExistsNoDefault("Channels", "SchemeId", "varchar(26)", "varchar(26)") - sqlSupplier.CreateColumnIfNotExistsNoDefault("TeamMembers", "SchemeUser", "boolean", "boolean") - sqlSupplier.CreateColumnIfNotExistsNoDefault("TeamMembers", "SchemeAdmin", "boolean", "boolean") - sqlSupplier.CreateColumnIfNotExistsNoDefault("ChannelMembers", "SchemeUser", "boolean", "boolean") - sqlSupplier.CreateColumnIfNotExistsNoDefault("ChannelMembers", "SchemeAdmin", "boolean", "boolean") + sqlStore.CreateColumnIfNotExistsNoDefault("TeamMembers", "SchemeUser", "boolean", "boolean") + sqlStore.CreateColumnIfNotExistsNoDefault("TeamMembers", "SchemeAdmin", "boolean", "boolean") + sqlStore.CreateColumnIfNotExistsNoDefault("ChannelMembers", "SchemeUser", "boolean", "boolean") + sqlStore.CreateColumnIfNotExistsNoDefault("ChannelMembers", "SchemeAdmin", "boolean", "boolean") - sqlSupplier.CreateColumnIfNotExists("Roles", "BuiltIn", "boolean", "boolean", "0") - sqlSupplier.GetMaster().Exec("UPDATE Roles SET BuiltIn=true") - sqlSupplier.GetMaster().Exec("UPDATE Roles SET SchemeManaged=false WHERE Name NOT IN ('system_user', 'system_admin', 'team_user', 'team_admin', 'channel_user', 'channel_admin')") - sqlSupplier.CreateColumnIfNotExists("IncomingWebhooks", "ChannelLocked", "boolean", "boolean", "0") + sqlStore.CreateColumnIfNotExists("Roles", "BuiltIn", "boolean", "boolean", "0") + sqlStore.GetMaster().Exec("UPDATE Roles SET BuiltIn=true") + sqlStore.GetMaster().Exec("UPDATE Roles SET SchemeManaged=false WHERE Name NOT IN ('system_user', 'system_admin', 'team_user', 'team_admin', 'channel_user', 'channel_admin')") + sqlStore.CreateColumnIfNotExists("IncomingWebhooks", "ChannelLocked", "boolean", "boolean", "0") - sqlSupplier.RemoveIndexIfExists("idx_channels_txt", "Channels") + sqlStore.RemoveIndexIfExists("idx_channels_txt", "Channels") - saveSchemaVersion(sqlSupplier, VERSION_5_0_0) + saveSchemaVersion(sqlStore, VERSION_5_0_0) } } -func upgradeDatabaseToVersion51(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_0_0, VERSION_5_1_0) { - saveSchemaVersion(sqlSupplier, VERSION_5_1_0) +func upgradeDatabaseToVersion51(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_0_0, VERSION_5_1_0) { + saveSchemaVersion(sqlStore, VERSION_5_1_0) } } -func upgradeDatabaseToVersion52(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_1_0, VERSION_5_2_0) { - sqlSupplier.CreateColumnIfNotExists("OutgoingWebhooks", "Username", "varchar(64)", "varchar(64)", "") - sqlSupplier.CreateColumnIfNotExists("OutgoingWebhooks", "IconURL", "varchar(1024)", "varchar(1024)", "") - saveSchemaVersion(sqlSupplier, VERSION_5_2_0) +func upgradeDatabaseToVersion52(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_1_0, VERSION_5_2_0) { + sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "Username", "varchar(64)", "varchar(64)", "") + sqlStore.CreateColumnIfNotExists("OutgoingWebhooks", "IconURL", "varchar(1024)", "varchar(1024)", "") + saveSchemaVersion(sqlStore, VERSION_5_2_0) } } -func upgradeDatabaseToVersion53(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_2_0, VERSION_5_3_0) { - saveSchemaVersion(sqlSupplier, VERSION_5_3_0) +func upgradeDatabaseToVersion53(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_2_0, VERSION_5_3_0) { + saveSchemaVersion(sqlStore, VERSION_5_3_0) } } -func upgradeDatabaseToVersion54(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_3_0, VERSION_5_4_0) { - sqlSupplier.AlterColumnTypeIfExists("OutgoingWebhooks", "Description", "varchar(500)", "varchar(500)") - sqlSupplier.AlterColumnTypeIfExists("IncomingWebhooks", "Description", "varchar(500)", "varchar(500)") - if err := sqlSupplier.Channel().MigratePublicChannels(); err != nil { +func upgradeDatabaseToVersion54(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_3_0, VERSION_5_4_0) { + sqlStore.AlterColumnTypeIfExists("OutgoingWebhooks", "Description", "varchar(500)", "varchar(500)") + sqlStore.AlterColumnTypeIfExists("IncomingWebhooks", "Description", "varchar(500)", "varchar(500)") + if err := sqlStore.Channel().MigratePublicChannels(); err != nil { mlog.Critical("Failed to migrate PublicChannels table", mlog.Err(err)) time.Sleep(time.Second) os.Exit(EXIT_GENERIC_FAILURE) } - saveSchemaVersion(sqlSupplier, VERSION_5_4_0) + saveSchemaVersion(sqlStore, VERSION_5_4_0) } } -func upgradeDatabaseToVersion55(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_4_0, VERSION_5_5_0) { - saveSchemaVersion(sqlSupplier, VERSION_5_5_0) +func upgradeDatabaseToVersion55(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_4_0, VERSION_5_5_0) { + saveSchemaVersion(sqlStore, VERSION_5_5_0) } } -func upgradeDatabaseToVersion56(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_5_0, VERSION_5_6_0) { - sqlSupplier.CreateColumnIfNotExists("PluginKeyValueStore", "ExpireAt", "bigint(20)", "bigint", "0") +func upgradeDatabaseToVersion56(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_5_0, VERSION_5_6_0) { + sqlStore.CreateColumnIfNotExists("PluginKeyValueStore", "ExpireAt", "bigint(20)", "bigint", "0") // migrating user's accepted terms of service data into the new table - sqlSupplier.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()}) + 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()}) - if sqlSupplier.DriverName() == model.DATABASE_DRIVER_POSTGRES { - sqlSupplier.RemoveIndexIfExists("idx_users_email_lower", "lower(Email)") - sqlSupplier.RemoveIndexIfExists("idx_users_username_lower", "lower(Username)") - sqlSupplier.RemoveIndexIfExists("idx_users_nickname_lower", "lower(Nickname)") - sqlSupplier.RemoveIndexIfExists("idx_users_firstname_lower", "lower(FirstName)") - sqlSupplier.RemoveIndexIfExists("idx_users_lastname_lower", "lower(LastName)") + if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES { + sqlStore.RemoveIndexIfExists("idx_users_email_lower", "lower(Email)") + sqlStore.RemoveIndexIfExists("idx_users_username_lower", "lower(Username)") + sqlStore.RemoveIndexIfExists("idx_users_nickname_lower", "lower(Nickname)") + sqlStore.RemoveIndexIfExists("idx_users_firstname_lower", "lower(FirstName)") + sqlStore.RemoveIndexIfExists("idx_users_lastname_lower", "lower(LastName)") } - saveSchemaVersion(sqlSupplier, VERSION_5_6_0) + saveSchemaVersion(sqlStore, VERSION_5_6_0) } } -func upgradeDatabaseToVersion57(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_6_0, VERSION_5_7_0) { - saveSchemaVersion(sqlSupplier, VERSION_5_7_0) +func upgradeDatabaseToVersion57(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_6_0, VERSION_5_7_0) { + saveSchemaVersion(sqlStore, VERSION_5_7_0) } } -func upgradeDatabaseToVersion58(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_7_0, VERSION_5_8_0) { +func upgradeDatabaseToVersion58(sqlStore *SqlStore) { + 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. - sqlSupplier.RemoveIndexIfExists("idx_channels_txt", "Channels") + sqlStore.RemoveIndexIfExists("idx_channels_txt", "Channels") // Fix column types and defaults where gorp converged on a different schema value than the // original migration. - sqlSupplier.AlterColumnTypeIfExists("OutgoingWebhooks", "Description", "text", "VARCHAR(500)") - sqlSupplier.AlterColumnTypeIfExists("IncomingWebhooks", "Description", "text", "VARCHAR(500)") - sqlSupplier.AlterColumnTypeIfExists("OutgoingWebhooks", "IconURL", "text", "VARCHAR(1024)") - sqlSupplier.AlterColumnDefaultIfExists("OutgoingWebhooks", "Username", model.NewString("NULL"), model.NewString("")) - sqlSupplier.AlterColumnDefaultIfExists("OutgoingWebhooks", "IconURL", nil, model.NewString("")) - sqlSupplier.AlterColumnDefaultIfExists("PluginKeyValueStore", "ExpireAt", model.NewString("NULL"), model.NewString("NULL")) + 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(sqlSupplier, VERSION_5_8_0) + saveSchemaVersion(sqlStore, VERSION_5_8_0) } } -func upgradeDatabaseToVersion59(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_8_0, VERSION_5_9_0) { - saveSchemaVersion(sqlSupplier, VERSION_5_9_0) +func upgradeDatabaseToVersion59(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_8_0, VERSION_5_9_0) { + saveSchemaVersion(sqlStore, VERSION_5_9_0) } } -func upgradeDatabaseToVersion510(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_9_0, VERSION_5_10_0) { - sqlSupplier.CreateColumnIfNotExistsNoDefault("Channels", "GroupConstrained", "tinyint(4)", "boolean") - sqlSupplier.CreateColumnIfNotExistsNoDefault("Teams", "GroupConstrained", "tinyint(4)", "boolean") +func upgradeDatabaseToVersion510(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_9_0, VERSION_5_10_0) { + sqlStore.CreateColumnIfNotExistsNoDefault("Channels", "GroupConstrained", "tinyint(4)", "boolean") + sqlStore.CreateColumnIfNotExistsNoDefault("Teams", "GroupConstrained", "tinyint(4)", "boolean") - sqlSupplier.CreateIndexIfNotExists("idx_groupteams_teamid", "GroupTeams", "TeamId") - sqlSupplier.CreateIndexIfNotExists("idx_groupchannels_channelid", "GroupChannels", "ChannelId") + sqlStore.CreateIndexIfNotExists("idx_groupteams_teamid", "GroupTeams", "TeamId") + sqlStore.CreateIndexIfNotExists("idx_groupchannels_channelid", "GroupChannels", "ChannelId") - saveSchemaVersion(sqlSupplier, VERSION_5_10_0) + saveSchemaVersion(sqlStore, VERSION_5_10_0) } } -func upgradeDatabaseToVersion511(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_10_0, VERSION_5_11_0) { +func upgradeDatabaseToVersion511(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_10_0, VERSION_5_11_0) { // Enforce all teams have an InviteID set var teams []*model.Team - if _, err := sqlSupplier.GetReplica().Select(&teams, "SELECT * FROM Teams WHERE InviteId = ''"); err != nil { + if _, err := sqlStore.GetReplica().Select(&teams, "SELECT * FROM Teams WHERE InviteId = ''"); err != nil { mlog.Error("Error fetching Teams without InviteID", mlog.Err(err)) } else { for _, team := range teams { team.InviteId = model.NewId() - if _, err := sqlSupplier.Team().Update(team); err != nil { + if _, err := sqlStore.Team().Update(team); err != nil { mlog.Error("Error updating Team InviteIDs", mlog.String("team_id", team.Id), mlog.Err(err)) } } } - saveSchemaVersion(sqlSupplier, VERSION_5_11_0) + saveSchemaVersion(sqlStore, VERSION_5_11_0) } } -func upgradeDatabaseToVersion512(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_11_0, VERSION_5_12_0) { - sqlSupplier.CreateColumnIfNotExistsNoDefault("TeamMembers", "SchemeGuest", "boolean", "boolean") - sqlSupplier.CreateColumnIfNotExistsNoDefault("ChannelMembers", "SchemeGuest", "boolean", "boolean") - sqlSupplier.CreateColumnIfNotExistsNoDefault("Schemes", "DefaultTeamGuestRole", "text", "VARCHAR(64)") - sqlSupplier.CreateColumnIfNotExistsNoDefault("Schemes", "DefaultChannelGuestRole", "text", "VARCHAR(64)") +func upgradeDatabaseToVersion512(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_11_0, VERSION_5_12_0) { + sqlStore.CreateColumnIfNotExistsNoDefault("TeamMembers", "SchemeGuest", "boolean", "boolean") + sqlStore.CreateColumnIfNotExistsNoDefault("ChannelMembers", "SchemeGuest", "boolean", "boolean") + sqlStore.CreateColumnIfNotExistsNoDefault("Schemes", "DefaultTeamGuestRole", "text", "VARCHAR(64)") + sqlStore.CreateColumnIfNotExistsNoDefault("Schemes", "DefaultChannelGuestRole", "text", "VARCHAR(64)") - sqlSupplier.GetMaster().Exec("UPDATE Schemes SET DefaultTeamGuestRole = '', DefaultChannelGuestRole = ''") + sqlStore.GetMaster().Exec("UPDATE Schemes SET DefaultTeamGuestRole = '', DefaultChannelGuestRole = ''") // Saturday, January 24, 2065 5:20:00 AM GMT. To remove all personal access token sessions. - sqlSupplier.GetMaster().Exec("DELETE FROM Sessions WHERE ExpiresAt > 3000000000000") + sqlStore.GetMaster().Exec("DELETE FROM Sessions WHERE ExpiresAt > 3000000000000") - saveSchemaVersion(sqlSupplier, VERSION_5_12_0) + saveSchemaVersion(sqlStore, VERSION_5_12_0) } } -func upgradeDatabaseToVersion513(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_12_0, VERSION_5_13_0) { +func upgradeDatabaseToVersion513(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_12_0, VERSION_5_13_0) { // The previous jobs ran once per minute, cluttering the Jobs table with somewhat useless entries. Clean that up. - sqlSupplier.GetMaster().Exec("DELETE FROM Jobs WHERE Type = 'plugins'") + sqlStore.GetMaster().Exec("DELETE FROM Jobs WHERE Type = 'plugins'") - saveSchemaVersion(sqlSupplier, VERSION_5_13_0) + saveSchemaVersion(sqlStore, VERSION_5_13_0) } } -func upgradeDatabaseToVersion514(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_13_0, VERSION_5_14_0) { - saveSchemaVersion(sqlSupplier, VERSION_5_14_0) +func upgradeDatabaseToVersion514(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_13_0, VERSION_5_14_0) { + saveSchemaVersion(sqlStore, VERSION_5_14_0) } } -func upgradeDatabaseToVersion515(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_14_0, VERSION_5_15_0) { - saveSchemaVersion(sqlSupplier, VERSION_5_15_0) +func upgradeDatabaseToVersion515(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_14_0, VERSION_5_15_0) { + saveSchemaVersion(sqlStore, VERSION_5_15_0) } } -func upgradeDatabaseToVersion516(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_15_0, VERSION_5_16_0) { - if sqlSupplier.DriverName() == model.DATABASE_DRIVER_POSTGRES { - sqlSupplier.GetMaster().Exec("ALTER TABLE Tokens ALTER COLUMN Extra TYPE varchar(2048)") - } else if sqlSupplier.DriverName() == model.DATABASE_DRIVER_MYSQL { - sqlSupplier.GetMaster().Exec("ALTER TABLE Tokens MODIFY Extra text") +func upgradeDatabaseToVersion516(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_15_0, VERSION_5_16_0) { + if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES { + sqlStore.GetMaster().Exec("ALTER TABLE Tokens ALTER COLUMN Extra TYPE varchar(2048)") + } else if sqlStore.DriverName() == model.DATABASE_DRIVER_MYSQL { + sqlStore.GetMaster().Exec("ALTER TABLE Tokens MODIFY Extra text") } - saveSchemaVersion(sqlSupplier, VERSION_5_16_0) + saveSchemaVersion(sqlStore, VERSION_5_16_0) // Fix mismatches between the canonical and migrated schemas. - sqlSupplier.AlterColumnTypeIfExists("TeamMembers", "SchemeGuest", "tinyint(4)", "boolean") - sqlSupplier.AlterColumnTypeIfExists("Schemes", "DefaultTeamGuestRole", "varchar(64)", "VARCHAR(64)") - sqlSupplier.AlterColumnTypeIfExists("Schemes", "DefaultChannelGuestRole", "varchar(64)", "VARCHAR(64)") - sqlSupplier.AlterColumnTypeIfExists("Teams", "AllowedDomains", "text", "VARCHAR(1000)") - sqlSupplier.AlterColumnTypeIfExists("Channels", "GroupConstrained", "tinyint(1)", "boolean") - sqlSupplier.AlterColumnTypeIfExists("Teams", "GroupConstrained", "tinyint(1)", "boolean") + sqlStore.AlterColumnTypeIfExists("TeamMembers", "SchemeGuest", "tinyint(4)", "boolean") + sqlStore.AlterColumnTypeIfExists("Schemes", "DefaultTeamGuestRole", "varchar(64)", "VARCHAR(64)") + sqlStore.AlterColumnTypeIfExists("Schemes", "DefaultChannelGuestRole", "varchar(64)", "VARCHAR(64)") + sqlStore.AlterColumnTypeIfExists("Teams", "AllowedDomains", "text", "VARCHAR(1000)") + sqlStore.AlterColumnTypeIfExists("Channels", "GroupConstrained", "tinyint(1)", "boolean") + sqlStore.AlterColumnTypeIfExists("Teams", "GroupConstrained", "tinyint(1)", "boolean") // One known mismatch remains: ChannelMembers.SchemeGuest. The requisite migration // is left here for posterity, but we're avoiding fix this given the corresponding // table rewrite in most MySQL and Postgres instances. - // sqlSupplier.AlterColumnTypeIfExists("ChannelMembers", "SchemeGuest", "tinyint(4)", "boolean") + // sqlStore.AlterColumnTypeIfExists("ChannelMembers", "SchemeGuest", "tinyint(4)", "boolean") - sqlSupplier.CreateIndexIfNotExists("idx_groupteams_teamid", "GroupTeams", "TeamId") - sqlSupplier.CreateIndexIfNotExists("idx_groupchannels_channelid", "GroupChannels", "ChannelId") + sqlStore.CreateIndexIfNotExists("idx_groupteams_teamid", "GroupTeams", "TeamId") + sqlStore.CreateIndexIfNotExists("idx_groupchannels_channelid", "GroupChannels", "ChannelId") } } -func upgradeDatabaseToVersion517(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_16_0, VERSION_5_17_0) { - saveSchemaVersion(sqlSupplier, VERSION_5_17_0) +func upgradeDatabaseToVersion517(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_16_0, VERSION_5_17_0) { + saveSchemaVersion(sqlStore, VERSION_5_17_0) } } -func upgradeDatabaseToVersion518(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_17_0, VERSION_5_18_0) { - saveSchemaVersion(sqlSupplier, VERSION_5_18_0) +func upgradeDatabaseToVersion518(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_17_0, VERSION_5_18_0) { + saveSchemaVersion(sqlStore, VERSION_5_18_0) } } -func upgradeDatabaseToVersion519(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_18_0, VERSION_5_19_0) { - saveSchemaVersion(sqlSupplier, VERSION_5_19_0) +func upgradeDatabaseToVersion519(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_18_0, VERSION_5_19_0) { + saveSchemaVersion(sqlStore, VERSION_5_19_0) } } -func upgradeDatabaseToVersion520(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_19_0, VERSION_5_20_0) { - sqlSupplier.CreateColumnIfNotExistsNoDefault("Bots", "LastIconUpdate", "bigint", "bigint") +func upgradeDatabaseToVersion520(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_19_0, VERSION_5_20_0) { + sqlStore.CreateColumnIfNotExistsNoDefault("Bots", "LastIconUpdate", "bigint", "bigint") - sqlSupplier.CreateColumnIfNotExists("GroupTeams", "SchemeAdmin", "boolean", "boolean", "0") - sqlSupplier.CreateIndexIfNotExists("idx_groupteams_schemeadmin", "GroupTeams", "SchemeAdmin") + sqlStore.CreateColumnIfNotExists("GroupTeams", "SchemeAdmin", "boolean", "boolean", "0") + sqlStore.CreateIndexIfNotExists("idx_groupteams_schemeadmin", "GroupTeams", "SchemeAdmin") - sqlSupplier.CreateColumnIfNotExists("GroupChannels", "SchemeAdmin", "boolean", "boolean", "0") - sqlSupplier.CreateIndexIfNotExists("idx_groupchannels_schemeadmin", "GroupChannels", "SchemeAdmin") + sqlStore.CreateColumnIfNotExists("GroupChannels", "SchemeAdmin", "boolean", "boolean", "0") + sqlStore.CreateIndexIfNotExists("idx_groupchannels_schemeadmin", "GroupChannels", "SchemeAdmin") - saveSchemaVersion(sqlSupplier, VERSION_5_20_0) + saveSchemaVersion(sqlStore, VERSION_5_20_0) } } -func upgradeDatabaseToVersion521(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_20_0, VERSION_5_21_0) { - saveSchemaVersion(sqlSupplier, VERSION_5_21_0) +func upgradeDatabaseToVersion521(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_20_0, VERSION_5_21_0) { + saveSchemaVersion(sqlStore, VERSION_5_21_0) } } -func upgradeDatabaseToVersion522(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_21_0, VERSION_5_22_0) { - sqlSupplier.CreateIndexIfNotExists("idx_teams_scheme_id", "Teams", "SchemeId") - sqlSupplier.CreateIndexIfNotExists("idx_channels_scheme_id", "Channels", "SchemeId") - sqlSupplier.CreateIndexIfNotExists("idx_channels_scheme_id", "Channels", "SchemeId") - sqlSupplier.CreateIndexIfNotExists("idx_schemes_channel_guest_role", "Schemes", "DefaultChannelGuestRole") - sqlSupplier.CreateIndexIfNotExists("idx_schemes_channel_user_role", "Schemes", "DefaultChannelUserRole") - sqlSupplier.CreateIndexIfNotExists("idx_schemes_channel_admin_role", "Schemes", "DefaultChannelAdminRole") +func upgradeDatabaseToVersion522(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_21_0, VERSION_5_22_0) { + sqlStore.CreateIndexIfNotExists("idx_teams_scheme_id", "Teams", "SchemeId") + sqlStore.CreateIndexIfNotExists("idx_channels_scheme_id", "Channels", "SchemeId") + sqlStore.CreateIndexIfNotExists("idx_channels_scheme_id", "Channels", "SchemeId") + sqlStore.CreateIndexIfNotExists("idx_schemes_channel_guest_role", "Schemes", "DefaultChannelGuestRole") + sqlStore.CreateIndexIfNotExists("idx_schemes_channel_user_role", "Schemes", "DefaultChannelUserRole") + sqlStore.CreateIndexIfNotExists("idx_schemes_channel_admin_role", "Schemes", "DefaultChannelAdminRole") - saveSchemaVersion(sqlSupplier, VERSION_5_22_0) + saveSchemaVersion(sqlStore, VERSION_5_22_0) } } -func upgradeDatabaseToVersion523(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_22_0, VERSION_5_23_0) { - saveSchemaVersion(sqlSupplier, VERSION_5_23_0) +func upgradeDatabaseToVersion523(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_22_0, VERSION_5_23_0) { + saveSchemaVersion(sqlStore, VERSION_5_23_0) } } -func upgradeDatabaseToVersion524(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_23_0, VERSION_5_24_0) { - sqlSupplier.CreateColumnIfNotExists("UserGroups", "AllowReference", "boolean", "boolean", "0") - sqlSupplier.GetMaster().Exec("UPDATE UserGroups SET Name = null, AllowReference = false") - sqlSupplier.AlterPrimaryKey("Reactions", []string{"PostId", "UserId", "EmojiName"}) +func upgradeDatabaseToVersion524(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_23_0, VERSION_5_24_0) { + sqlStore.CreateColumnIfNotExists("UserGroups", "AllowReference", "boolean", "boolean", "0") + sqlStore.GetMaster().Exec("UPDATE UserGroups SET Name = null, AllowReference = false") + sqlStore.AlterPrimaryKey("Reactions", []string{"PostId", "UserId", "EmojiName"}) - saveSchemaVersion(sqlSupplier, VERSION_5_24_0) + saveSchemaVersion(sqlStore, VERSION_5_24_0) } } -func upgradeDatabaseToVersion525(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_24_0, VERSION_5_25_0) { - saveSchemaVersion(sqlSupplier, VERSION_5_25_0) +func upgradeDatabaseToVersion525(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_24_0, VERSION_5_25_0) { + saveSchemaVersion(sqlStore, VERSION_5_25_0) } } -func upgradeDatabaseToVersion526(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_25_0, VERSION_5_26_0) { - sqlSupplier.CreateColumnIfNotExists("Sessions", "ExpiredNotify", "boolean", "boolean", "0") +func upgradeDatabaseToVersion526(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_25_0, VERSION_5_26_0) { + sqlStore.CreateColumnIfNotExists("Sessions", "ExpiredNotify", "boolean", "boolean", "0") - saveSchemaVersion(sqlSupplier, VERSION_5_26_0) + saveSchemaVersion(sqlStore, VERSION_5_26_0) } } -func upgradeDatabaseToVersion527(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_26_0, VERSION_5_27_0) { - saveSchemaVersion(sqlSupplier, VERSION_5_27_0) +func upgradeDatabaseToVersion527(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_26_0, VERSION_5_27_0) { + saveSchemaVersion(sqlStore, VERSION_5_27_0) } } -func upgradeDatabaseToVersion528(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_27_0, VERSION_5_28_0) { - if err := precheckMigrationToVersion528(sqlSupplier); err != nil { +func upgradeDatabaseToVersion528(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_27_0, VERSION_5_28_0) { + if err := precheckMigrationToVersion528(sqlStore); err != nil { mlog.Error("Error upgrading DB schema to 5.28.0", mlog.Err(err)) os.Exit(EXIT_GENERIC_FAILURE) } - sqlSupplier.CreateColumnIfNotExistsNoDefault("Commands", "PluginId", "VARCHAR(190)", "VARCHAR(190)") - sqlSupplier.GetMaster().Exec("UPDATE Commands SET PluginId = '' WHERE PluginId IS NULL") + sqlStore.CreateColumnIfNotExistsNoDefault("Commands", "PluginId", "VARCHAR(190)", "VARCHAR(190)") + sqlStore.GetMaster().Exec("UPDATE Commands SET PluginId = '' WHERE PluginId IS NULL") - sqlSupplier.AlterColumnTypeIfExists("Teams", "Type", "VARCHAR(255)", "VARCHAR(255)") - sqlSupplier.AlterColumnTypeIfExists("Teams", "SchemeId", "VARCHAR(26)", "VARCHAR(26)") - sqlSupplier.AlterColumnTypeIfExists("IncomingWebhooks", "Username", "varchar(255)", "varchar(255)") - sqlSupplier.AlterColumnTypeIfExists("IncomingWebhooks", "IconURL", "text", "varchar(1024)") + sqlStore.AlterColumnTypeIfExists("Teams", "Type", "VARCHAR(255)", "VARCHAR(255)") + sqlStore.AlterColumnTypeIfExists("Teams", "SchemeId", "VARCHAR(26)", "VARCHAR(26)") + sqlStore.AlterColumnTypeIfExists("IncomingWebhooks", "Username", "varchar(255)", "varchar(255)") + sqlStore.AlterColumnTypeIfExists("IncomingWebhooks", "IconURL", "text", "varchar(1024)") - saveSchemaVersion(sqlSupplier, VERSION_5_28_0) + saveSchemaVersion(sqlStore, VERSION_5_28_0) } } -func upgradeDatabaseToVersion5281(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_28_0, VERSION_5_28_1) { - sqlSupplier.CreateColumnIfNotExistsNoDefault("FileInfo", "MiniPreview", "MEDIUMBLOB", "bytea") +func upgradeDatabaseToVersion5281(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_28_0, VERSION_5_28_1) { + sqlStore.CreateColumnIfNotExistsNoDefault("FileInfo", "MiniPreview", "MEDIUMBLOB", "bytea") - saveSchemaVersion(sqlSupplier, VERSION_5_28_1) + saveSchemaVersion(sqlStore, VERSION_5_28_1) } } -func precheckMigrationToVersion528(sqlSupplier *SqlSupplier) error { - teamsQuery, _, err := sqlSupplier.getQueryBuilder().Select(`COALESCE(SUM(CASE +func precheckMigrationToVersion528(sqlStore *SqlStore) error { + teamsQuery, _, err := sqlStore.getQueryBuilder().Select(`COALESCE(SUM(CASE WHEN CHAR_LENGTH(SchemeId) > 26 THEN 1 ELSE 0 END),0) as schemeidwrong, @@ -880,7 +880,7 @@ func precheckMigrationToVersion528(sqlSupplier *SqlSupplier) error { if err != nil { return err } - webhooksQuery, _, err := sqlSupplier.getQueryBuilder().Select(`COALESCE(SUM(CASE + webhooksQuery, _, err := sqlStore.getQueryBuilder().Select(`COALESCE(SUM(CASE WHEN CHAR_LENGTH(Username) > 255 THEN 1 ELSE 0 END),0) as usernamewrong, @@ -894,7 +894,7 @@ func precheckMigrationToVersion528(sqlSupplier *SqlSupplier) error { } var schemeIDWrong, typeWrong int - row := sqlSupplier.GetMaster().Db.QueryRow(teamsQuery) + row := sqlStore.GetMaster().Db.QueryRow(teamsQuery) if err = row.Scan(&schemeIDWrong, &typeWrong); err != nil && err != sql.ErrNoRows { return err } else if err == nil && schemeIDWrong > 0 { @@ -906,7 +906,7 @@ func precheckMigrationToVersion528(sqlSupplier *SqlSupplier) error { } var usernameWrong, iconURLWrong int - row = sqlSupplier.GetMaster().Db.QueryRow(webhooksQuery) + row = sqlStore.GetMaster().Db.QueryRow(webhooksQuery) if err = row.Scan(&usernameWrong, &iconURLWrong); err != nil && err != sql.ErrNoRows { mlog.Error("Error fetching IncomingWebhooks columns data", mlog.Err(err)) } else if err == nil && usernameWrong > 0 { @@ -920,34 +920,34 @@ func precheckMigrationToVersion528(sqlSupplier *SqlSupplier) error { return nil } -func upgradeDatabaseToVersion529(sqlSupplier *SqlSupplier) { - if shouldPerformUpgrade(sqlSupplier, VERSION_5_28_1, VERSION_5_29_0) { - sqlSupplier.AlterColumnTypeIfExists("SidebarCategories", "Id", "VARCHAR(128)", "VARCHAR(128)") - sqlSupplier.AlterColumnDefaultIfExists("SidebarCategories", "Id", model.NewString(""), nil) - sqlSupplier.AlterColumnTypeIfExists("SidebarChannels", "CategoryId", "VARCHAR(128)", "VARCHAR(128)") - sqlSupplier.AlterColumnDefaultIfExists("SidebarChannels", "CategoryId", model.NewString(""), nil) +func upgradeDatabaseToVersion529(sqlStore *SqlStore) { + if shouldPerformUpgrade(sqlStore, VERSION_5_28_1, VERSION_5_29_0) { + sqlStore.AlterColumnTypeIfExists("SidebarCategories", "Id", "VARCHAR(128)", "VARCHAR(128)") + sqlStore.AlterColumnDefaultIfExists("SidebarCategories", "Id", model.NewString(""), nil) + sqlStore.AlterColumnTypeIfExists("SidebarChannels", "CategoryId", "VARCHAR(128)", "VARCHAR(128)") + sqlStore.AlterColumnDefaultIfExists("SidebarChannels", "CategoryId", model.NewString(""), nil) - sqlSupplier.CreateColumnIfNotExistsNoDefault("Threads", "ChannelId", "VARCHAR(26)", "VARCHAR(26)") + sqlStore.CreateColumnIfNotExistsNoDefault("Threads", "ChannelId", "VARCHAR(26)", "VARCHAR(26)") updateThreadChannelsQuery := "UPDATE Threads INNER JOIN Posts ON Posts.Id=Threads.PostId SET Threads.ChannelId=Posts.ChannelId WHERE Threads.ChannelId IS NULL" - if sqlSupplier.DriverName() == model.DATABASE_DRIVER_POSTGRES { + if sqlStore.DriverName() == model.DATABASE_DRIVER_POSTGRES { updateThreadChannelsQuery = "UPDATE Threads SET ChannelId=Posts.ChannelId FROM Posts WHERE Posts.Id=Threads.PostId AND Threads.ChannelId IS NULL" } - if _, err := sqlSupplier.GetMaster().Exec(updateThreadChannelsQuery); err != nil { + if _, err := sqlStore.GetMaster().Exec(updateThreadChannelsQuery); err != nil { mlog.Error("Error updating ChannelId in Threads table", mlog.Err(err)) } - saveSchemaVersion(sqlSupplier, VERSION_5_29_0) + saveSchemaVersion(sqlStore, VERSION_5_29_0) } } -func upgradeDatabaseToVersion530(sqlSupplier *SqlSupplier) { - // if shouldPerformUpgrade(sqlSupplier, VERSION_5_29_0, VERSION_5_30_0) { +func upgradeDatabaseToVersion530(sqlStore *SqlStore) { + // if shouldPerformUpgrade(sqlStore, VERSION_5_29_0, VERSION_5_30_0) { - sqlSupplier.CreateColumnIfNotExistsNoDefault("FileInfo", "Content", "longtext", "text") + sqlStore.CreateColumnIfNotExistsNoDefault("FileInfo", "Content", "longtext", "text") - sqlSupplier.CreateColumnIfNotExists("SidebarCategories", "Muted", "tinyint(1)", "boolean", "0") + sqlStore.CreateColumnIfNotExists("SidebarCategories", "Muted", "tinyint(1)", "boolean", "0") - // saveSchemaVersion(sqlSupplier, VERSION_5_30_0) + // saveSchemaVersion(sqlStore, VERSION_5_30_0) // } } diff --git a/store/sqlstore/upgrade_test.go b/store/sqlstore/upgrade_test.go index 24a46c8c3d..48ac4142f0 100644 --- a/store/sqlstore/upgrade_test.go +++ b/store/sqlstore/upgrade_test.go @@ -12,7 +12,7 @@ import ( func TestStoreUpgrade(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - sqlStore := ss.(*SqlSupplier) + sqlStore := ss.(*SqlStore) t.Run("invalid currentModelVersion", func(t *testing.T) { err := upgradeDatabase(sqlStore, "notaversion") @@ -81,7 +81,7 @@ func TestStoreUpgrade(t *testing.T) { func TestSaveSchemaVersion(t *testing.T) { StoreTest(t, func(t *testing.T, ss store.Store) { - sqlStore := ss.(*SqlSupplier) + sqlStore := ss.(*SqlStore) t.Run("set earliest version", func(t *testing.T) { saveSchemaVersion(sqlStore, VERSION_3_0_0) diff --git a/store/sqlstore/upload_session_store.go b/store/sqlstore/upload_session_store.go index 3be330fd8d..bc7fe4c518 100644 --- a/store/sqlstore/upload_session_store.go +++ b/store/sqlstore/upload_session_store.go @@ -15,14 +15,14 @@ import ( ) type SqlUploadSessionStore struct { - *SqlSupplier + *SqlStore } -func newSqlUploadSessionStore(sqlSupplier *SqlSupplier) store.UploadSessionStore { +func newSqlUploadSessionStore(sqlStore *SqlStore) store.UploadSessionStore { s := &SqlUploadSessionStore{ - SqlSupplier: sqlSupplier, + SqlStore: sqlStore, } - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.UploadSession{}, "UploadSessions").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("Type").SetMaxSize(32) diff --git a/store/sqlstore/user_access_token_store.go b/store/sqlstore/user_access_token_store.go index 4b5b7f45f7..ab4e115c21 100644 --- a/store/sqlstore/user_access_token_store.go +++ b/store/sqlstore/user_access_token_store.go @@ -15,13 +15,13 @@ import ( ) type SqlUserAccessTokenStore struct { - *SqlSupplier + *SqlStore } -func newSqlUserAccessTokenStore(sqlSupplier *SqlSupplier) store.UserAccessTokenStore { - s := &SqlUserAccessTokenStore{sqlSupplier} +func newSqlUserAccessTokenStore(sqlStore *SqlStore) store.UserAccessTokenStore { + s := &SqlUserAccessTokenStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.UserAccessToken{}, "UserAccessTokens").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("Token").SetMaxSize(26).SetUnique(true) diff --git a/store/sqlstore/user_store.go b/store/sqlstore/user_store.go index e851ee3efd..a507c9fee7 100644 --- a/store/sqlstore/user_store.go +++ b/store/sqlstore/user_store.go @@ -31,7 +31,7 @@ var ( ) type SqlUserStore struct { - *SqlSupplier + *SqlStore metrics einterfaces.MetricsInterface // usersQuery is a starting point for all queries that return one or more Users. @@ -42,10 +42,10 @@ func (us SqlUserStore) ClearCaches() {} func (us SqlUserStore) InvalidateProfileCacheForUser(userId string) {} -func newSqlUserStore(sqlSupplier *SqlSupplier, metrics einterfaces.MetricsInterface) store.UserStore { +func newSqlUserStore(sqlStore *SqlStore, metrics einterfaces.MetricsInterface) store.UserStore { us := &SqlUserStore{ - SqlSupplier: sqlSupplier, - metrics: metrics, + SqlStore: sqlStore, + metrics: metrics, } // note: we are providing field names explicitly here to maintain order of columns (needed when using raw queries) @@ -55,7 +55,7 @@ func newSqlUserStore(sqlSupplier *SqlSupplier, metrics einterfaces.MetricsInterf From("Users u"). LeftJoin("Bots b ON ( b.UserId = u.Id )") - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.User{}, "Users").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("Username").SetMaxSize(64).SetUnique(true) diff --git a/store/sqlstore/user_store_test.go b/store/sqlstore/user_store_test.go index 9c9f758c94..6c720c7940 100644 --- a/store/sqlstore/user_store_test.go +++ b/store/sqlstore/user_store_test.go @@ -11,7 +11,7 @@ import ( ) func TestUserStore(t *testing.T) { - StoreTestWithSqlSupplier(t, storetest.TestUserStore) + StoreTestWithSqlStore(t, storetest.TestUserStore) } func TestSearchUserStore(t *testing.T) { diff --git a/store/sqlstore/user_terms_of_service.go b/store/sqlstore/user_terms_of_service.go index f35b1c466f..463a377c98 100644 --- a/store/sqlstore/user_terms_of_service.go +++ b/store/sqlstore/user_terms_of_service.go @@ -13,13 +13,13 @@ import ( ) type SqlUserTermsOfServiceStore struct { - *SqlSupplier + *SqlStore } -func newSqlUserTermsOfServiceStore(sqlSupplier *SqlSupplier) store.UserTermsOfServiceStore { - s := SqlUserTermsOfServiceStore{sqlSupplier} +func newSqlUserTermsOfServiceStore(sqlStore *SqlStore) store.UserTermsOfServiceStore { + s := SqlUserTermsOfServiceStore{sqlStore} - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.UserTermsOfService{}, "UserTermsOfService").SetKeys(false, "UserId") table.ColMap("UserId").SetMaxSize(26) table.ColMap("TermsOfServiceId").SetMaxSize(26) diff --git a/store/sqlstore/webhook_store.go b/store/sqlstore/webhook_store.go index 829de20009..e30b68832b 100644 --- a/store/sqlstore/webhook_store.go +++ b/store/sqlstore/webhook_store.go @@ -15,20 +15,20 @@ import ( ) type SqlWebhookStore struct { - *SqlSupplier + *SqlStore metrics einterfaces.MetricsInterface } func (s SqlWebhookStore) ClearCaches() { } -func newSqlWebhookStore(sqlSupplier *SqlSupplier, metrics einterfaces.MetricsInterface) store.WebhookStore { +func newSqlWebhookStore(sqlStore *SqlStore, metrics einterfaces.MetricsInterface) store.WebhookStore { s := &SqlWebhookStore{ - SqlSupplier: sqlSupplier, - metrics: metrics, + SqlStore: sqlStore, + metrics: metrics, } - for _, db := range sqlSupplier.GetAllConns() { + for _, db := range sqlStore.GetAllConns() { table := db.AddTableWithName(model.IncomingWebhook{}, "IncomingWebhooks").SetKeys(false, "Id") table.ColMap("Id").SetMaxSize(26) table.ColMap("UserId").SetMaxSize(26) diff --git a/store/storetest/bot_store.go b/store/storetest/bot_store.go index b92405014f..3fd50d7cf9 100644 --- a/store/storetest/bot_store.go +++ b/store/storetest/bot_store.go @@ -24,7 +24,7 @@ func makeBotWithUser(t *testing.T, ss store.Store, bot *model.Bot) (*model.Bot, return bot, user } -func TestBotStore(t *testing.T, ss store.Store, s SqlSupplier) { +func TestBotStore(t *testing.T, ss store.Store, s SqlStore) { t.Run("Get", func(t *testing.T) { testBotStoreGet(t, ss, s) }) t.Run("GetAll", func(t *testing.T) { testBotStoreGetAll(t, ss, s) }) t.Run("Save", func(t *testing.T) { testBotStoreSave(t, ss) }) @@ -32,7 +32,7 @@ func TestBotStore(t *testing.T, ss store.Store, s SqlSupplier) { t.Run("PermanentDelete", func(t *testing.T) { testBotStorePermanentDelete(t, ss) }) } -func testBotStoreGet(t *testing.T, ss store.Store, s SqlSupplier) { +func testBotStoreGet(t *testing.T, ss store.Store, s SqlStore) { deletedBot, _ := makeBotWithUser(t, ss, &model.Bot{ Username: "deleted_bot", Description: "A deleted bot", @@ -117,7 +117,7 @@ func testBotStoreGet(t *testing.T, ss store.Store, s SqlSupplier) { }) } -func testBotStoreGetAll(t *testing.T, ss store.Store, s SqlSupplier) { +func testBotStoreGetAll(t *testing.T, ss store.Store, s SqlStore) { OwnerId1 := model.NewId() OwnerId2 := model.NewId() diff --git a/store/storetest/channel_store.go b/store/storetest/channel_store.go index c38fbbec55..f006347d3c 100644 --- a/store/storetest/channel_store.go +++ b/store/storetest/channel_store.go @@ -21,7 +21,7 @@ import ( "github.com/mattermost/mattermost-server/v5/utils" ) -type SqlSupplier interface { +type SqlStore interface { GetMaster() *gorp.DbMap DriverName() string } @@ -35,7 +35,7 @@ func cleanupChannels(t *testing.T, ss store.Store) { } } -func TestChannelStore(t *testing.T, ss store.Store, s SqlSupplier) { +func TestChannelStore(t *testing.T, ss store.Store, s SqlStore) { createDefaultRoles(t, ss) t.Run("Save", func(t *testing.T) { testChannelStoreSave(t, ss) }) @@ -163,7 +163,7 @@ func testChannelStoreSave(t *testing.T, ss store.Store) { require.True(t, errors.As(nErr, &cErr)) } -func testChannelStoreSaveDirectChannel(t *testing.T, ss store.Store, s SqlSupplier) { +func testChannelStoreSaveDirectChannel(t *testing.T, ss store.Store, s SqlStore) { teamId := model.NewId() o1 := model.Channel{} @@ -363,7 +363,7 @@ func testGetChannelUnread(t *testing.T, ss store.Store) { require.EqualValues(t, 10, ch2.MsgCount, "wrong MsgCount for channel 2") } -func testChannelStoreGet(t *testing.T, ss store.Store, s SqlSupplier) { +func testChannelStoreGet(t *testing.T, ss store.Store, s SqlStore) { o1 := model.Channel{} o1.TeamId = model.NewId() o1.DisplayName = "Name" @@ -3256,7 +3256,7 @@ func testChannelStoreGetChannels(t *testing.T, ss store.Store) { ss.Channel().InvalidateAllChannelMembersForUser(m1.UserId) } -func testChannelStoreGetAllChannels(t *testing.T, ss store.Store, s SqlSupplier) { +func testChannelStoreGetAllChannels(t *testing.T, ss store.Store, s SqlStore) { cleanupChannels(t, ss) t1 := model.Team{} @@ -4949,7 +4949,7 @@ func (s ByChannelDisplayName) Less(i, j int) bool { return s[i].Id < s[j].Id } -func testChannelStoreSearchArchivedInTeam(t *testing.T, ss store.Store, s SqlSupplier) { +func testChannelStoreSearchArchivedInTeam(t *testing.T, ss store.Store, s SqlStore) { teamId := model.NewId() userId := model.NewId() @@ -4971,7 +4971,7 @@ func testChannelStoreSearchArchivedInTeam(t *testing.T, ss store.Store, s SqlSup }) } -func testChannelStoreSearchInTeam(t *testing.T, ss store.Store, s SqlSupplier) { +func testChannelStoreSearchInTeam(t *testing.T, ss store.Store, s SqlStore) { teamId := model.NewId() otherTeamId := model.NewId() @@ -6246,7 +6246,7 @@ func testChannelStoreClearAllCustomRoleAssignments(t *testing.T, ss store.Store) // testMaterializedPublicChannels tests edge cases involving the triggers and stored procedures // that materialize the PublicChannels table. -func testMaterializedPublicChannels(t *testing.T, ss store.Store, s SqlSupplier) { +func testMaterializedPublicChannels(t *testing.T, ss store.Store, s SqlStore) { teamId := model.NewId() // o1 is a public channel on the team @@ -6491,7 +6491,7 @@ func testChannelStoreGetChannelMembersForExport(t *testing.T, ss store.Store) { assert.Equal(t, u1.Id, cmfe1.UserId) } -func testChannelStoreRemoveAllDeactivatedMembers(t *testing.T, ss store.Store, s SqlSupplier) { +func testChannelStoreRemoveAllDeactivatedMembers(t *testing.T, ss store.Store, s SqlStore) { // Set up all the objects needed in the store. t1 := model.Team{} t1.DisplayName = "Name" @@ -6574,7 +6574,7 @@ func testChannelStoreRemoveAllDeactivatedMembers(t *testing.T, ss store.Store, s s.GetMaster().Exec("TRUNCATE Channels") } -func testChannelStoreExportAllDirectChannels(t *testing.T, ss store.Store, s SqlSupplier) { +func testChannelStoreExportAllDirectChannels(t *testing.T, ss store.Store, s SqlStore) { teamId := model.NewId() o1 := model.Channel{} @@ -6631,7 +6631,7 @@ func testChannelStoreExportAllDirectChannels(t *testing.T, ss store.Store, s Sql s.GetMaster().Exec("TRUNCATE Channels") } -func testChannelStoreExportAllDirectChannelsExcludePrivateAndPublic(t *testing.T, ss store.Store, s SqlSupplier) { +func testChannelStoreExportAllDirectChannelsExcludePrivateAndPublic(t *testing.T, ss store.Store, s SqlStore) { teamId := model.NewId() o1 := model.Channel{} @@ -6693,7 +6693,7 @@ func testChannelStoreExportAllDirectChannelsExcludePrivateAndPublic(t *testing.T s.GetMaster().Exec("TRUNCATE Channels") } -func testChannelStoreExportAllDirectChannelsDeletedChannel(t *testing.T, ss store.Store, s SqlSupplier) { +func testChannelStoreExportAllDirectChannelsDeletedChannel(t *testing.T, ss store.Store, s SqlStore) { teamId := model.NewId() o1 := model.Channel{} diff --git a/store/storetest/channel_store_categories.go b/store/storetest/channel_store_categories.go index 01493b1f70..24951cc5f3 100644 --- a/store/storetest/channel_store_categories.go +++ b/store/storetest/channel_store_categories.go @@ -15,7 +15,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestChannelStoreCategories(t *testing.T, ss store.Store, s SqlSupplier) { +func TestChannelStoreCategories(t *testing.T, ss store.Store, s SqlStore) { t.Run("CreateInitialSidebarCategories", func(t *testing.T) { testCreateInitialSidebarCategories(t, ss) }) t.Run("CreateSidebarCategory", func(t *testing.T) { testCreateSidebarCategory(t, ss) }) t.Run("GetSidebarCategory", func(t *testing.T) { testGetSidebarCategory(t, ss, s) }) @@ -505,7 +505,7 @@ func testCreateSidebarCategory(t *testing.T, ss store.Store) { }) } -func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlSupplier) { +func testGetSidebarCategory(t *testing.T, ss store.Store, s SqlStore) { t.Run("should return a custom category with its Channels field set", func(t *testing.T) { userId := model.NewId() teamId := model.NewId() @@ -867,7 +867,7 @@ func testGetSidebarCategories(t *testing.T, ss store.Store) { }) } -func testUpdateSidebarCategories(t *testing.T, ss store.Store, s SqlSupplier) { +func testUpdateSidebarCategories(t *testing.T, ss store.Store, s SqlStore) { t.Run("ensure the query to update SidebarCategories hasn't been polluted by UpdateSidebarCategoryOrder", func(t *testing.T) { userId := model.NewId() teamId := model.NewId() @@ -1648,7 +1648,7 @@ func testUpdateSidebarCategories(t *testing.T, ss store.Store, s SqlSupplier) { }) } -func testDeleteSidebarCategory(t *testing.T, ss store.Store, s SqlSupplier) { +func testDeleteSidebarCategory(t *testing.T, ss store.Store, s SqlStore) { setupInitialSidebarCategories := func(t *testing.T, ss store.Store) (string, string) { userId := model.NewId() teamId := model.NewId() diff --git a/store/storetest/mocks/SqlSupplier.go b/store/storetest/mocks/SqlSupplier.go index a9347437a1..90add3da28 100644 --- a/store/storetest/mocks/SqlSupplier.go +++ b/store/storetest/mocks/SqlSupplier.go @@ -9,13 +9,13 @@ import ( mock "github.com/stretchr/testify/mock" ) -// SqlSupplier is an autogenerated mock type for the SqlSupplier type -type SqlSupplier struct { +// SqlStore is an autogenerated mock type for the SqlStore type +type SqlStore struct { mock.Mock } // DriverName provides a mock function with given fields: -func (_m *SqlSupplier) DriverName() string { +func (_m *SqlStore) DriverName() string { ret := _m.Called() var r0 string @@ -29,7 +29,7 @@ func (_m *SqlSupplier) DriverName() string { } // GetMaster provides a mock function with given fields: -func (_m *SqlSupplier) GetMaster() *gorp.DbMap { +func (_m *SqlStore) GetMaster() *gorp.DbMap { ret := _m.Called() var r0 *gorp.DbMap diff --git a/store/storetest/plugin_store.go b/store/storetest/plugin_store.go index eb9e6b5f2d..1715ac390f 100644 --- a/store/storetest/plugin_store.go +++ b/store/storetest/plugin_store.go @@ -14,7 +14,7 @@ import ( "github.com/stretchr/testify/assert" ) -func TestPluginStore(t *testing.T, ss store.Store, s SqlSupplier) { +func TestPluginStore(t *testing.T, ss store.Store, s SqlStore) { t.Run("SaveOrUpdate", func(t *testing.T) { testPluginSaveOrUpdate(t, ss, s) }) t.Run("CompareAndSet", func(t *testing.T) { testPluginCompareAndSet(t, ss, s) }) t.Run("CompareAndDelete", func(t *testing.T) { testPluginCompareAndDelete(t, ss, s) }) @@ -63,7 +63,7 @@ func setupKVs(t *testing.T, ss store.Store) (string, func()) { } } -func doTestPluginSaveOrUpdate(t *testing.T, ss store.Store, s SqlSupplier, doer func(kv *model.PluginKeyValue) (*model.PluginKeyValue, error)) { +func doTestPluginSaveOrUpdate(t *testing.T, ss store.Store, s SqlStore, doer func(kv *model.PluginKeyValue) (*model.PluginKeyValue, error)) { t.Run("invalid kv", func(t *testing.T) { _, tearDown := setupKVs(t, ss) defer tearDown() @@ -219,7 +219,7 @@ func doTestPluginSaveOrUpdate(t *testing.T, ss store.Store, s SqlSupplier, doer }) } -func testPluginSaveOrUpdate(t *testing.T, ss store.Store, s SqlSupplier) { +func testPluginSaveOrUpdate(t *testing.T, ss store.Store, s SqlStore) { doTestPluginSaveOrUpdate(t, ss, s, func(kv *model.PluginKeyValue) (*model.PluginKeyValue, error) { return ss.Plugin().SaveOrUpdate(kv) }) @@ -227,7 +227,7 @@ func testPluginSaveOrUpdate(t *testing.T, ss store.Store, s SqlSupplier) { // doTestPluginCompareAndSet exercises the CompareAndSet functionality, but abstracts the actual // call to same to allow reuse with SetWithOptions -func doTestPluginCompareAndSet(t *testing.T, ss store.Store, s SqlSupplier, compareAndSet func(kv *model.PluginKeyValue, oldValue []byte) (bool, error)) { +func doTestPluginCompareAndSet(t *testing.T, ss store.Store, s SqlStore, compareAndSet func(kv *model.PluginKeyValue, oldValue []byte) (bool, error)) { t.Run("invalid kv", func(t *testing.T) { _, tearDown := setupKVs(t, ss) defer tearDown() @@ -524,13 +524,13 @@ func doTestPluginCompareAndSet(t *testing.T, ss store.Store, s SqlSupplier, comp }) } -func testPluginCompareAndSet(t *testing.T, ss store.Store, s SqlSupplier) { +func testPluginCompareAndSet(t *testing.T, ss store.Store, s SqlStore) { doTestPluginCompareAndSet(t, ss, s, func(kv *model.PluginKeyValue, oldValue []byte) (bool, error) { return ss.Plugin().CompareAndSet(kv, oldValue) }) } -func testPluginCompareAndDelete(t *testing.T, ss store.Store, s SqlSupplier) { +func testPluginCompareAndDelete(t *testing.T, ss store.Store, s SqlStore) { t.Run("invalid kv", func(t *testing.T) { _, tearDown := setupKVs(t, ss) defer tearDown() @@ -660,7 +660,7 @@ func testPluginCompareAndDelete(t *testing.T, ss store.Store, s SqlSupplier) { }) } -func testPluginSetWithOptions(t *testing.T, ss store.Store, s SqlSupplier) { +func testPluginSetWithOptions(t *testing.T, ss store.Store, s SqlStore) { t.Run("invalid options", func(t *testing.T) { _, tearDown := setupKVs(t, ss) defer tearDown() diff --git a/store/storetest/post_store.go b/store/storetest/post_store.go index cd7bdf452d..d5074b3b36 100644 --- a/store/storetest/post_store.go +++ b/store/storetest/post_store.go @@ -17,7 +17,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestPostStore(t *testing.T, ss store.Store, s SqlSupplier) { +func TestPostStore(t *testing.T, ss store.Store, s SqlStore) { t.Run("SaveMultiple", func(t *testing.T) { testPostStoreSaveMultiple(t, ss) }) t.Run("Save", func(t *testing.T) { testPostStoreSave(t, ss) }) t.Run("SaveAndUpdateChannelMsgCounts", func(t *testing.T) { testPostStoreSaveChannelMsgCounts(t, ss) }) @@ -1691,7 +1691,7 @@ func testPostCountsByDay(t *testing.T, ss store.Store) { assert.Equal(t, int64(6), r2) } -func testPostStoreGetFlaggedPostsForTeam(t *testing.T, ss store.Store, s SqlSupplier) { +func testPostStoreGetFlaggedPostsForTeam(t *testing.T, ss store.Store, s SqlStore) { c1 := &model.Channel{} c1.TeamId = model.NewId() c1.DisplayName = "Channel1" @@ -2609,7 +2609,7 @@ func testPostStoreGetRepliesForExport(t *testing.T, ss store.Store) { } -func testPostStoreGetDirectPostParentsForExportAfter(t *testing.T, ss store.Store, s SqlSupplier) { +func testPostStoreGetDirectPostParentsForExportAfter(t *testing.T, ss store.Store, s SqlStore) { teamId := model.NewId() o1 := model.Channel{} @@ -2663,7 +2663,7 @@ func testPostStoreGetDirectPostParentsForExportAfter(t *testing.T, ss store.Stor s.GetMaster().Exec("TRUNCATE Channels") } -func testPostStoreGetDirectPostParentsForExportAfterDeleted(t *testing.T, ss store.Store, s SqlSupplier) { +func testPostStoreGetDirectPostParentsForExportAfterDeleted(t *testing.T, ss store.Store, s SqlStore) { teamId := model.NewId() o1 := model.Channel{} @@ -2729,7 +2729,7 @@ func testPostStoreGetDirectPostParentsForExportAfterDeleted(t *testing.T, ss sto s.GetMaster().Exec("TRUNCATE Channels") } -func testPostStoreGetDirectPostParentsForExportAfterBatched(t *testing.T, ss store.Store, s SqlSupplier) { +func testPostStoreGetDirectPostParentsForExportAfterBatched(t *testing.T, ss store.Store, s SqlStore) { teamId := model.NewId() o1 := model.Channel{} diff --git a/store/storetest/role_store.go b/store/storetest/role_store.go index 71ed48adb7..713cc8d37f 100644 --- a/store/storetest/role_store.go +++ b/store/storetest/role_store.go @@ -14,7 +14,7 @@ import ( "github.com/mattermost/mattermost-server/v5/store" ) -func TestRoleStore(t *testing.T, ss store.Store, s SqlSupplier) { +func TestRoleStore(t *testing.T, ss store.Store, s SqlStore) { t.Run("Save", func(t *testing.T) { testRoleStoreSave(t, ss) }) t.Run("Get", func(t *testing.T) { testRoleStoreGet(t, ss) }) t.Run("GetAll", func(t *testing.T) { testRoleStoreGetAll(t, ss) }) @@ -516,7 +516,7 @@ func testRoleStoreLowerScopedChannelSchemeRoles(t *testing.T, ss store.Store) { }) } -func testRoleStoreChannelHigherScopedPermissionsBlankTeamSchemeChannelGuest(t *testing.T, ss store.Store, s SqlSupplier) { +func testRoleStoreChannelHigherScopedPermissionsBlankTeamSchemeChannelGuest(t *testing.T, ss store.Store, s SqlStore) { teamScheme := &model.Scheme{ DisplayName: model.NewId(), Name: model.NewId(), diff --git a/store/storetest/thread_store.go b/store/storetest/thread_store.go index e8fb28b167..5656ad820f 100644 --- a/store/storetest/thread_store.go +++ b/store/storetest/thread_store.go @@ -13,7 +13,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestThreadStore(t *testing.T, ss store.Store, s SqlSupplier) { +func TestThreadStore(t *testing.T, ss store.Store, s SqlStore) { t.Run("ThreadStorePopulation", func(t *testing.T) { testThreadStorePopulation(t, ss) }) } diff --git a/store/storetest/user_store.go b/store/storetest/user_store.go index 35837418f7..071165ef0e 100644 --- a/store/storetest/user_store.go +++ b/store/storetest/user_store.go @@ -21,12 +21,12 @@ const ( MONTH_MILLISECONDS = 31 * DAY_MILLISECONDS ) -func cleanupStatusStore(t *testing.T, s SqlSupplier) { +func cleanupStatusStore(t *testing.T, s SqlStore) { _, execerr := s.GetMaster().ExecNoTimeout(` DELETE FROM Status `) require.Nil(t, execerr) } -func TestUserStore(t *testing.T, ss store.Store, s SqlSupplier) { +func TestUserStore(t *testing.T, ss store.Store, s SqlStore) { users, err := ss.User().GetAll() require.Nil(t, err, "failed cleaning up test users") @@ -957,7 +957,7 @@ func testUserStoreGetProfilesInChannel(t *testing.T, ss store.Store) { }) } -func testUserStoreGetProfilesInChannelByStatus(t *testing.T, ss store.Store, s SqlSupplier) { +func testUserStoreGetProfilesInChannelByStatus(t *testing.T, ss store.Store, s SqlStore) { cleanupStatusStore(t, s) @@ -2317,7 +2317,7 @@ func testUserStoreUpdateMfaActive(t *testing.T, ss store.Store) { require.Nil(t, err) } -func testUserStoreGetRecentlyActiveUsersForTeam(t *testing.T, ss store.Store, s SqlSupplier) { +func testUserStoreGetRecentlyActiveUsersForTeam(t *testing.T, ss store.Store, s SqlStore) { cleanupStatusStore(t, s) @@ -3823,7 +3823,7 @@ func testCount(t *testing.T, ss store.Store) { } } -func testUserStoreAnalyticsActiveCount(t *testing.T, ss store.Store, s SqlSupplier) { +func testUserStoreAnalyticsActiveCount(t *testing.T, ss store.Store, s SqlStore) { cleanupStatusStore(t, s) @@ -3908,7 +3908,7 @@ func testUserStoreAnalyticsActiveCount(t *testing.T, ss store.Store, s SqlSuppli assert.Equal(t, int64(4), count) } -func testUserStoreAnalyticsActiveCountForPeriod(t *testing.T, ss store.Store, s SqlSupplier) { +func testUserStoreAnalyticsActiveCountForPeriod(t *testing.T, ss store.Store, s SqlStore) { cleanupStatusStore(t, s) diff --git a/testlib/helper.go b/testlib/helper.go index 8d8fd0f08b..f52ffb7c0e 100644 --- a/testlib/helper.go +++ b/testlib/helper.go @@ -25,7 +25,7 @@ type MainHelper struct { Settings *model.SqlSettings Store store.Store SearchEngine *searchengine.Broker - SQLSupplier *sqlstore.SqlSupplier + SQLStore *sqlstore.SqlStore ClusterInterface *FakeClusterInterface status int @@ -109,9 +109,9 @@ func (h *MainHelper) setupStore() { h.SearchEngine = searchengine.NewBroker(config, nil) h.ClusterInterface = &FakeClusterInterface{} - h.SQLSupplier = sqlstore.NewSqlSupplier(*h.Settings, nil) + h.SQLStore = sqlstore.New(*h.Settings, nil) h.Store = searchlayer.NewSearchLayer(&TestStore{ - h.SQLSupplier, + h.SQLStore, }, h.SearchEngine, config) } @@ -151,7 +151,7 @@ func (h *MainHelper) PreloadMigrations() { panic(fmt.Errorf("cannot read file: %v", err)) } } - handle := h.SQLSupplier.GetMaster() + handle := h.SQLStore.GetMaster() _, err = handle.Exec(string(buf)) if err != nil { mlog.Error("Error preloading migrations. Check if you have &multiStatements=true in your DSN if you are using MySQL. Or perhaps the schema changed? If yes, then update the warmup files accordingly.") @@ -160,8 +160,8 @@ func (h *MainHelper) PreloadMigrations() { } func (h *MainHelper) Close() error { - if h.SQLSupplier != nil { - h.SQLSupplier.Close() + if h.SQLStore != nil { + h.SQLStore.Close() } if h.Settings != nil { storetest.CleanupSqlSettings(h.Settings) @@ -195,12 +195,12 @@ func (h *MainHelper) GetStore() store.Store { return h.Store } -func (h *MainHelper) GetSQLSupplier() *sqlstore.SqlSupplier { - if h.SQLSupplier == nil { - panic("MainHelper not initialized with sql supplier.") +func (h *MainHelper) GetSQLStore() *sqlstore.SqlStore { + if h.SQLStore == nil { + panic("MainHelper not initialized with sql store.") } - return h.SQLSupplier + return h.SQLStore } func (h *MainHelper) GetClusterInterface() *FakeClusterInterface {