diff --git a/src/sakia/data/repositories/meta.py b/src/sakia/data/repositories/meta.py index bd08ef3d504a8092c58e3f4a16d6b40e2a6b7f19..fd37d379d873d189457b5343c72ff241ad041961 100644 --- a/src/sakia/data/repositories/meta.py +++ b/src/sakia/data/repositories/meta.py @@ -2,14 +2,14 @@ import attr import os import logging import sqlite3 -from duniterpy.documents import BlockUID +from duniterpy.documents import BlockUID, MalformedDocumentError from .connections import ConnectionsRepo from .identities import IdentitiesRepo from .blockchains import BlockchainsRepo from .certifications import CertificationsRepo from .transactions import TransactionsRepo, Transaction from .dividends import DividendsRepo -from .nodes import NodesRepo +from .nodes import NodesRepo, Node from .sources import SourcesRepo from .contacts import ContactsRepo @@ -73,7 +73,8 @@ class SakiaDatabase: self.add_contacts, self.add_sentry_property, self.add_last_state_change_property, - self.refactor_transactions + self.refactor_transactions, + self.drop_incorrect_nodes ] def upgrade_database(self, to=0): @@ -151,6 +152,22 @@ class SakiaDatabase: with self.conn: self.conn.executescript(sql_file.read()) + def drop_incorrect_nodes(self): + self._logger.debug("Drop incorrect nodes") + with self.conn: + c = self.conn.execute("SELECT * FROM nodes") + data = c.fetchone() + while data: + try: + Node(*data) + except MalformedDocumentError: + self._logger.debug("Dropping node {0}".format(data[1])) + self.conn.execute("""DELETE FROM nodes + WHERE + currency=? AND pubkey=?""", (data[0], data[1])) + finally: + data = c.fetchone() + def version(self): with self.conn: c = self.conn.execute("SELECT * FROM meta WHERE id=1") diff --git a/src/sakia/data/repositories/nodes.py b/src/sakia/data/repositories/nodes.py index 4206b7a097a59254e46f4c293ee03800d7ad622e..368a0e85979fe204473c51d795b6fbcb0908da64 100644 --- a/src/sakia/data/repositories/nodes.py +++ b/src/sakia/data/repositories/nodes.py @@ -72,10 +72,7 @@ class NodesRepo: c = self._conn.execute(request, tuple(values)) data = c.fetchone() if data: - try: - return Node(*data) - except MalformedDocumentError: - pass + return Node(*data) def get_all(self, **search): """ @@ -101,13 +98,7 @@ class NodesRepo: c = self._conn.execute(request, tuple(values)) datas = c.fetchall() if datas: - nodes = [] - for data in datas: - try: - nodes.append(Node(*data)) - except MalformedDocumentError: - pass - return nodes + return [Node(*data) for data in datas] return [] def drop(self, node):