Private
Public Access
1
0
Files
data-api/ntpdb/dbconn.go
2023-05-07 00:01:00 -07:00

76 lines
1.4 KiB
Go

package ntpdb
import (
"database/sql"
"database/sql/driver"
"fmt"
"log"
"os"
"time"
"github.com/go-sql-driver/mysql"
"gopkg.in/yaml.v3"
)
type DBConfig struct {
DSN string `default:"" flag:"dsn" usage:"Database DSN"`
User string `default:"" flag:"user"`
Pass string `default:"" flag:"pass"`
}
func OpenDB(configFile string) (*sql.DB, error) {
dbconn := sql.OpenDB(Driver{CreateConnectorFunc: createConnector(configFile)})
dbconn.SetConnMaxLifetime(time.Minute * 3)
dbconn.SetMaxOpenConns(10)
dbconn.SetMaxIdleConns(5)
err := dbconn.Ping()
if err != nil {
log.Printf("Could not connect to database: %s", err)
return nil, err
}
return dbconn, nil
}
func createConnector(configFile string) CreateConnectorFunc {
return func() (driver.Connector, error) {
dbFile, err := os.Open(configFile)
if err != nil {
return nil, err
}
dec := yaml.NewDecoder(dbFile)
cfg := DBConfig{}
err = dec.Decode(&cfg)
if err != nil {
return nil, err
}
dsn := cfg.DSN
if len(dsn) == 0 {
return nil, fmt.Errorf("--database.dsn flag or DATABASE_DSN environment variable required")
}
dbcfg, err := mysql.ParseDSN(dsn)
if err != nil {
return nil, err
}
if user := cfg.User; len(user) > 0 && err == nil {
dbcfg.User = user
}
if pass := cfg.Pass; len(pass) > 0 && err == nil {
dbcfg.Passwd = pass
}
return mysql.NewConnector(dbcfg)
}
}