f5/sysutils.go
aozhiwei 5610bc1f75 1
2024-07-13 14:49:10 +08:00

126 lines
2.0 KiB
Go

package f5
import (
"q5"
"os"
"time"
"sync"
"errors"
"gorm.io/gorm"
"net/http"
"github.com/gin-gonic/gin"
)
const (
ONLINE_ENV = 0
TEST_ENV = iota
DEV_ENV = iota
)
var serverEnv int32
var globalLock sync.Mutex
var globalLockHash map[string]*sync.Mutex
func IsTestEnv() bool {
return serverEnv == TEST_ENV
}
func IsOnlineEnv() bool {
return serverEnv == ONLINE_ENV
}
func IsDevEnv() bool {
return serverEnv == DEV_ENV
}
func New[T any](cb func(*T)) *T {
obj := new(T)
cb(obj)
return obj
}
func ExtractRegisterTimeFromSessionId(sessionId string) int32 {
strList := q5.StrSplit(sessionId, "_")
if len(strList) < 4 {
return 0
}
return q5.ToInt32(strList[0])
}
func IsOrmErrRecordNotFound(err error) bool {
return errors.Is(err, gorm.ErrRecordNotFound)
}
func AllocLock(key string) *sync.Mutex {
var l *sync.Mutex
globalLock.Lock()
if p, ok := globalLockHash[key]; ok {
l = p
} else {
l = new(sync.Mutex)
globalLockHash[key] = l
}
globalLock.Unlock()
go func () {
time.Sleep(time.Second * 30)
globalLock.Lock()
delete(globalLockHash, key)
globalLock.Unlock()
}()
l.Lock()
return l
}
func ReleaseLock(l *sync.Mutex) {
l.Unlock()
}
func BatchAllocLock(keys []string) []*sync.Mutex {
locks := []*sync.Mutex{}
lock := sync.Mutex{}
for _, key := range keys {
go func () {
l := AllocLock(key)
lock.Lock()
q5.AppendSlice(&locks, l)
lock.Unlock()
}()
}
for len(locks) < len(keys) {
time.Sleep(time.Millisecond * 10)
}
return locks
}
func BatchReleaseLock(locks []*sync.Mutex) {
for _, val := range locks {
ReleaseLock(val)
}
}
func RspErr(c *gin.Context, errCode int32, errMsg string) {
c.JSON(http.StatusOK, gin.H{
"errcode": errCode,
"errmsg": errMsg,
})
}
func RspErr2(c *gin.Context, code int32, message string) {
c.JSON(http.StatusOK, gin.H{
"code": code,
"message": message,
})
}
func init() {
switch os.Getenv("SERVER_ENV") {
case "TEST":
serverEnv = TEST_ENV
case "DEBUG":
serverEnv = DEV_ENV
default:
serverEnv = ONLINE_ENV
}
globalLockHash = map[string]*sync.Mutex{}
}