Skip to main content

rullst_orm/
raw.rs

1use crate::{Error, RullstValue};
2
3pub struct RawQueryBuilder {
4    pub sql: String,
5    pub bindings: Vec<RullstValue>,
6}
7
8impl RawQueryBuilder {
9    pub fn new(sql: &str) -> Self {
10        Self {
11            sql: sql.to_string(),
12            bindings: Vec::new(),
13        }
14    }
15
16    pub fn bind<T: Into<RullstValue>>(mut self, value: T) -> Self {
17        self.bindings.push(value.into());
18        self
19    }
20
21    pub async fn map_to<T>(&self) -> Result<Vec<T>, Error>
22    where
23        for<'r> T: crate::_sqlx::FromRow<'r, <crate::RullstDatabase as crate::_sqlx::Database>::Row>
24            + Send
25            + Unpin,
26    {
27        if crate::schema::is_query_log_enabled() {
28            println!(
29                "[SQL Debug] {:?} | Bindings: [{} parameter(s)]",
30                self.sql,
31                self.bindings.len()
32            );
33        }
34
35        let mut query =
36            crate::_sqlx::query_as::<_, T>(crate::_sqlx::AssertSqlSafe(self.sql.as_str()));
37        for binding in &self.bindings {
38            match binding {
39                RullstValue::String(s) => {
40                    query = query.bind(s.clone());
41                }
42                RullstValue::Int(i) => {
43                    query = query.bind(*i);
44                }
45                RullstValue::Float(f) => {
46                    query = query.bind(*f);
47                }
48                RullstValue::Bool(b) => {
49                    query = query.bind(*b);
50                }
51            }
52        }
53
54        let results = crate::execute_query!(query, fetch_all, read_pool)
55            .map_err(|e| Error::DatabaseError(e.to_string()))?;
56        Ok(results)
57    }
58
59    pub async fn execute(&self) -> Result<u64, Error> {
60        if crate::schema::is_query_log_enabled() {
61            println!(
62                "[SQL Debug] {:?} | Bindings: [{} parameter(s)]",
63                self.sql,
64                self.bindings.len()
65            );
66        }
67
68        let mut query = crate::_sqlx::query(crate::_sqlx::AssertSqlSafe(self.sql.as_str()));
69        for binding in &self.bindings {
70            match binding {
71                RullstValue::String(s) => {
72                    query = query.bind(s.clone());
73                }
74                RullstValue::Int(i) => {
75                    query = query.bind(*i);
76                }
77                RullstValue::Float(f) => {
78                    query = query.bind(*f);
79                }
80                RullstValue::Bool(b) => {
81                    query = query.bind(*b);
82                }
83            }
84        }
85
86        let result = crate::execute_query!(query, execute, pool)
87            .map_err(|e| Error::DatabaseError(e.to_string()))?;
88        Ok(result.rows_affected())
89    }
90}