cdbc_pg/
transaction.rs

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
11/// Implementation of [`TransactionManager`] for PostgreSQL.
12pub 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}