76 lines
2.5 KiB
Go
76 lines
2.5 KiB
Go
package dbimpl
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/grafana/grafana/pkg/infra/tracing"
|
|
"github.com/grafana/grafana/pkg/services/sqlstore"
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
"github.com/grafana/grafana/pkg/util"
|
|
"xorm.io/xorm"
|
|
)
|
|
|
|
func getEngineMySQL(cfgSection *setting.DynamicSection, tracer tracing.Tracer) (*xorm.Engine, error) {
|
|
dbHost := cfgSection.Key("db_host").MustString("")
|
|
dbName := cfgSection.Key("db_name").MustString("")
|
|
dbUser := cfgSection.Key("db_user").MustString("")
|
|
dbPass := cfgSection.Key("db_pass").MustString("")
|
|
|
|
// TODO: support all mysql connection options
|
|
protocol := "tcp"
|
|
if strings.HasPrefix(dbHost, "/") {
|
|
protocol = "unix"
|
|
}
|
|
|
|
connectionString := connectionStringMySQL(dbUser, dbPass, protocol, dbHost, dbName)
|
|
|
|
driverName := sqlstore.WrapDatabaseDriverWithHooks("mysql", tracer)
|
|
engine, err := xorm.NewEngine(driverName, connectionString)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
engine.SetMaxOpenConns(0)
|
|
engine.SetMaxIdleConns(2)
|
|
engine.SetConnMaxLifetime(time.Second * time.Duration(14400))
|
|
|
|
return engine, nil
|
|
}
|
|
|
|
func getEnginePostgres(cfgSection *setting.DynamicSection, tracer tracing.Tracer) (*xorm.Engine, error) {
|
|
dbHost := cfgSection.Key("db_host").MustString("")
|
|
dbName := cfgSection.Key("db_name").MustString("")
|
|
dbUser := cfgSection.Key("db_user").MustString("")
|
|
dbPass := cfgSection.Key("db_pass").MustString("")
|
|
|
|
// TODO: support all postgres connection options
|
|
dbSslMode := cfgSection.Key("db_sslmode").MustString("disable")
|
|
|
|
addr, err := util.SplitHostPortDefault(dbHost, "127.0.0.1", "5432")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("invalid host specifier '%s': %w", dbHost, err)
|
|
}
|
|
|
|
connectionString := connectionStringPostgres(dbUser, dbPass, addr.Host, addr.Port, dbName, dbSslMode)
|
|
|
|
driverName := sqlstore.WrapDatabaseDriverWithHooks("postgres", tracer)
|
|
engine, err := xorm.NewEngine(driverName, connectionString)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return engine, nil
|
|
}
|
|
|
|
func connectionStringMySQL(user, password, protocol, host, dbName string) string {
|
|
return fmt.Sprintf("%s:%s@%s(%s)/%s?collation=utf8mb4_unicode_ci&allowNativePasswords=true&clientFoundRows=true", user, password, protocol, host, dbName)
|
|
}
|
|
|
|
func connectionStringPostgres(user, password, host, port, dbName, sslMode string) string {
|
|
return fmt.Sprintf(
|
|
"user=%s password=%s host=%s port=%s dbname=%s sslmode=%s", // sslcert='%s' sslkey='%s' sslrootcert='%s'",
|
|
user, password, host, port, dbName, sslMode, // ss.dbCfg.ClientCertPath, ss.dbCfg.ClientKeyPath, ss.dbCfg.CaCertPath
|
|
)
|
|
}
|