1pub(crate) mod catalyst_id_for_stake_address;
4pub(crate) mod catalyst_id_for_txn_id;
5pub(crate) mod cip36_registration;
6pub(crate) mod cip36_registration_for_vote_key;
7pub(crate) mod cip36_registration_invalid;
8pub(crate) mod rbac509_invalid_registration;
9pub(crate) mod rbac509_registration;
10pub(crate) mod stake_registration;
11pub(crate) mod txi_by_hash;
12pub(crate) mod txo_ada;
13pub(crate) mod txo_assets;
14pub(crate) mod unstaked_txo_ada;
15pub(crate) mod unstaked_txo_assets;
16
17use std::{fmt::Debug, sync::Arc};
18
19use scylla::{
20 prepared_statement::PreparedStatement, serialize::row::SerializeRow,
21 transport::iterator::QueryPager, Session,
22};
23
24use super::{FallibleQueryResults, SizedBatch};
25use crate::settings::cassandra_db;
26
27const NO_PARAMS: () = ();
29
30#[derive(strum_macros::Display)]
32pub(crate) enum PreparedDeleteQuery {
33 TxoAda,
35 TxoAssets,
37 UnstakedTxoAda,
39 UnstakedTxoAsset,
41 Txi,
43 StakeRegistration,
45 Cip36Registration,
47 Cip36RegistrationInvalid,
49 Cip36RegistrationForVoteKey,
51 Rbac509,
53 Rbac509Invalid,
55 CatalystIdForTxnId,
57 CatalystIdForStakeAddress,
59}
60
61#[derive(strum_macros::Display)]
63pub(crate) enum PreparedSelectQuery {
64 TxoAda,
66 TxoAssets,
68 UnstakedTxoAda,
70 UnstakedTxoAsset,
72 Txi,
74 StakeRegistration,
76 Cip36Registration,
78 Cip36RegistrationInvalid,
80 Cip36RegistrationForVoteKey,
82 Rbac509,
84 Rbac509Invalid,
86 CatalystIdForTxnId,
88 CatalystIdForStakeAddress,
90}
91
92pub(crate) struct PreparedQueries {
94 select_txo_ada: PreparedStatement,
96 delete_txo_ada: SizedBatch,
98 select_txo_assets: PreparedStatement,
100 delete_txo_assets: SizedBatch,
102 select_unstaked_txo_ada: PreparedStatement,
104 delete_unstaked_txo_ada: SizedBatch,
106 select_unstaked_txo_assets: PreparedStatement,
108 delete_unstaked_txo_assets: SizedBatch,
110 select_txi_by_hash: PreparedStatement,
112 delete_txi_by_hash: SizedBatch,
114 select_stake_registration: PreparedStatement,
116 delete_stake_registration: SizedBatch,
118 select_cip36_registration: PreparedStatement,
120 delete_cip36_registration: SizedBatch,
122 select_cip36_registration_invalid: PreparedStatement,
124 delete_cip36_registration_invalid: SizedBatch,
126 select_cip36_registration_for_vote_key: PreparedStatement,
128 delete_cip36_registration_for_vote_key: SizedBatch,
130 select_rbac509_registration: PreparedStatement,
132 delete_rbac509_registration: SizedBatch,
134 select_rbac509_invalid_registration: PreparedStatement,
136 delete_rbac509_invalid_registration: SizedBatch,
138 select_catalyst_id_for_txn_id: PreparedStatement,
140 delete_catalyst_id_for_txn_id: SizedBatch,
142 select_catalyst_id_for_stake_address: PreparedStatement,
144 delete_catalyst_id_for_stake_address: SizedBatch,
146}
147
148impl PreparedQueries {
149 pub(crate) async fn new(
151 session: Arc<Session>, cfg: &cassandra_db::EnvVars,
152 ) -> anyhow::Result<Self> {
153 Ok(Self {
155 select_txo_ada: txo_ada::PrimaryKeyQuery::prepare(&session).await?,
156 delete_txo_ada: txo_ada::DeleteQuery::prepare_batch(&session, cfg).await?,
157 select_txo_assets: txo_assets::PrimaryKeyQuery::prepare(&session).await?,
158 delete_txo_assets: txo_assets::DeleteQuery::prepare_batch(&session, cfg).await?,
159 select_unstaked_txo_ada: unstaked_txo_ada::PrimaryKeyQuery::prepare(&session).await?,
160 delete_unstaked_txo_ada: unstaked_txo_ada::DeleteQuery::prepare_batch(&session, cfg)
161 .await?,
162 select_unstaked_txo_assets: unstaked_txo_assets::PrimaryKeyQuery::prepare(&session)
163 .await?,
164 delete_unstaked_txo_assets: unstaked_txo_assets::DeleteQuery::prepare_batch(
165 &session, cfg,
166 )
167 .await?,
168 select_txi_by_hash: txi_by_hash::PrimaryKeyQuery::prepare(&session).await?,
169 delete_txi_by_hash: txi_by_hash::DeleteQuery::prepare_batch(&session, cfg).await?,
170 select_stake_registration: stake_registration::PrimaryKeyQuery::prepare(&session)
171 .await?,
172 delete_stake_registration: stake_registration::DeleteQuery::prepare_batch(
173 &session, cfg,
174 )
175 .await?,
176 select_cip36_registration: cip36_registration::PrimaryKeyQuery::prepare(&session)
177 .await?,
178 delete_cip36_registration: cip36_registration::DeleteQuery::prepare_batch(
179 &session, cfg,
180 )
181 .await?,
182 select_cip36_registration_invalid:
183 cip36_registration_invalid::PrimaryKeyQuery::prepare(&session).await?,
184 delete_cip36_registration_invalid:
185 cip36_registration_invalid::DeleteQuery::prepare_batch(&session, cfg).await?,
186 select_cip36_registration_for_vote_key:
187 cip36_registration_for_vote_key::PrimaryKeyQuery::prepare(&session).await?,
188 delete_cip36_registration_for_vote_key:
189 cip36_registration_for_vote_key::DeleteQuery::prepare_batch(&session, cfg).await?,
190 select_rbac509_registration: rbac509_registration::PrimaryKeyQuery::prepare(&session)
191 .await?,
192 delete_rbac509_registration: rbac509_registration::DeleteQuery::prepare_batch(
193 &session, cfg,
194 )
195 .await?,
196 select_rbac509_invalid_registration:
197 rbac509_invalid_registration::PrimaryKeyQuery::prepare(&session).await?,
198 delete_rbac509_invalid_registration:
199 rbac509_invalid_registration::DeleteQuery::prepare_batch(&session, cfg).await?,
200 select_catalyst_id_for_txn_id: catalyst_id_for_txn_id::PrimaryKeyQuery::prepare(
201 &session,
202 )
203 .await?,
204 delete_catalyst_id_for_txn_id: catalyst_id_for_txn_id::DeleteQuery::prepare_batch(
205 &session, cfg,
206 )
207 .await?,
208 select_catalyst_id_for_stake_address:
209 catalyst_id_for_stake_address::PrimaryKeyQuery::prepare(&session).await?,
210 delete_catalyst_id_for_stake_address:
211 catalyst_id_for_stake_address::DeleteQuery::prepare_batch(&session, cfg).await?,
212 })
213 }
214
215 pub(crate) async fn prepare(
217 session: Arc<Session>, query: &str, consistency: scylla::statement::Consistency,
218 idempotent: bool,
219 ) -> anyhow::Result<PreparedStatement> {
220 super::PreparedQueries::prepare(session, query, consistency, idempotent).await
221 }
222
223 pub(crate) async fn prepare_batch(
227 session: Arc<Session>, query: &str, cfg: &cassandra_db::EnvVars,
228 consistency: scylla::statement::Consistency, idempotent: bool, logged: bool,
229 ) -> anyhow::Result<SizedBatch> {
230 super::PreparedQueries::prepare_batch(session, query, cfg, consistency, idempotent, logged)
231 .await
232 }
233
234 pub(crate) async fn execute_iter(
239 &self, session: Arc<Session>, select_query: PreparedSelectQuery,
240 ) -> anyhow::Result<QueryPager> {
241 let prepared_stmt = match select_query {
242 PreparedSelectQuery::TxoAda => &self.select_txo_ada,
243 PreparedSelectQuery::TxoAssets => &self.select_txo_assets,
244 PreparedSelectQuery::UnstakedTxoAda => &self.select_unstaked_txo_ada,
245 PreparedSelectQuery::UnstakedTxoAsset => &self.select_unstaked_txo_assets,
246 PreparedSelectQuery::Txi => &self.select_txi_by_hash,
247 PreparedSelectQuery::StakeRegistration => &self.select_stake_registration,
248 PreparedSelectQuery::Cip36Registration => &self.select_cip36_registration,
249 PreparedSelectQuery::Cip36RegistrationInvalid => {
250 &self.select_cip36_registration_invalid
251 },
252 PreparedSelectQuery::Cip36RegistrationForVoteKey => {
253 &self.select_cip36_registration_for_vote_key
254 },
255 PreparedSelectQuery::Rbac509 => &self.select_rbac509_registration,
256 PreparedSelectQuery::Rbac509Invalid => &self.select_rbac509_invalid_registration,
257 PreparedSelectQuery::CatalystIdForTxnId => &self.select_catalyst_id_for_txn_id,
258 PreparedSelectQuery::CatalystIdForStakeAddress => {
259 &self.select_catalyst_id_for_stake_address
260 },
261 };
262
263 super::session_execute_iter(session, prepared_stmt, NO_PARAMS).await
264 }
265
266 pub(crate) async fn execute_batch<T: SerializeRow + Debug>(
268 &self, session: Arc<Session>, cfg: Arc<cassandra_db::EnvVars>, query: PreparedDeleteQuery,
269 values: Vec<T>,
270 ) -> FallibleQueryResults {
271 let query_map = match query {
272 PreparedDeleteQuery::TxoAda => &self.delete_txo_ada,
273 PreparedDeleteQuery::TxoAssets => &self.delete_txo_assets,
274 PreparedDeleteQuery::UnstakedTxoAda => &self.delete_unstaked_txo_ada,
275 PreparedDeleteQuery::UnstakedTxoAsset => &self.delete_unstaked_txo_assets,
276 PreparedDeleteQuery::Txi => &self.delete_txi_by_hash,
277 PreparedDeleteQuery::StakeRegistration => &self.delete_stake_registration,
278 PreparedDeleteQuery::Cip36Registration => &self.delete_cip36_registration,
279 PreparedDeleteQuery::Cip36RegistrationInvalid => {
280 &self.delete_cip36_registration_invalid
281 },
282 PreparedDeleteQuery::Cip36RegistrationForVoteKey => {
283 &self.delete_cip36_registration_for_vote_key
284 },
285 PreparedDeleteQuery::Rbac509 => &self.delete_rbac509_registration,
286 PreparedDeleteQuery::Rbac509Invalid => &self.delete_rbac509_invalid_registration,
287 PreparedDeleteQuery::CatalystIdForTxnId => &self.delete_catalyst_id_for_txn_id,
288 PreparedDeleteQuery::CatalystIdForStakeAddress => {
289 &self.delete_catalyst_id_for_stake_address
290 },
291 };
292
293 super::session_execute_batch(session, query_map, cfg, query, values).await
294 }
295}