From 8ec9be0c8009b86affe588de774119c5f8e149fa Mon Sep 17 00:00:00 2001 From: Diego Roversi Date: Fri, 26 Apr 2019 16:43:23 +0200 Subject: sqlite3 implentation of store --- pyapd/stores/sqlite.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ tests/test_sqlite_store.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 pyapd/stores/sqlite.py create mode 100644 tests/test_sqlite_store.py diff --git a/pyapd/stores/sqlite.py b/pyapd/stores/sqlite.py new file mode 100644 index 0000000..a2a8145 --- /dev/null +++ b/pyapd/stores/sqlite.py @@ -0,0 +1,44 @@ +from .. import objects +from . import exceptions + +import pickle +import sqlite3 + + +class Store(): + def __init__(self): + self.db = sqlite3.connect('pyad.db') + self.objects = {} + + def add(self, obj: objects.Object): + obj_type = type(obj).__name__.lower() + c = self.db.cursor() + # cur.execute("insert into pickled(data) values (?)", (sqlite3.Binary(pickle.dumps(p1, protocol=2)),)) + c.execute('insert or replace into objects(type, oid, obj) values ( :type, :oid, :obj )', + (obj_type, obj.ap_id, sqlite3.Binary(pickle.dumps(obj, protocol=2)))) + self.db.commit() + c.close() + +# if obj_type not in self.objects: +# self.objects[obj_type] = {} +# self.objects[obj_type][obj.ap_id] = obj + + def get(self, obj_type: str, oid: str) -> objects.Object: + c = self.db.cursor() + c.execute( + 'select obj from objects where type = :type and oid = :oid', (obj_type, oid)) + row = c.fetchone() + if row is None: + raise exceptions.DoesNotExist( + "An object with id {} does not exist".format(oid)) + return pickle.loads(row[0]) + + def createdb(self): + c = self.db.cursor() + c.execute('create table objects(type text, oid text, obj blob)') + c.execute('create index idx on objects(type, oid)') + + +if __name__ == '__main__': + s = Store() + s.createdb() diff --git a/tests/test_sqlite_store.py b/tests/test_sqlite_store.py new file mode 100644 index 0000000..849c7a2 --- /dev/null +++ b/tests/test_sqlite_store.py @@ -0,0 +1,32 @@ +import unittest + +from pyapd import objects +from pyapd.stores import sqlite, exceptions + + +class TestSqliteStore(unittest.TestCase): + def setUp(self): + self.store = sqlite.Store() + self.oid = 'https://test/object/12345' + self.obj = objects.Object(id=self.oid) + self.store.add(self.obj) + + def test_add_object(self): + oid = 'https://test/object/12345' + obj = objects.Object(id=oid) + self.store.add(obj) + self.assertIn('object', self.store.objects) + self.assertIn(oid, self.store.objects['object']) + + def test_get_object(self): + res = self.store.get('object', self.oid) + self.assertEqual(res, self.obj) + + def test_get_object_not_existing(self): + oid = 'https://test/object/does_not_exist' + with self.assertRaises(exceptions.DoesNotExist): + self.store.get('object', oid) + + def test_get_object_wrong_type(self): + with self.assertRaises(exceptions.UnknownObjectType): + self.store.get('no_such_type', self.oid) -- cgit v1.2.3