parsql_deadpool_postgres/
pool_extensions.rs1use deadpool_postgres::Pool;
2use tokio_postgres::{Error, Row};
3use crate::{SqlQuery, SqlParams, UpdateParams, FromRow};
4
5fn pool_err_to_io_err(e: deadpool_postgres::PoolError) -> Error {
7 let err = Error::__private_api_timeout();
10
11 eprintln!("Pool bağlantı hatası: {}", e);
13
14 err
15}
16
17#[async_trait::async_trait]
20pub trait CrudOps {
21 async fn insert<T>(&self, entity: T) -> Result<u64, Error>
29 where
30 T: SqlQuery + SqlParams + Send + Sync;
31
32 async fn update<T>(&self, entity: T) -> Result<u64, Error>
40 where
41 T: SqlQuery + UpdateParams + Send + Sync;
42
43 async fn delete<T>(&self, entity: T) -> Result<u64, Error>
51 where
52 T: SqlQuery + SqlParams + Send + Sync;
53
54 async fn fetch<T>(&self, params: &T) -> Result<T, Error>
62 where
63 T: SqlQuery + FromRow + SqlParams + Send + Sync;
64
65 async fn fetch_all<T>(&self, params: &T) -> Result<Vec<T>, Error>
73 where
74 T: SqlQuery + FromRow + SqlParams + Send + Sync;
75
76 async fn select<T, R, F>(&self, entity: T, to_model: F) -> Result<R, Error>
85 where
86 T: SqlQuery + SqlParams + Send + Sync,
87 F: FnOnce(&Row) -> Result<R, Error> + Send + Sync;
88
89 async fn select_all<T, R, F>(&self, entity: T, to_model: F) -> Result<Vec<R>, Error>
98 where
99 T: SqlQuery + SqlParams + Send + Sync,
100 F: Fn(&Row) -> R + Send + Sync;
101}
102
103#[async_trait::async_trait]
105impl CrudOps for Pool {
106 async fn insert<T>(&self, entity: T) -> Result<u64, Error>
107 where
108 T: SqlQuery + SqlParams + Send + Sync
109 {
110 let client = self.get().await.map_err(pool_err_to_io_err)?;
111 let sql = T::query();
112
113 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
114 println!("[PARSQL-TOKIO-POSTGRES-POOL] Execute SQL: {}", sql);
115 }
116
117 let params = entity.params();
118 client.execute(&sql, ¶ms).await
119 }
120
121 async fn update<T>(&self, entity: T) -> Result<u64, Error>
122 where
123 T: SqlQuery + UpdateParams + Send + Sync
124 {
125 let client = self.get().await.map_err(pool_err_to_io_err)?;
126 let sql = T::query();
127
128 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
129 println!("[PARSQL-TOKIO-POSTGRES-POOL] Execute SQL: {}", sql);
130 }
131
132 let params = entity.params();
133 client.execute(&sql, ¶ms).await
134 }
135
136 async fn delete<T>(&self, entity: T) -> Result<u64, Error>
137 where
138 T: SqlQuery + SqlParams + Send + Sync
139 {
140 let client = self.get().await.map_err(pool_err_to_io_err)?;
141 let sql = T::query();
142
143 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
144 println!("[PARSQL-TOKIO-POSTGRES-POOL] Execute SQL: {}", sql);
145 }
146
147 let params = entity.params();
148 client.execute(&sql, ¶ms).await
149 }
150
151 async fn fetch<T>(&self, params: &T) -> Result<T, Error>
152 where
153 T: SqlQuery + FromRow + SqlParams + Send + Sync
154 {
155 let client = self.get().await.map_err(pool_err_to_io_err)?;
156 let sql = T::query();
157
158 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
159 println!("[PARSQL-TOKIO-POSTGRES-POOL] Execute SQL: {}", sql);
160 }
161
162 let query_params = params.params();
163 let row = client.query_one(&sql, &query_params).await?;
164 T::from_row(&row)
165 }
166
167 async fn fetch_all<T>(&self, params: &T) -> Result<Vec<T>, Error>
168 where
169 T: SqlQuery + FromRow + SqlParams + Send + Sync
170 {
171 let client = self.get().await.map_err(pool_err_to_io_err)?;
172 let sql = T::query();
173
174 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
175 println!("[PARSQL-TOKIO-POSTGRES-POOL] Execute SQL: {}", sql);
176 }
177
178 let query_params = params.params();
179 let rows = client.query(&sql, &query_params).await?;
180
181 let mut results = Vec::with_capacity(rows.len());
182 for row in rows {
183 results.push(T::from_row(&row)?);
184 }
185
186 Ok(results)
187 }
188
189 async fn select<T, R, F>(&self, entity: T, to_model: F) -> Result<R, Error>
190 where
191 T: SqlQuery + SqlParams + Send + Sync,
192 F: FnOnce(&Row) -> Result<R, Error> + Send + Sync
193 {
194 let client = self.get().await.map_err(pool_err_to_io_err)?;
195 let sql = T::query();
196
197 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
198 println!("[PARSQL-TOKIO-POSTGRES-POOL] Execute SQL: {}", sql);
199 }
200
201 let params = entity.params();
202 let row = client.query_one(&sql, ¶ms).await?;
203 to_model(&row)
204 }
205
206 async fn select_all<T, R, F>(&self, entity: T, to_model: F) -> Result<Vec<R>, Error>
207 where
208 T: SqlQuery + SqlParams + Send + Sync,
209 F: Fn(&Row) -> R + Send + Sync
210 {
211 let client = self.get().await.map_err(pool_err_to_io_err)?;
212 let sql = T::query();
213
214 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
215 println!("[PARSQL-TOKIO-POSTGRES-POOL] Execute SQL: {}", sql);
216 }
217
218 let params = entity.params();
219 let rows = client.query(&sql, ¶ms).await?;
220
221 let mut results = Vec::with_capacity(rows.len());
222 for row in rows {
223 results.push(to_model(&row));
224 }
225
226 Ok(results)
227 }
228}