parsql_postgres/
transaction_ops.rs

1use postgres::{Transaction, Error, Row};
2use crate::{SqlQuery, SqlParams, FromRow, UpdateParams, CrudOps};
3
4/// CrudOps trait implementasyonu Transaction<'_> için.
5/// Bu sayede transaction içinde tüm CRUD işlemleri extension metotları olarak kullanılabilir.
6impl<'a> CrudOps for Transaction<'a> {
7    fn insert<T: SqlQuery + SqlParams>(&mut self, entity: T) -> Result<u64, Error> {
8        let sql = T::query();
9        if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
10            println!("[PARSQL-POSTGRES] Execute SQL (Transaction): {}", sql);
11        }
12
13        let params = entity.params();
14        self.execute(&sql, &params)
15    }
16
17    fn update<T: SqlQuery + UpdateParams>(&mut self, entity: T) -> Result<u64, Error> {
18        let sql = T::query();
19        if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
20            println!("[PARSQL-POSTGRES] Execute SQL (Transaction): {}", sql);
21        }
22
23        let params = entity.params();
24        self.execute(&sql, &params)
25    }
26
27    fn delete<T: SqlQuery + SqlParams>(&mut self, entity: T) -> Result<u64, Error> {
28        let sql = T::query();
29        if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
30            println!("[PARSQL-POSTGRES] Execute SQL (Transaction): {}", sql);
31        }
32
33        let params = entity.params();
34        self.execute(&sql, &params)
35    }
36
37    fn fetch<T: SqlQuery + FromRow + SqlParams>(&mut self, entity: &T) -> Result<T, Error> {
38        let sql = T::query();
39        if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
40            println!("[PARSQL-POSTGRES] Execute SQL (Transaction): {}", sql);
41        }
42        
43        let params = entity.params();
44        let row = self.query_one(&sql, &params)?;
45        T::from_row(&row)
46    }
47
48    fn fetch_all<T: SqlQuery + FromRow + SqlParams>(&mut self, entity: &T) -> Result<Vec<T>, Error> {
49        let sql = T::query();
50        if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
51            println!("[PARSQL-POSTGRES] Execute SQL (Transaction): {}", sql);
52        }
53        
54        let params = entity.params();
55        let rows = self.query(&sql, &params)?;
56        
57        rows.iter()
58            .map(|row| T::from_row(row))
59            .collect::<Result<Vec<_>, _>>()
60    }
61
62    fn select<T, F, R>(&mut self, entity: &T, to_model: F) -> Result<R, Error>
63    where
64        T: SqlQuery + SqlParams,
65        F: FnOnce(&Row) -> Result<R, Error>,
66    {
67        let sql = T::query();
68        if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
69            println!("[PARSQL-POSTGRES] Execute SQL (Transaction): {}", sql);
70        }
71
72        let params = entity.params();
73        let row = self.query_one(&sql, &params)?;
74        to_model(&row)
75    }
76
77    fn select_all<T, F, R>(&mut self, entity: &T, to_model: F) -> Result<Vec<R>, Error>
78    where
79        T: SqlQuery + SqlParams,
80        F: FnMut(&Row) -> Result<R, Error>,
81    {
82        let sql = T::query();
83        if std::env::var("PARSQL_TRACE").unwrap_or_default() == "1" {
84            println!("[PARSQL-POSTGRES] Execute SQL (Transaction): {}", sql);
85        }
86
87        let params = entity.params();
88        let rows = self.query(&sql, &params)?;
89        
90        rows.iter().map(to_model).collect()
91    }
92}
93
94/// # begin
95/// 
96/// Yeni bir transaction başlatır.
97/// 
98/// ## Parametreler
99/// - `client`: Veritabanı bağlantı istemcisi
100/// 
101/// ## Dönüş Değeri
102/// - `Result<Transaction<'_>, Error>`: Başarılı olursa, transaction nesnesini döner; hata durumunda Error döner
103/// 
104/// ## Örnek Kullanım
105/// ```rust,no_run
106/// use postgres::{Client, NoTls, Error};
107/// use parsql::postgres::transactional::begin;
108/// 
109/// fn main() -> Result<(), Error> {
110///     let mut client = Client::connect(
111///         "host=localhost user=postgres dbname=test",
112///         NoTls,
113///     )?;
114///     
115///     let tx = begin(&mut client)?;
116///     
117///     // İşlemler...
118///     
119///     // Transaction'ı tamamla
120///     tx.commit()?;
121///     Ok(())
122/// }
123/// ```
124pub fn begin<'a>(client: &'a mut postgres::Client) -> Result<Transaction<'a>, Error> {
125    client.transaction()
126}
127
128/// # tx_insert
129/// 
130/// Transaction içinde bir kaydı veritabanına ekler.
131/// 
132/// ## Parametreler
133/// - `tx`: Transaction nesnesi
134/// - `entity`: Eklenecek veri nesnesi (SqlQuery ve SqlParams trait'lerini implement etmeli)
135/// 
136/// ## Dönüş Değeri
137/// - `Result<(Transaction<'_>, u64), Error>`: Başarılı olursa, transaction ve etkilenen kayıt sayısını döner; hata durumunda Error döner
138/// 
139/// ## Örnek Kullanım
140/// ```rust,no_run
141/// use postgres::{Client, NoTls, Error};
142/// use parsql::postgres::transactional::{begin, tx_insert};
143/// 
144/// #[derive(Insertable, SqlParams)]
145/// #[table("users")]
146/// pub struct InsertUser {
147///     pub name: String,
148///     pub email: String,
149/// }
150///
151/// fn main() -> Result<(), Error> {
152///     let mut client = Client::connect(
153///         "host=localhost user=postgres dbname=test",
154///         NoTls,
155///     )?;
156///     
157///     let mut tx = begin(&mut client)?;
158///     
159///     let insert_user = InsertUser {
160///         name: "John".to_string(),
161///         email: "john@example.com".to_string(),
162///     };
163///     
164///     let (tx, rows_affected) = tx_insert(tx, insert_user)?;
165///     
166///     // İşlemler devam edebilir...
167///     
168///     // Transaction'ı tamamla
169///     tx.commit()?;
170///     Ok(())
171/// }
172/// ```
173pub fn tx_insert<'a, T>(mut tx: Transaction<'a>, entity: T) -> Result<(Transaction<'a>, u64), Error>
174where
175    T: SqlQuery + SqlParams,
176{
177    let result = tx.insert(entity)?;
178    Ok((tx, result))
179}
180
181/// # tx_update
182/// 
183/// Transaction içinde bir kaydı günceller.
184/// 
185/// ## Parametreler
186/// - `tx`: Transaction nesnesi
187/// - `entity`: Güncellenecek veri nesnesi (SqlQuery ve UpdateParams trait'lerini implement etmeli)
188/// 
189/// ## Dönüş Değeri
190/// - `Result<(Transaction<'_>, u64), Error>`: Başarılı olursa, transaction ve etkilenen kayıt sayısını döner; hata durumunda Error döner
191/// 
192/// ## Örnek Kullanım
193/// ```rust,no_run
194/// use postgres::{Client, NoTls, Error};
195/// use parsql::postgres::transactional::{begin, tx_update};
196/// 
197/// #[derive(Updateable, UpdateParams)]
198/// #[table("users")]
199/// #[update("name, email")]
200/// #[where_clause("id = $")]
201/// pub struct UpdateUser {
202///     pub id: i32,
203///     pub name: String,
204///     pub email: String,
205/// }
206///
207/// fn main() -> Result<(), Error> {
208///     let mut client = Client::connect(
209///         "host=localhost user=postgres dbname=test",
210///         NoTls,
211///     )?;
212///     
213///     let mut tx = begin(&mut client)?;
214///     
215///     let update_user = UpdateUser {
216///         id: 1,
217///         name: "John Updated".to_string(),
218///         email: "john.updated@example.com".to_string(),
219///     };
220///     
221///     let (tx, rows_affected) = tx_update(tx, update_user)?;
222///     
223///     // İşlemler devam edebilir...
224///     
225///     // Transaction'ı tamamla
226///     tx.commit()?;
227///     Ok(())
228/// }
229/// ```
230pub fn tx_update<'a, T>(mut tx: Transaction<'a>, entity: T) -> Result<(Transaction<'a>, u64), Error>
231where
232    T: SqlQuery + UpdateParams,
233{
234    let result = tx.update(entity)?;
235    Ok((tx, result))
236}
237
238/// # tx_delete
239/// 
240/// Transaction içinde bir kaydı siler.
241/// 
242/// ## Parametreler
243/// - `tx`: Transaction nesnesi
244/// - `entity`: Silinecek veri nesnesi (SqlQuery ve SqlParams trait'lerini implement etmeli)
245/// 
246/// ## Dönüş Değeri
247/// - `Result<(Transaction<'_>, u64), Error>`: Başarılı olursa, transaction ve etkilenen kayıt sayısını döner; hata durumunda Error döner
248/// 
249/// ## Örnek Kullanım
250/// ```rust,no_run
251/// use postgres::{Client, NoTls, Error};
252/// use parsql::postgres::transactional::{begin, tx_delete};
253/// 
254/// #[derive(Deletable, SqlParams)]
255/// #[table("users")]
256/// #[where_clause("id = $")]
257/// pub struct DeleteUser {
258///     pub id: i32,
259/// }
260///
261/// fn main() -> Result<(), Error> {
262///     let mut client = Client::connect(
263///         "host=localhost user=postgres dbname=test",
264///         NoTls,
265///     )?;
266///     
267///     let mut tx = begin(&mut client)?;
268///     
269///     let delete_user = DeleteUser { id: 1 };
270///     
271///     let (tx, rows_affected) = tx_delete(tx, delete_user)?;
272///     
273///     // İşlemler devam edebilir...
274///     
275///     // Transaction'ı tamamla
276///     tx.commit()?;
277///     Ok(())
278/// }
279/// ```
280pub fn tx_delete<'a, T>(mut tx: Transaction<'a>, entity: T) -> Result<(Transaction<'a>, u64), Error>
281where
282    T: SqlQuery + SqlParams,
283{
284    let result = tx.delete(entity)?;
285    Ok((tx, result))
286}
287
288/// # tx_fetch
289/// 
290/// Transaction içinde tek bir kaydı getirir.
291/// 
292/// ## Parametreler
293/// - `tx`: Transaction nesnesi
294/// - `entity`: Sorgu parametresi nesnesi (SqlQuery, FromRow ve SqlParams trait'lerini implement etmeli)
295/// 
296/// ## Dönüş Değeri
297/// - `Result<(Transaction<'_>, T), Error>`: Başarılı olursa, transaction ve bulunan kaydı döner; hata durumunda Error döner
298/// 
299/// ## Örnek Kullanım
300/// ```rust,no_run
301/// use postgres::{Client, NoTls, Error};
302/// use parsql::postgres::transactional::{begin, tx_fetch};
303/// 
304/// #[derive(Queryable, FromRow, SqlParams)]
305/// #[table("users")]
306/// #[where_clause("id = $")]
307/// pub struct GetUser {
308///     pub id: i32,
309///     pub name: String,
310///     pub email: String,
311/// }
312///
313/// fn main() -> Result<(), Error> {
314///     let mut client = Client::connect(
315///         "host=localhost user=postgres dbname=test",
316///         NoTls,
317///     )?;
318///     
319///     let mut tx = begin(&mut client)?;
320///     
321///     let get_user = GetUser {
322///         id: 1,
323///         name: String::new(),
324///         email: String::new(),
325///     };
326///     
327///     let (tx, user) = tx_fetch(tx, &get_user)?;
328///     
329///     // İşlemler devam edebilir...
330///     
331///     // Transaction'ı tamamla
332///     tx.commit()?;
333///     Ok(())
334/// }
335/// ```
336pub fn tx_fetch<'a, T>(mut tx: Transaction<'a>, entity: &T) -> Result<(Transaction<'a>, T), Error>
337where
338    T: SqlQuery + FromRow + SqlParams,
339{
340    let result = tx.fetch(entity)?;
341    Ok((tx, result))
342}
343
344/// # tx_fetch_all
345/// 
346/// Transaction içinde birden fazla kaydı getirir.
347/// 
348/// ## Parametreler
349/// - `tx`: Transaction nesnesi
350/// - `entity`: Sorgu parametresi nesnesi (SqlQuery, FromRow ve SqlParams trait'lerini implement etmeli)
351/// 
352/// ## Dönüş Değeri
353/// - `Result<(Transaction<'_>, Vec<T>), Error>`: Başarılı olursa, transaction ve bulunan kayıtların listesini döner; hata durumunda Error döner
354/// 
355/// ## Örnek Kullanım
356/// ```rust,no_run
357/// use postgres::{Client, NoTls, Error};
358/// use parsql::postgres::transactional::{begin, tx_fetch_all};
359/// 
360/// #[derive(Queryable, FromRow, SqlParams)]
361/// #[table("users")]
362/// #[where_clause("active = $")]
363/// pub struct GetUsers {
364///     pub active: bool,
365///     pub id: i32,
366///     pub name: String,
367///     pub email: String,
368/// }
369///
370/// fn main() -> Result<(), Error> {
371///     let mut client = Client::connect(
372///         "host=localhost user=postgres dbname=test",
373///         NoTls,
374///     )?;
375///     
376///     let mut tx = begin(&mut client)?;
377///     
378///     let get_users = GetUsers {
379///         active: true,
380///         id: 0,
381///         name: String::new(),
382///         email: String::new(),
383///     };
384///     
385///     let (tx, users) = tx_fetch_all(tx, &get_users)?;
386///     
387///     // İşlemler devam edebilir...
388///     
389///     // Transaction'ı tamamla
390///     tx.commit()?;
391///     Ok(())
392/// }
393/// ```
394pub fn tx_fetch_all<'a, T>(mut tx: Transaction<'a>, entity: &T) -> Result<(Transaction<'a>, Vec<T>), Error>
395where
396    T: SqlQuery + FromRow + SqlParams,
397{
398    let result = tx.fetch_all(entity)?;
399    Ok((tx, result))
400}
401
402/// # tx_select
403/// 
404/// Transaction içinde özel bir sorgu çalıştırır ve sonucu dönüştürür.
405/// 
406/// ## Parametreler
407/// - `tx`: Transaction nesnesi
408/// - `entity`: Sorgu parametresi nesnesi (SqlQuery ve SqlParams trait'lerini implement etmeli)
409/// - `to_model`: Row nesnesini hedef nesne tipine dönüştüren fonksiyon
410/// 
411/// ## Dönüş Değeri
412/// - `Result<(Transaction<'_>, R), Error>`: Başarılı olursa, transaction ve dönüştürülmüş nesneyi döner; hata durumunda Error döner
413pub fn tx_select<'a, T, F, R>(mut tx: Transaction<'a>, entity: &T, to_model: F) -> Result<(Transaction<'a>, R), Error>
414where
415    T: SqlQuery + SqlParams,
416    F: FnOnce(&Row) -> Result<R, Error>,
417{
418    let result = tx.select(entity, to_model)?;
419    Ok((tx, result))
420}
421
422/// # tx_select_all
423/// 
424/// Transaction içinde özel bir sorgu çalıştırır ve tüm sonuçları dönüştürür.
425/// 
426/// ## Parametreler
427/// - `tx`: Transaction nesnesi
428/// - `entity`: Sorgu parametresi nesnesi (SqlQuery ve SqlParams trait'lerini implement etmeli)
429/// - `to_model`: Row nesnesini hedef nesne tipine dönüştüren fonksiyon
430/// 
431/// ## Dönüş Değeri
432/// - `Result<(Transaction<'_>, Vec<R>), Error>`: Başarılı olursa, transaction ve dönüştürülmüş nesnelerin listesini döner; hata durumunda Error döner
433pub fn tx_select_all<'a, T, F, R>(mut tx: Transaction<'a>, entity: &T, to_model: F) -> Result<(Transaction<'a>, Vec<R>), Error>
434where
435    T: SqlQuery + SqlParams,
436    F: FnMut(&Row) -> Result<R, Error>,
437{
438    let result = tx.select_all(entity, to_model)?;
439    Ok((tx, result))
440}
441
442// Geriye dönük uyumluluk için eski tx_get fonksiyonunu koruyalım
443#[deprecated(
444    since = "0.2.0",
445    note = "Renamed to `tx_fetch`. Please use `tx_fetch` function instead."
446)]
447/// # tx_get
448/// 
449/// Transaction içinde tek bir kaydı getirir.
450/// 
451/// This function is deprecated. Please use `tx_fetch` instead.
452pub fn tx_get<'a, T>(mut tx: Transaction<'a>, entity: &T) -> Result<(Transaction<'a>, T), Error>
453where
454    T: SqlQuery + FromRow + SqlParams,
455{
456    let result = tx.fetch(entity)?;
457    Ok((tx, result))
458}
459
460// Geriye dönük uyumluluk için eski tx_get_all fonksiyonunu koruyalım
461#[deprecated(
462    since = "0.2.0",
463    note = "Renamed to `tx_fetch_all`. Please use `tx_fetch_all` function instead."
464)]
465/// # tx_get_all
466/// 
467/// Transaction içinde birden fazla kaydı getirir.
468/// 
469/// This function is deprecated. Please use `tx_fetch_all` instead.
470pub fn tx_get_all<'a, T>(mut tx: Transaction<'a>, entity: &T) -> Result<(Transaction<'a>, Vec<T>), Error>
471where
472    T: SqlQuery + FromRow + SqlParams,
473{
474    let result = tx.fetch_all(entity)?;
475    Ok((tx, result))
476}