2025-04-30 15:07:43 +08:00

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)
}