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
use associations::HasTable;
use helper_types::*;
use query_builder::{AsChangeset, IntoUpdateTarget};
use query_dsl::*;
use result::QueryResult;
#[cfg(any(feature = "sqlite", feature = "mysql"))]
use associations::Identifiable;
pub trait InternalSaveChangesDsl<Conn, T>: Sized {
fn internal_save_changes(self, connection: &Conn) -> QueryResult<T>;
}
impl<T, U, Conn> InternalSaveChangesDsl<Conn, U> for T where
T: Copy + AsChangeset<Target=<T as HasTable>::Table> + IntoUpdateTarget,
Update<T, T>: LoadDsl<Conn> + LoadQuery<Conn, U>,
{
fn internal_save_changes(self, conn: &Conn) -> QueryResult<U> {
::update(self).set(self).get_result(conn)
}
}
#[cfg(feature = "sqlite")]
use sqlite::SqliteConnection;
#[cfg(feature = "sqlite")]
impl<T, U> InternalSaveChangesDsl<SqliteConnection, U> for T where
T: Copy + Identifiable,
T: AsChangeset<Target=<T as HasTable>::Table> + IntoUpdateTarget,
T::Table: FindDsl<T::Id>,
Update<T, T>: ExecuteDsl<SqliteConnection>,
Find<T::Table, T::Id>: LoadQuery<SqliteConnection, U>,
{
fn internal_save_changes(self, conn: &SqliteConnection) -> QueryResult<U> {
try!(::update(self).set(self).execute(conn));
T::table().find(self.id()).get_result(conn)
}
}
#[cfg(feature = "mysql")]
use mysql::MysqlConnection;
#[cfg(feature = "mysql")]
impl<T, U> InternalSaveChangesDsl<MysqlConnection, U> for T where
T: Copy + Identifiable,
T: AsChangeset<Target=<T as HasTable>::Table> + IntoUpdateTarget,
T::Table: FindDsl<T::Id>,
Update<T, T>: ExecuteDsl<MysqlConnection>,
Find<T::Table, T::Id>: LoadQuery<MysqlConnection, U>,
{
fn internal_save_changes(self, conn: &MysqlConnection) -> QueryResult<U> {
try!(::update(self).set(self).execute(conn));
T::table().find(self.id()).get_result(conn)
}
}
pub trait SaveChangesDsl<Conn> {
fn save_changes<T>(self, connection: &Conn) -> QueryResult<T> where
Self: InternalSaveChangesDsl<Conn, T>,
{
self.internal_save_changes(connection)
}
}
impl<T, Conn> SaveChangesDsl<Conn> for T where
T: Copy + AsChangeset<Target=<T as HasTable>::Table> + IntoUpdateTarget,
{}