teo_sql_connector/stmts/insert_into/
mod.rs1use crate::schema::dialect::SQLDialect;
2use crate::schema::value::encode::ToSQLString;
3
4pub(crate) struct SQLInsertIntoStatement<'a> {
5 pub(crate) table: &'a str,
6 pub(crate) values: Vec<(&'a str, &'a str)>,
7 pub(crate) returning: Vec<String>,
8}
9
10impl<'a> SQLInsertIntoStatement<'a> {
11 pub(crate) fn value(&mut self, pair: (&'a str, &'a str)) -> &mut Self {
12 self.values.push(pair);
13 self
14 }
15
16 pub(crate) fn values(&mut self, pairs: Vec<(&'a str, &'a str)>) -> &mut Self {
17 self.values.extend(pairs);
18 self
19 }
20
21 pub(crate) fn returning<S>(&mut self, keys: &Vec<S>) -> &mut Self where S: Clone + Into<String> {
22 self.returning = keys.iter().map(|k| k.clone().into()).collect();
23 self
24 }
25}
26
27impl<'a> ToSQLString for SQLInsertIntoStatement<'a> {
28 fn to_string(&self, dialect: SQLDialect) -> String {
29 let mut keys: Vec<&str> = vec![];
30 let mut values: Vec<&str> = vec![];
31 for (k, v) in self.values.iter() {
32 keys.push(k);
33 values.push(v);
34 }
35 if dialect == SQLDialect::PostgreSQL {
36 format!("INSERT INTO \"{}\"({}) VALUES({}){};", self.table, keys.iter().map(|k| format!("\"{}\"", k)).collect::<Vec<String>>().join(","), values.join(","), if self.returning.is_empty() {
37 "".to_owned()
38 } else {
39 " RETURNING ".to_owned() + &self.returning.join(",")
40 })
41 } else {
42 format!("INSERT INTO `{}`({}) VALUES({});", self.table, keys.iter().map(|k| format!("`{k}`")).collect::<Vec<String>>().join(","), values.join(","))
43 }
44 }
45}