parsql_deadpool_postgres/
transaction_extensions.rs

1use 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, &params[..]).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, &params[..]).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, &params[..]).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(&params_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(&params_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, &params[..]).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, &params[..]).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}