diff --git a/core/bucket.go b/core/bucket.go index b4d501b..3363f5b 100644 --- a/core/bucket.go +++ b/core/bucket.go @@ -27,7 +27,6 @@ var sillyGirl = MakeBucket("sillyGirl") // } var MakeBucketlocker sync.Mutex -var app storage.Bucket func MakeBucket(name string) storage.Bucket { MakeBucketlocker.Lock() @@ -45,7 +44,8 @@ func MakeBucket(name string) storage.Bucket { // Set = redis.Set // logs.Info("已使用redis进行数据存储") // } - app = bkt + var app = bkt + isredis := false if def := bkt.GetString("storage"); def == "redis" { func() { defer func() { @@ -53,6 +53,8 @@ func MakeBucket(name string) storage.Bucket { if err != nil { // console.Warn("redis异常,已默认启用boltdb进行数据存储") bkt = app + } else { + isredis = true } }() bkt = redis.Initsillyplus(app.GetString("redis_addr"), app.GetString("redis_password")) @@ -63,24 +65,32 @@ func MakeBucket(name string) storage.Bucket { } logs.Info("默认使用boltdb进行数据存储") } - - storage.Watch(app, "storage", func(old, new, _ string) *storage.Final { - if new != "redis" { - return nil - } - message := "Redis连接成功,重启生效!" - err := redis.Try(app.GetString("redis_addr"), app.GetString("redis_password")) - if err != nil { - message = "Redis连接失败,操作无效:" + err.Error() - return &storage.Final{ - Error: errors.New(message), + storage.Watch(bkt, "storage", func(old, new, key string) *storage.Final { + if isredis { + if new == "boltdb" { + app.Set2(key, new) + return &storage.Final{ + Message: "重启生效!", + } } } else { - return &storage.Final{ - Message: message, + if new != "redis" { + return nil + } + message := "Redis连接成功,重启生效!" + err := redis.Try(app.GetString("redis_addr"), app.GetString("redis_password")) + if err != nil { + message = "Redis连接失败,操作无效:" + err.Error() + return &storage.Final{ + Error: errors.New(message), + } + } else { + return &storage.Final{ + Message: message, + } } } - + return nil }) storage.Watch(app, "redis_addr", func(old, new, _ string) *storage.Final { message := "Redis连接成功,重启生效!" diff --git a/core/storage/boltdb/init.go b/core/storage/boltdb/init.go index 5ff87af..87fbebb 100644 --- a/core/storage/boltdb/init.go +++ b/core/storage/boltdb/init.go @@ -113,6 +113,37 @@ func (bucket *Bucket) Delete() error { return err } +func (bucket *Bucket) Set2(key interface{}, value interface{}) (string, error) { + new := "" + msg := "" + k := fmt.Sprint(key) + switch value := value.(type) { + case []byte: + new = string(value) + case string: + new = value + case nil: + default: + new = fmt.Sprint(value) + } + return msg, db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucketIfNotExists([]byte(bucket.name)) + if err != nil { + return err + } + if new == "" { + if err := b.Delete([]byte(k)); err != nil { + return err + } + } else { + if err := b.Put([]byte(k), []byte(new)); err != nil { + return err + } + } + return nil + }) +} + func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) { new := "" msg := "" diff --git a/core/storage/main.go b/core/storage/main.go index 2f1b1ee..5615a19 100644 --- a/core/storage/main.go +++ b/core/storage/main.go @@ -21,6 +21,7 @@ var DisableHandle = func(uuid string) { type Bucket interface { Set(interface{}, interface{}) (string, error) + Set2(interface{}, interface{}) (string, error) Copy(string) Bucket IsEmpty() (bool, error) Size() (int64, error) diff --git a/core/storage/redis/init.go b/core/storage/redis/init.go index 5849370..613f561 100644 --- a/core/storage/redis/init.go +++ b/core/storage/redis/init.go @@ -177,6 +177,31 @@ func Get(key string) string { return v } +func (bucket *Bucket) Set2(key interface{}, value interface{}) (string, error) { + new := "" + msg := "" + k := fmt.Sprint(key) + switch value := value.(type) { + case []byte: + new = string(value) + case string: + new = value + case nil: + default: + new = fmt.Sprint(value) + } + if !utils.SlaveMode { + if new == "" { + return msg, db.HDel(ctx, bucket.name, k).Err() + } else { + return msg, db.HSet(ctx, bucket.name, k, new).Err() + } + } else { + return toMaster(bucket.name, k, new) + } + +} + func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) { new := "" msg := ""