-
Notifications
You must be signed in to change notification settings - Fork 0
/
key.go
130 lines (111 loc) · 2.72 KB
/
key.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package levelup
import (
"fmt"
"regexp"
id "github.com/multiverse-os/levelup/id"
)
////////////////////////////////////////////////////////////////////////////////
type Key struct {
Collection *Collection
Type KeyType
Subset id.Id
Record id.Id
}
func IsValidKey(k string) (bool, error) {
return regexp.MatchString(`^[a-zA-Z0-9][a-zA-Z0-9_.-]{1,255}$`, k)
}
////////////////////////////////////////////////////////////////////////////////
type KeyType int
const (
bytesKey KeyType = iota
specialKey
indexKey
documentKey
immutableKey
cacheKey
allKey
)
func (self KeyType) String() string {
switch self {
case documentKey:
return "d"
case indexKey:
return "x"
case immutableKey:
return "i"
case cacheKey:
return "c"
case specialKey:
return "s"
case bytesKey:
return "b"
default: // Standard
return ""
}
}
func (self KeyType) Bytes() []byte { return []byte(self.String()) }
////////////////////////////////////////////////////////////////////////////////
//func Key(t KeyType) Key {
// return Key{
// Type: standardKey,
// }
//}
////////////////////////////////////////////////////////////////////////////////
func Document(subsetName string) Key {
return Key{
Type: documentKey,
Subset: id.Hash(subsetName),
}
}
func ValueBucket(subsetName string) Key {
return Key{
Type: bytesKey,
Subset: id.Hash(subsetName),
}
}
func Special(subsetName string) Key {
return Key{
Type: specialKey,
Subset: id.Hash(subsetName),
}
}
func Index(subsetName string) Key {
return Key{
Type: indexKey,
Subset: id.Hash(subsetName),
}
}
func Cache(subsetName string) Key {
return Key{
Type: cacheKey,
Subset: id.Hash(subsetName),
}
}
func Immutable(subsetName string) Key {
return Key{
Type: immutableKey,
Subset: id.Hash(subsetName),
}
}
////////////////////////////////////////////////////////////////////////////////
func (self Key) Key(recordName string) Key {
self.Record = id.Hash(recordName)
return self
}
////////////////////////////////////////////////////////////////////////////////
func (self Key) Bytes() []byte {
switch self.Type {
case documentKey:
return id.Hash(fmt.Sprintf("%s.%s.%s", self.Type.Bytes(), self.Subset.Bytes(), self.Record.Bytes())).Bytes()
case bytesKey:
return id.Hash(fmt.Sprintf("%s.%s.%s", self.Type.Bytes(), self.Subset.Bytes(), self.Record.Bytes())).Bytes()
case immutableKey:
return []byte(fmt.Sprintf("%s!%s.%s", self.Type.Bytes(), self.Subset.Bytes(), self.Record.Bytes()))
case cacheKey:
return []byte(fmt.Sprintf("%s?%s.%s", self.Type.Bytes(), self.Subset.Bytes(), self.Record.Bytes()))
case specialKey:
return []byte(fmt.Sprintf("%s$%s.%s", self.Type.Bytes(), self.Subset.Bytes(), self.Record.Bytes()))
default: // allKey
return []byte("")
}
}