parsql_deadpool_postgres/
traits.rs

1use postgres::types::FromSql;
2use tokio_postgres::{Error, Row};
3use tokio_postgres::types::ToSql;
4use std::fmt::Debug;
5use async_trait::async_trait;
6
7/// Trait for generating SQL queries.
8/// This trait is implemented by the derive macro `Queryable`, `Insertable`, `Updateable`, and `Deletable`.
9pub trait SqlQuery {
10    /// Returns the SQL query string.
11    fn query() -> String;
12}
13
14/// Trait for providing SQL parameters.
15/// This trait is implemented by the derive macro `SqlParams`.
16pub trait SqlParams {
17    /// Returns a vector of references to SQL parameters.
18    fn params(&self) -> Vec<&(dyn ToSql + Sync)>;
19}
20
21/// Trait for providing UPDATE parameters.
22/// This trait is implemented by the derive macro `UpdateParams`.
23pub trait UpdateParams {
24    /// Returns a vector of references to SQL parameters for UPDATE operations.
25    fn params(&self) -> Vec<&(dyn ToSql + Sync)>;
26}
27
28/// Trait for converting database rows to Rust structs.
29/// This trait is implemented by the derive macro `FromRow`.
30pub trait FromRow {
31    /// Converts a database row to a Rust struct.
32    /// 
33    /// # Arguments
34    /// * `row` - A reference to a database row
35    /// 
36    /// # Returns
37    /// * `Result<Self, Error>` - The converted struct or an error
38    fn from_row(row: &Row) -> Result<Self, Error>
39    where
40        Self: Sized;
41}
42
43/// CrudOps trait'i, Pool nesnesi için CRUD işlemlerini extension method olarak sağlar.
44/// Bu trait, Pool üzerinde doğrudan CRUD işlemlerini çağırmayı mümkün kılar.
45#[async_trait]
46pub trait CrudOps {
47    /// Veritabanına yeni bir kayıt ekler.
48    async fn insert<T, P:for<'a> FromSql<'a> + Send + Sync>(&self, entity: T) -> Result<P, Error>
49    where
50        T: SqlQuery + SqlParams + Send + Sync;
51    
52    /// Veritabanındaki mevcut bir kaydı günceller.
53    async fn update<T>(&self, entity: T) -> Result<u64, Error>
54    where
55        T: SqlQuery + UpdateParams + Send + Sync;
56    
57    /// Veritabanından bir kaydı siler.
58    async fn delete<T>(&self, entity: T) -> Result<u64, Error>
59    where
60        T: SqlQuery + SqlParams + Send + Sync;
61    
62    /// Belirtilen kriterlere uygun tek bir kaydı getirir.
63    async fn fetch<T>(&self, params: &T) -> Result<T, Error>
64    where
65        T: SqlQuery + FromRow + SqlParams + Send + Sync;
66    
67    /// Belirtilen kriterlere uygun tüm kayıtları getirir.
68    async fn fetch_all<T>(&self, params: &T) -> Result<Vec<T>, Error>
69    where
70        T: SqlQuery + FromRow + SqlParams + Send + Sync;
71    
72    /// Belirtilen özel dönüşüm fonksiyonunu kullanarak tek bir kaydı getirir.
73    async fn select<T, R, F>(&self, entity: T, to_model: F) -> Result<R, Error>
74    where
75        T: SqlQuery + SqlParams + Send + Sync,
76        F: FnOnce(&Row) -> Result<R, Error> + Send + Sync;
77    
78    /// Belirtilen özel dönüşüm fonksiyonunu kullanarak tüm kayıtları getirir.
79    async fn select_all<T, R, F>(&self, entity: T, to_model: F) -> Result<Vec<R>, Error>
80    where
81        T: SqlQuery + SqlParams + Send + Sync,
82        F: Fn(&Row) -> R + Send + Sync;
83}
84
85/// TransactionOps trait, Transaction için CRUD işlemlerini extension method olarak sağlar
86/// Bu şekilde, herhangi bir Transaction nesnesi üzerinde doğrudan CRUD işlemleri yapılabilir
87#[async_trait]
88pub trait TransactionOps {
89    /// Insert method, yeni bir kayıt eklemek için kullanılır
90    async fn insert<T>(&self, entity: T) -> Result<u64, Error>
91    where
92        T: SqlQuery + SqlParams + Debug + Send + 'static;
93
94    /// Update method, mevcut bir kaydı güncellemek için kullanılır
95    async fn update<T>(&self, entity: T) -> Result<u64, Error>
96    where
97        T: SqlQuery + UpdateParams + SqlParams + Debug + Send + 'static;
98
99    /// Delete method, bir kaydı silmek için kullanılır
100    async fn delete<T>(&self, entity: T) -> Result<u64, Error>
101    where
102        T: SqlQuery + SqlParams + Debug + Send + 'static;
103
104    /// Get method, tek bir kayıt getirmek için kullanılır
105    async fn get<T>(&self, params: &T) -> Result<T, Error>
106    where
107        T: SqlQuery + FromRow + SqlParams + Debug + Send + Sync + Clone + 'static;
108
109    /// Get All method, birden fazla kayıt getirmek için kullanılır
110    async fn get_all<T>(&self, params: &T) -> Result<Vec<T>, Error>
111    where
112        T: SqlQuery + FromRow + SqlParams + Debug + Send + Sync + Clone + 'static;
113
114    /// Select method, özel dönüşüm fonksiyonu ile tek bir kayıt getirmek için kullanılır
115    async fn select<T, R, F>(&self, entity: T, to_model: F) -> Result<R, Error>
116    where
117        T: SqlQuery + SqlParams + Debug + Send + 'static,
118        F: FnOnce(&Row) -> Result<R, Error> + Send + Sync + 'static,
119        R: Send + 'static;
120
121    /// Select All method, özel dönüşüm fonksiyonu ile birden fazla kayıt getirmek için kullanılır
122    async fn select_all<T, R, F>(&self, entity: T, to_model: F) -> Result<Vec<R>, Error>
123    where
124        T: SqlQuery + SqlParams + Debug + Send + 'static,
125        F: Fn(&Row) -> R + Send + Sync + 'static,
126        R: Send + 'static;
127}