wasi_pg_client/transaction/
savepoint.rs1use crate::error::Result;
4use crate::query::result::{ExecuteResult, QueryResult};
5use crate::transaction::quote_identifier;
6use crate::Transaction;
7
8#[non_exhaustive]
20pub struct Savepoint<'t, 'c> {
21 pub(crate) transaction: &'t mut Transaction<'c>,
22 pub(crate) name: String,
23 pub(crate) released: bool,
24}
25
26impl<'t, 'c> Savepoint<'t, 'c> {
27 #[must_use = "savepoint release errors should be checked"]
29 pub async fn release(mut self) -> Result<()> {
30 let sql = format!("RELEASE SAVEPOINT {}", quote_identifier(&self.name));
31 self.transaction.conn.execute(&sql).await?;
32 self.released = true;
33 self.transaction.savepoint_depth -= 1;
34 Ok(())
35 }
36
37 #[must_use = "savepoint rollback errors should be checked"]
39 pub async fn rollback(mut self) -> Result<()> {
40 let sql = format!("ROLLBACK TO SAVEPOINT {}", quote_identifier(&self.name));
41 self.transaction.conn.execute(&sql).await?;
42 self.released = true;
43 self.transaction.savepoint_depth -= 1;
44 Ok(())
45 }
46
47 #[must_use = "query errors should be checked"]
49 pub async fn query(&mut self, sql: &str) -> Result<QueryResult> {
50 self.transaction.query(sql).await
51 }
52
53 #[must_use = "execute errors should be checked"]
55 pub async fn execute(&mut self, sql: &str) -> Result<ExecuteResult> {
56 self.transaction.execute(sql).await
57 }
58
59 #[must_use = "query errors should be checked"]
61 pub async fn query_params(
62 &mut self,
63 sql: &str,
64 params: &[&dyn crate::types::ToSql],
65 ) -> Result<QueryResult> {
66 self.transaction.query_params(sql, params).await
67 }
68
69 #[must_use = "execute errors should be checked"]
71 pub async fn execute_params(
72 &mut self,
73 sql: &str,
74 params: &[&dyn crate::types::ToSql],
75 ) -> Result<ExecuteResult> {
76 self.transaction.execute_params(sql, params).await
77 }
78
79 #[must_use = "prepare errors should be checked"]
81 pub async fn prepare(&mut self, sql: &str) -> Result<crate::query::PreparedStatement> {
82 self.transaction.prepare(sql).await
83 }
84}
85
86impl<'t, 'c> Drop for Savepoint<'t, 'c> {
87 fn drop(&mut self) {
88 if self.released || std::thread::panicking() {
89 return;
90 }
91 self.transaction.savepoint_depth -= 1;
96 }
97}