1use tokio_postgres::types::ToSql;
2
3mod 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
18pub use clause::*;
20pub use condition::*;
21pub use delete::*;
22pub use insert::*;
23pub use select::*;
24pub use update::*;
25
26pub struct Raw;
27pub struct Column;
29pub struct Select;
31pub struct From;
33pub struct Table;
35pub struct Join;
39pub struct Condition;
43pub struct Paging;
45
46trait SqlClause<'q> {
47 fn unwrap(self) -> (String, Vec<&'q (dyn ToSql + Sync)>);
48}
49
50fn format_col(name: &str) -> String {
51 let mut cast_split = name.split("::");
52 let name = cast_split.next().unwrap_or_default();
53 let mut result = match name.chars().position(|c| c == '.') {
54 Some(dot) => format!("{}.\"{}\"", &name[..dot], name[dot + 1..].trim()),
55 None => format!("\"{}\"", name),
56 };
57 if let Some(cast) = cast_split.next() {
58 result.push_str(&format!("::{}", cast).as_str())
59 }
60 result
61}
62fn format_prim(name: &str) -> String {
63 let name = name.trim();
64 let (col, alias) = {
65 let mut split_as = name.split(" as ");
66 let col_name = split_as.next().unwrap_or_default();
67 let alias = split_as.next();
68 (col_name, alias)
69 };
70
71 let mut col_name = format_col(col);
72
73 if let Some(a) = alias {
74 if a.chars().any(char::is_uppercase) {
75 col_name.push_str(&format!(" as \"{}\"", a));
76 } else {
77 col_name.push_str(&format!(" as {}", a));
78 }
79 }
80 col_name
81}
82fn __cols(sql: &mut String, columns: &[&str]) {
83 let mut not_first = false;
84 for col in columns {
85 if not_first {
86 sql.push_str(", ");
87 }
88 not_first = true;
89 sql.push_str(&format_prim(col));
90 }
91}
92pub fn cols<'q>(columns: &[&str]) -> Clause<'q, Column> {
93 let mut sql = String::new();
94 __cols(&mut sql, columns);
95 Clause::new(sql, vec![])
96}
97fn wrap(s: &str) -> String {
98 format!("\"{}\"", s)
99}
100
101pub fn raw<'q, T>(sql: &str, values: &[&'q (dyn ToSql + Sync)]) -> Clause<'q, T> {
102 Clause::new(sql.to_string(), values.to_vec())
103}
104
105fn __and_col<'q, T>(
106 clause: Clause<'q, T>,
107 name: &str,
108 condition: Clause<'q, Condition>,
109) -> Clause<'q, T> {
110 let (mut sql, mut params) = clause.unwrap();
111 let (cond_sql, cond_params) = condition.unwrap();
112 sql.push_str(" AND ");
113 sql.push_str(&format_col(name));
114 sql.push_str(cond_sql.as_str());
115 params.extend(cond_params);
116 Clause::new(sql, params)
117}
118fn __or_col<'q, T>(
119 clause: Clause<'q, T>,
120 name: &str,
121 condition: Clause<'q, Condition>,
122) -> Clause<'q, T> {
123 let (mut sql, mut params) = clause.unwrap();
124 let (cond_sql, cond_params) = condition.unwrap();
125 sql.push_str(" OR ");
126 sql.push_str(&format_col(name));
127 sql.push_str(cond_sql.as_str());
128 params.extend(cond_params);
129 Clause::new(sql, params)
130}
131
132fn __and_cond<'q, T>(clause: Clause<'q, T>, condition: Clause<'q, Condition>) -> Clause<'q, T> {
133 let (mut sql, mut params) = clause.unwrap();
134 let (cond_sql, cond_params) = condition.unwrap();
135 sql.push_str(" AND ");
136 sql.push_str(cond_sql.as_str());
137 params.extend(cond_params);
138 Clause::new(sql, params)
139}
140fn __or_cond<'q, T>(clause: Clause<'q, T>, condition: Clause<'q, Condition>) -> Clause<'q, T> {
141 let (mut sql, mut params) = clause.unwrap();
142 let (cond_sql, cond_params) = condition.unwrap();
143 sql.push_str(" OR ");
144 sql.push_str(cond_sql.as_str());
145 params.extend(cond_params);
146 Clause::new(sql, params)
147}
148
149fn __and_wrap<'q, T1, T2, R>(clause: Clause<'q, T1>, condition: Clause<'q, T2>) -> Clause<'q, R> {
150 let (mut sql, mut params) = clause.unwrap();
151 sql.push_str(" AND (");
152 sql.push_str(&condition.sql);
153 sql.push(')');
154 params.extend(condition.params);
155 Clause::new(sql, params)
156}
157fn __or_wrap<'q, T1, T2, R>(clause: Clause<'q, T1>, condition: Clause<'q, T2>) -> Clause<'q, R> {
158 let (mut sql, mut params) = clause.unwrap();
159 sql.push_str(" OR (");
160 sql.push_str(&condition.sql);
161 sql.push(')');
162 params.extend(condition.params);
163 Clause::new(sql, params)
164}
165fn __condition<'q, T, C>(clause: Clause<'q, T>, condition: Clause<'q, Condition>) -> Clause<'q, C> {
166 let (mut sql, mut params) = clause.unwrap();
167 let (cond_sql, cond_params) = condition.unwrap();
168 sql.push_str(&cond_sql);
169 params.extend_from_slice(&cond_params);
170 Clause::new(sql, params)
171}