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}