1 #[cfg(feature = "with-deprecated")]
2 use query_builder::locking_clause::ForUpdate;
3 use query_builder::AsQuery;
4 use query_source::Table;
5 
6 /// The `for_update` method
7 ///
8 /// This trait should not be relied on directly by most apps. Its behavior is
9 /// provided by [`QueryDsl`]. However, you may need a where clause on this trait
10 /// to call `for_update` from generic code.
11 ///
12 /// [`QueryDsl`]: ../trait.QueryDsl.html
13 #[cfg(feature = "with-deprecated")]
14 #[deprecated(since = "1.3.0", note = "use `LockingDsl<ForUpdate>` instead")]
15 pub trait ForUpdateDsl {
16     /// The type returned by `for_update`. See [`dsl::ForUpdate`] for
17     /// convenient access to this type.
18     ///
19     /// [`dsl::ForUpdate`]: ../../dsl/type.ForUpdate.html
20     type Output;
21 
22     /// See the trait level documentation
for_update(self) -> Self::Output23     fn for_update(self) -> Self::Output;
24 }
25 
26 #[cfg(feature = "with-deprecated")]
27 #[allow(deprecated)]
28 impl<T> ForUpdateDsl for T
29 where
30     T: LockingDsl<ForUpdate>,
31 {
32     type Output = <T as LockingDsl<ForUpdate>>::Output;
33 
for_update(self) -> Self::Output34     fn for_update(self) -> Self::Output {
35         self.with_lock(ForUpdate)
36     }
37 }
38 
39 /// Methods related to locking select statements
40 ///
41 /// This trait should not be relied on directly by most apps. Its behavior is
42 /// provided by [`QueryDsl`]. However, you may need a where clause on this trait
43 /// to call `for_update` from generic code.
44 ///
45 /// [`QueryDsl`]: ../trait.QueryDsl.html
46 pub trait LockingDsl<Lock> {
47     /// The type returned by `set_lock`. See [`dsl::ForUpdate`] and friends for
48     /// convenient access to this type.
49     ///
50     /// [`dsl::ForUpdate`]: ../../dsl/type.ForUpdate.html
51     type Output;
52 
53     /// See the trait level documentation
with_lock(self, lock: Lock) -> Self::Output54     fn with_lock(self, lock: Lock) -> Self::Output;
55 }
56 
57 impl<T, Lock> LockingDsl<Lock> for T
58 where
59     T: Table + AsQuery,
60     T::Query: LockingDsl<Lock>,
61 {
62     type Output = <T::Query as LockingDsl<Lock>>::Output;
63 
with_lock(self, lock: Lock) -> Self::Output64     fn with_lock(self, lock: Lock) -> Self::Output {
65         self.as_query().with_lock(lock)
66     }
67 }
68 
69 /// Methods related to modifiers on locking select statements
70 ///
71 /// This trait should not be relied on directly by most apps. Its behavior is
72 /// provided by [`QueryDsl`]. However, you may need a where clause on this trait
73 /// to call `skip_locked` from generic code.
74 ///
75 /// [`QueryDsl`]: ../trait.QueryDsl.html
76 pub trait ModifyLockDsl<Modifier> {
77     /// The type returned by `modify_lock`. See [`dsl::SkipLocked`] and friends
78     /// for convenient access to this type.
79     ///
80     /// [`dsl::SkipLocked`]: ../../dsl/type.SkipLocked.html
81     type Output;
82 
83     /// See the trait level documentation
modify_lock(self, modifier: Modifier) -> Self::Output84     fn modify_lock(self, modifier: Modifier) -> Self::Output;
85 }
86