teo_sql_connector/stmts/insert_into/
mod.rs

1use 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}