-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathencode_zset.go
88 lines (77 loc) · 1.76 KB
/
encode_zset.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
package main
import "github.com/gushitong/rekkles/ut"
type ZsetEncoder struct {
key []byte
}
func (z ZsetEncoder) EncodeMemberKey(member []byte) []byte {
return ut.ConcatBytearray(
[]byte{(byte)(SymbolSet)},
[]byte{uint8(len(z.key))},
z.key,
[]byte{uint8(len(member))},
member,
)
}
func (z ZsetEncoder) MemberPrefix() []byte {
return ut.ConcatBytearray(
[]byte{(byte)(SymbolSet)},
[]byte{uint8(len(z.key))},
z.key,
)
}
func (z ZsetEncoder) EncodeScoreKey(score int64) []byte {
var flag byte
if score < 0 {
flag = '-'
} else {
flag = '='
}
zscore := ut.Int642Bytes(score)
return ut.ConcatBytearray(
[]byte{(byte)(SymbolZset)},
[]byte{uint8(len(z.key))},
z.key,
[]byte{flag},
zscore,
)
}
func (z ZsetEncoder) ScorePrefix() []byte {
return ut.ConcatBytearray(
[]byte{(byte)(SymbolZset)},
[]byte{uint8(len(z.key))},
z.key,
)
}
func (z ZsetEncoder) EncodeScore(score []byte) ([]byte, error) {
s, err := ut.ParseInt64(score)
if err != nil {
return nil, err
}
return ut.Int642Bytes(s), nil
}
func (z ZsetEncoder) DecodeScoreKey(scoreKey []byte) (int64, error) {
if len(scoreKey) < 5 || scoreKey[0] != (byte)(SymbolZset) {
return 0, ErrCorruptedZsetScore
}
lKey := int(scoreKey[1])
return ut.Bytes2Int64(scoreKey[lKey+3:])
}
func (z ZsetEncoder) DecodeMemberKey(memberKey []byte) ([]byte, error) {
if len(memberKey) < 3 || memberKey[0] != (byte)(SymbolSet) {
return nil, ErrCorruptedZsetMember
}
lKey := int(memberKey[1])
return memberKey[lKey+2:], nil
}
func (z ZsetEncoder) QueueKey() []byte {
return ut.ConcatBytearray(
[]byte{(byte)(SymbolQueue)},
z.key,
)
}
func NewZsetEncoder(key []byte) (*ZsetEncoder, error) {
if len(key) > MaxKeySize {
return nil, ErrWrongNumOfArguments
}
return &ZsetEncoder{key: key}, nil
}