metadb/config.go

77 lines
2.0 KiB
Go

package metadb
import (
"database/sql"
"fmt"
"time"
"git.bit5.ru/gomodules/timeutils"
"github.com/go-sql-driver/mysql"
"github.com/pkg/errors"
)
type Config struct {
Host string `json:"host"`
Port uint32 `json:"port"`
User string `json:"user"`
Password string `json:"pswd"`
Database string `json:"database"`
DialTimeoutSec int64 `json:"dial_timeout_sec"`
ReadTimeoutSec int64 `json:"read_timeout_sec"`
WriteTimeoutSec int64 `json:"write_timeout_sec"`
MaxOpenConns int `json:"max_open_conns"`
MaxIdleConns int `json:"max_idle_conns"`
ConnMaxLifetimeSec int64 `json:"conn_max_lifetime_sec"`
ConnMaxIdletimeSec int64 `json:"conn_max_idletime_sec"`
}
func (cfg Config) Addr() string {
if len(cfg.Host) == 0 {
cfg.Host = "localhost"
}
if cfg.Port == 0 {
cfg.Port = 3306
}
return fmt.Sprintf("%s:%d", cfg.Host, cfg.Port)
}
func (cfg Config) BuildPool() (*sql.DB, error) {
myCfg := mysql.NewConfig()
myCfg.Net = "tcp"
myCfg.Addr = cfg.Addr()
myCfg.User = cfg.User
myCfg.Passwd = cfg.Password
myCfg.DBName = cfg.Database
myCfg.Timeout = time.Second * time.Duration(cfg.DialTimeoutSec)
myCfg.ReadTimeout = time.Second * time.Duration(cfg.ReadTimeoutSec)
myCfg.WriteTimeout = time.Second * time.Duration(cfg.WriteTimeoutSec)
myCfg.InterpolateParams = true
myCfg.Loc = timeutils.MoscowLocation
pool, err := sql.Open("mysql", myCfg.FormatDSN())
if err != nil {
return nil, errors.WithStack(err)
}
if cfg.MaxOpenConns <= 0 {
cfg.MaxOpenConns = 0
}
if cfg.MaxIdleConns == 0 {
cfg.MaxIdleConns = 100
}
if cfg.ConnMaxLifetimeSec <= 0 {
cfg.ConnMaxLifetimeSec = 0
}
if cfg.ConnMaxIdletimeSec <= 0 {
cfg.ConnMaxIdletimeSec = 30
}
pool.SetMaxOpenConns(cfg.MaxOpenConns)
pool.SetMaxIdleConns(cfg.MaxIdleConns)
pool.SetConnMaxLifetime(time.Second * time.Duration(cfg.ConnMaxLifetimeSec))
pool.SetConnMaxIdleTime(time.Second * time.Duration(cfg.ConnMaxIdletimeSec))
return pool, nil
}