-
Notifications
You must be signed in to change notification settings - Fork 7
/
hmsetExt.go
102 lines (87 loc) · 1.71 KB
/
hmsetExt.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package redis2kvstore
import (
"sync"
"github.com/gallir/smart-relayer/redis/radix.improved/redis"
)
var (
hmsetPool sync.Pool
fieldPool sync.Pool
)
func getPoolHMSet() *Hmset {
m := hmsetPool.Get()
if m == nil {
return &Hmset{}
}
h := m.(*Hmset)
h.Reset()
return h
}
func putPoolHMSet(m *Hmset) {
if m == nil {
return
}
for _, f := range m.Fields {
if f == nil {
continue
}
putPoolField(f)
}
m.Reset()
hmsetPool.Put(m)
}
func getPoolField() *Field {
m := fieldPool.Get()
if m == nil {
return &Field{}
}
m.(*Field).Reset()
return m.(*Field)
}
func putPoolField(m *Field) {
fieldPool.Put(m)
}
func (h *Hmset) processItems(items []*redis.Resp) {
for i := 0; i < len(items); i++ {
f := getPoolField()
s, _ := items[i].Str()
f.Name = s
i++
b, _ := items[i].Bytes()
f.Value = append(f.Value[:0], b...)
h.Fields = append(h.Fields, f)
}
}
func (h *Hmset) getAllAsRedis() (*redis.Resp, error) {
t := make(map[string][]byte, 0)
for _, f := range h.Fields {
t[f.Name] = append(t[f.Name][:0], f.Value...)
}
r := redis.NewResp(t)
if r == nil {
return nil, errBadCmd
}
return r, nil
}
func (h *Hmset) getOneAsRedis(field string) (*redis.Resp, error) {
for _, f := range h.Fields {
if f.Name == field {
return redis.NewResp(append([]byte{}, f.Value...)), nil
}
}
return nil, errNotFound
}
func (h *Hmset) clone() *Hmset {
clonedH := getPoolHMSet()
clonedH.Key = h.Key
clonedH.Sent = h.Sent
for _, field := range h.Fields {
if field == nil {
continue
}
clonedField := getPoolField()
clonedField.Name = field.Name
clonedField.Value = append(clonedField.Value[:0], field.Value...)
clonedH.Fields = append(clonedH.Fields, clonedField)
}
return clonedH
}