diesel/query_dsl/
save_changes_dsl.rs1use crate::associations::HasTable;
2#[cfg(any(feature = "sqlite", feature = "mysql"))]
3use crate::associations::Identifiable;
4use crate::connection::Connection;
5#[cfg(any(feature = "sqlite", feature = "mysql"))]
6use crate::dsl::Find;
7#[cfg(any(feature = "sqlite", feature = "postgres", feature = "mysql"))]
8use crate::dsl::Update;
9#[cfg(any(feature = "sqlite", feature = "postgres", feature = "mysql"))]
10use crate::expression::{is_aggregate, MixedAggregates, ValidGrouping};
11use crate::query_builder::{AsChangeset, IntoUpdateTarget};
12#[cfg(any(feature = "sqlite", feature = "mysql"))]
13use crate::query_dsl::methods::{ExecuteDsl, FindDsl};
14#[cfg(any(feature = "sqlite", feature = "postgres", feature = "mysql"))]
15use crate::query_dsl::{LoadQuery, RunQueryDsl};
16use crate::result::QueryResult;
17#[cfg(any(feature = "sqlite", feature = "postgres", feature = "mysql"))]
18use crate::Table;
19
20pub trait UpdateAndFetchResults<Changes, Output>: Connection {
31 fn update_and_fetch(&mut self, changeset: Changes) -> QueryResult<Output>;
33}
34
35#[cfg(feature = "postgres")]
36use crate::pg::PgConnection;
37
38#[cfg(feature = "postgres")]
39impl<'b, Changes, Output> UpdateAndFetchResults<Changes, Output> for PgConnection
40where
41 Changes: Copy + AsChangeset<Target = <Changes as HasTable>::Table> + IntoUpdateTarget,
42 Update<Changes, Changes>: LoadQuery<'b, PgConnection, Output>,
43 <Changes::Table as Table>::AllColumns: ValidGrouping<()>,
44 <<Changes::Table as Table>::AllColumns as ValidGrouping<()>>::IsAggregate:
45 MixedAggregates<is_aggregate::No, Output = is_aggregate::No>,
46{
47 fn update_and_fetch(&mut self, changeset: Changes) -> QueryResult<Output> {
48 crate::update(changeset).set(changeset).get_result(self)
49 }
50}
51
52#[cfg(feature = "sqlite")]
53use crate::sqlite::SqliteConnection;
54
55#[cfg(feature = "sqlite")]
56impl<'b, Changes, Output> UpdateAndFetchResults<Changes, Output> for SqliteConnection
57where
58 Changes: Copy + Identifiable,
59 Changes: AsChangeset<Target = <Changes as HasTable>::Table> + IntoUpdateTarget,
60 Changes::Table: FindDsl<Changes::Id>,
61 Update<Changes, Changes>: ExecuteDsl<SqliteConnection>,
62 Find<Changes::Table, Changes::Id>: LoadQuery<'b, SqliteConnection, Output>,
63 <Changes::Table as Table>::AllColumns: ValidGrouping<()>,
64 <<Changes::Table as Table>::AllColumns as ValidGrouping<()>>::IsAggregate:
65 MixedAggregates<is_aggregate::No, Output = is_aggregate::No>,
66{
67 fn update_and_fetch(&mut self, changeset: Changes) -> QueryResult<Output> {
68 crate::update(changeset).set(changeset).execute(self)?;
69 Changes::table().find(changeset.id()).get_result(self)
70 }
71}
72
73#[cfg(feature = "mysql")]
74use crate::mysql::MysqlConnection;
75
76#[cfg(feature = "mysql")]
77impl<'b, Changes, Output> UpdateAndFetchResults<Changes, Output> for MysqlConnection
78where
79 Changes: Copy + Identifiable,
80 Changes: AsChangeset<Target = <Changes as HasTable>::Table> + IntoUpdateTarget,
81 Changes::Table: FindDsl<Changes::Id>,
82 Update<Changes, Changes>: ExecuteDsl<MysqlConnection>,
83 Find<Changes::Table, Changes::Id>: LoadQuery<'b, MysqlConnection, Output>,
84 <Changes::Table as Table>::AllColumns: ValidGrouping<()>,
85 <<Changes::Table as Table>::AllColumns as ValidGrouping<()>>::IsAggregate:
86 MixedAggregates<is_aggregate::No, Output = is_aggregate::No>,
87{
88 fn update_and_fetch(&mut self, changeset: Changes) -> QueryResult<Output> {
89 crate::update(changeset).set(changeset).execute(self)?;
90 Changes::table().find(changeset.id()).get_result(self)
91 }
92}
93
94pub trait SaveChangesDsl<Conn> {
142 fn save_changes<T>(self, connection: &mut Conn) -> QueryResult<T>
144 where
145 Self: Sized,
146 Conn: UpdateAndFetchResults<Self, T>,
147 {
148 connection.update_and_fetch(self)
149 }
150}
151
152impl<T, Conn> SaveChangesDsl<Conn> for T where
153 T: Copy + AsChangeset<Target = <T as HasTable>::Table> + IntoUpdateTarget
154{
155}