derive_sql/traits/
sql.rs

1use super::*;
2
3impl<C, R, T, S> update::Update<C, R, T> for S
4where S: update::UpdateFlavoredStatement,
5      C: Connection<R>,
6      R: Row,
7      T: params::Params + row::TryFromRefRow<R>,
8{
9  fn update(&self, conn: &mut C, object: &T) -> Result<()> {
10    conn.execute_with_params(self.update_stmt(conn)?, object)?;
11    Ok(())
12  }
13
14  fn update_with_filter<F>(&self, conn: &mut C, filter: &F, object: &T) -> Result<()>
15  where F: traits::FlavoredFilter
16  {
17    conn.execute_with_params(self.update_with_filter_stmt(conn, filter)?, object)?;
18    Ok(())
19  }
20
21  fn update_with_filter_order_limit_offset<F, O>(&self, conn: &mut C, filter: &F, order: &O, limit: usize, offset: usize, object: &T) -> Result<()>
22  where F: traits::FlavoredFilter, O: FlavoredOrder,
23  {
24    match conn.flavor() {
25      Flavor::SQLite
26      | Flavor::MySQL => {
27        log::warn!("Update with limit and offset will be deprecated");
28        conn.execute_with_params(self.update_with_filter_order_limit_offset_stmt(conn, filter, order, limit, offset)?, object)?;
29        Ok(())
30      }
31      Flavor::PostgreSQL => Err(Error::UpdateWithLimitOffsetNotSupported),
32    }
33  }
34}
35
36impl<C, R, S> delete::Delete<C, R> for S
37where S: delete::DeleteFlavoredStatement,
38      C: Connection<R>,
39      R: Row,
40{
41  fn delete(&self, conn: &mut C) -> Result<()> {
42    conn.query_drop(self.delete_stmt(conn)?)?;
43    Ok(())
44  }
45
46  fn delete_with_filter<F>(&self, conn: &mut C, filter: &F) -> Result<()> 
47  where F: traits::FlavoredFilter
48  {
49    conn.query_drop(self.delete_with_filter_stmt(conn, filter)?)?;
50    Ok(())
51  }
52
53  fn delete_with_filter_order_limit_offset<F, O>(&self, conn: &mut C, filter: &F, order: &O, limit: usize, offset: usize) -> Result<()> 
54  where F: traits::FlavoredFilter, O: FlavoredOrder,
55  {
56    conn.query_drop(self.delete_with_filter_order_limit_offset_stmt(conn, filter, order, limit, offset)?)?;
57    Ok(())
58  }
59}
60
61impl<C, R, T, S> insert::Insert<C, R, T> for S
62where S: insert::InsertFlavoredStatement,
63      T: params::Params,
64      C: Connection<R>,
65      R: Row,
66{
67  fn insert(&self, conn: &mut C, object: &T) -> Result<()> {
68    conn.execute_with_params(self.insert_stmt(conn)?, object)?;
69    Ok(())
70  }
71}
72
73impl<'a, C, R, T, S> insert::InsertMultiple<'a, C, R, T> for S
74where S: insert::InsertFlavoredStatement,
75      T: params::Params + 'a,
76      C: Connection<R>,
77      R: Row,
78{
79  fn insert_multiple<I>(&self, conn: &mut C, objects: I) -> Result<()> 
80  where I: core::iter::IntoIterator<Item = &'a T>
81  {
82    conn.execute_with_params_iterator(self.insert_stmt(conn)?, objects)?;
83    Ok(())
84  }
85}
86
87impl<C, R, T, S> select::Select<C, R, T> for S
88where S: select::SelectFlavoredStatement,
89      T: row::TryFromRefRow<R>,
90      C: Connection<R>,
91      R: Row,
92{
93  fn select(&self, conn: &mut C) -> Result<Vec<T>> {
94    conn.query_try_as_object(self.select_stmt(conn)?)
95  }
96
97  fn select_with_filter<F>(&self, conn: &mut C, filter: &F) -> Result<Vec<T>>
98  where F: traits::FlavoredFilter
99  {
100    conn.query_try_as_object(self.select_with_filter_stmt(conn, filter)?)
101  }
102
103  fn select_with_filter_order<F, O>(&self, conn: &mut C, filter: &F, order: &O) -> Result<Vec<T>>
104  where F: traits::FlavoredFilter, O: traits::FlavoredOrder,
105  {
106    conn.query_try_as_object(self.select_with_filter_order_stmt(conn, filter, order)?)
107  }
108
109  fn select_with_filter_order_limit_offset<F, O>(&self, conn: &mut C, filter: &F, order: &O, limit: usize, offset: usize) -> Result<Vec<T>> 
110  where F: traits::FlavoredFilter, O: traits::FlavoredOrder,
111  {
112    conn.query_try_as_object(self.select_with_filter_order_limit_offset_stmt(conn, filter, order, limit, offset)?)
113  }
114}
115
116impl<C, R, S> table::Table<C, R> for S
117where S: table::TableFlavoredStatement,
118      C: Connection<R>,
119      R: Row,
120{
121  fn create(&self, conn: &mut C) -> Result<()> {
122    conn.query_drop(self.create_stmt(conn)?)
123  }
124
125  fn create_if_not_exist(&self, conn: &mut C) -> Result<()> {
126    conn.query_drop(self.create_if_not_exist_stmt(conn)?)
127  }
128
129  fn drop(&self, conn: &mut C) -> Result<()> {
130    conn.query_drop(self.drop_stmt(conn)?)
131  }
132}