Files
EdgeAPI/internal/db/models/utils.go
GoEdgeLab 5a17ae9d79 v1.4.1
2024-07-27 14:15:25 +08:00

94 lines
1.8 KiB
Go

package models
import (
"errors"
"strings"
"sync"
"github.com/go-sql-driver/mysql"
"github.com/iwind/TeaGo/dbs"
"github.com/iwind/TeaGo/types"
)
// SharedCacheLocker 缓存专用Locker
var SharedCacheLocker = sync.RWMutex{}
// JSONBytes 处理JSON字节Slice
func JSONBytes(data []byte) []byte {
if len(data) == 0 {
return []byte("null")
}
return data
}
// IsNotNull 判断JSON是否不为空
func IsNotNull(data []byte) bool {
if len(data) == 0 {
return false
}
if len(data) == 4 && string(data) == "null" {
return false
}
return true
}
// IsNull 判断JSON是否为空
func IsNull(data []byte) bool {
if len(data) == 0 {
return true
}
if len(data) == 4 && string(data) == "null" {
return true
}
return false
}
// NewQuery 构造Query
func NewQuery(tx *dbs.Tx, dao dbs.DAOWrapper, adminId int64, userId int64) *dbs.Query {
query := dao.Object().Query(tx)
if adminId > 0 {
//query.Attr("adminId", adminId)
}
if userId > 0 {
query.Attr("userId", userId)
}
return query
}
// CheckSQLErrCode 检查数据库错误代码
func CheckSQLErrCode(err error, code uint16) bool {
if err == nil {
return false
}
// 快速判断错误方法
var mysqlErr *mysql.MySQLError
if errors.As(err, &mysqlErr) && mysqlErr.Number == code { // Error 1050: Table 'xxx' already exists
return true
}
// 防止二次包装过程中错误丢失的保底错误判断方法
if strings.Contains(err.Error(), "Error "+types.String(code)) {
return true
}
return false
}
// CheckSQLDuplicateErr 检查Duplicate错误
func CheckSQLDuplicateErr(err error) bool {
if err == nil {
return false
}
return CheckSQLErrCode(err, 1062)
}
// IsMySQLError Check error is MySQLError
func IsMySQLError(err error) bool {
if err == nil {
return false
}
var mysqlErr *mysql.MySQLError
return errors.As(err, &mysqlErr)
}