Host-customized fork of https://github.com/tecnovert/basicswap/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
308 lines
13 KiB
308 lines
13 KiB
# -*- coding: utf-8 -*- |
|
|
|
# Copyright (c) 2022-2023 tecnovert |
|
# Distributed under the MIT software license, see the accompanying |
|
# file LICENSE or http://www.opensource.org/licenses/mit-license.php. |
|
|
|
import json |
|
import time |
|
|
|
from sqlalchemy.orm import scoped_session |
|
from .db import ( |
|
BidState, |
|
Concepts, |
|
AutomationStrategy, |
|
CURRENT_DB_VERSION, |
|
CURRENT_DB_DATA_VERSION) |
|
|
|
from .basicswap_util import ( |
|
BidStates, |
|
strBidState, |
|
isActiveBidState, |
|
isErrorBidState, |
|
isFailingBidState, |
|
isFinalBidState, |
|
) |
|
|
|
|
|
def upgradeDatabaseData(self, data_version): |
|
if data_version >= CURRENT_DB_DATA_VERSION: |
|
return |
|
|
|
self.log.info('Upgrading database records from version %d to %d.', data_version, CURRENT_DB_DATA_VERSION) |
|
with self.mxDB: |
|
try: |
|
session = scoped_session(self.session_factory) |
|
|
|
now = int(time.time()) |
|
|
|
if data_version < 1: |
|
session.add(AutomationStrategy( |
|
active_ind=1, |
|
label='Accept All', |
|
type_ind=Concepts.OFFER, |
|
data=json.dumps({'exact_rate_only': True, |
|
'max_concurrent_bids': 5}).encode('utf-8'), |
|
only_known_identities=False, |
|
created_at=now)) |
|
session.add(AutomationStrategy( |
|
active_ind=1, |
|
label='Accept Known', |
|
type_ind=Concepts.OFFER, |
|
data=json.dumps({'exact_rate_only': True, |
|
'max_concurrent_bids': 5}).encode('utf-8'), |
|
only_known_identities=True, |
|
note='Accept bids from identities with previously successful swaps only', |
|
created_at=now)) |
|
|
|
for state in BidStates: |
|
session.add(BidState( |
|
active_ind=1, |
|
state_id=int(state), |
|
in_progress=isActiveBidState(state), |
|
in_error=isErrorBidState(state), |
|
swap_failed=isFailingBidState(state), |
|
swap_ended=isFinalBidState(state), |
|
label=strBidState(state), |
|
created_at=now)) |
|
|
|
if data_version > 0 and data_version < 2: |
|
for state in (BidStates.XMR_SWAP_MSG_SCRIPT_LOCK_TX_SIGS, BidStates.XMR_SWAP_MSG_SCRIPT_LOCK_SPEND_TX): |
|
session.add(BidState( |
|
active_ind=1, |
|
state_id=int(state), |
|
in_progress=isActiveBidState(state), |
|
label=strBidState(state), |
|
created_at=now)) |
|
if data_version > 0 and data_version < 3: |
|
for state in BidStates: |
|
in_error = isErrorBidState(state) |
|
swap_failed = isFailingBidState(state) |
|
swap_ended = isFinalBidState(state) |
|
session.execute('UPDATE bidstates SET in_error = :in_error, swap_failed = :swap_failed, swap_ended = :swap_ended WHERE state_id = :state_id', {'in_error': in_error, 'swap_failed': swap_failed, 'swap_ended': swap_ended, 'state_id': int(state)}) |
|
if data_version > 0 and data_version < 4: |
|
for state in (BidStates.BID_REQUEST_SENT, BidStates.BID_REQUEST_ACCEPTED): |
|
session.add(BidState( |
|
active_ind=1, |
|
state_id=int(state), |
|
in_progress=isActiveBidState(state), |
|
in_error=isErrorBidState(state), |
|
swap_failed=isFailingBidState(state), |
|
swap_ended=isFinalBidState(state), |
|
label=strBidState(state), |
|
created_at=now)) |
|
|
|
self.db_data_version = CURRENT_DB_DATA_VERSION |
|
self.setIntKVInSession('db_data_version', self.db_data_version, session) |
|
session.commit() |
|
self.log.info('Upgraded database records to version {}'.format(self.db_data_version)) |
|
finally: |
|
session.close() |
|
session.remove() |
|
|
|
|
|
def upgradeDatabase(self, db_version): |
|
if db_version >= CURRENT_DB_VERSION: |
|
return |
|
|
|
self.log.info('Upgrading database from version %d to %d.', db_version, CURRENT_DB_VERSION) |
|
|
|
while True: |
|
session = scoped_session(self.session_factory) |
|
|
|
current_version = db_version |
|
if current_version == 6: |
|
session.execute('ALTER TABLE bids ADD COLUMN security_token BLOB') |
|
session.execute('ALTER TABLE offers ADD COLUMN security_token BLOB') |
|
db_version += 1 |
|
elif current_version == 7: |
|
session.execute('ALTER TABLE transactions ADD COLUMN block_hash BLOB') |
|
session.execute('ALTER TABLE transactions ADD COLUMN block_height INTEGER') |
|
session.execute('ALTER TABLE transactions ADD COLUMN block_time INTEGER') |
|
db_version += 1 |
|
elif current_version == 8: |
|
session.execute(''' |
|
CREATE TABLE wallets ( |
|
record_id INTEGER NOT NULL, |
|
coin_id INTEGER, |
|
wallet_name VARCHAR, |
|
wallet_data VARCHAR, |
|
balance_type INTEGER, |
|
created_at BIGINT, |
|
PRIMARY KEY (record_id))''') |
|
db_version += 1 |
|
elif current_version == 9: |
|
session.execute('ALTER TABLE wallets ADD COLUMN wallet_data VARCHAR') |
|
db_version += 1 |
|
elif current_version == 10: |
|
session.execute('ALTER TABLE smsgaddresses ADD COLUMN active_ind INTEGER') |
|
session.execute('ALTER TABLE smsgaddresses ADD COLUMN created_at INTEGER') |
|
session.execute('ALTER TABLE smsgaddresses ADD COLUMN note VARCHAR') |
|
session.execute('ALTER TABLE smsgaddresses ADD COLUMN pubkey VARCHAR') |
|
session.execute('UPDATE smsgaddresses SET active_ind = 1, created_at = 1') |
|
|
|
session.execute('ALTER TABLE offers ADD COLUMN addr_to VARCHAR') |
|
session.execute(f'UPDATE offers SET addr_to = "{self.network_addr}"') |
|
db_version += 1 |
|
elif current_version == 11: |
|
session.execute('ALTER TABLE bids ADD COLUMN chain_a_height_start INTEGER') |
|
session.execute('ALTER TABLE bids ADD COLUMN chain_b_height_start INTEGER') |
|
session.execute('ALTER TABLE bids ADD COLUMN protocol_version INTEGER') |
|
session.execute('ALTER TABLE offers ADD COLUMN protocol_version INTEGER') |
|
session.execute('ALTER TABLE transactions ADD COLUMN tx_data BLOB') |
|
db_version += 1 |
|
elif current_version == 12: |
|
session.execute(''' |
|
CREATE TABLE knownidentities ( |
|
record_id INTEGER NOT NULL, |
|
address VARCHAR, |
|
label VARCHAR, |
|
publickey BLOB, |
|
num_sent_bids_successful INTEGER, |
|
num_recv_bids_successful INTEGER, |
|
num_sent_bids_rejected INTEGER, |
|
num_recv_bids_rejected INTEGER, |
|
num_sent_bids_failed INTEGER, |
|
num_recv_bids_failed INTEGER, |
|
note VARCHAR, |
|
updated_at BIGINT, |
|
created_at BIGINT, |
|
PRIMARY KEY (record_id))''') |
|
session.execute('ALTER TABLE bids ADD COLUMN reject_code INTEGER') |
|
session.execute('ALTER TABLE bids ADD COLUMN rate INTEGER') |
|
session.execute('ALTER TABLE offers ADD COLUMN amount_negotiable INTEGER') |
|
session.execute('ALTER TABLE offers ADD COLUMN rate_negotiable INTEGER') |
|
db_version += 1 |
|
elif current_version == 13: |
|
db_version += 1 |
|
session.execute(''' |
|
CREATE TABLE automationstrategies ( |
|
record_id INTEGER NOT NULL, |
|
active_ind INTEGER, |
|
label VARCHAR, |
|
type_ind INTEGER, |
|
only_known_identities INTEGER, |
|
num_concurrent INTEGER, |
|
data BLOB, |
|
|
|
note VARCHAR, |
|
created_at BIGINT, |
|
PRIMARY KEY (record_id))''') |
|
|
|
session.execute(''' |
|
CREATE TABLE automationlinks ( |
|
record_id INTEGER NOT NULL, |
|
active_ind INTEGER, |
|
|
|
linked_type INTEGER, |
|
linked_id BLOB, |
|
strategy_id INTEGER, |
|
|
|
data BLOB, |
|
repeat_limit INTEGER, |
|
repeat_count INTEGER, |
|
|
|
note VARCHAR, |
|
created_at BIGINT, |
|
PRIMARY KEY (record_id))''') |
|
|
|
session.execute(''' |
|
CREATE TABLE history ( |
|
record_id INTEGER NOT NULL, |
|
concept_type INTEGER, |
|
concept_id INTEGER, |
|
changed_data BLOB, |
|
|
|
note VARCHAR, |
|
created_at BIGINT, |
|
PRIMARY KEY (record_id))''') |
|
|
|
session.execute(''' |
|
CREATE TABLE bidstates ( |
|
record_id INTEGER NOT NULL, |
|
active_ind INTEGER, |
|
state_id INTEGER, |
|
label VARCHAR, |
|
in_progress INTEGER, |
|
|
|
note VARCHAR, |
|
created_at BIGINT, |
|
PRIMARY KEY (record_id))''') |
|
|
|
session.execute('ALTER TABLE wallets ADD COLUMN active_ind INTEGER') |
|
session.execute('ALTER TABLE knownidentities ADD COLUMN active_ind INTEGER') |
|
session.execute('ALTER TABLE eventqueue RENAME TO actions') |
|
session.execute('ALTER TABLE actions RENAME COLUMN event_id TO action_id') |
|
session.execute('ALTER TABLE actions RENAME COLUMN event_type TO action_type') |
|
session.execute('ALTER TABLE actions RENAME COLUMN event_data TO action_data') |
|
elif current_version == 14: |
|
db_version += 1 |
|
session.execute('ALTER TABLE xmr_swaps ADD COLUMN coin_a_lock_release_msg_id BLOB') |
|
session.execute('ALTER TABLE xmr_swaps RENAME COLUMN coin_a_lock_refund_spend_tx_msg_id TO coin_a_lock_spend_tx_msg_id') |
|
elif current_version == 15: |
|
db_version += 1 |
|
session.execute(''' |
|
CREATE TABLE notifications ( |
|
record_id INTEGER NOT NULL, |
|
active_ind INTEGER, |
|
event_type INTEGER, |
|
event_data BLOB, |
|
created_at BIGINT, |
|
PRIMARY KEY (record_id))''') |
|
elif current_version == 16: |
|
db_version += 1 |
|
session.execute(''' |
|
CREATE TABLE prefunded_transactions ( |
|
record_id INTEGER NOT NULL, |
|
active_ind INTEGER, |
|
created_at BIGINT, |
|
linked_type INTEGER, |
|
linked_id BLOB, |
|
tx_type INTEGER, |
|
tx_data BLOB, |
|
used_by BLOB, |
|
PRIMARY KEY (record_id))''') |
|
elif current_version == 17: |
|
db_version += 1 |
|
session.execute('ALTER TABLE knownidentities ADD COLUMN automation_override INTEGER') |
|
session.execute('ALTER TABLE knownidentities ADD COLUMN visibility_override INTEGER') |
|
session.execute('ALTER TABLE knownidentities ADD COLUMN data BLOB') |
|
session.execute('UPDATE knownidentities SET active_ind = 1') |
|
elif current_version == 18: |
|
db_version += 1 |
|
session.execute('ALTER TABLE xmr_split_data ADD COLUMN addr_from STRING') |
|
session.execute('ALTER TABLE xmr_split_data ADD COLUMN addr_to STRING') |
|
elif current_version == 19: |
|
db_version += 1 |
|
session.execute('ALTER TABLE bidstates ADD COLUMN in_error INTEGER') |
|
session.execute('ALTER TABLE bidstates ADD COLUMN swap_failed INTEGER') |
|
session.execute('ALTER TABLE bidstates ADD COLUMN swap_ended INTEGER') |
|
elif current_version == 20: |
|
db_version += 1 |
|
session.execute(''' |
|
CREATE TABLE message_links ( |
|
record_id INTEGER NOT NULL, |
|
active_ind INTEGER, |
|
created_at BIGINT, |
|
|
|
linked_type INTEGER, |
|
linked_id BLOB, |
|
|
|
msg_type INTEGER, |
|
msg_sequence INTEGER, |
|
msg_id BLOB, |
|
PRIMARY KEY (record_id))''') |
|
session.execute('ALTER TABLE offers ADD COLUMN bid_reversed INTEGER') |
|
|
|
if current_version != db_version: |
|
self.db_version = db_version |
|
self.setIntKVInSession('db_version', db_version, session) |
|
session.commit() |
|
session.close() |
|
session.remove() |
|
self.log.info('Upgraded database to version {}'.format(self.db_version)) |
|
continue |
|
break |
|
|
|
if db_version != CURRENT_DB_VERSION: |
|
raise ValueError('Unable to upgrade database.')
|
|
|