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