1use crate::query::Cte;
2use crate::query::Where;
3use crate::util::SqlExtension;
4use crate::{Dialect, ToSql};
5
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub struct Update {
8 pub ctes: Vec<Cte>,
9 pub schema: Option<String>,
10 pub table: String,
11 pub values: Vec<(String, String)>,
12 pub where_: Where,
13}
14
15impl Update {
16 pub fn new(table: &str) -> Self {
17 Self {
18 ctes: vec![],
19 schema: None,
20 table: table.to_string(),
21 values: vec![],
22 where_: Where::And(vec![]),
23 }
24 }
25
26 pub fn set(mut self, column: &str, value: &str) -> Self {
27 self.values.push((column.to_string(), value.to_string()));
28 self
29 }
30
31 pub fn where_(mut self, where_: Where) -> Self {
32 match self.where_ {
33 Where::And(ref mut v) => v.push(where_),
34 _ => self.where_ = Where::And(vec![self.where_, where_]),
35 }
36 self
37 }
38}
39
40impl ToSql for Update {
41 fn write_sql(&self, buf: &mut String, dialect: Dialect) {
42 if !self.ctes.is_empty() {
43 buf.push_str("WITH ");
44 buf.push_sql_sequence(&self.ctes, ", ", dialect);
45 buf.push(' ');
46 }
47 buf.push_str("UPDATE ");
48 buf.push_table_name(&self.schema, &self.table);
49 buf.push_str(" SET ");
50 for (i, (column, value)) in self.values.iter().enumerate() {
51 if i > 0 {
52 buf.push_str(", ");
53 }
54 buf.push_quoted(column);
55 buf.push_str(" = ");
56 buf.push_str(value);
57 }
58 if !self.where_.is_empty() {
59 buf.push_str(" WHERE ");
60 self.where_.write_sql(buf, dialect);
61 }
62 }
63}