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