-
Notifications
You must be signed in to change notification settings - Fork 113
/
map_handler.go
80 lines (66 loc) · 1.74 KB
/
map_handler.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
package database
import (
"strings"
)
// MapHandler handler of map
type MapHandler struct {
db database
}
// MapPrefix prefix of map key
const MapPrefix = "m-"
// Separator separator of map key
const Separator = "-"
// ApplicationSeparator separator of value
const ApplicationSeparator = "@"
// MPut put value in kfv storage o(1)
func (m *MapHandler) MPut(key, field, value string) {
//fmt.Println("map put,", key, field, value)
m.addField(key, field)
m.db.Put(MapPrefix+key+Separator+field, value)
}
func (m *MapHandler) addField(key, field string) {
if m.MHas(key, field) {
return
}
s := m.db.Get(MapPrefix + key)
if s == "n" {
m.db.Put(MapPrefix+key, ApplicationSeparator+field)
return
}
if strings.Count(s, ApplicationSeparator) > 256 {
return
}
s = s + ApplicationSeparator + field
m.db.Put(MapPrefix+key, s)
}
func (m *MapHandler) delField(key, field string) {
s := m.db.Get(MapPrefix + key)
s2 := strings.Replace(s, ApplicationSeparator+field, "", 1)
if s2 == "" {
m.db.Del(MapPrefix + key)
return
}
m.db.Put(MapPrefix+key, s2)
}
// MGet get value from storage o(1)
func (m *MapHandler) MGet(key, field string) (value string) {
//fmt.Println("map get,", key, field)
return m.db.Get(MapPrefix + key + Separator + field)
}
// MHas if has map and field
func (m *MapHandler) MHas(key, field string) bool {
return m.db.Has(MapPrefix + key + Separator + field)
}
// MKeys list fields of map o(1)
func (m *MapHandler) MKeys(key string) (fields []string) {
s := m.db.Get(MapPrefix + key)
return strings.Split(s, ApplicationSeparator)[1:]
}
// MDel delete field of map o(1)
func (m *MapHandler) MDel(key, field string) {
if !m.MHas(key, field) {
return
}
m.db.Del(MapPrefix + key + Separator + field)
m.delField(key, field)
}