From 16059211b973a71bee9f9907dcaaee26e63dabb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C5=9Fu?= Date: Thu, 10 Apr 2025 18:21:50 +0300 Subject: [PATCH] Add contains ticketbook data db query (#5670) * Add contains ticketbook data db query * Fix clippy * Use exists for better performance --- .../credential-storage/src/backends/memory.rs | 15 +++++++++++++++ .../credential-storage/src/backends/sqlite.rs | 18 ++++++++++++++++++ .../src/ephemeral_storage.rs | 7 +++++++ .../src/persistent_storage/mod.rs | 10 ++++++++++ common/credential-storage/src/storage.rs | 5 +++++ 5 files changed, 55 insertions(+) diff --git a/common/credential-storage/src/backends/memory.rs b/common/credential-storage/src/backends/memory.rs index 91d197d632..f565376748 100644 --- a/common/credential-storage/src/backends/memory.rs +++ b/common/credential-storage/src/backends/memory.rs @@ -172,6 +172,21 @@ impl MemoryEcachTicketbookManager { ); } + pub(crate) async fn contains_ticketbook(&self, ticketbook: &IssuedTicketBook) -> bool { + let ser = ticketbook.pack(); + let search_data = Zeroizing::new(ser.data); + self.inner + .read() + .await + .ticketbooks + .iter() + .any(|ticketbook| { + let ser = ticketbook.1.ticketbook.pack(); + let data = Zeroizing::new(ser.data); + search_data.eq(&data) + }) + } + pub(crate) async fn get_ticketbooks_info(&self) -> Vec { let guard = self.inner.read().await; diff --git a/common/credential-storage/src/backends/sqlite.rs b/common/credential-storage/src/backends/sqlite.rs index dec0899064..f1fd0b802d 100644 --- a/common/credential-storage/src/backends/sqlite.rs +++ b/common/credential-storage/src/backends/sqlite.rs @@ -95,6 +95,24 @@ impl SqliteEcashTicketbookManager { Ok(()) } + pub(crate) async fn contains_ticketbook_data(&self, data: &[u8]) -> Result { + let exists = sqlx::query( + r#" + SELECT EXISTS ( + SELECT 1 + FROM ecash_ticketbook + WHERE ticketbook_data = ? + ) + "#, + ) + .bind(data) + .fetch_optional(&self.connection_pool) + .await? + .is_some(); + + Ok(exists) + } + pub(crate) async fn get_ticketbooks_info( &self, ) -> Result, sqlx::Error> { diff --git a/common/credential-storage/src/ephemeral_storage.rs b/common/credential-storage/src/ephemeral_storage.rs index b6a113f414..fdcd89ccbd 100644 --- a/common/credential-storage/src/ephemeral_storage.rs +++ b/common/credential-storage/src/ephemeral_storage.rs @@ -70,6 +70,13 @@ impl Storage for EphemeralStorage { Ok(()) } + async fn contains_issued_ticketbook( + &self, + ticketbook: &IssuedTicketBook, + ) -> Result { + Ok(self.storage_manager.contains_ticketbook(ticketbook).await) + } + async fn get_ticketbooks_info( &self, ) -> Result, Self::StorageError> { diff --git a/common/credential-storage/src/persistent_storage/mod.rs b/common/credential-storage/src/persistent_storage/mod.rs index 32b6f581de..565ab94513 100644 --- a/common/credential-storage/src/persistent_storage/mod.rs +++ b/common/credential-storage/src/persistent_storage/mod.rs @@ -145,6 +145,16 @@ impl Storage for PersistentStorage { Ok(()) } + async fn contains_issued_ticketbook( + &self, + ticketbook: &IssuedTicketBook, + ) -> Result { + let ser = ticketbook.pack(); + let data = Zeroizing::new(ser.data); + + Ok(self.storage_manager.contains_ticketbook_data(&data).await?) + } + async fn get_ticketbooks_info( &self, ) -> Result, Self::StorageError> { diff --git a/common/credential-storage/src/storage.rs b/common/credential-storage/src/storage.rs index bc2a6ac7d5..b4288f1b88 100644 --- a/common/credential-storage/src/storage.rs +++ b/common/credential-storage/src/storage.rs @@ -37,6 +37,11 @@ pub trait Storage: Clone + Send + Sync { ticketbook: &IssuedTicketBook, ) -> Result<(), Self::StorageError>; + async fn contains_issued_ticketbook( + &self, + ticketbook: &IssuedTicketBook, + ) -> Result; + async fn get_ticketbooks_info( &self, ) -> Result, Self::StorageError>;