def get_all_asset_data( mapping: bool ) -> Union[List[AssetData], Dict[str, Dict[str, Any]]]: """Return all asset data from the DB TODO: This can be improved. Too many sql queries. If mapping is True, return them as a Dict of identifier to data If mapping is False, return them as a List of AssetData """ result: Union[List[AssetData], Dict[str, Dict[str, Any]]] if mapping: result = {} else: result = [] cursor = GlobalDBHandler()._conn.cursor() querystr = """ SELECT A.identifier, A.type, B.address, B.decimals, A.name, A.symbol, A.started, null, A.swapped_for, A.coingecko, A.cryptocompare, B.protocol from assets as A LEFT OUTER JOIN ethereum_tokens as B ON B.address = A.details_reference WHERE A.type=? UNION ALL SELECT A.identifier, A.type, null, null, A.name, A.symbol, A.started, B.forked, A.swapped_for, A.coingecko, A.cryptocompare, null from assets as A LEFT OUTER JOIN common_asset_details as B ON B.asset_id = A.identifier WHERE A.type!=?; """ # noqa: E501 eth_token_type = AssetType.ETHEREUM_TOKEN.serialize_for_db() # pylint: disable=no-member query = cursor.execute(querystr, (eth_token_type, eth_token_type)) for entry in query: asset_type = AssetType.deserialize_from_db(entry[1]) ethereum_address: Optional[ChecksumEthAddress] if asset_type == AssetType.ETHEREUM_TOKEN: ethereum_address = string_to_ethereum_address(entry[2]) else: ethereum_address = None data = AssetData( identifier=entry[0], asset_type=asset_type, ethereum_address=ethereum_address, decimals=entry[3], name=entry[4], symbol=entry[5], started=entry[6], forked=entry[7], swapped_for=entry[8], coingecko=entry[9], cryptocompare=entry[10], protocol=entry[11], ) if mapping: result[entry[0]] = data.serialize() # type: ignore else: result.append(data) # type: ignore return result
def test_get_all_asset_data_specific_ids(globaldb): btc_asset_data = AssetData( identifier='BTC', name='Bitcoin', symbol='BTC', asset_type=AssetType.OWN_CHAIN, started=Timestamp(1231006505), forked=None, swapped_for=None, ethereum_address=None, decimals=None, cryptocompare=None, coingecko='bitcoin', protocol=None, ) eth_asset_data = AssetData( identifier='ETH', name='Ethereum', symbol='ETH', asset_type=AssetType.OWN_CHAIN, started=Timestamp(1438214400), forked=None, swapped_for=None, ethereum_address=None, decimals=None, cryptocompare=None, coingecko='ethereum', protocol=None, ) asset_data = globaldb.get_all_asset_data( mapping=False, specific_ids=['BTC', 'ETH', selfkey_id, 'BIDR'], ) assert asset_data == [ selfkey_asset_data, bidr_asset_data, btc_asset_data, eth_asset_data, ] asset_data = globaldb.get_all_asset_data( mapping=True, serialized=True, specific_ids=['BTC', 'ETH', selfkey_id, 'BIDR'], ) assert asset_data == { selfkey_id: selfkey_asset_data.serialize(), 'BIDR': bidr_asset_data.serialize(), 'BTC': btc_asset_data.serialize(), 'ETH': eth_asset_data.serialize(), } asset_data = globaldb.get_all_asset_data( mapping=True, serialized=False, specific_ids=['BTC', 'ETH', selfkey_id, 'BIDR'], ) assert asset_data == { selfkey_id: selfkey_asset_data, 'BIDR': bidr_asset_data, 'BTC': btc_asset_data, 'ETH': eth_asset_data, } # unknown ids assert globaldb.get_all_asset_data( mapping=False, specific_ids=['INVALIDIDSS!@!1', 'DSAD#@$DSAD@EAS'], ) == [] assert globaldb.get_all_asset_data( mapping=True, specific_ids=['INVALIDIDSS!@!1', 'DSAD#@$DSAD@EAS'], ) == {} # empty list assert globaldb.get_all_asset_data( mapping=False, specific_ids=[], ) == [] assert globaldb.get_all_asset_data( mapping=True, specific_ids=[], ) == {}