1use crate::{Dialect, ToSql};
2
3pub(crate) trait SqlExtension {
4 fn push_quoted<T: AsRef<str>>(&mut self, s: T);
5 fn push_table_name(&mut self, schema: &Option<String>, table: &str);
6 fn push_sql<T: ToSql>(&mut self, sql: &T, dialect: Dialect);
7 fn push_sql_sequence<T: ToSql>(&mut self, sql: &[T], separator: &str, dialect: Dialect);
8 fn push_quoted_sequence(&mut self, sql: &[String], separator: &str);
9}
10
11impl SqlExtension for String {
12 fn push_quoted<T: AsRef<str>>(&mut self, s: T) {
13 if s.as_ref().contains('"') {
14 panic!("Cannot quote string with double quotes");
15 }
16 self.push('"');
17 self.push_str(s.as_ref());
18 self.push('"');
19 }
20
21 fn push_table_name(&mut self, schema: &Option<String>, table: &str) {
22 if let Some(schema) = schema {
23 self.push_quoted(schema);
24 self.push('.');
25 }
26 self.push_quoted(table);
27 }
28
29 fn push_sql<T: ToSql>(&mut self, sql: &T, dialect: Dialect) {
30 sql.write_sql(self, dialect);
31 }
32
33 fn push_sql_sequence<T: ToSql>(&mut self, sql: &[T], separator: &str, dialect: Dialect) {
34 let mut first = true;
35 for s in sql.into_iter() {
36 if !first {
37 self.push_str(separator);
38 }
39 s.write_sql(self, dialect);
40 first = false;
41 }
42 }
43
44 fn push_quoted_sequence(&mut self, sql: &[String], separator: &str) {
45 let mut first = true;
46 for s in sql {
47 if !first {
48 self.push_str(separator);
49 }
50 self.push_quoted(s);
51 first = false;
52 }
53 }
54}
55
56pub fn pkey_column_names(schema: &str) -> Vec<String> {
57 vec![
58 format!("{}_id", schema),
59 format!("{}_uuid", schema),
60 "id".to_string(),
61 "uuid".to_string(),
62 ]
63}