77 lines
2.0 KiB
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
|
|
}
|