MysqlClient.go 2.4 KB
package mysqlrym

import (
	"fmt"
	"git.168cad.top/zhengqiuyun/rym-util/conf"
	"git.168cad.top/zhengqiuyun/rym-util/log"
	"git.168cad.top/zhengqiuyun/rym-util/util"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"os"
	"sync"
	"time"

	"gorm.io/gorm/logger"

	_log "log"
)

func TestLog() {
	log.Info("Mysql 测试")
}

var customerDb *gorm.DB

var customerDbMap sync.Map

var gidNeedTX sync.Map

func SetTx() {
	gid := util.GetGID()
	gidNeedTX.Store(gid, 1)
}

func GetDb() *gorm.DB {
	return getDb(customerDb, &customerDbMap)
}

func getDb(db *gorm.DB, dbMap *sync.Map) *gorm.DB {
	gid := util.GetGID()
	_, needTx := gidNeedTX.Load(gid)
	if needTx {
		cacheTx, ok := dbMap.Load(gid)
		if ok {
			return cacheTx.(*gorm.DB)
		} else {
			if conf.LogShowSql {
				db = db.Debug()
			}
			tx := db.Begin()
			dbMap.Store(gid, tx)
			return tx
		}
	} else {
		if conf.LogShowSql {
			db = db.Debug()
		}
		return db
	}
}

func Rollback() {
	gid := util.GetGID()
	_, needTx := gidNeedTX.Load(gid)
	if needTx {
		rollbackTx(gid, &customerDbMap)
		gidNeedTX.Delete(gid)
	}

}

func Commit() {
	gid := util.GetGID()
	_, needTx := gidNeedTX.Load(gid)
	if needTx {
		commitTx(gid, &customerDbMap)
		gidNeedTX.Delete(gid)
	}

}

func rollbackTx(gid uint64, dbMap *sync.Map) {
	cacheTx, ok := dbMap.Load(gid)
	if ok {
		tx := cacheTx.(*gorm.DB)
		tx.Rollback()
		dbMap.Delete(gid)
	}
}

func commitTx(gid uint64, dbMap *sync.Map) {
	cacheTx, ok := dbMap.Load(gid)
	if ok {
		tx := cacheTx.(*gorm.DB)
		tx.Commit()
		dbMap.Delete(gid)
	}
}

func init() {
	newLogger := logger.New(
		_log.New(os.Stdout, "", _log.Lmicroseconds), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)
		logger.Config{
			SlowThreshold:             time.Second,      // 慢 SQL 阈值
			LogLevel:                  logger.Error,     // 日志级别
			IgnoreRecordNotFoundError: true,             // 忽略ErrRecordNotFound(记录未找到)错误
			Colorful:                  conf.LogColorful, // 是否开启彩色打印
		},
	)
	var err error
	customerDb, err = gorm.Open(mysql.Open(fmt.Sprintf("%s:%s@tcp(%s:%d)/duocaihui_dev?charset=utf8mb4&parseTime=True&loc=Local",
		conf.MySql.User, conf.MySql.Password, conf.MySql.Host, conf.MySql.Port)), &gorm.Config{
		Logger: newLogger,
	})
	if err != nil {
		log.Error(fmt.Sprintf("%s connect error:%s", "Mysql server", err.Error()))
	} else {
		log.Info(fmt.Sprintf("%s connect success", "Mysql server"))
	}
}