Browse Source

json_db: register extra types outside of constructor

master
ThomasV 3 years ago
parent
commit
759eaf1cf5
  1. 23
      electrum/json_db.py
  2. 29
      electrum/wallet_db.py

23
electrum/json_db.py

@ -50,6 +50,17 @@ registered_dicts = {}
registered_dict_keys = {}
registered_parent_keys = {}
def register_dict(name, method, _type):
registered_dicts[name] = method, _type
def register_name(name, method, _type):
registered_names[name] = method, _type
def register_dict_key(name, method):
registered_dict_keys[name] = method
def register_parent_key(name, method):
registered_parent_keys[name] = method
def stored_as(name, _type=dict):
""" decorator that indicates the storage key of a stored object"""
@ -212,18 +223,6 @@ class JsonDB(Logger):
def _should_convert_to_stored_dict(self, key) -> bool:
return True
def register_dict(self, name, method, _type):
registered_dicts[name] = method, _type
def register_name(self, name, method, _type):
registered_names[name] = method, _type
def register_dict_key(self, name, method):
registered_dict_keys[name] = method
def register_parent_key(self, name, method):
registered_parent_keys[name] = method
def _convert_dict(self, path, key, v):
if key in registered_dicts:
constructor, _type = registered_dicts[key]

29
electrum/wallet_db.py

@ -43,6 +43,7 @@ from .transaction import Transaction, TxOutpoint, tx_from_any, PartialTransactio
from .logging import Logger
from .lnutil import LOCAL, REMOTE, HTLCOwner, ChannelType
from . import json_db
from .json_db import StoredDict, JsonDB, locked, modifier, StoredObject, stored_in, stored_as
from .plugin import run_hook, plugin_loaders
from .version import ELECTRUM_VERSION
@ -86,25 +87,25 @@ class DBMetadata(StoredObject):
# separate tracking issues
class WalletFileExceptionVersion51(WalletFileException): pass
# register dicts that require value conversions not handled by constructor
json_db.register_dict('transactions', lambda x: tx_from_any(x, deserialize=False), None)
json_db.register_dict('prevouts_by_scripthash', lambda x: set(tuple(k) for k in x), None)
json_db.register_dict('data_loss_protect_remote_pcp', lambda x: bytes.fromhex(x), None)
# register dicts that require key conversion
for key in [
'adds', 'locked_in', 'settles', 'fails', 'fee_updates', 'buckets',
'unacked_updates', 'unfulfilled_htlcs', 'fail_htlc_reasons', 'onion_keys']:
json_db.register_dict_key(key, int)
for key in ['log']:
json_db.register_dict_key(key, lambda x: HTLCOwner(int(x)))
for key in ['locked_in', 'fails', 'settles']:
json_db.register_parent_key(key, lambda x: HTLCOwner(int(x)))
class WalletDB(JsonDB):
def __init__(self, raw, *, manual_upgrades: bool):
JsonDB.__init__(self, {})
# register dicts that require value conversions not handled by constructor
self.register_dict('transactions', lambda x: tx_from_any(x, deserialize=False), None)
self.register_dict('prevouts_by_scripthash', lambda x: set(tuple(k) for k in x), None)
self.register_dict('data_loss_protect_remote_pcp', lambda x: bytes.fromhex(x), None)
# register dicts that require key conversion
for key in [
'adds', 'locked_in', 'settles', 'fails', 'fee_updates', 'buckets',
'unacked_updates', 'unfulfilled_htlcs', 'fail_htlc_reasons', 'onion_keys']:
self.register_dict_key(key, int)
for key in ['log']:
self.register_dict_key(key, lambda x: HTLCOwner(int(x)))
for key in ['locked_in', 'fails', 'settles']:
self.register_parent_key(key, lambda x: HTLCOwner(int(x)))
self._manual_upgrades = manual_upgrades
self._called_after_upgrade_tasks = False
if raw: # loading existing db

Loading…
Cancel
Save