chainqueue/chainqueue/sql/backend.py

98 lines
3.0 KiB
Python
Raw Normal View History

# standard imports
import logging
2021-08-26 10:05:56 +02:00
import urllib.error
# external imports
from sqlalchemy.exc import (
IntegrityError,
)
2021-06-02 15:05:48 +02:00
from chainlib.error import JSONRPCException
2021-08-26 10:05:56 +02:00
from hexathon import (
add_0x,
strip_0x,
uniform as hex_uniform,
)
2021-06-02 12:59:04 +02:00
# local imports
from chainqueue.sql.tx import create as queue_create
2021-06-02 12:59:04 +02:00
from chainqueue.db.models.base import SessionBase
2021-06-02 14:07:01 +02:00
from chainqueue.db.models.tx import TxCache
2021-08-26 10:05:56 +02:00
from chainqueue.sql.query import (
get_upcoming_tx,
get_tx as backend_get_tx,
)
2021-06-02 15:05:48 +02:00
from chainqueue.sql.state import (
set_ready,
set_reserved,
set_sent,
2021-08-26 10:05:56 +02:00
set_fubar,
2021-06-02 15:05:48 +02:00
)
2021-08-26 10:05:56 +02:00
from chainqueue.sql.tx import cache_tx_dict
2021-06-02 12:59:04 +02:00
logg = logging.getLogger(__name__)
2021-06-02 12:59:04 +02:00
class SQLBackend:
def __init__(self, conn_spec, *args, **kwargs):
SessionBase.connect(conn_spec, pool_size=kwargs.get('poolsize', 0), debug=kwargs.get('debug', False))
def create(self, chain_spec, nonce, holder_address, tx_hash, signed_tx, obsolete_predecessors=True, session=None):
try:
2021-06-02 14:07:01 +02:00
queue_create(chain_spec, nonce, holder_address, tx_hash, signed_tx, obsolete_predecessors=True, session=session)
except IntegrityError as e:
logg.warning('skipped possible duplicate insert {}'.format(e))
return 1
2021-06-02 14:07:01 +02:00
set_ready(chain_spec, tx_hash, session=session)
return 0
2021-06-02 12:59:04 +02:00
2021-06-02 14:07:01 +02:00
def cache(self, tx, session=None):
2021-08-26 10:05:56 +02:00
(tx, txc_id) = cache_tx_dict(tx, session=session)
logg.debug('cached {} db insert id {}'.format(tx, txc_id))
2021-06-02 14:07:01 +02:00
return 0
2021-08-26 10:05:56 +02:00
def get_tx(self, chain_spec, tx_hash, session=None):
return backend_get_tx(chain_spec, tx_hash, session=session)
def get(self, chain_spec, decoder, session=None, requeue=False, *args, **kwargs):
txs = get_upcoming_tx(chain_spec, status=kwargs.get('status'), decoder=decoder, not_status=kwargs.get('not_status', 0), recipient=kwargs.get('recipient'), before=kwargs.get('before'), limit=kwargs.get('limit', 0))
if requeue:
for tx_hash in txs.keys():
set_ready(chain_spec, tx_hash, session=session)
2021-06-02 14:07:01 +02:00
return txs
2021-06-02 15:05:48 +02:00
def dispatch(self, chain_spec, rpc, tx_hash, payload, session=None):
set_reserved(chain_spec, tx_hash, session=session)
fail = False
r = 1
try:
rpc.do(payload)
r = 0
2021-08-26 10:05:56 +02:00
except ConnectionError as e:
logg.error('dispatch {} connection error {}'.format(tx_hash, e))
fail = True
except urllib.error.URLError as e:
logg.error('dispatch {} urllib error {}'.format(tx_hash, e))
2021-06-02 15:05:48 +02:00
fail = True
except JSONRPCException as e:
2021-08-26 10:05:56 +02:00
logg.exception('error! {}'.format(e))
set_fubar(chain_spec, tx_hash, session=session)
raise e
2021-06-02 15:05:48 +02:00
set_sent(chain_spec, tx_hash, fail=fail, session=session)
2021-08-26 10:05:56 +02:00
2021-06-02 15:05:48 +02:00
return r
2021-06-02 14:07:01 +02:00
2021-08-26 10:05:56 +02:00
def create_session(self, session=None):
return SessionBase.bind_session(session=session)
def release_session(self, session):
return SessionBase.release_session(session=session)