diff --git a/xormhelper/register.go b/xormhelper/register.go new file mode 100644 index 00000000..662e30bb --- /dev/null +++ b/xormhelper/register.go @@ -0,0 +1,154 @@ +package xormhelper + +import ( + "errors" + "gitea.com/laixyz/xorm" + "gitea.com/laixyz/xorm/log" + "gitea.com/laixyz/xorm/names" + _ "github.com/go-sql-driver/mysql" + "sync" + "time" +) + +type XormSession struct { + Engine *xorm.Engine + Session *xorm.Session + Name string + DSN string + Prefix string + Debug bool +} + +func (xc *XormSession) Connect() (err error) { + xc.Engine, err = xorm.NewEngine("mysql", xc.DSN) + if err != nil { + return err + } + if xc.Prefix != "" { + tbMapper := names.NewPrefixMapper(names.GonicMapper{}, xc.Prefix) + xc.Engine.SetTableMapper(tbMapper) + } + xc.Engine.SetConnMaxLifetime(25 * time.Second) + xc.Engine.SetMaxIdleConns(64) + xc.Engine.SetMaxOpenConns(16) + if xc.Debug { + xc.Engine.ShowSQL(true) + //xorm 日志设置,只显示错误日志 + xc.Engine.Logger().SetLevel(log.LOG_DEBUG) + } else { + xc.Engine.Logger().SetLevel(log.LOG_ERR) + } + xc.Session = xc.Engine.NewSession() + return nil +} +func (xc *XormSession) Close() error { + return xc.Engine.Close() +} + +type Xorms struct { + Engine map[string]*XormSession + sync.RWMutex +} + +var PublicXorms Xorms = Xorms{Engine: make(map[string]*XormSession)} + +/* +Register 注册一个mysql连接池 +范例: + Register("test:test@(127.0.0.1:3306)/db?charset=utf8mb4&parseTime=True&loc=Local") + 给连接取个名称 + Register("default","test:test@(127.0.0.1:3306)/db?charset=utf8mb4&parseTime=True&loc=Local") + 指定表前缀 + Register("default","test:test@(127.0.0.1:3306)/db?charset=utf8mb4&parseTime=True&loc=Local","prefix_") + 设置调试模式,会打印sql语句 + Register("default","test:test@(127.0.0.1:3306)/db?charset=utf8mb4&parseTime=True&loc=Local","prefix_","true") +*/ +func MySQLRegister(params ...string) error { + var newXormConfig XormSession + paramsLen := len(params) + if paramsLen >= 4 { + if params[3] == "true" { + newXormConfig.Debug = true + } + } + if paramsLen >= 3 { + newXormConfig.Name = params[0] + newXormConfig.DSN = params[1] + newXormConfig.Prefix = params[2] + } else if paramsLen == 2 { + newXormConfig.Name = params[0] + newXormConfig.DSN = params[1] + } else if paramsLen == 1 { + newXormConfig.Name = "default" + newXormConfig.DSN = params[0] + } else { + return errors.New("the XORM Register function param failure") + } + err := newXormConfig.Connect() + if err != nil { + return err + } + PublicXorms.Lock() + defer PublicXorms.Unlock() + if _, ok := PublicXorms.Engine[newXormConfig.Name]; ok { + delete(PublicXorms.Engine, newXormConfig.Name) + } + PublicXorms.Engine[newXormConfig.Name] = &newXormConfig + return nil +} + +// Using 使用指定的名字的连接池, 不指定默认为default +func Using(params ...string) (*xorm.Session, *xorm.Engine, error) { + PublicXorms.Lock() + defer PublicXorms.Unlock() + var name string + if len(params) == 0 { + name = "default" + } + if _, ok := PublicXorms.Engine[name]; ok { + if err := PublicXorms.Engine[name].Engine.Ping(); err != nil { + err = PublicXorms.Engine[name].Connect() + if err != nil { + return nil, nil, err + } + return PublicXorms.Engine[name].Session, PublicXorms.Engine[name].Engine, err + } + return PublicXorms.Engine[name].Session, PublicXorms.Engine[name].Engine, nil + } + return nil, nil, errors.New("the mysql connect not register") +} + +/* Close 关闭连接 + 范例: + Close() 关闭名字为default的连接 + Close("my") 关闭名字为my的连接 + Close("my","your") 关闭多个连接 + Close("__all__") 关闭所有的连接。 +*/ +func Close(params ...string) (err error) { + PublicXorms.Lock() + defer PublicXorms.Unlock() + var names []string + if len(params) == 0 { + names = []string{"default"} + } else if len(params) == 1 && params[0] == "__all__" { + for _, xc := range PublicXorms.Engine { + err = xc.Close() + if err != nil { + return + } + } + return nil + } else { + names = params + } + for _, name := range names { + if _, ok := PublicXorms.Engine[name]; ok { + err = PublicXorms.Engine[name].Close() + if err != nil { + return + } + } + } + return nil +}