cat_gateway/db/index/block/
mod.rs1pub(crate) mod certs;
5pub(crate) mod cip36;
6pub(crate) mod rbac509;
7pub(crate) mod roll_forward;
8pub(crate) mod txi;
9pub(crate) mod txo;
10
11use cardano_blockchain_types::MultiEraBlock;
12use catalyst_types::hashes::Blake2b256Hash;
13use certs::CertInsertQuery;
14use cip36::Cip36InsertQuery;
15use rbac509::Rbac509InsertQuery;
16use tracing::error;
17use txi::TxiInsertQuery;
18use txo::TxoInsertQuery;
19
20use super::{queries::FallibleQueryTasks, session::CassandraSession};
21
22pub(crate) async fn index_block(block: &MultiEraBlock) -> anyhow::Result<()> {
24 let Some(session) = CassandraSession::get(block.is_immutable()) else {
26 anyhow::bail!("Failed to get Index DB Session. Can not index block.");
27 };
28
29 let mut cert_index = CertInsertQuery::new();
30 let mut cip36_index = Cip36InsertQuery::new();
31 let mut rbac509_index = Rbac509InsertQuery::new();
32
33 let mut txi_index = TxiInsertQuery::new();
34 let mut txo_index = TxoInsertQuery::new();
35
36 let slot_no = block.point().slot_or_default();
37
38 for (index, txn) in block.enumerate_txs() {
40 let txn_id = Blake2b256Hash::from(txn.hash()).into();
41
42 txi_index.index(&txn, slot_no);
44
45 cip36_index.index(index, slot_no, block);
50
51 cert_index.index(&txn, slot_no, index, block);
53
54 txo_index.index(block.network(), &txn, slot_no, txn_id, index);
56
57 rbac509_index.index(&session, txn_id, index, block).await;
59 }
60
61 let mut query_handles: FallibleQueryTasks = Vec::new();
64
65 query_handles.extend(txo_index.execute(&session));
66 query_handles.extend(txi_index.execute(&session));
67 query_handles.extend(cert_index.execute(&session));
68 query_handles.extend(cip36_index.execute(&session));
69 query_handles.extend(rbac509_index.execute(&session));
70
71 let mut result: anyhow::Result<()> = Ok(());
72
73 for handle in query_handles {
75 if result.is_err() {
76 handle.abort();
78 continue;
79 }
80 match handle.await {
81 Ok(join_res) => {
82 if let Err(error) = join_res {
83 error!(error=%error,"Query Failed");
85 result = Err(error);
86 }
87 },
88 Err(error) => {
89 error!(error=%error,"Query Join Failed");
90 result = Err(error.into());
91 },
92 }
93 }
94
95 result
96}