tank_sqlite/
transaction.rs1use 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}