139 lines
3.0 KiB
Go
139 lines
3.0 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/go-sql-driver/mysql"
|
|
"net/url"
|
|
"strings"
|
|
)
|
|
|
|
var (
|
|
PrintfDSN = true
|
|
)
|
|
|
|
type FileCfg struct {
|
|
Listen *int `yaml:"listen"` // 监听端口
|
|
RunMode *string `yaml:"runmode"` // 服务运行模式
|
|
Mysql *EntityMysql `yaml:"mysql"` //
|
|
Redis *EntityRedis `yaml:"redis"` // redis
|
|
}
|
|
|
|
type EntityMysql struct {
|
|
MaxOpen int `yaml:"max_open"`
|
|
MaxIdle int `yaml:"max_idle"`
|
|
Master ConnectMysql `yaml:",inline"`
|
|
Slave []ConnectMysql `yaml:"slave"`
|
|
}
|
|
|
|
type ComponentMysql struct {
|
|
SlowThreshold int
|
|
OpTimeout int
|
|
}
|
|
|
|
type ConnectMysql struct {
|
|
Addr string `yaml:"addr"`
|
|
UserName string `yaml:"user"`
|
|
Password string `yaml:"password"`
|
|
Database string `yaml:"db"`
|
|
Charset string `yaml:"charset"`
|
|
Options string `yaml:"options"`
|
|
initOpt bool
|
|
}
|
|
|
|
type EntityRedis struct {
|
|
ConnectRedis `yaml:",inline"`
|
|
PoolSize int `yaml:"poolsize"`
|
|
}
|
|
|
|
// redis
|
|
|
|
type ConnectRedis struct {
|
|
Addr string `yaml:"addr"`
|
|
Pwd string `yaml:"password"`
|
|
DB int `yaml:"db"`
|
|
}
|
|
|
|
type ComponentRedis struct {
|
|
IdleCheckTime,
|
|
MaxReadTime,
|
|
MaxWriteTime,
|
|
MaxRequestTime,
|
|
SlowThreshold int
|
|
}
|
|
|
|
func (c *ConnectMysql) GetPrintDSN() string {
|
|
if !c.initOpt {
|
|
var params map[string]string
|
|
var optValues []string
|
|
|
|
if c.Options != "" {
|
|
optValues = strings.Split(c.Options, "&")
|
|
params = make(map[string]string, len(optValues))
|
|
for _, v := range optValues {
|
|
v = strings.Trim(v, " ")
|
|
if v != "" {
|
|
kv := strings.Split(v, "=")
|
|
if len(kv) > 1 {
|
|
params[strings.Trim(kv[0], " ")] = strings.Trim(kv[1], " ")
|
|
} else {
|
|
params[strings.Trim(kv[0], " ")] = ""
|
|
}
|
|
}
|
|
}
|
|
}
|
|
c._setOption(params)
|
|
}
|
|
return fmt.Sprintf("mysql://%s/%s?%s", c.Addr, c.Database, c.Options)
|
|
}
|
|
|
|
func (c *ConnectMysql) ParserDSN(val string) error {
|
|
cfg, err := mysql.ParseDSN(val)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var params map[string]string
|
|
u := strings.Split(val, "?")
|
|
if len(u) > 1 {
|
|
if q, err := url.ParseQuery(u[1]); err == nil {
|
|
params = make(map[string]string, len(q))
|
|
for k := range q {
|
|
params[k] = q.Get(k)
|
|
}
|
|
}
|
|
}
|
|
|
|
*c = ConnectMysql{}
|
|
c.Addr, c.Database, c.UserName, c.Password = cfg.Addr, cfg.DBName, cfg.User, cfg.Passwd
|
|
c._setOption(params)
|
|
return nil
|
|
}
|
|
|
|
func (c *ConnectMysql) _setOption(params map[string]string) {
|
|
if params == nil {
|
|
params = make(map[string]string)
|
|
}
|
|
//if _, ok := params["parseTime"]; !ok {
|
|
// params["parseTime"] = "true"
|
|
//}
|
|
//if _, ok := params["loc"]; !ok {
|
|
// params["loc"] = "Local"
|
|
//}
|
|
if _, ok := params["charset"]; !ok {
|
|
if c.Charset == "" {
|
|
c.Charset = "utf8mb4"
|
|
}
|
|
params["charset"] = c.Charset
|
|
}
|
|
optValues := make([]string, 0, len(params))
|
|
for k := range params {
|
|
optValues = append(optValues, k+"="+params[k])
|
|
}
|
|
c.Options = strings.Join(optValues, "&")
|
|
c.initOpt = true
|
|
}
|
|
|
|
func (c *ConnectMysql) GetConnectDSN() string {
|
|
return fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", c.UserName, c.Password, c.Addr, c.Database, c.Options)
|
|
}
|