Skip to main content

ngb_sqlbuilder/
update.rs

1use crate::clause::Clause;
2use crate::select::__where;
3use crate::{Condition, SqlClause, wrap};
4use tokio_postgres::types::ToSql;
5
6pub struct Update;
7pub struct UpdateSet;
8pub struct UpdateWhere;
9pub fn update<'q>(table: &str) -> Clause<'q, Update> {
10    let mut sql = String::from("update ");
11    sql.push_str(&wrap(table));
12    Clause::new(sql, vec![])
13}
14
15impl<'q> Clause<'q, Update> {
16    pub fn set(self, map: &[(&str, &'q (dyn ToSql + Sync + 'q))]) -> Clause<'q, UpdateSet> {
17        let (mut sql, mut params) = self.unwrap();
18        sql.push_str(" set ");
19        let mut not_first = false;
20        for (k, v) in map {
21            if not_first {
22                sql.push_str(", ");
23            } else {
24                not_first = true;
25            }
26            sql.push_str(&wrap(k));
27            sql.push_str(" = $");
28            params.push(*v);
29        }
30        Clause::new(sql, params)
31    }
32}
33
34impl<'q> Clause<'q, UpdateSet> {
35    pub fn where_col(
36        self,
37        name: &str,
38        condition: Clause<'q, Condition>,
39    ) -> Clause<'q, UpdateWhere> {
40        __where(self, name, condition)
41    }
42}
43
44#[cfg(test)]
45mod test {
46    use super::*;
47    use crate::eq;
48    #[test]
49    fn test_update() {
50        let name = String::from("test");
51        let (sql, params) = update("Table")
52            .set(&[("Value", &1), ("Name", &name)])
53            .where_col("Id", eq(&123))
54            .build();
55        println!("{}", sql);
56        println!("{:?}", params);
57    }
58}