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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
pub mod changeset;
pub mod target;
pub use self::changeset::{Changeset, AsChangeset};
pub use self::target::UpdateTarget;
use expression::Expression;
use query_builder::{Query, AsQuery, QueryFragment, QueryBuilder, BuildQueryResult};
use query_source::Table;
pub struct IncompleteUpdateStatement<T>(T);
impl<T> IncompleteUpdateStatement<T> {
#[doc(hidden)]
pub fn new(t: T) -> Self {
IncompleteUpdateStatement(t)
}
}
impl<T> IncompleteUpdateStatement<T> {
pub fn set<U>(self, values: U) -> UpdateStatement<T, U::Changeset> where
U: changeset::AsChangeset,
UpdateStatement<T, U::Changeset>: QueryFragment,
{
UpdateStatement {
target: self.0,
values: values.as_changeset(),
}
}
}
#[doc(hidden)]
pub struct UpdateStatement<T, U> {
target: T,
values: U,
}
impl<T, U> QueryFragment for UpdateStatement<T, U> where
T: UpdateTarget,
U: changeset::Changeset<Target=T::Table>,
{
fn to_sql(&self, out: &mut QueryBuilder) -> BuildQueryResult {
out.push_sql("UPDATE ");
try!(self.target.from_clause(out));
out.push_sql(" SET ");
try!(self.values.to_sql(out));
self.target.where_clause(out)
}
}
impl<T, U> AsQuery for UpdateStatement<T, U> where
UpdateQuery<T, U>: Query,
{
type SqlType = <Self::Query as Query>::SqlType;
type Query = UpdateQuery<T, U>;
fn as_query(self) -> Self::Query {
UpdateQuery(self)
}
}
#[doc(hidden)]
pub struct UpdateQuery<T, U>(UpdateStatement<T, U>);
impl<T, U> QueryFragment for UpdateQuery<T, U> where
T: UpdateTarget,
UpdateStatement<T, U>: QueryFragment,
{
fn to_sql(&self, out: &mut QueryBuilder) -> BuildQueryResult {
try!(self.0.to_sql(out));
out.push_sql(" RETURNING ");
Expression::to_sql(&T::Table::all_columns(), out)
}
}
impl<T, U> Query for UpdateQuery<T, U> where
UpdateQuery<T, U>: QueryFragment,
T: UpdateTarget,
{
type SqlType = <<T::Table as Table>::AllColumns as Expression>::SqlType;
}