sea_query/raw_sql/
seaql.rs

1use crate::{Value, Values};
2
3#[derive(Debug)]
4pub struct Query {
5    pub sql: String,
6    pub values: Values,
7}
8
9pub fn query(sql: &str) -> Query {
10    Query {
11        sql: sql.to_owned(),
12        values: Values(Default::default()),
13    }
14}
15
16impl Query {
17    pub fn bind<V: Into<Value> + Clone>(mut self, v: &V) -> Self {
18        self.values.0.push(v.to_owned().into());
19        self
20    }
21
22    /// Matches the signature of [`SqlWriterValues::into_parts`]
23    pub fn into_parts(self) -> (String, Values) {
24        (self.sql, self.values)
25    }
26}
27
28pub struct DebugQuery {
29    pub sql: String,
30    pub params: Vec<String>,
31}
32
33pub fn debug(sql: &str) -> DebugQuery {
34    DebugQuery {
35        sql: sql.to_owned(),
36        params: Default::default(),
37    }
38}
39
40impl DebugQuery {
41    /// This can bind virtually any type for debug purpose
42    pub fn bind<V: std::fmt::Debug>(mut self, v: V) -> Self {
43        self.params.push(format!("{v:?}"));
44        self
45    }
46}
47
48impl std::fmt::Debug for DebugQuery {
49    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
50        write!(f, "sql!(")?;
51        write!(f, "{}", self.sql)?;
52        writeln!(f, ")")?;
53        write!(f, "    .params(")?;
54        for (i, p) in self.params.iter().enumerate() {
55            if i > 0 {
56                write!(f, ", ")?;
57            }
58            write!(f, "{p}")?;
59        }
60        write!(f, ")")
61    }
62}