sql/query/
update.rs

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}