Files
Sillyv2/core/bucket.go
T
2023-06-01 08:41:54 +08:00

128 lines
2.8 KiB
Go

package core
import (
"fmt"
"strconv"
"strings"
"sync"
"time"
"github.com/cdle/sillyplus/core/logs"
"github.com/cdle/sillyplus/core/storage"
"github.com/cdle/sillyplus/core/storage/boltdb"
"github.com/cdle/sillyplus/core/storage/redis"
"github.com/cdle/sillyplus/utils"
"github.com/goccy/go-json"
)
var bkt storage.Bucket
var HttpPort string
var sillyGirl = MakeBucket("sillyGirl")
var Get = func(key string) string {
return ""
}
var Set = func(key, value string, expiration time.Duration) error {
return nil
}
var MakeBucketlocker sync.Mutex
func MakeBucket(name string) storage.Bucket {
MakeBucketlocker.Lock()
defer MakeBucketlocker.Unlock()
if bkt == nil {
utils.ReadYaml(utils.ExecPath+"/conf/", &Config, "https://raw.githubusercontent.com/cdle/sillyplus/main/conf/demo_config.yaml")
utils.SlaveMode = Config.SlaveMode
HttpPort = Config.HttpPort
if !Config.EnableRedis {
bkt = boltdb.Initsillyplus()
Get = boltdb.Get
Set = boltdb.Set
logs.Info("默认使用boltdb进行数据存储。")
} else {
bkt = redis.Initsillyplus(Config.RedisAddr, Config.RedisPassword)
Get = redis.Get
Set = redis.Set
logs.Info("已使用redis进行数据存储。")
}
for _, name := range bkt.Buckets() {
b := bkt.Copy(name)
keys, err := b.Keys()
if len(keys) == 0 && err == nil {
b.Delete()
}
}
}
if name == "" {
name = "sillyGirl"
}
if name == "silly" || name == "app" {
name = "sillyGirl"
}
return bkt.Copy(name)
}
func TransformBucketKeyValue(v string) interface{} {
var result interface{}
if strings.HasPrefix(v, "f:") {
result, _ = strconv.ParseFloat(strings.Replace(v, "f:", "", 1), 64)
return result
}
if strings.HasPrefix(v, "d:") {
result = utils.Int(strings.Replace(v, "d:", "", 1))
return result
}
if strings.HasPrefix(v, "b:") {
result = strings.Replace(v, "b:", "", 1) == "true"
return result
}
if strings.HasPrefix(v, "o:") {
json.Unmarshal([]byte(strings.Replace(v, "o:", "", 1)), &result)
return result
}
if v == "" {
return nil
}
return v
}
func GetBucketKeyValue(bucket storage.Bucket, ps ...interface{}) interface{} {
var key interface{}
var value interface{}
if len(ps) == 0 {
return nil
}
if len(ps) > 0 {
key = ps[0]
}
if len(ps) > 1 {
value = ps[1]
}
v := bucket.GetString(key)
var result = TransformBucketKeyValue(v)
if result == nil {
return value
}
return result
}
func SetBucketKeyValue(bucket storage.Bucket, key interface{}, value interface{}) (string, error) {
new := ""
switch value := value.(type) {
case int, int64, int32, uint:
new = fmt.Sprintf("d:%d", value)
case float32, float64:
new = fmt.Sprintf("f:%f", value)
case string, []byte:
new = fmt.Sprintf("%s", value)
case bool:
new = fmt.Sprintf("b:%t", value)
case nil:
new = ""
default:
new = fmt.Sprintf("o:%s", utils.JsonMarshal(value))
}
return bucket.Set(key, new)
}