parsql_deadpool_postgres/
transaction_extensions.rs1use std::fmt::Debug;
2use tokio_postgres::Error;
3use deadpool_postgres::Transaction;
4
5use crate::{SqlQuery, SqlParams, FromRow, UpdateParams};
6
7pub trait TransactionOps {
10 async fn insert<T>(&self, entity: T) -> Result<u64, Error>
52 where
53 T: SqlQuery + SqlParams + Debug;
54
55 async fn update<T>(&self, entity: T) -> Result<u64, Error>
60 where
61 T: SqlQuery + UpdateParams + SqlParams + Debug;
62
63 async fn delete<T>(&self, entity: T) -> Result<u64, Error>
68 where
69 T: SqlQuery + SqlParams + Debug;
70
71 async fn get<T>(&self, params: &T) -> Result<T, Error>
76 where
77 T: SqlQuery + FromRow + SqlParams + Debug;
78
79 async fn get_all<T>(&self, params: &T) -> Result<Vec<T>, Error>
84 where
85 T: SqlQuery + FromRow + SqlParams + Debug;
86
87 async fn select<T, R, F>(&self, entity: T, to_model: F) -> Result<R, Error>
93 where
94 T: SqlQuery + SqlParams + Debug,
95 F: FnOnce(&tokio_postgres::Row) -> Result<R, Error>;
96
97 async fn select_all<T, R, F>(&self, entity: T, to_model: F) -> Result<Vec<R>, Error>
103 where
104 T: SqlQuery + SqlParams + Debug,
105 F: Fn(&tokio_postgres::Row) -> R;
106}
107
108impl<'a> TransactionOps for Transaction<'a> {
109 async fn insert<T>(&self, entity: T) -> Result<u64, Error>
110 where
111 T: SqlQuery + SqlParams + Debug,
112 {
113 let sql = T::query();
114
115 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
116 println!("[PARSQL-DEADPOOL-POSTGRES-TX] Execute SQL: {} {:?}", sql, entity);
117 }
118
119 let params = SqlParams::params(&entity);
120 self.execute(&sql, ¶ms[..]).await
121 }
122
123 async fn update<T>(&self, entity: T) -> Result<u64, Error>
124 where
125 T: SqlQuery + UpdateParams + SqlParams + Debug,
126 {
127 let sql = T::query();
128
129 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
130 println!("[PARSQL-DEADPOOL-POSTGRES-TX] Execute SQL: {} {:?}", sql, entity);
131 }
132
133 let params = SqlParams::params(&entity);
134 self.execute(&sql, ¶ms[..]).await
135 }
136
137 async fn delete<T>(&self, entity: T) -> Result<u64, Error>
138 where
139 T: SqlQuery + SqlParams + Debug,
140 {
141 let sql = T::query();
142
143 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
144 println!("[PARSQL-DEADPOOL-POSTGRES-TX] Execute SQL: {} {:?}", sql, entity);
145 }
146
147 let params = SqlParams::params(&entity);
148 self.execute(&sql, ¶ms[..]).await
149 }
150
151 async fn get<T>(&self, params: &T) -> Result<T, Error>
152 where
153 T: SqlQuery + FromRow + SqlParams + Debug,
154 {
155 let sql = T::query();
156
157 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
158 println!("[PARSQL-DEADPOOL-POSTGRES-TX] Execute SQL: {} {:?}", sql, params);
159 }
160
161 let query_params = SqlParams::params(params);
162 let row = self.query_one(&sql, &query_params[..]).await?;
163 T::from_row(&row)
164 }
165
166 async fn get_all<T>(&self, params: &T) -> Result<Vec<T>, Error>
167 where
168 T: SqlQuery + FromRow + SqlParams + Debug,
169 {
170 let sql = T::query();
171
172 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
173 println!("[PARSQL-DEADPOOL-POSTGRES-TX] Execute SQL: {} {:?}", sql, params);
174 }
175
176 let query_params = SqlParams::params(params);
177 let rows = self.query(&sql, &query_params[..]).await?;
178
179 let mut results = Vec::with_capacity(rows.len());
180 for row in rows {
181 results.push(T::from_row(&row)?);
182 }
183
184 Ok(results)
185 }
186
187 async fn select<T, R, F>(&self, entity: T, to_model: F) -> Result<R, Error>
188 where
189 T: SqlQuery + SqlParams + Debug,
190 F: FnOnce(&tokio_postgres::Row) -> Result<R, Error>,
191 {
192 let sql = T::query();
193
194 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
195 println!("[PARSQL-DEADPOOL-POSTGRES-TX] Execute SQL: {} {:?}", sql, entity);
196 }
197
198 let params = SqlParams::params(&entity);
199 let row = self.query_one(&sql, ¶ms[..]).await?;
200 to_model(&row)
201 }
202
203 async fn select_all<T, R, F>(&self, entity: T, to_model: F) -> Result<Vec<R>, Error>
204 where
205 T: SqlQuery + SqlParams + Debug,
206 F: Fn(&tokio_postgres::Row) -> R,
207 {
208 let sql = T::query();
209
210 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
211 println!("[PARSQL-DEADPOOL-POSTGRES-TX] Execute SQL: {} {:?}", sql, entity);
212 }
213
214 let params = SqlParams::params(&entity);
215 let rows = self.query(&sql, ¶ms[..]).await?;
216
217 let mut results = Vec::with_capacity(rows.len());
218 for row in rows {
219 results.push(to_model(&row));
220 }
221
222 Ok(results)
223 }
224}