-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathacdb.py
More file actions
181 lines (134 loc) · 4.25 KB
/
acdb.py
File metadata and controls
181 lines (134 loc) · 4.25 KB
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
import collections
import contextlib
import json
import os.path
import fnmatch
class MemDriver:
def __init__(self):
self.memcache = {}
def set(self, k, v):
self.memcache[k] = v
def get(self, k):
return self.memcache[k]
def all(self):
return list(self.memcache.keys())
def rm(self, k):
del self.memcache[k]
class DocDriver:
def __init__(self, root):
self.root = root
if not os.path.exists(self.root):
os.makedirs(self.root)
def set(self, k, v):
with open(os.path.join(self.root, k), 'wb') as f:
f.write(v)
def get(self, k):
with open(os.path.join(self.root, k), 'rb') as f:
return f.read()
def all(self):
return [e.name for e in os.scandir(self.root)]
def rm(self, k):
os.remove(os.path.join(self.root, k))
class LruDriver:
def __init__(self, size=1024):
self.size = size
self.dict = collections.OrderedDict()
def set(self, k, s):
if len(self.dict) >= self.size:
for _ in range(self.size // 4):
self.dict.popitem(last=False)
self.dict[k] = s
def get(self, k):
s = self.dict.pop(k)
self.dict[k] = s
return s
def all(self):
return list(self.dict.keys())
def rm(self, k):
del self.dict[k]
class MapDriver:
def __init__(self, root):
self.doc_driver = DocDriver(root)
self.lru_driver = LruDriver(1024)
def set(self, k, s):
self.doc_driver.set(k, s)
self.lru_driver.set(k, s)
def get(self, k):
with contextlib.suppress(KeyError):
return self.lru_driver.get(k)
s = self.doc_driver.get(k)
self.lru_driver.set(k, s)
return s
def all(self):
return self.doc_driver.all()
def rm(self, k):
self.doc_driver.rm(k)
self.lru_driver.rm(k)
class Emerge:
def __init__(self, driver):
self.driver = driver
def get(self, k):
# Get gets and returns the bytes or any error encountered.
s = self.driver.get(k)
return json.loads(s)
def set(self, k, v):
# Set sets bytes with given k.
s = json.dumps(v).encode()
self.driver.set(k, s)
def all(self, p='*'):
# All returns all keys. Supported glob-style patterns.
#
# Supported glob-style patterns:
# h?llo matches hello, hallo and hxllo
# h*llo matches hllo and heeeello
# h[ae]llo matches hello and hallo, but not hillo
# h[^e]llo matches hallo, hbllo, ... but not hello
# h[a-b]llo matches hallo and hbllo
return [e for e in self.driver.all() if fnmatch.fnmatch(e, p)]
def rm(self, k):
# Rm dels bytes with given k.
self.driver.rm(k)
def incr_by(self, k, n):
# IncrBy increments the number stored at key by n.
self.set(k, self.get(k) + n)
def incr(self, k):
# Incr increments the number stored at key by one.
self.incr_by(k, 1)
def decr_by(self, k, n):
# DecrBy decrements the number stored at key by n.
return self.incr_by(k, -n)
def decr(self, k):
# Decr decrements the number stored at key by one.
return self.decr_by(k, 1)
def some(self, k):
# Some returns true if the key is some.
with contextlib.suppress(Exception):
self.get(k)
return True
return False
def none(self, k):
# None returns true if the key is none.
with contextlib.suppress(Exception):
self.get(k)
return False
return True
def set_some(self, k, v):
# Set key to hold value if the key is some.
if self.some(k):
self.set(k, v)
def set_none(self, k, v):
# Set key to hold value if the key is none.
if self.none(k):
self.set(k, v)
def mem():
# Returns a Client with MemDriver.
return Emerge(MemDriver())
def doc(root):
# Returns a Client with DocDriver.
return Emerge(DocDriver(root))
def lru(size):
# Returns a Client with LruDriver.
return Emerge(LruDriver(size))
def syn(root):
# Returns a Client with MapDriver.
return Emerge(MapDriver(root))