1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use crate::{DatabaseClient, QueryResult, Statement};
use anyhow::{Context, Result};
pub struct Transaction<'a, Client: DatabaseClient + ?Sized> {
client: &'a mut Client,
}
impl<'a, Client: DatabaseClient + ?Sized> Transaction<'a, Client> {
pub async fn new(client: &'a mut Client) -> Result<Transaction<'a, Client>> {
client.raw_batch(vec![Statement::new("BEGIN")]).await?;
Ok(Self { client })
}
pub async fn execute(&mut self, stmt: Statement) -> Result<QueryResult> {
self.client
.raw_batch(vec![stmt])
.await?
.pop()
.context("Exactly one QueryResult was expected")
}
pub async fn commit(self) -> Result<()> {
self.client
.raw_batch(vec![Statement::new("COMMIT")])
.await?;
Ok(())
}
pub async fn rollback(self) -> Result<()> {
self.client
.raw_batch(vec![Statement::new("ROLLBACK")])
.await?;
Ok(())
}
}