parsql_deadpool_postgres/
transaction_extensions.rs

1use std::fmt::Debug;
2use tokio_postgres::Error;
3use deadpool_postgres::Transaction;
4
5use crate::{SqlQuery, SqlParams, FromRow, UpdateParams};
6
7/// TransactionOps trait, Transaction için CRUD işlemlerini extension method olarak sağlar
8/// Bu şekilde, herhangi bir Transaction nesnesi üzerinde doğrudan CRUD işlemleri yapılabilir
9pub trait TransactionOps {
10    /// Insert method, yeni bir kayıt eklemek için kullanılır
11    ///
12    /// # Parameters
13    /// * `entity` - Eklenecek varlık, SqlQuery ve SqlParams trait'lerini implement etmeli
14    ///
15    /// # Örnek Kullanım
16    /// ```rust,no_run
17    /// use deadpool_postgres::{Config, Runtime};
18    /// use parsql_deadpool_postgres::TransactionOps;
19    /// use tokio_postgres::NoTls;
20    ///
21    /// // Entity tanımı
22    /// #[derive(SqlQuery, SqlParams)]
23    /// #[table("users")]
24    /// pub struct InsertUser {
25    ///     pub name: String,
26    ///     pub email: String,
27    /// }
28    ///
29    /// #[tokio::main]
30    /// async fn main() -> Result<(), tokio_postgres::Error> {
31    ///     let mut cfg = Config::new();
32    ///     cfg.dbname = Some("test".to_string());
33    ///     let pool = cfg.create_pool(Some(Runtime::Tokio1), NoTls).unwrap();
34    ///     
35    ///     let client = pool.get().await?;
36    ///     let tx = client.transaction().await?;
37    ///     
38    ///     let user = InsertUser {
39    ///         name: "John".to_string(),
40    ///         email: "john@example.com".to_string(),
41    ///     };
42    ///     
43    ///     // Extension method kullanımı
44    ///     let rows_affected = tx.insert(user).await?;
45    ///     tx.commit().await?;
46    ///     
47    ///     println!("{} kayıt eklendi", rows_affected);
48    ///     Ok(())
49    /// }
50    /// ```
51    async fn insert<T>(&self, entity: T) -> Result<u64, Error>
52    where
53        T: SqlQuery + SqlParams + Debug;
54
55    /// Update method, mevcut bir kaydı güncellemek için kullanılır
56    ///
57    /// # Parameters
58    /// * `entity` - Güncellenecek varlık, SqlQuery, UpdateParams ve SqlParams trait'lerini implement etmeli
59    async fn update<T>(&self, entity: T) -> Result<u64, Error>
60    where
61        T: SqlQuery + UpdateParams + SqlParams + Debug;
62
63    /// Delete method, bir kaydı silmek için kullanılır
64    ///
65    /// # Parameters
66    /// * `entity` - Silinecek varlık, SqlQuery ve SqlParams trait'lerini implement etmeli
67    async fn delete<T>(&self, entity: T) -> Result<u64, Error>
68    where
69        T: SqlQuery + SqlParams + Debug;
70
71    /// Get method, tek bir kayıt getirmek için kullanılır
72    ///
73    /// # Parameters
74    /// * `params` - Sorgu parametreleri, SqlQuery, FromRow ve SqlParams trait'lerini implement etmeli
75    async fn get<T>(&self, params: &T) -> Result<T, Error>
76    where
77        T: SqlQuery + FromRow + SqlParams + Debug;
78
79    /// Get All method, birden fazla kayıt getirmek için kullanılır
80    ///
81    /// # Parameters
82    /// * `params` - Sorgu parametreleri, SqlQuery, FromRow ve SqlParams trait'lerini implement etmeli
83    async fn get_all<T>(&self, params: &T) -> Result<Vec<T>, Error>
84    where
85        T: SqlQuery + FromRow + SqlParams + Debug;
86
87    /// Select method, özel dönüşüm fonksiyonu ile tek bir kayıt getirmek için kullanılır
88    ///
89    /// # Parameters
90    /// * `entity` - Sorgu parametreleri, SqlQuery ve SqlParams trait'lerini implement etmeli
91    /// * `to_model` - Satırı istenen türe dönüştüren fonksiyon
92    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    /// Select All method, özel dönüşüm fonksiyonu ile birden fazla kayıt getirmek için kullanılır
98    ///
99    /// # Parameters
100    /// * `entity` - Sorgu parametreleri, SqlQuery ve SqlParams trait'lerini implement etmeli
101    /// * `to_model` - Her satırı istenen türe dönüştüren fonksiyon
102    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, &params[..]).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, &params[..]).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, &params[..]).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, &params[..]).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, &params[..]).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}