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, ¶ms)
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, ¶ms)
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, ¶ms)
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, ¶ms)?;
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, ¶ms)?;
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, ¶ms)?;
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, ¶ms)?;
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}