Pass-through DB Driver implementation (#17685)
* Pass-through DB Driver implementation This is the first step in implementing a DB layer via RPC. The plan is to migrate the mattermost-plugin-api to use this DB connector so that all queries start to get routed through this library. And then we will add the DB query capability to the plugin RPC API and route all queries via RPC. At that point, this will be completely transparent to all plugins because they will already be using the DB connector and everything will be behind the scenes for them. https://focalboard-community.octo.mattermost.com/workspace/zyoahc9uapdn3xdptac6jb69ic?id=285b80a3-257d-41f6-8cf4-ed80ca9d92e5&v=495cdb4d-c13a-4992-8eb9-80cfee2819a4&c=c7386db7-65fd-469b-8bcf-8dc8f8e61e4f ```release-note NONE ``` * remove deprecated interfaces
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
ff2fe1e62c
Коммит
e35c78cac2
@@ -321,25 +321,39 @@ func setupConnection(connType string, dataSource string, settings *model.SqlSett
|
||||
db.SetConnMaxLifetime(time.Duration(*settings.ConnMaxLifetimeMilliseconds) * time.Millisecond)
|
||||
db.SetConnMaxIdleTime(time.Duration(*settings.ConnMaxIdleTimeMilliseconds) * time.Millisecond)
|
||||
|
||||
var dbmap *gorp.DbMap
|
||||
dbMap := getDBMap(settings, db)
|
||||
|
||||
return dbMap
|
||||
}
|
||||
|
||||
func getDBMap(settings *model.SqlSettings, db *dbsql.DB) *gorp.DbMap {
|
||||
connectionTimeout := time.Duration(*settings.QueryTimeout) * time.Second
|
||||
|
||||
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 {
|
||||
var dbMap *gorp.DbMap
|
||||
switch *settings.DriverName {
|
||||
case model.DATABASE_DRIVER_MYSQL:
|
||||
dbMap = &gorp.DbMap{
|
||||
Db: db,
|
||||
TypeConverter: mattermConverter{},
|
||||
Dialect: gorp.MySQLDialect{Engine: "InnoDB", Encoding: "UTF8MB4"},
|
||||
QueryTimeout: connectionTimeout,
|
||||
}
|
||||
case model.DATABASE_DRIVER_POSTGRES:
|
||||
dbMap = &gorp.DbMap{
|
||||
Db: db,
|
||||
TypeConverter: mattermConverter{},
|
||||
Dialect: gorp.PostgresDialect{},
|
||||
QueryTimeout: connectionTimeout,
|
||||
}
|
||||
default:
|
||||
mlog.Critical("Failed to create dialect specific driver")
|
||||
time.Sleep(time.Second)
|
||||
os.Exit(ExitNoDriver)
|
||||
return nil
|
||||
}
|
||||
|
||||
if settings.Trace != nil && *settings.Trace {
|
||||
dbmap.TraceOn("sql-trace:", &TraceOnAdapter{})
|
||||
dbMap.TraceOn("sql-trace:", &TraceOnAdapter{})
|
||||
}
|
||||
|
||||
return dbmap
|
||||
return dbMap
|
||||
}
|
||||
|
||||
func (ss *SqlStore) SetContext(context context.Context) {
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
package sqlstore
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"os"
|
||||
"regexp"
|
||||
@@ -20,6 +21,7 @@ import (
|
||||
|
||||
"github.com/mattermost/mattermost-server/v5/einterfaces/mocks"
|
||||
"github.com/mattermost/mattermost-server/v5/model"
|
||||
"github.com/mattermost/mattermost-server/v5/shared/driver"
|
||||
"github.com/mattermost/mattermost-server/v5/store"
|
||||
"github.com/mattermost/mattermost-server/v5/store/searchtest"
|
||||
"github.com/mattermost/mattermost-server/v5/store/storetest"
|
||||
@@ -95,6 +97,47 @@ func StoreTestWithSqlStore(t *testing.T, f func(*testing.T, store.Store, storete
|
||||
}
|
||||
}
|
||||
|
||||
func TestDBConnector(t *testing.T) {
|
||||
testDrivers := []string{
|
||||
model.DATABASE_DRIVER_POSTGRES,
|
||||
model.DATABASE_DRIVER_MYSQL,
|
||||
}
|
||||
|
||||
for _, dr := range testDrivers {
|
||||
settings := makeSqlSettings(dr)
|
||||
|
||||
store := &SqlStore{
|
||||
settings: settings,
|
||||
}
|
||||
connector, err := driver.NewConnector(*settings.DriverName, *settings.DataSource)
|
||||
require.NoError(t, err)
|
||||
db := sql.OpenDB(connector)
|
||||
|
||||
store.master = getDBMap(settings, db)
|
||||
store.stores.post = newSqlPostStore(store, nil)
|
||||
store.stores.channel = newSqlChannelStore(store, nil)
|
||||
store.stores.team = newSqlTeamStore(store)
|
||||
store.stores.thread = newSqlThreadStore(store)
|
||||
store.stores.user = newSqlUserStore(store, nil)
|
||||
store.stores.preference = newSqlPreferenceStore(store)
|
||||
store.stores.bot = newSqlBotStore(store, nil)
|
||||
store.stores.scheme = newSqlSchemeStore(store)
|
||||
err = store.GetMaster().CreateTablesIfNotExists()
|
||||
require.NoError(t, err)
|
||||
|
||||
store.stores.post.(*SqlPostStore).createIndexesIfNotExists()
|
||||
store.stores.channel.(*SqlChannelStore).createIndexesIfNotExists()
|
||||
|
||||
t.Run(dr, func(t *testing.T) {
|
||||
// Just testing post store for now.
|
||||
// This will eventually go away when it is replaced with RPC.
|
||||
storetest.TestPostStore(t, store, store)
|
||||
})
|
||||
|
||||
store.Close()
|
||||
}
|
||||
}
|
||||
|
||||
func initStores() {
|
||||
if testing.Short() {
|
||||
return
|
||||
@@ -109,8 +152,10 @@ func initStores() {
|
||||
storeTypes = append(storeTypes, newStoreType("PostgreSQL", model.DATABASE_DRIVER_POSTGRES))
|
||||
}
|
||||
} else {
|
||||
storeTypes = append(storeTypes, newStoreType("MySQL", model.DATABASE_DRIVER_MYSQL),
|
||||
newStoreType("PostgreSQL", model.DATABASE_DRIVER_POSTGRES))
|
||||
storeTypes = append(storeTypes,
|
||||
newStoreType("MySQL", model.DATABASE_DRIVER_MYSQL),
|
||||
newStoreType("PostgreSQL", model.DATABASE_DRIVER_POSTGRES),
|
||||
)
|
||||
}
|
||||
|
||||
defer func() {
|
||||
|
||||
Ссылка в новой задаче
Block a user