diff --git a/electrum/json_db.py b/electrum/json_db.py index 226c8480d..b4b56a38d 100644 --- a/electrum/json_db.py +++ b/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] diff --git a/electrum/wallet_db.py b/electrum/wallet_db.py index 2b38ad7de..cf889d453 100644 --- a/electrum/wallet_db.py +++ b/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