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}