This commit is contained in:
parent
09c4f13f2c
commit
2d962d18d2
16 changed files with 520 additions and 89 deletions
79
server/sqlstore/store.go
Normal file
79
server/sqlstore/store.go
Normal file
|
@ -0,0 +1,79 @@
|
|||
package sqlstore
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
|
||||
sq "github.com/Masterminds/squirrel"
|
||||
"github.com/jmoiron/sqlx"
|
||||
"github.com/mattermost/mattermost/server/public/model"
|
||||
)
|
||||
|
||||
type Source interface {
|
||||
GetMasterDB() (*sql.DB, error)
|
||||
GetReplicaDB() (*sql.DB, error)
|
||||
DriverName() string
|
||||
}
|
||||
|
||||
type Logger interface {
|
||||
Error(message string, keyValuePairs ...interface{})
|
||||
Warn(message string, keyValuePairs ...interface{})
|
||||
Info(message string, keyValuePairs ...interface{})
|
||||
Debug(message string, keyValuePairs ...interface{})
|
||||
}
|
||||
|
||||
type SQLStore struct {
|
||||
src Source
|
||||
master *sqlx.DB
|
||||
replica *sqlx.DB
|
||||
masterBuilder sq.StatementBuilderType
|
||||
replicaBuilder sq.StatementBuilderType
|
||||
logger Logger
|
||||
}
|
||||
|
||||
// New constructs a new instance of SQLStore.
|
||||
func New(src Source, logger Logger) (*SQLStore, error) {
|
||||
var master, replica *sqlx.DB
|
||||
|
||||
masterDB, err := src.GetMasterDB()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
master = sqlx.NewDb(masterDB, src.DriverName())
|
||||
|
||||
replicaDB, err := src.GetReplicaDB()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
replica = sqlx.NewDb(replicaDB, src.DriverName())
|
||||
|
||||
masterBuilder := sq.StatementBuilder.PlaceholderFormat(sq.Question)
|
||||
if src.DriverName() == model.DatabaseDriverPostgres {
|
||||
masterBuilder = masterBuilder.PlaceholderFormat(sq.Dollar)
|
||||
}
|
||||
|
||||
if src.DriverName() == model.DatabaseDriverMysql {
|
||||
master.MapperFunc(func(s string) string { return s })
|
||||
}
|
||||
|
||||
masterBuilder = masterBuilder.RunWith(master)
|
||||
|
||||
replicaBuilder := sq.StatementBuilder.PlaceholderFormat(sq.Question)
|
||||
if src.DriverName() == model.DatabaseDriverPostgres {
|
||||
replicaBuilder = replicaBuilder.PlaceholderFormat(sq.Dollar)
|
||||
}
|
||||
|
||||
if src.DriverName() == model.DatabaseDriverMysql {
|
||||
replica.MapperFunc(func(s string) string { return s })
|
||||
}
|
||||
|
||||
replicaBuilder = replicaBuilder.RunWith(replica)
|
||||
|
||||
return &SQLStore{
|
||||
src,
|
||||
master,
|
||||
replica,
|
||||
masterBuilder,
|
||||
replicaBuilder,
|
||||
logger,
|
||||
}, nil
|
||||
}
|
Reference in a new issue