diff --git a/pkg/structure/hashx/hashx.go b/pkg/structure/hashx/hashx.go new file mode 100644 index 0000000..8d6862b --- /dev/null +++ b/pkg/structure/hashx/hashx.go @@ -0,0 +1,120 @@ +package hashx + +import ( + "gitee.com/wheat-os/wheatCache/pkg/errorx" + "gitee.com/wheat-os/wheatCache/pkg/structure" +) + +type HashX map[string]*structure.Value + +func NewHashXSingle() structure.HashXInterface { + return make(HashX) +} + +func (h HashX) SizeByte() int64 { + var size int + for _, val := range h { + size += val.GetSize() + } + return int64(size) +} + +// RollBack TODO 事务相关, V2 实现 +func (h HashX) RollBack() error { + panic("not implemented") // TODO: Implement +} + +// Begin 事务相关, V2 实现 +func (h HashX) Begin() error { + panic("not implemented") // TODO: Implement +} + +// Comment 事务相关, V2 实现 +func (h HashX) Comment() error { + panic("not implemented") // TODO: Implement +} + +func (h HashX) Encode() ([]byte, error) { + panic("not implemented") // TODO: Implement +} + +func (h HashX) Set(key string, val string) structure.UpdateLength { + + var Length structure.UpdateLength + if v, ok := h[key]; ok { + Length -= structure.UpdateLength(v.GetSize()) + } + + strVal := structure.NewValue(val) + h[key] = strVal + return Length + structure.UpdateLength(strVal.GetSize()) +} + +func (h HashX) Get(key string) (string, error) { + if v, ok := h[key]; ok { + return v.ToString(), nil + } + + return "", errorx.New("this key does not exist in hashx, key:%s", key) +} + +func (h HashX) Del(key string) (structure.UpdateLength, error) { + if v, ok := h[key]; ok { + delete(h, key) + return structure.UpdateLength(v.GetSize()), nil + } + + return 0, errorx.New("this key does not exist in hashx, key:%s", key) +} + +func (h HashX) Key() []string { + result := make([]string, 0, len(h)) + for key := range h { + result = append(result, key) + } + return result +} + +func (h HashX) Value() []string { + result := make([]string, 0, len(h)) + for _, val := range h { + result = append(result, val.ToString()) + } + return result +} + +func (h HashX) Item() map[string]string { + result := make(map[string]string, len(h)) + for key, val := range h { + result[key] = val.ToString() + } + return result +} + +func (h HashX) Add(renewal int, keys ...string) (count int, result []string, err error) { + for _, key := range keys { + if v, ok := h[key]; ok { + res, err := v.Incr(int32(renewal)) + if err != nil { + return count, result, errorx.New("option key err, key:%s, err:%v", key, err) + } + + count += 1 + result = append(result, res) + } + } + return count, result, nil +} + +func (h HashX) SetX(key string, val string) (bool, structure.UpdateLength) { + if _, ok := h[key]; ok { + return false, 0 + } + strVal := structure.NewValue(val) + h[key] = strVal + return true, structure.UpdateLength(strVal.GetSize()) +} + +func (h HashX) Length() int { + return len(h) +}