155 lines
3.9 KiB
Go
155 lines
3.9 KiB
Go
|
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
|
|||
|
}
|