Bläddra i källkod

Remove lifetime from db transaction

Cesar Rodas 2 månader sedan
förälder
incheckning
5fe08bdebd

+ 5 - 6
crates/cdk-common/src/database/wallet.rs

@@ -17,15 +17,14 @@ use crate::wallet::{
 };
 
 /// Easy to use Dynamic Database type alias
-pub type DynWalletDatabaseTransaction<'a> =
-    Box<dyn DatabaseTransaction<'a, super::Error> + Sync + Send + 'a>;
+pub type DynWalletDatabaseTransaction = Box<dyn DatabaseTransaction<super::Error> + Sync + Send>;
 
 /// Database transaction
 ///
 /// This trait encapsulates all the changes to be done in the wallet
 #[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
 #[cfg_attr(not(target_arch = "wasm32"), async_trait)]
-pub trait DatabaseTransaction<'a, Error>: DbTransactionFinalizer<Err = Error> {
+pub trait DatabaseTransaction<Error>: DbTransactionFinalizer<Err = Error> {
     /// Add Mint to storage
     async fn add_mint(
         &mut self,
@@ -118,9 +117,9 @@ pub trait Database: Debug {
     type Err: Into<Error> + From<Error>;
 
     /// Begins a DB transaction
-    async fn begin_db_transaction<'a>(
-        &'a self,
-    ) -> Result<Box<dyn DatabaseTransaction<'a, Self::Err> + Send + Sync + 'a>, Self::Err>;
+    async fn begin_db_transaction(
+        &self,
+    ) -> Result<Box<dyn DatabaseTransaction<Self::Err> + Send + Sync>, Self::Err>;
 
     /// Get mint from storage
     async fn get_mint(&self, mint_url: MintUrl) -> Result<Option<MintInfo>, Self::Err>;

+ 6 - 16
crates/cdk-ffi/src/database.rs

@@ -438,10 +438,9 @@ impl CdkWalletDatabase for WalletDatabaseBridge {
             .map_err(|e| cdk::cdk_database::Error::Database(e.to_string().into()))
     }
 
-    async fn begin_db_transaction<'a>(
-        &'a self,
-    ) -> Result<Box<dyn CdkWalletDatabaseTransaction<'a, Self::Err> + Send + Sync + 'a>, Self::Err>
-    {
+    async fn begin_db_transaction(
+        &self,
+    ) -> Result<Box<dyn CdkWalletDatabaseTransaction<Self::Err> + Send + Sync>, Self::Err> {
         self.ffi_db
             .begin()
             .await
@@ -461,9 +460,7 @@ struct WalletDatabaseTransactionBridge {
 }
 
 #[async_trait::async_trait]
-impl<'a> CdkWalletDatabaseTransaction<'a, cdk::cdk_database::Error>
-    for WalletDatabaseTransactionBridge
-{
+impl CdkWalletDatabaseTransaction<cdk::cdk_database::Error> for WalletDatabaseTransactionBridge {
     async fn add_mint(
         &mut self,
         mint_url: cdk::mint_url::MintUrl,
@@ -786,7 +783,7 @@ where
     // our API that `inner` outlives the transaction. The transaction is always
     // explicitly committed or rolled back, and we never drop `inner` while a
     // transaction is active. Automatic rollback on drop ensures no dangling state.
-    tx: Mutex<Option<DynWalletDatabaseTransaction<'static>>>,
+    tx: Mutex<Option<DynWalletDatabaseTransaction>>,
 }
 
 impl<RM> FfiWalletSQLDatabase<RM>
@@ -822,14 +819,7 @@ where
             .await
             .map_err(|e| FfiError::Database { msg: e.to_string() })?;
 
-        // SAFETY: We transmute the lifetime from 'a to 'static. This is safe because:
-        // 1. `inner` (Arc<CdkWalletPgDatabase>) is never dropped while tx is active
-        // 2. Transaction is always explicitly committed/rolled back via our API
-        // 3. Transaction has automatic rollback on drop, so no dangling state
-        // 4. The struct design ensures inner outlives any transaction
-        let tx_static: DynWalletDatabaseTransaction<'static> = unsafe { std::mem::transmute(tx) };
-
-        *inner_tx = Some(tx_static);
+        *inner_tx = Some(tx);
         Ok(())
     }
 

+ 4 - 6
crates/cdk-redb/src/wallet/mod.rs

@@ -470,10 +470,10 @@ impl WalletDatabase for WalletRedbDatabase {
         Ok(transactions)
     }
 
-    async fn begin_db_transaction<'a>(
-        &'a self,
+    async fn begin_db_transaction(
+        &self,
     ) -> Result<
-        Box<dyn cdk_common::database::WalletDatabaseTransaction<'a, Self::Err> + Send + Sync + 'a>,
+        Box<dyn cdk_common::database::WalletDatabaseTransaction<Self::Err> + Send + Sync>,
         Self::Err,
     > {
         let write_txn = self.db.begin_write().map_err(Error::from)?;
@@ -482,9 +482,7 @@ impl WalletDatabase for WalletRedbDatabase {
 }
 
 #[async_trait]
-impl<'a> cdk_common::database::WalletDatabaseTransaction<'a, database::Error>
-    for RedbWalletTransaction
-{
+impl cdk_common::database::WalletDatabaseTransaction<database::Error> for RedbWalletTransaction {
     #[instrument(skip(self), fields(keyset_id = %keyset_id))]
     async fn get_keyset_by_id(
         &mut self,

+ 4 - 5
crates/cdk-sql-common/src/wallet/mod.rs

@@ -52,7 +52,7 @@ where
 }
 
 #[async_trait]
-impl<'a, RM> WalletDatabaseTransaction<'a, Error> for SQLWalletTransaction<RM>
+impl<RM> WalletDatabaseTransaction<Error> for SQLWalletTransaction<RM>
 where
     RM: DatabasePool + 'static,
 {
@@ -888,10 +888,9 @@ where
 {
     type Err = database::Error;
 
-    async fn begin_db_transaction<'a>(
-        &'a self,
-    ) -> Result<Box<dyn WalletDatabaseTransaction<'a, Self::Err> + Send + Sync + 'a>, Self::Err>
-    {
+    async fn begin_db_transaction(
+        &self,
+    ) -> Result<Box<dyn WalletDatabaseTransaction<Self::Err> + Send + Sync>, Self::Err> {
         Ok(Box::new(SQLWalletTransaction {
             inner: ConnectionWithTransaction::new(
                 self.pool.get().map_err(|e| Error::Database(Box::new(e)))?,

+ 1 - 1
crates/cdk/src/wallet/melt/mod.rs

@@ -49,7 +49,7 @@ impl Wallet {
 
     pub(crate) async fn add_transaction_for_pending_melt(
         &self,
-        tx: &mut DynWalletDatabaseTransaction<'_>,
+        tx: &mut DynWalletDatabaseTransaction,
         quote: &MeltQuote,
         response: &MeltQuoteBolt11Response<String>,
     ) -> Result<(), Error> {

+ 2 - 2
crates/cdk/src/wallet/mod.rs

@@ -371,7 +371,7 @@ impl Wallet {
     #[instrument(skip(self, tx))]
     pub(crate) async fn amounts_needed_for_state_target(
         &self,
-        tx: &mut DynWalletDatabaseTransaction<'_>,
+        tx: &mut DynWalletDatabaseTransaction,
         fee_and_amounts: &FeeAndAmounts,
     ) -> Result<Vec<Amount>, Error> {
         let unspent_proofs = self
@@ -409,7 +409,7 @@ impl Wallet {
     #[instrument(skip(self, tx))]
     async fn determine_split_target_values(
         &self,
-        tx: &mut DynWalletDatabaseTransaction<'_>,
+        tx: &mut DynWalletDatabaseTransaction,
         change_amount: Amount,
         fee_and_amounts: &FeeAndAmounts,
     ) -> Result<SplitTarget, Error> {

+ 1 - 1
crates/cdk/src/wallet/proofs.rs

@@ -47,7 +47,7 @@ impl Wallet {
     /// Get this wallet's [Proofs] that match the args
     pub async fn get_proofs_with(
         &self,
-        tx: Option<&mut DynWalletDatabaseTransaction<'_>>,
+        tx: Option<&mut DynWalletDatabaseTransaction>,
         state: Option<Vec<State>>,
         spending_conditions: Option<Vec<SpendingConditions>>,
     ) -> Result<Proofs, Error> {

+ 1 - 1
crates/cdk/src/wallet/swap.rs

@@ -209,7 +209,7 @@ impl Wallet {
     #[allow(clippy::too_many_arguments)]
     pub async fn create_swap(
         &self,
-        mut tx: DynWalletDatabaseTransaction<'_>,
+        mut tx: DynWalletDatabaseTransaction,
         active_keyset_id: Id,
         fee_and_amounts: &FeeAndAmounts,
         amount: Option<Amount>,