2020-09-17 10:16:00 +08:00
|
|
|
package models
|
|
|
|
|
|
2021-01-21 10:06:59 +08:00
|
|
|
import (
|
2024-01-29 17:57:01 +08:00
|
|
|
"errors"
|
2024-07-27 14:15:25 +08:00
|
|
|
"strings"
|
|
|
|
|
"sync"
|
|
|
|
|
|
2022-03-23 10:05:42 +08:00
|
|
|
"github.com/go-sql-driver/mysql"
|
2021-01-21 10:06:59 +08:00
|
|
|
"github.com/iwind/TeaGo/dbs"
|
2022-03-23 10:05:42 +08:00
|
|
|
"github.com/iwind/TeaGo/types"
|
2021-01-21 10:06:59 +08:00
|
|
|
)
|
|
|
|
|
|
2022-03-21 21:39:36 +08:00
|
|
|
// SharedCacheLocker 缓存专用Locker
|
2021-01-21 10:06:59 +08:00
|
|
|
var SharedCacheLocker = sync.RWMutex{}
|
2020-11-25 21:19:22 +08:00
|
|
|
|
2022-03-21 21:39:36 +08:00
|
|
|
// JSONBytes 处理JSON字节Slice
|
2020-09-17 10:16:00 +08:00
|
|
|
func JSONBytes(data []byte) []byte {
|
|
|
|
|
if len(data) == 0 {
|
|
|
|
|
return []byte("null")
|
|
|
|
|
}
|
|
|
|
|
return data
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-21 21:39:36 +08:00
|
|
|
// IsNotNull 判断JSON是否不为空
|
|
|
|
|
func IsNotNull(data []byte) bool {
|
|
|
|
|
if len(data) == 0 {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
if len(data) == 4 && string(data) == "null" {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
return true
|
2020-09-17 10:16:00 +08:00
|
|
|
}
|
2020-11-25 21:19:22 +08:00
|
|
|
|
2022-04-01 16:18:54 +08:00
|
|
|
// IsNull 判断JSON是否为空
|
|
|
|
|
func IsNull(data []byte) bool {
|
|
|
|
|
if len(data) == 0 {
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
if len(data) == 4 && string(data) == "null" {
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-21 21:39:36 +08:00
|
|
|
// NewQuery 构造Query
|
2021-01-01 23:31:30 +08:00
|
|
|
func NewQuery(tx *dbs.Tx, dao dbs.DAOWrapper, adminId int64, userId int64) *dbs.Query {
|
|
|
|
|
query := dao.Object().Query(tx)
|
2020-11-25 21:19:22 +08:00
|
|
|
if adminId > 0 {
|
2021-01-05 14:11:00 +08:00
|
|
|
//query.Attr("adminId", adminId)
|
2020-11-25 21:19:22 +08:00
|
|
|
}
|
|
|
|
|
if userId > 0 {
|
|
|
|
|
query.Attr("userId", userId)
|
|
|
|
|
}
|
|
|
|
|
return query
|
|
|
|
|
}
|
2022-03-23 10:05:42 +08:00
|
|
|
|
|
|
|
|
// CheckSQLErrCode 检查数据库错误代码
|
|
|
|
|
func CheckSQLErrCode(err error, code uint16) bool {
|
|
|
|
|
if err == nil {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 快速判断错误方法
|
2024-01-29 17:57:01 +08:00
|
|
|
var mysqlErr *mysql.MySQLError
|
|
|
|
|
if errors.As(err, &mysqlErr) && mysqlErr.Number == code { // Error 1050: Table 'xxx' already exists
|
2022-03-23 10:05:42 +08:00
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 防止二次包装过程中错误丢失的保底错误判断方法
|
|
|
|
|
if strings.Contains(err.Error(), "Error "+types.String(code)) {
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false
|
|
|
|
|
}
|
2022-12-13 18:39:23 +08:00
|
|
|
|
|
|
|
|
// CheckSQLDuplicateErr 检查Duplicate错误
|
|
|
|
|
func CheckSQLDuplicateErr(err error) bool {
|
|
|
|
|
if err == nil {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
return CheckSQLErrCode(err, 1062)
|
|
|
|
|
}
|
2023-07-04 22:02:17 +08:00
|
|
|
|
|
|
|
|
// IsMySQLError Check error is MySQLError
|
|
|
|
|
func IsMySQLError(err error) bool {
|
|
|
|
|
if err == nil {
|
|
|
|
|
return false
|
|
|
|
|
}
|
2024-01-29 17:57:01 +08:00
|
|
|
var mysqlErr *mysql.MySQLError
|
|
|
|
|
return errors.As(err, &mysqlErr)
|
2023-07-04 22:02:17 +08:00
|
|
|
}
|