Skip to content
Snippets Groups Projects
Commit 142cd2a9 authored by inso's avatar inso
Browse files

Implement Meta DB

parent 0bd0a9e5
No related branches found
No related tags found
No related merge requests found
...@@ -13,7 +13,3 @@ class Identity: ...@@ -13,7 +13,3 @@ class Identity:
member = attr.ib(validator=attr.validators.instance_of(bool)) member = attr.ib(validator=attr.validators.instance_of(bool))
membership_buid = attr.ib(convert=block_uid) membership_buid = attr.ib(convert=block_uid)
membership_timestamp = attr.ib(convert=int) membership_timestamp = attr.ib(convert=int)
def astuple(self):
return (self.currency, self.pubkey, self.uid, self.signature, self.blockstamp, self.timestamp,
self.member, self.membership_buid, self.membership_timestamp)
\ No newline at end of file
from .identities import IdentitiesRepo from .identities import IdentitiesRepo
\ No newline at end of file from .meta import MetaDatabase
\ No newline at end of file
import sqlite3 import attr
from ..entities import Identity from ..entities import Identity
@attr.s
class IdentitiesRepo: class IdentitiesRepo:
def __init__(self, conn): """The repository for Identities entities.
""" """
:param sqlite3.Connection conn: the cursor _conn = attr.ib() # :type sqlite3.Connection
"""
self._conn = conn
def prepare(self):
"""
Prepares the database if the table is missing
"""
with self._conn:
self._conn.execute("create table if not exists identities("
"CURRENCY varchar(30), "
"PUBKEY varchar(50),"
"UID varchar(255),"
"SIGNATURE varchar(100),"
"BLOCKSTAMP varchar(100),"
"TS int,"
"MEMBER boolean,"
"MS_BUID varchar(100),"
"MS_TIMESTAMP int,"
"PRIMARY KEY (CURRENCY, PUBKEY)"
")"
)
def insert(self, identity): def insert(self, identity):
""" """
...@@ -34,7 +14,7 @@ class IdentitiesRepo: ...@@ -34,7 +14,7 @@ class IdentitiesRepo:
:param sakia.data.entities.Identity identity: the identity to commit :param sakia.data.entities.Identity identity: the identity to commit
""" """
with self._conn: with self._conn:
self._conn.execute("INSERT INTO identities VALUES (?,?,?,?,?,?,?,?,?)", identity.astuple()) self._conn.execute("INSERT INTO identities VALUES (?,?,?,?,?,?,?,?,?)", attr.astuple(identity))
def update(self, identity): def update(self, identity):
""" """
...@@ -50,7 +30,7 @@ class IdentitiesRepo: ...@@ -50,7 +30,7 @@ class IdentitiesRepo:
"MEMBER=?," "MEMBER=?,"
"MS_BUID=?," "MS_BUID=?,"
"MS_TIMESTAMP=?" "MS_TIMESTAMP=?"
"WHERE CURRENCY=? AND PUBKEY=?", identity.astuple()[2:] + (identity.currency, "WHERE CURRENCY=? AND PUBKEY=?", attr.astuple(identity)[2:] + (identity.currency,
identity.pubkey) identity.pubkey)
) )
......
import attr
from ..entities import Identity
@attr.s(frozen=True)
class MetaDatabase:
"""The repository for Identities entities.
"""
_conn = attr.ib() # :type sqlite3.Connection
def prepare(self):
"""
Prepares the database if the table is missing
"""
with self._conn:
self._conn.execute("create table if not exists meta("
"id integer not null,"
"version integer not null,"
"primary key (id)"
")"
)
@property
def upgrades(self):
return [
self.create_all_tables,
]
def upgrade_database(self):
"""
Execute the migrations
"""
version = self.version()
nb_versions = len(self.upgrades)
for v in range(version, nb_versions):
self.upgrades[v]()
with self._conn:
self._conn.execute("UPDATE meta SET version=? WHERE id=1", (version + 1,))
def create_all_tables(self):
"""
Init all the tables
:return:
"""
with self._conn:
self._conn.execute("create table if not exists identities("
"CURRENCY varchar(30), "
"PUBKEY varchar(50),"
"UID varchar(255),"
"SIGNATURE varchar(100),"
"BLOCKSTAMP varchar(100),"
"TS int,"
"MEMBER boolean,"
"MS_BUID varchar(100),"
"MS_TIMESTAMP int,"
"PRIMARY KEY (CURRENCY, PUBKEY)"
")"
)
def version(self):
with self._conn:
c = self._conn.execute("SELECT * FROM meta WHERE id=1")
data = c.fetchone()
if data:
return data[1]
else:
self._conn.execute("INSERT INTO meta VALUES (1, 0)")
return 0
from sakia.data.repositories import IdentitiesRepo from sakia.data.repositories import IdentitiesRepo, MetaDatabase
from sakia.data.entities import Identity from sakia.data.entities import Identity
from duniterpy.documents import BlockUID from duniterpy.documents import BlockUID
import unittest import unittest
...@@ -16,8 +16,10 @@ class TestIdentitiesRepo(unittest.TestCase): ...@@ -16,8 +16,10 @@ class TestIdentitiesRepo(unittest.TestCase):
self.con.close() self.con.close()
def test_add_get_identity(self): def test_add_get_identity(self):
meta_repo = MetaDatabase(self.con)
meta_repo.prepare()
meta_repo.upgrade_database()
identities_repo = IdentitiesRepo(self.con) identities_repo = IdentitiesRepo(self.con)
identities_repo.prepare()
identities_repo.insert(Identity("testcurrency", "7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ", identities_repo.insert(Identity("testcurrency", "7Aqw6Efa9EzE7gtsc8SveLLrM7gm6NEGoywSv4FJx6pZ",
"john", "john",
"H41/8OGV2W4CLKbE35kk5t1HJQsb3jEM0/QGLUf80CwJvGZf3HvVCcNtHPUFoUBKEDQO9mPK3KJkqOoxHpqHCw==", "H41/8OGV2W4CLKbE35kk5t1HJQsb3jEM0/QGLUf80CwJvGZf3HvVCcNtHPUFoUBKEDQO9mPK3KJkqOoxHpqHCw==",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment