1
2use cdbc::error::Error;
3use cdbc::executor::Executor;
4use crate::message::Query;
5use crate::{PgConnection, Postgres};
6use cdbc::transaction::{
7 begin_ansi_transaction_sql, commit_ansi_transaction_sql, rollback_ansi_transaction_sql,
8 TransactionManager,
9};
10
11pub struct PgTransactionManager;
13
14impl TransactionManager for PgTransactionManager {
15 type Database = Postgres;
16
17 fn begin(conn: &mut PgConnection) -> Result<(), Error> {
18
19 conn.execute(&*begin_ansi_transaction_sql(conn.transaction_depth))
20 ?;
21
22 conn.transaction_depth += 1;
23
24 Ok(())
25
26 }
27
28 fn commit(conn: &mut PgConnection) -> Result<(), Error> {
29 if conn.transaction_depth > 0 {
30 conn.execute(&*commit_ansi_transaction_sql(conn.transaction_depth))?;
31 conn.transaction_depth -= 1;
32 }
33 Ok(())
34
35 }
36
37 fn rollback(conn: &mut PgConnection) -> Result<(), Error> {
38 if conn.transaction_depth > 0 {
39 conn.execute(&*rollback_ansi_transaction_sql(conn.transaction_depth))
40 ?;
41 conn.transaction_depth -= 1;
42 }
43 Ok(())
44 }
45
46 fn start_rollback(conn: &mut PgConnection) {
47 if conn.transaction_depth > 0 {
48 conn.pending_ready_for_query_count += 1;
49 conn.stream.write(Query(&rollback_ansi_transaction_sql(
50 conn.transaction_depth,
51 )));
52
53 conn.transaction_depth -= 1;
54 }
55 }
56}