2021-02-17 12:44:35 +01:00
|
|
|
|
# standard imports
|
|
|
|
|
import logging
|
|
|
|
|
|
2021-02-18 23:55:49 +01:00
|
|
|
|
# local imports
|
|
|
|
|
from .error import BackendError
|
|
|
|
|
|
2021-02-17 12:44:35 +01:00
|
|
|
|
logg = logging.getLogger(__name__)
|
|
|
|
|
|
2021-04-04 15:03:58 +02:00
|
|
|
|
|
2021-02-17 12:44:35 +01:00
|
|
|
|
class SyncFilter:
|
|
|
|
|
|
2021-04-16 15:21:26 +02:00
|
|
|
|
def __init__(self, backend):
|
2021-02-17 12:44:35 +01:00
|
|
|
|
self.filters = []
|
2021-02-18 23:55:49 +01:00
|
|
|
|
self.backend = backend
|
2021-02-17 12:44:35 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def add(self, fltr):
|
|
|
|
|
if getattr(fltr, 'filter') == None:
|
|
|
|
|
raise ValueError('filter object must implement have method filter')
|
2021-04-04 15:03:58 +02:00
|
|
|
|
logg.debug('added filter "{}"'.format(str(fltr)))
|
2021-02-17 12:44:35 +01:00
|
|
|
|
|
|
|
|
|
self.filters.append(fltr)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def apply(self, conn, block, tx):
|
2021-02-18 23:55:49 +01:00
|
|
|
|
session = None
|
|
|
|
|
try:
|
|
|
|
|
session = self.backend.connect()
|
2021-04-16 15:21:26 +02:00
|
|
|
|
except TimeoutError as e:
|
2021-02-18 23:55:49 +01:00
|
|
|
|
self.backend.disconnect()
|
|
|
|
|
raise BackendError('database connection fail: {}'.format(e))
|
2021-04-04 15:03:58 +02:00
|
|
|
|
i = 0
|
2021-04-15 14:11:06 +02:00
|
|
|
|
(pair, flags) = self.backend.get()
|
2021-02-17 12:44:35 +01:00
|
|
|
|
for f in self.filters:
|
2021-04-15 17:16:31 +02:00
|
|
|
|
if not self.backend.check_filter(i, flags):
|
|
|
|
|
#if flags & (1 << i) == 0:
|
2021-04-15 15:06:07 +02:00
|
|
|
|
logg.debug('applying filter {} {}'.format(str(f), flags))
|
|
|
|
|
f.filter(conn, block, tx, session)
|
|
|
|
|
self.backend.complete_filter(i)
|
|
|
|
|
else:
|
|
|
|
|
logg.debug('skipping previously applied filter {} {}'.format(str(f), flags))
|
2021-04-04 15:03:58 +02:00
|
|
|
|
i += 1
|
|
|
|
|
|
2021-04-15 15:06:07 +02:00
|
|
|
|
self.backend.disconnect()
|
2021-02-17 12:44:35 +01:00
|
|
|
|
|
2021-02-18 23:55:49 +01:00
|
|
|
|
class NoopFilter:
|
2021-02-17 12:44:35 +01:00
|
|
|
|
|
2021-02-18 23:55:49 +01:00
|
|
|
|
def filter(self, conn, block, tx, db_session=None):
|
|
|
|
|
logg.debug('noop filter :received\n{} {} {}'.format(block, tx, id(db_session)))
|
2021-02-17 12:44:35 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return 'noopfilter'
|