xorm/xormhelper/register.go

155 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}