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}