Skip to main content

tank_sqlite/
transaction.rs

1use crate::{SQLiteConnection, SQLiteDriver};
2use tank_core::{
3    DynQuery, Driver, Executor, Result, SqlWriter, Transaction, future::TryFutureExt,
4    impl_executor_transaction,
5};
6
7pub struct SQLiteTransaction<'c> {
8    connection: &'c mut SQLiteConnection,
9}
10
11impl<'c> SQLiteTransaction<'c> {
12    pub async fn new(connection: &'c mut SQLiteConnection) -> Result<Self> {
13        let result = Self { connection };
14        let mut query = DynQuery::default();
15        result
16            .connection
17            .driver()
18            .sql_writer()
19            .write_transaction_begin(&mut query);
20        result.connection.execute(query).await?;
21        Ok(result)
22    }
23}
24
25impl_executor_transaction!(SQLiteDriver, SQLiteTransaction<'c>, connection);
26impl<'c> Transaction<'c> for SQLiteTransaction<'c> {
27    fn commit(self) -> impl Future<Output = Result<()>> {
28        let mut query = DynQuery::default();
29        self.driver()
30            .sql_writer()
31            .write_transaction_commit(&mut query);
32        self.connection.execute(query).map_ok(|_| ())
33    }
34
35    fn rollback(self) -> impl Future<Output = Result<()>> {
36        let mut query = DynQuery::default();
37        self.driver()
38            .sql_writer()
39            .write_transaction_rollback(&mut query);
40        self.connection.execute(query).map_ok(|_| ())
41    }
42}