parsql_deadpool_postgres/
transaction_extensions.rs1use std::fmt::Debug;
2use std::sync::OnceLock;
3use tokio_postgres::Error;
4use deadpool_postgres::Transaction;
5use crate::traits::{SqlQuery, SqlParams, FromRow, UpdateParams, TransactionOps};
6
7#[async_trait::async_trait]
8impl TransactionOps for Transaction<'_> {
9 async fn insert<T>(&self, entity: T) -> Result<u64, Error>
10 where
11 T: SqlQuery + SqlParams + Debug + Send + 'static,
12 {
13 let sql = T::query();
14
15 if let Some(trace) = std::env::var_os("PARSQL_TRACE") {
16 if trace == "1" {
17 println!("[PARSQL-DEADPOOL-POSTGRES-TX] Execute SQL: {}", sql);
18 }
19 }
20
21 let params = SqlParams::params(&entity);
22 self.execute(&sql, ¶ms[..]).await
23 }
24
25 async fn update<T>(&self, entity: T) -> Result<u64, Error>
26 where
27 T: SqlQuery + UpdateParams + SqlParams + Debug + Send + 'static,
28 {
29 let sql = T::query();
30
31 if let Some(trace) = std::env::var_os("PARSQL_TRACE") {
32 if trace == "1" {
33 println!("[PARSQL-DEADPOOL-POSTGRES-TX] Execute SQL: {}", sql);
34 }
35 }
36
37 let params = SqlParams::params(&entity);
38 self.execute(&sql, ¶ms[..]).await
39 }
40
41 async fn delete<T>(&self, entity: T) -> Result<u64, Error>
42 where
43 T: SqlQuery + SqlParams + Debug + Send + 'static,
44 {
45 let sql = T::query();
46
47 if let Some(trace) = std::env::var_os("PARSQL_TRACE") {
48 if trace == "1" {
49 println!("[PARSQL-DEADPOOL-POSTGRES-TX] Execute SQL: {}", sql);
50 }
51 }
52
53 let params = SqlParams::params(&entity);
54 self.execute(&sql, ¶ms[..]).await
55 }
56
57 async fn get<T>(&self, params: &T) -> Result<T, Error>
58 where
59 T: SqlQuery + FromRow + SqlParams + Debug + Send + Sync + Clone + 'static,
60 {
61 let sql = T::query();
62
63 static TRACE_ENABLED: OnceLock<bool> = OnceLock::new();
64 let is_trace_enabled = *TRACE_ENABLED.get_or_init(|| {
65 std::env::var_os("PARSQL_TRACE").map_or(false, |v| v == "1")
66 });
67
68 if is_trace_enabled {
69 println!("[PARSQL-DEADPOOL-POSTGRES-TX] Execute SQL: {}", sql);
70 }
71
72 let params_owned = params.clone();
73 let query_params = SqlParams::params(¶ms_owned);
74 let row = self.query_one(&sql, &query_params[..]).await?;
75
76 T::from_row(&row)
77 }
78
79 async fn get_all<T>(&self, params: &T) -> Result<Vec<T>, Error>
80 where
81 T: SqlQuery + FromRow + SqlParams + Debug + Send + Sync + Clone + 'static,
82 {
83 let sql = T::query();
84
85 if let Some(trace) = std::env::var_os("PARSQL_TRACE") {
86 if trace == "1" {
87 println!("[PARSQL-DEADPOOL-POSTGRES-TX] Execute SQL: {}", sql);
88 }
89 }
90
91 let params_owned = params.clone();
92 let query_params = SqlParams::params(¶ms_owned);
93 let rows = self.query(&sql, &query_params[..]).await?;
94
95 let mut results = Vec::with_capacity(rows.len());
96 for row in rows {
97 results.push(T::from_row(&row)?);
98 }
99
100 Ok(results)
101 }
102
103 async fn select<T, R, F>(&self, entity: T, to_model: F) -> Result<R, Error>
104 where
105 T: SqlQuery + SqlParams + Debug + Send + 'static,
106 F: FnOnce(&tokio_postgres::Row) -> Result<R, Error> + Send + Sync + 'static,
107 R: Send + 'static,
108 {
109 let sql = T::query();
110
111 if let Some(trace) = std::env::var_os("PARSQL_TRACE") {
112 if trace == "1" {
113 println!("[PARSQL-DEADPOOL-POSTGRES-TX] Execute SQL: {}", sql);
114 }
115 }
116
117 let params = SqlParams::params(&entity);
118 let row = self.query_one(&sql, ¶ms[..]).await?;
119 to_model(&row)
120 }
121
122 async fn select_all<T, R, F>(&self, entity: T, to_model: F) -> Result<Vec<R>, Error>
123 where
124 T: SqlQuery + SqlParams + Debug + Send + 'static,
125 F: Fn(&tokio_postgres::Row) -> R + Send + Sync + 'static,
126 R: Send + 'static,
127 {
128 let sql = T::query();
129
130 if let Some(trace) = std::env::var_os("PARSQL_TRACE") {
131 if trace == "1" {
132 println!("[PARSQL-DEADPOOL-POSTGRES-TX] Execute SQL: {}", sql);
133 }
134 }
135
136 let params = SqlParams::params(&entity);
137 let rows = self.query(&sql, ¶ms[..]).await?;
138
139 let mut results = Vec::with_capacity(rows.len());
140 for row in rows {
141 results.push(to_model(&row));
142 }
143
144 Ok(results)
145 }
146}