Skip to content
Snippets Groups Projects
Commit 6d5ad73f authored by Pavel Kácha's avatar Pavel Kácha
Browse files

Added possibility to store variable length byte strings as values

parent afba8345
No related branches found
No related tags found
No related merge requests found
......@@ -5,7 +5,7 @@ from kyotocabinet import DB, conv_bytes
class database:
def __init__(self, name, keybytes=8, valbytes=8):
def __init__(self, name, keybytes=8, valbytes=None):
self.name = name
self.filename = self.name + ".kct"
self.keybytes = keybytes
......@@ -18,7 +18,10 @@ class database:
return key.to_bytes(self.keybytes, "big", signed=False)
def _to_val(self, val):
if self.valbytes:
return val.to_bytes(self.valbytes, "big", signed=False)
else:
return val
def _from_bytes(self, val):
return int.from_bytes(val, "big", signed=False)
......@@ -29,13 +32,24 @@ class database:
def get(self, key):
val = self.db.get(self._to_key(key))
if val is not None:
if self.valbytes:
return [self._from_bytes(val[i:i+self.valbytes]) for i in range(0, len(val), self.valbytes)]
else:
return [val]
else:
return None
def jump(self, key):
return self.cursor.jump(self._to_key(key))
def get_new_key(self):
self.cursor.jump_back()
key = self.cursor.get_key()
if not key:
return 0
else:
return self._from_bytes(key) + 1
def get_range_key(self, lo, hi):
if not self.jump(lo):
return None
......@@ -58,8 +72,11 @@ class database:
item = self.cursor.get()
self.cursor.step()
while item is not None and item[0] <= self._to_key(hi):
if self.valbytes:
for i in range(0, len(item[1]), self.valbytes):
yield self._from_bytes(item[0]), self._from_bytes(item[1][i:i+self.valbytes])
else:
yield self._from_bytes(item[0]), item[1]
item = self.cursor.get()
self.cursor.step()
......@@ -79,8 +96,11 @@ class database:
item = self.cursor.get()
self.cursor.step()
while item is not None:
if self.valbytes:
for i in range(0, len(item[1]), self.valbytes):
yield self._from_bytes(item[0]), self._from_bytes(item[1][i:i+self.valbytes])
else:
yield self._from_bytes(item[0]), item[1]
item = self.cursor.get()
self.cursor.step()
......@@ -97,7 +117,7 @@ class database:
if __name__=="__main__":
db = database("test", 8)
db = database("test", 8, 8)
db.put(1, 5)
db.put(1, 6)
db.put(2, 6)
......@@ -113,5 +133,14 @@ if __name__=="__main__":
print("get_range 4 6", list(db.get_range(4, 6)))
print("get_range 3 3", list(db.get_range(3, 3)))
print("get_range 6 6", list(db.get_range(6, 6)))
print("get_new_key", db.get_new_key())
db.dump()
db.drop()
db = database("test", 8)
db.put(1, "asdf")
print("get 1", db.get(1))
print("get_range_key 1 3", db.get_range_key(1, 3))
print("get_range 0 2", list(db.get_range(0, 2)))
db.dump()
db.drop()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment