def add_asset( asset_id: str, asset_type: AssetType, data: Union[CustomEthereumToken, Dict[str, Any]], ) -> None: """ Add an asset in the DB. Either an ethereum token or a custom asset. If it's a custom asset the data should be typed. As given in by marshmallow. May raise InputError in case of error, meaning asset exists or some constraint hit""" connection = GlobalDBHandler()._conn cursor = connection.cursor() details_id: Union[str, ChecksumEthAddress] if asset_type == AssetType.ETHEREUM_TOKEN: token = cast(CustomEthereumToken, data) GlobalDBHandler().add_ethereum_token_data(token) details_id = token.address name = token.name symbol = token.symbol started = token.started swapped_for = token.swapped_for.identifier if token.swapped_for else None coingecko = token.coingecko cryptocompare = token.cryptocompare else: details_id = asset_id data = cast(Dict[str, Any], data) # The data should already be typed (as given in by marshmallow) name = data.get('name', None) symbol = data.get('symbol', None) started = data.get('started', None) swapped_for_asset = data.get('swapped_for', None) swapped_for = swapped_for_asset.identifier if swapped_for_asset else None coingecko = data.get('coingecko', None) cryptocompare = data.get('cryptocompare', None) try: cursor.execute( 'INSERT INTO assets(' 'identifier, type, name, symbol, started, swapped_for, ' 'coingecko, cryptocompare, details_reference) ' 'VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)', (asset_id, asset_type.serialize_for_db(), name, symbol, started, swapped_for, coingecko, cryptocompare, details_id), ) except sqlite3.IntegrityError as e: connection.rollback() raise InputError( f'Failed to add asset {asset_id} into the assets table for details id {details_id}', # noqa: E501 ) from e # for common asset details we have to add them after the addition of the main asset table if asset_type != AssetType.ETHEREUM_TOKEN: asset_data = cast(Dict[str, Any], data) asset_data['identifier'] = asset_id GlobalDBHandler().add_common_asset_details(asset_data) connection.commit() # success
def check_asset_exists( asset_type: AssetType, name: str, symbol: str, ) -> Optional[List[str]]: """Checks if an asset of a given type, symbol and name exists in the DB already For non ethereum tokens with no unique identifier like an address this is the only way to check if something already exists in the DB. If it exists it returns a list of the identifiers of the assets. """ cursor = GlobalDBHandler()._conn.cursor() query = cursor.execute( 'SELECT identifier from assets WHERE type=? AND name=? AND symbol=?;', (asset_type.serialize_for_db(), name, symbol), ) result = query.fetchall() if len(result) == 0: return None return [x[0] for x in result]