79 lines
1.9 KiB
Go
79 lines
1.9 KiB
Go
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
|
|
}
|