From 8a55ae2d320de45528a77596d72e57e9f0965b3b Mon Sep 17 00:00:00 2001 From: Hamza Date: Fri, 4 Dec 2020 17:15:02 +0500 Subject: [PATCH] Fix transaction wrapper --- sqlx-core/src/connection.rs | 48 +++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/sqlx-core/src/connection.rs b/sqlx-core/src/connection.rs index d4b0a028..5c67ce9f 100644 --- a/sqlx-core/src/connection.rs +++ b/sqlx-core/src/connection.rs @@ -35,30 +35,42 @@ pub trait Connection: Send { /// /// If the function returns an error, the transaction will be rolled back. If it does not /// return an error, the transaction will be committed. - fn transaction<'c: 'f, 'f, T, E, F, Fut>(&'c mut self, f: F) -> BoxFuture<'f, Result> - where - Self: Sized, - T: Send, - F: FnOnce(&mut ::Connection) -> Fut + Send + 'f, - E: From + Send, - Fut: Future> + Send, + /// + /// # Example + /// + /// ```rust + /// use sqlx_core::postgres::{PgConnection, PgRow}; + /// use sqlx_core::connection::Connection; + /// use sqlx_core::error::Error; + /// + /// # pub async fn _f(conn: &mut PgConnection) -> Result, Error> { + /// conn.transaction(|conn|Box::pin(async move { + /// sqlx::query("select * from ..").fetch_all(conn).await + /// })).await + /// # } + /// ``` + fn transaction(&mut self, callback: F) -> BoxFuture> + where + for<'c> F: + FnOnce(&'c mut Transaction) -> BoxFuture<'c, Result> + 'static + Send + Sync, + Self: Sized, + R: Send, + E: From + Send, { Box::pin(async move { - let mut tx = self.begin().await?; + let mut transaction = self.begin().await?; + let ret = callback(&mut transaction).await; - match f(&mut tx).await { - Ok(r) => { - // no error occurred, commit the transaction - tx.commit().await?; + match ret { + Ok(ret) => { + transaction.commit().await?; - Ok(r) + Ok(ret) } + Err(err) => { + transaction.rollback().await?; - Err(e) => { - // an error occurred, rollback the transaction - tx.rollback().await?; - - Err(e) + Err(err) } } })