Skip to main content

ngb_sqlbuilder/
lib.rs

1use tokio_postgres::types::ToSql;
2
3// type Parameter = (dyn ToSql + Sync);
4
5mod builder;
6mod clause;
7mod condition;
8mod delete;
9mod insert;
10#[allow(dead_code)]
11mod select;
12mod update;
13
14mod column;
15#[cfg(feature = "execute")]
16mod execute;
17
18// pub use builder::*;
19pub use clause::*;
20pub use condition::*;
21pub use delete::*;
22pub use insert::*;
23pub use select::*;
24pub use update::*;
25
26
27
28pub struct Raw;
29// #[derive(Debug)]
30pub struct Column;
31// #[derive(Debug)]
32pub struct Select;
33// #[derive(Debug)]
34pub struct From;
35// #[derive(Debug)]
36pub struct Table;
37// #[derive(Debug)]
38// pub struct Final;
39// #[derive(Debug)]
40pub struct Join;
41// #[derive(Debug)]
42
43// #[derive(Debug)]
44pub struct Condition;
45// #[derive(Debug)]
46pub struct Paging;
47
48trait SqlClause<'q> {
49    fn unwrap(self) -> (String, Vec<&'q (dyn ToSql + Sync)>);
50}
51
52fn format_col(name: &str) -> String {
53    let mut cast_split = name.split("::");
54    let name = cast_split.next().unwrap_or_default();
55    let mut result = match name.chars().position(|c| c == '.') {
56        Some(dot) => format!("{}.\"{}\"", &name[..dot], name[dot + 1..].trim()),
57        None => format!("\"{}\"", name),
58    };
59    if let Some(cast) = cast_split.next() {
60        result.push_str(&format!("::{}", cast).as_str())
61    }
62    result
63}
64fn format_prim(name: &str) -> String {
65    let name = name.trim();
66    let (col, alias) = {
67        let mut split_as = name.split(" as ");
68        let col_name = split_as.next().unwrap_or_default();
69        let alias = split_as.next();
70        (col_name, alias)
71    };
72
73    let mut col_name = format_col(col);
74
75    if let Some(a) = alias {
76        if a.chars().any(char::is_uppercase) {
77            col_name.push_str(&format!(" as \"{}\"", a));
78        } else {
79            col_name.push_str(&format!(" as {}", a));
80        }
81    }
82    col_name
83}
84fn __cols(sql: &mut String, columns: &[&str]) {
85    let mut not_first = false;
86    for col in columns {
87        if not_first {
88            sql.push_str(", ");
89        }
90        not_first = true;
91        sql.push_str(&format_prim(col));
92    }
93}
94pub fn cols<'q>(columns: &[&str]) -> Clause<'q, Column> {
95    let mut sql = String::new();
96    __cols(&mut sql, columns);
97    Clause::new(sql, vec![])
98}
99pub fn func<'q, T, C>(name: &str, clause: Clause<'q, T>) -> Clause<'q, C> {
100    let mut sql = String::from(name);
101    let (cl_sql, cl_params) = clause.unwrap();
102    sql.push('(');
103    sql.push_str(&cl_sql);
104    sql.push(')');
105    Clause::new(sql, cl_params)
106}
107pub fn func_col<'q>(func_name: &str, column: &str) -> Clause<'q, Column> {
108    func(func_name, col(column))
109}
110pub fn avg_col(column: &str) -> Clause<'_, Column> {
111    func("avg", col(column))
112}
113pub fn max_col(column: &str) -> Clause<'_, Column> {
114    func("max", col(column))
115}
116pub fn min_col(column: &str) -> Clause<'_, Column> {
117    func("min", col(column))
118}
119pub fn sum_col(column: &str) -> Clause<'_, Column> {
120    func("sum", col(column))
121}
122fn wrap(s: &str) -> String {
123    format!("\"{}\"", s)
124}
125
126pub fn raw<'q, T>(sql: &str, values: &[&'q (dyn ToSql + Sync)]) -> Clause<'q, T> {
127    Clause::new(sql.to_string(), values.to_vec())
128}
129
130fn __and_col<'q, T>(
131    clause: Clause<'q, T>,
132    name: &str,
133    condition: Clause<'q, Condition>,
134) -> Clause<'q, T> {
135    let (mut sql, mut params) = clause.unwrap();
136    let (cond_sql, cond_params) = condition.unwrap();
137    sql.push_str(" AND ");
138    sql.push_str(&format_col(name));
139    sql.push_str(cond_sql.as_str());
140    params.extend(cond_params);
141    Clause::new(sql, params)
142}
143fn __or_col<'q, T>(
144    clause: Clause<'q, T>,
145    name: &str,
146    condition: Clause<'q, Condition>,
147) -> Clause<'q, T> {
148    let (mut sql, mut params) = clause.unwrap();
149    let (cond_sql, cond_params) = condition.unwrap();
150    sql.push_str(" OR ");
151    sql.push_str(&format_col(name));
152    sql.push_str(cond_sql.as_str());
153    params.extend(cond_params);
154    Clause::new(sql, params)
155}
156
157fn __and_cond<'q, T>(clause: Clause<'q, T>, condition: Clause<'q, Condition>) -> Clause<'q, T> {
158    let (mut sql, mut params) = clause.unwrap();
159    let (cond_sql, cond_params) = condition.unwrap();
160    sql.push_str(" AND ");
161    sql.push_str(cond_sql.as_str());
162    params.extend(cond_params);
163    Clause::new(sql, params)
164}
165fn __or_cond<'q, T>(clause: Clause<'q, T>, condition: Clause<'q, Condition>) -> Clause<'q, T> {
166    let (mut sql, mut params) = clause.unwrap();
167    let (cond_sql, cond_params) = condition.unwrap();
168    sql.push_str(" OR ");
169    sql.push_str(cond_sql.as_str());
170    params.extend(cond_params);
171    Clause::new(sql, params)
172}
173
174fn __and_wrap<'q, T1, T2, R>(clause: Clause<'q, T1>, condition: Clause<'q, T2>) -> Clause<'q, R> {
175    let (mut sql, mut params) = clause.unwrap();
176    sql.push_str(" AND (");
177    sql.push_str(&condition.sql);
178    sql.push(')');
179    params.extend(condition.params);
180    Clause::new(sql, params)
181}
182fn __or_wrap<'q, T1, T2, R>(clause: Clause<'q, T1>, condition: Clause<'q, T2>) -> Clause<'q, R> {
183    let (mut sql, mut params) = clause.unwrap();
184    sql.push_str(" OR (");
185    sql.push_str(&condition.sql);
186    sql.push(')');
187    params.extend(condition.params);
188    Clause::new(sql, params)
189}
190fn __condition<'q, T, C>(clause: Clause<'q, T>, condition: Clause<'q, Condition>) -> Clause<'q, C> {
191    let (mut sql, mut params) = clause.unwrap();
192    let (cond_sql, cond_params) = condition.unwrap();
193    sql.push_str(&cond_sql);
194    params.extend_from_slice(&cond_params);
195    Clause::new(sql, params)
196}