summaryrefslogtreecommitdiff
path: root/src/store.py
blob: bc2c4ffbb00fe2de795a500f3121be17a1052cf5 (plain)
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
#! /usr/bin/env python3

from leveldb import LevelDB, WriteBatch
import time
from pathlib import PurePath
import os

class KVStore:
    """Wraps a Python wrapper for LevelDB in case we want to change wrapper
    """
    def __init__(self, name, basedir='.'):
        os.makedirs(basedir, exist_ok = True)
        path = str(PurePath(basedir).joinpath(name))
        self._db = LevelDB(path)

    def get(self, key):
        try:
            val = self._db.Get(key)
        except KeyError:
            val = None          # You can thus not store None!
        return val

    def put(self, key, val):
        self._db.Put(key, val)

    def delete(self, key):
        self._db.Delete(key)

    def range_iter(self, key_from=None, key_to=None):
        return self._db.RangeIter(key_from=key_from, key_to=key_to)

    def batch(self):
        return WriteBatch()

    def write(self, batch):
        self._db.Write(batch, sync=True)

    def timestamp_asc():
        return str(time.time()).encode('ascii')


def test_store(name):
    # TODO: rm -r name
    db = KVStore(name)

    ts0 = KVStore.timestamp_asc()
    db.put(ts0, b'Bar')
    assert(db.get(ts0) == b'Bar')

    ts1 = KVStore.timestamp_asc()
    db.put(ts1, b'Foo')
    assert(db.get(ts1) == b'Foo')

    assert(list(db.range_iter()) == [(ts0, b'Bar'), (ts1, b'Foo')])

    db.delete(ts0)
    assert(db.get(ts0) is None)

    return db

if __name__ == '__main__':
    test_store('test_store.db')