1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
use super::predicate::{And, Eq, Op, Predicate}; use crate::types::{Bind, Primitive}; use crate::{CheckedSql, Table, ToSql}; use std::marker::PhantomData; pub trait UpdateSet { fn write_set(&self, sql: &mut String); } impl<T, A> UpdateSet for Op<T, A, Bind, Eq> where T: Table, { fn write_set(&self, sql: &mut String) { self.write_predicate(sql); } } impl<T, A, U> UpdateSet for Op<T, A, U, Eq> where T: Table, U: Primitive, { fn write_set(&self, sql: &mut String) { self.write_predicate(sql); } } impl<H, T> UpdateSet for And<H, T> where H: UpdateSet, T: UpdateSet, { fn write_set(&self, sql: &mut String) { self.head.write_set(sql); sql.push(','); self.tail.write_set(sql); } } pub struct Update<T: ?Sized, S> { _table: PhantomData<T>, set: S, } impl<T: ?Sized, S> Update<T, S> { pub(crate) const fn new(set: S) -> Self { Self { _table: PhantomData, set, } } } impl<T, S> ToSql for Update<T, S> where T: Table + ?Sized, S: UpdateSet, { fn write_sql_unchecked(&self, sql: &mut String) { sql.push_str("UPDATE "); sql.push_str(T::NAME); sql.push_str(" SET "); self.set.write_set(sql); } } impl<T: ?Sized, S: CheckedSql> CheckedSql for Update<T, S> {}