cat_gateway/db/index/block/txo/insert_txo_asset.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
//! Insert TXO Native Assets into the DB.
use std::sync::Arc;
use scylla::{SerializeRow, Session};
use tracing::error;
use crate::{
db::index::queries::{PreparedQueries, SizedBatch},
settings::cassandra_db,
};
/// TXO Asset by Stake Address Indexing Query
const INSERT_TXO_ASSET_QUERY: &str = include_str!("./cql/insert_txo_asset.cql");
/// Insert TXO Asset Query Parameters
/// (Superset of data to support both Staked and Unstaked TXO records.)
#[derive(SerializeRow, Debug)]
pub(super) struct Params {
/// Stake Address - Binary 28 bytes. 0 bytes = not staked.
stake_address: Vec<u8>,
/// Block Slot Number
slot_no: num_bigint::BigInt,
/// Transaction Offset inside the block.
txn: i16,
/// Transaction Output Offset inside the transaction.
txo: i16,
/// Policy hash of the asset
policy_id: Vec<u8>,
/// Name of the asset, within the Policy.
asset_name: Vec<u8>,
/// Value of the asset
value: num_bigint::BigInt,
}
impl Params {
/// Create a new record for this transaction.
///
/// Note Value can be either a u64 or an i64, so use a i128 to represent all possible
/// values.
#[allow(clippy::too_many_arguments)]
pub(super) fn new(
stake_address: &[u8], slot_no: u64, txn: i16, txo: i16, policy_id: &[u8],
asset_name: &[u8], value: i128,
) -> Self {
Self {
stake_address: stake_address.to_vec(),
slot_no: slot_no.into(),
txn,
txo,
policy_id: policy_id.to_vec(),
asset_name: asset_name.to_vec(),
value: value.into(),
}
}
/// Prepare Batch of Staked Insert TXO Asset Index Data Queries
pub(super) async fn prepare_batch(
session: &Arc<Session>, cfg: &cassandra_db::EnvVars,
) -> anyhow::Result<SizedBatch> {
let txo_insert_queries = PreparedQueries::prepare_batch(
session.clone(),
INSERT_TXO_ASSET_QUERY,
cfg,
scylla::statement::Consistency::Any,
true,
false,
)
.await;
if let Err(ref error) = txo_insert_queries {
error!(error=%error,"Failed to prepare Insert TXO Asset Query.");
};
txo_insert_queries
}
}