json_db: do not overload load_data.
instead, pass an upgrader function to the constructor.
This commit is contained in:
+28
-46
@@ -32,6 +32,7 @@ from collections import defaultdict
|
||||
from typing import Dict, Optional, List, Tuple, Set, Iterable, NamedTuple, Sequence, TYPE_CHECKING, Union
|
||||
import binascii
|
||||
import time
|
||||
from functools import partial
|
||||
|
||||
import attr
|
||||
|
||||
@@ -1172,60 +1173,41 @@ class WalletDBUpgrader(Logger):
|
||||
raise WalletFileException(msg)
|
||||
|
||||
|
||||
def upgrade_wallet_db(data: dict, do_upgrade) -> Tuple[dict, bool]:
|
||||
was_upgraded = False
|
||||
|
||||
if len(data) == 0:
|
||||
# create new DB
|
||||
data['seed_version'] = FINAL_SEED_VERSION
|
||||
# store this for debugging purposes
|
||||
v = DBMetadata(
|
||||
creation_timestamp=int(time.time()),
|
||||
first_electrum_version_used=ELECTRUM_VERSION,
|
||||
)
|
||||
assert data.get("db_metadata", None) is None
|
||||
data["db_metadata"] = v
|
||||
was_upgraded = True
|
||||
|
||||
dbu = WalletDBUpgrader(data)
|
||||
if dbu.requires_split():
|
||||
raise WalletRequiresSplit(dbu.get_split_accounts())
|
||||
if dbu.requires_upgrade() and do_upgrade:
|
||||
dbu.upgrade()
|
||||
was_upgraded = True
|
||||
if dbu.requires_upgrade():
|
||||
raise WalletRequiresUpgrade()
|
||||
return dbu.data, was_upgraded
|
||||
|
||||
|
||||
class WalletDB(JsonDB):
|
||||
|
||||
def __init__(self, s, *, storage=None, upgrade=False):
|
||||
self._upgrade = upgrade
|
||||
JsonDB.__init__(self, s, storage, encoder=MyEncoder)
|
||||
JsonDB.__init__(self, s, storage, encoder=MyEncoder, upgrader=partial(upgrade_wallet_db, do_upgrade=upgrade))
|
||||
# create pointers
|
||||
self.load_transactions()
|
||||
# load plugins that are conditional on wallet type
|
||||
self.load_plugins()
|
||||
|
||||
def load_data(self, s):
|
||||
try:
|
||||
data, _ = JsonDB.load_data(self, s)
|
||||
except Exception:
|
||||
try:
|
||||
d = ast.literal_eval(s)
|
||||
labels = d.get('labels', {})
|
||||
except Exception as e:
|
||||
raise WalletFileException("Cannot read wallet file. (parsing failed)")
|
||||
data = {}
|
||||
for key, value in d.items():
|
||||
try:
|
||||
json.dumps(key)
|
||||
json.dumps(value)
|
||||
except Exception:
|
||||
self.logger.info(f'Failed to convert label to json format: {key}')
|
||||
continue
|
||||
data[key] = value
|
||||
if not isinstance(data, dict):
|
||||
raise WalletFileException("Malformed wallet file (not dict)")
|
||||
|
||||
if len(data) == 0:
|
||||
# create new DB
|
||||
data['seed_version'] = FINAL_SEED_VERSION
|
||||
# store this for debugging purposes
|
||||
v = DBMetadata(
|
||||
creation_timestamp=int(time.time()),
|
||||
first_electrum_version_used=ELECTRUM_VERSION,
|
||||
)
|
||||
assert data.get("db_metadata", None) is None
|
||||
data["db_metadata"] = v
|
||||
|
||||
dbu = WalletDBUpgrader(data)
|
||||
was_upgraded = False
|
||||
if dbu.requires_split():
|
||||
raise WalletRequiresSplit(dbu.get_split_accounts())
|
||||
if dbu.requires_upgrade() and self._upgrade:
|
||||
dbu.upgrade()
|
||||
was_upgraded = True
|
||||
if dbu.requires_upgrade():
|
||||
raise WalletRequiresUpgrade()
|
||||
return dbu.data, was_upgraded
|
||||
|
||||
|
||||
@locked
|
||||
def get_seed_version(self):
|
||||
return self.get('seed_version')
|
||||
|
||||
Reference in New Issue
Block a user