parsql_deadpool_postgres/
pool_extensions.rs1use deadpool_postgres::Pool;
2use postgres::types::FromSql;
3use tokio_postgres::{Error, Row};
4use crate::traits::{SqlQuery, SqlParams, UpdateParams, FromRow, CrudOps};
5
6fn pool_err_to_io_err(e: deadpool_postgres::PoolError) -> Error {
8 let err = Error::__private_api_timeout();
11
12 eprintln!("Pool bağlantı hatası: {}", e);
14
15 err
16}
17
18#[async_trait::async_trait]
20impl CrudOps for Pool {
21 async fn insert<T, P:for<'a> FromSql<'a> + Send + Sync>(&self, entity: T) -> Result<P, Error>
22 where
23 T: SqlQuery + SqlParams + Send + Sync
24 {
25 let client = self.get().await.map_err(pool_err_to_io_err)?;
26 let sql = T::query();
27
28 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
29 println!("[PARSQL-TOKIO-POSTGRES-POOL] Execute SQL: {}", sql);
30 }
31
32 let params = entity.params();
33 let row = client.query_one(&sql, ¶ms).await?;
34 row.try_get::<_, P>(0)
35 }
36
37 async fn update<T>(&self, entity: T) -> Result<u64, Error>
38 where
39 T: SqlQuery + UpdateParams + Send + Sync
40 {
41 let client = self.get().await.map_err(pool_err_to_io_err)?;
42 let sql = T::query();
43
44 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
45 println!("[PARSQL-TOKIO-POSTGRES-POOL] Execute SQL: {}", sql);
46 }
47
48 let params = entity.params();
49 client.execute(&sql, ¶ms).await
50 }
51
52 async fn delete<T>(&self, entity: T) -> Result<u64, Error>
53 where
54 T: SqlQuery + SqlParams + Send + Sync
55 {
56 let client = self.get().await.map_err(pool_err_to_io_err)?;
57 let sql = T::query();
58
59 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
60 println!("[PARSQL-TOKIO-POSTGRES-POOL] Execute SQL: {}", sql);
61 }
62
63 let params = entity.params();
64 client.execute(&sql, ¶ms).await
65 }
66
67 async fn fetch<T>(&self, params: &T) -> Result<T, Error>
68 where
69 T: SqlQuery + FromRow + SqlParams + Send + Sync
70 {
71 let client = self.get().await.map_err(pool_err_to_io_err)?;
72 let sql = T::query();
73
74 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
75 println!("[PARSQL-TOKIO-POSTGRES-POOL] Execute SQL: {}", sql);
76 }
77
78 let query_params = params.params();
79 let row = client.query_one(&sql, &query_params).await?;
80 T::from_row(&row)
81 }
82
83 async fn fetch_all<T>(&self, params: &T) -> Result<Vec<T>, Error>
84 where
85 T: SqlQuery + FromRow + SqlParams + Send + Sync
86 {
87 let client = self.get().await.map_err(pool_err_to_io_err)?;
88 let sql = T::query();
89
90 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
91 println!("[PARSQL-TOKIO-POSTGRES-POOL] Execute SQL: {}", sql);
92 }
93
94 let query_params = params.params();
95 let rows = client.query(&sql, &query_params).await?;
96
97 let mut results = Vec::with_capacity(rows.len());
98 for row in rows {
99 results.push(T::from_row(&row)?);
100 }
101
102 Ok(results)
103 }
104
105 async fn select<T, R, F>(&self, entity: T, to_model: F) -> Result<R, Error>
106 where
107 T: SqlQuery + SqlParams + Send + Sync,
108 F: FnOnce(&Row) -> Result<R, Error> + 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 let row = client.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 + Send + Sync,
125 F: Fn(&Row) -> R + Send + Sync
126 {
127 let client = self.get().await.map_err(pool_err_to_io_err)?;
128 let sql = T::query();
129
130 if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
131 println!("[PARSQL-TOKIO-POSTGRES-POOL] Execute SQL: {}", sql);
132 }
133
134 let params = entity.params();
135 let rows = client.query(&sql, ¶ms).await?;
136
137 let mut results = Vec::with_capacity(rows.len());
138 for row in rows {
139 results.push(to_model(&row));
140 }
141
142 Ok(results)
143 }
144}