2025-04-30 16:35:25 +08:00

110 lines
2.4 KiB
Go

package component
import (
"fmt"
"gitea.party/public-messag-service/config"
"gitea.party/public-messag-service/config/app_ser"
glogger "gitea.party/public-messag-service/config/logger"
"github.com/urfave/cli/v2"
"gorm.io/gorm/logger"
"strings"
"time"
)
type MySQL struct {
Cfg config.ComponentMysql
Clts map[string]*MySQLClient
Log MysqlLogger
}
func (c *MySQL) SetLogLevel(v int) {
// log leve
nVal := logger.Error
switch v {
case glogger.Info:
nVal = logger.Info
case glogger.Warn:
nVal = logger.Warn
case glogger.Error:
nVal = logger.Error
}
c.Log.level = nVal
}
func (c *MySQL) CliFlags() []cli.Flag {
fs := make([][]cli.Flag, 0, len(c.Clts)+1)
fs = append(fs, []cli.Flag{
&cli.IntFlag{Name: "mysql-threshold", Usage: "mysql slow threshold", Value: 300, Destination: &c.Cfg.SlowThreshold},
&cli.IntFlag{Name: "mysql-op-timeout", Usage: "mysql operation timeout", Value: 15, Destination: &c.Cfg.OpTimeout},
})
for name, clt := range c.Clts {
fs = append(fs, clt.CliFlags(name))
}
l := 0
for k := range fs {
l += len(fs[k])
}
ret := make([]cli.Flag, 0, l)
for k := range fs {
ret = append(ret, fs[k]...)
}
return ret
}
func (c *MySQL) Init(l glogger.Interface, cfg *app_ser.AppConfig, _ *cli.Context) error {
// 设置日志等级
c.Log.SetLogger(l)
c.Log.slowThreshold = time.Duration(c.Cfg.SlowThreshold) * time.Millisecond
switch cfg.Env() {
case app_ser.EnvLocal:
c.SetLogLevel(glogger.Info)
case app_ser.EnvDebug:
c.SetLogLevel(glogger.Warn)
case app_ser.EnvProd:
c.SetLogLevel(glogger.Error)
}
// 打印链接信息
for k, v := range c.Clts {
msg := fmt.Sprintf("Init MySQL (%s) config", k)
v.Init(cfg.Env(), c)
if config.PrintfDSN {
var slave string
cCfg := v.Config()
if len(cCfg.Slave) > 0 {
ss := make([]string, 0, len(cCfg.Slave))
for sk := range cCfg.Slave {
ss = append(ss, cCfg.Slave[sk].GetPrintDSN())
}
slave = "[" + strings.Join(ss, ";") + "]"
}
msg = fmt.Sprintf("%s (%s%s)", msg, cCfg.Master.GetPrintDSN(), slave)
}
c.Log.log.WarnForce(msg)
}
return nil
}
func (c *MySQL) Run() error {
for name := range c.Clts {
if err := c.LoadOne(name); err != nil {
return err
}
}
return nil
}
func (c *MySQL) LoadOne(name string) (err error) {
if clt, ok := c.Clts[name]; ok {
err = clt.Load(name)
} else {
err = fmt.Errorf("MySQL (%s) config no find", name)
}
return err
}
func (c *MySQL) Close() error {
return nil
}