lbry-sdk/lbry/lbrynet/wallet/database.py

141 lines
4.8 KiB
Python
Raw Normal View History

2019-03-24 21:55:04 +01:00
from typing import List
2018-11-04 07:24:41 +01:00
from torba.client.basedatabase import BaseDatabase
2018-06-12 17:53:29 +02:00
2019-03-24 21:55:04 +01:00
from lbrynet.wallet.transaction import Output
2018-06-12 17:53:29 +02:00
class WalletDatabase(BaseDatabase):
CREATE_TXO_TABLE = """
create table if not exists txo (
2018-07-15 05:02:19 +02:00
txid text references tx,
txoid text primary key,
address text references pubkey_address,
position integer not null,
amount integer not null,
script blob not null,
is_reserved boolean not null default 0,
2018-07-12 05:18:59 +02:00
2018-07-15 05:02:19 +02:00
claim_id text,
claim_name text,
is_claim boolean not null default 0,
is_update boolean not null default 0,
2018-08-14 22:16:29 +02:00
is_support boolean not null default 0,
2018-08-23 05:47:37 +02:00
is_buy boolean not null default 0,
is_sell boolean not null default 0
);
2018-10-10 05:58:32 +02:00
create index if not exists txo_claim_id_idx on txo (claim_id);
"""
2018-06-12 17:53:29 +02:00
CREATE_TABLES_QUERY = (
BaseDatabase.CREATE_TX_TABLE +
BaseDatabase.CREATE_PUBKEY_ADDRESS_TABLE +
2018-10-10 05:40:02 +02:00
BaseDatabase.CREATE_PUBKEY_ADDRESS_INDEX +
CREATE_TXO_TABLE +
2018-10-10 05:40:02 +02:00
BaseDatabase.CREATE_TXO_INDEX +
BaseDatabase.CREATE_TXI_TABLE +
BaseDatabase.CREATE_TXI_INDEX
2018-06-12 17:53:29 +02:00
)
def txo_to_row(self, tx, address, txo):
row = super().txo_to_row(tx, address, txo)
row.update({
'is_claim': txo.script.is_claim_name,
'is_update': txo.script.is_update_claim,
'is_support': txo.script.is_support_claim,
2018-08-23 05:47:37 +02:00
'is_buy': txo.script.is_buy_claim,
'is_sell': txo.script.is_sell_claim,
})
if txo.script.is_claim_involved:
row['claim_id'] = txo.claim_id
row['claim_name'] = txo.claim_name
return row
2018-07-12 05:18:59 +02:00
2019-03-24 21:55:04 +01:00
async def get_txos(self, **constraints) -> List[Output]:
my_account = constraints.get('my_account', constraints.get('account', None))
2018-10-15 23:16:43 +02:00
txos = await super().get_txos(**constraints)
2018-10-05 15:02:02 +02:00
channel_ids = set()
2018-10-05 15:02:02 +02:00
for txo in txos:
if txo.is_claim and txo.can_decode_claim:
2019-03-20 06:46:23 +01:00
if txo.claim.is_signed:
channel_ids.add(txo.claim.signing_channel_id)
2019-03-24 21:55:04 +01:00
if txo.claim.is_channel and my_account is not None:
2019-05-29 00:46:50 +02:00
txo.private_key = my_account.get_channel_private_key(
txo.claim.channel.public_key_bytes
)
2018-10-05 15:02:02 +02:00
if channel_ids:
2018-10-05 15:02:02 +02:00
channels = {
txo.claim_id: txo for txo in
2018-10-30 21:20:43 +01:00
(await self.get_claims(
2018-10-05 15:02:02 +02:00
my_account=my_account,
claim_id__in=channel_ids
2018-10-05 15:02:02 +02:00
))
}
for txo in txos:
if txo.script.is_claim_name or txo.script.is_update_claim:
txo.channel = channels.get(txo.claim.signing_channel_id, None)
2018-10-05 15:02:02 +02:00
return txos
@staticmethod
def constrain_claims(constraints):
2019-03-24 21:55:04 +01:00
constraints['claim_type__any'] = {'is_claim': 1, 'is_update': 1}
2019-03-24 21:55:04 +01:00
async def get_claims(self, **constraints) -> List[Output]:
self.constrain_claims(constraints)
2019-03-24 21:55:04 +01:00
return await self.get_utxos(**constraints)
def get_claim_count(self, **constraints):
self.constrain_claims(constraints)
return self.get_utxo_count(**constraints)
@staticmethod
def constrain_streams(constraints):
if 'claim_name' not in constraints or 'claim_id' not in constraints:
constraints['claim_name__not_like'] = '@%'
def get_streams(self, **constraints):
self.constrain_streams(constraints)
return self.get_claims(**constraints)
def get_stream_count(self, **constraints):
self.constrain_streams(constraints)
return self.get_claim_count(**constraints)
@staticmethod
def constrain_channels(constraints):
if 'claim_name' not in constraints or 'claim_id' not in constraints:
constraints['claim_name__like'] = '@%'
def get_channels(self, **constraints):
self.constrain_channels(constraints)
return self.get_claims(**constraints)
2018-07-12 05:18:59 +02:00
def get_channel_count(self, **constraints):
self.constrain_channels(constraints)
return self.get_claim_count(**constraints)
2019-03-24 21:55:04 +01:00
@staticmethod
def constrain_supports(constraints):
constraints['is_support'] = 1
def get_supports(self, **constraints):
self.constrain_supports(constraints)
return self.get_utxos(**constraints)
def get_support_count(self, **constraints):
self.constrain_supports(constraints)
return self.get_utxo_count(**constraints)
2019-01-04 08:49:29 +01:00
async def release_all_outputs(self, account):
await self.db.execute(
"UPDATE txo SET is_reserved = 0 WHERE"
" is_reserved = 1 AND txo.address IN ("
" SELECT address from pubkey_address WHERE account = ?"
" )", [account.public_key.address]
)