diesel/query_dsl/
save_changes_dsl.rs1use associations::HasTable;
2#[cfg(any(feature = "sqlite", feature = "mysql"))]
3use associations::Identifiable;
4use connection::Connection;
5#[cfg(any(feature = "sqlite", feature = "mysql"))]
6use dsl::Find;
7#[cfg(any(feature = "sqlite", feature = "postgres", feature = "mysql"))]
8use dsl::Update;
9use query_builder::{AsChangeset, IntoUpdateTarget};
10#[cfg(any(feature = "sqlite", feature = "mysql"))]
11use query_dsl::methods::{ExecuteDsl, FindDsl};
12#[cfg(any(feature = "sqlite", feature = "postgres", feature = "mysql"))]
13use query_dsl::{LoadQuery, RunQueryDsl};
14use result::QueryResult;
15
16pub trait UpdateAndFetchResults<Changes, Output>: Connection {
27    fn update_and_fetch(&self, changeset: Changes) -> QueryResult<Output>;
29}
30
31#[cfg(feature = "postgres")]
32use pg::PgConnection;
33
34#[cfg(feature = "postgres")]
35impl<Changes, Output> UpdateAndFetchResults<Changes, Output> for PgConnection
36where
37    Changes: Copy + AsChangeset<Target = <Changes as HasTable>::Table> + IntoUpdateTarget,
38    Update<Changes, Changes>: LoadQuery<PgConnection, Output>,
39{
40    fn update_and_fetch(&self, changeset: Changes) -> QueryResult<Output> {
41        ::update(changeset).set(changeset).get_result(self)
42    }
43}
44
45#[cfg(feature = "sqlite")]
46use sqlite::SqliteConnection;
47
48#[cfg(feature = "sqlite")]
49impl<Changes, Output> UpdateAndFetchResults<Changes, Output> for SqliteConnection
50where
51    Changes: Copy + Identifiable,
52    Changes: AsChangeset<Target = <Changes as HasTable>::Table> + IntoUpdateTarget,
53    Changes::Table: FindDsl<Changes::Id>,
54    Update<Changes, Changes>: ExecuteDsl<SqliteConnection>,
55    Find<Changes::Table, Changes::Id>: LoadQuery<SqliteConnection, Output>,
56{
57    fn update_and_fetch(&self, changeset: Changes) -> QueryResult<Output> {
58        ::update(changeset).set(changeset).execute(self)?;
59        Changes::table().find(changeset.id()).get_result(self)
60    }
61}
62
63#[cfg(feature = "mysql")]
64use mysql::MysqlConnection;
65
66#[cfg(feature = "mysql")]
67impl<Changes, Output> UpdateAndFetchResults<Changes, Output> for MysqlConnection
68where
69    Changes: Copy + Identifiable,
70    Changes: AsChangeset<Target = <Changes as HasTable>::Table> + IntoUpdateTarget,
71    Changes::Table: FindDsl<Changes::Id>,
72    Update<Changes, Changes>: ExecuteDsl<MysqlConnection>,
73    Find<Changes::Table, Changes::Id>: LoadQuery<MysqlConnection, Output>,
74{
75    fn update_and_fetch(&self, changeset: Changes) -> QueryResult<Output> {
76        ::update(changeset).set(changeset).execute(self)?;
77        Changes::table().find(changeset.id()).get_result(self)
78    }
79}
80
81pub trait SaveChangesDsl<Conn> {
130    fn save_changes<T>(self, connection: &Conn) -> QueryResult<T>
132    where
133        Self: Sized,
134        Conn: UpdateAndFetchResults<Self, T>,
135    {
136        connection.update_and_fetch(self)
137    }
138}
139
140impl<T, Conn> SaveChangesDsl<Conn> for T where
141    T: Copy + AsChangeset<Target = <T as HasTable>::Table> + IntoUpdateTarget
142{
143}