1use crate::query::RowStream;
2use crate::types::{BorrowToSql, ToSql, Type};
3use crate::{Client, Error, Row, SimpleQueryMessage, Statement, ToStatement, Transaction};
4use async_trait::async_trait;
5
6mod private {
7 pub trait Sealed {}
8}
9
10#[async_trait]
14pub trait GenericClient: private::Sealed {
15 async fn execute<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
17 where
18 T: ?Sized + ToStatement + Sync + Send;
19
20 async fn execute_raw<P, I, T>(&self, statement: &T, params: I) -> Result<u64, Error>
22 where
23 T: ?Sized + ToStatement + Sync + Send,
24 P: BorrowToSql,
25 I: IntoIterator<Item = P> + Sync + Send,
26 I::IntoIter: ExactSizeIterator;
27
28 async fn query<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
30 where
31 T: ?Sized + ToStatement + Sync + Send;
32
33 async fn query_one<T>(
35 &self,
36 statement: &T,
37 params: &[&(dyn ToSql + Sync)],
38 ) -> Result<Row, Error>
39 where
40 T: ?Sized + ToStatement + Sync + Send;
41
42 async fn query_opt<T>(
44 &self,
45 statement: &T,
46 params: &[&(dyn ToSql + Sync)],
47 ) -> Result<Option<Row>, Error>
48 where
49 T: ?Sized + ToStatement + Sync + Send;
50
51 async fn query_raw<T, P, I>(&self, statement: &T, params: I) -> Result<RowStream, Error>
53 where
54 T: ?Sized + ToStatement + Sync + Send,
55 P: BorrowToSql,
56 I: IntoIterator<Item = P> + Sync + Send,
57 I::IntoIter: ExactSizeIterator;
58
59 async fn query_typed(
61 &self,
62 statement: &str,
63 params: &[(&(dyn ToSql + Sync), Type)],
64 ) -> Result<Vec<Row>, Error>;
65
66 async fn query_typed_raw<P, I>(&self, statement: &str, params: I) -> Result<RowStream, Error>
68 where
69 P: BorrowToSql,
70 I: IntoIterator<Item = (P, Type)> + Sync + Send;
71
72 async fn prepare(&self, query: &str) -> Result<Statement, Error>;
74
75 async fn prepare_typed(
77 &self,
78 query: &str,
79 parameter_types: &[Type],
80 ) -> Result<Statement, Error>;
81
82 async fn transaction(&mut self) -> Result<Transaction<'_>, Error>;
84
85 async fn batch_execute(&self, query: &str) -> Result<(), Error>;
87
88 async fn simple_query(&self, query: &str) -> Result<Vec<SimpleQueryMessage>, Error>;
90
91 fn client(&self) -> &Client;
93}
94
95impl private::Sealed for Client {}
96
97#[async_trait]
98impl GenericClient for Client {
99 async fn execute<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
100 where
101 T: ?Sized + ToStatement + Sync + Send,
102 {
103 self.execute(query, params).await
104 }
105
106 async fn execute_raw<P, I, T>(&self, statement: &T, params: I) -> Result<u64, Error>
107 where
108 T: ?Sized + ToStatement + Sync + Send,
109 P: BorrowToSql,
110 I: IntoIterator<Item = P> + Sync + Send,
111 I::IntoIter: ExactSizeIterator,
112 {
113 self.execute_raw(statement, params).await
114 }
115
116 async fn query<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
117 where
118 T: ?Sized + ToStatement + Sync + Send,
119 {
120 self.query(query, params).await
121 }
122
123 async fn query_one<T>(
124 &self,
125 statement: &T,
126 params: &[&(dyn ToSql + Sync)],
127 ) -> Result<Row, Error>
128 where
129 T: ?Sized + ToStatement + Sync + Send,
130 {
131 self.query_one(statement, params).await
132 }
133
134 async fn query_opt<T>(
135 &self,
136 statement: &T,
137 params: &[&(dyn ToSql + Sync)],
138 ) -> Result<Option<Row>, Error>
139 where
140 T: ?Sized + ToStatement + Sync + Send,
141 {
142 self.query_opt(statement, params).await
143 }
144
145 async fn query_raw<T, P, I>(&self, statement: &T, params: I) -> Result<RowStream, Error>
146 where
147 T: ?Sized + ToStatement + Sync + Send,
148 P: BorrowToSql,
149 I: IntoIterator<Item = P> + Sync + Send,
150 I::IntoIter: ExactSizeIterator,
151 {
152 self.query_raw(statement, params).await
153 }
154
155 async fn query_typed(
156 &self,
157 statement: &str,
158 params: &[(&(dyn ToSql + Sync), Type)],
159 ) -> Result<Vec<Row>, Error> {
160 self.query_typed(statement, params).await
161 }
162
163 async fn query_typed_raw<P, I>(&self, statement: &str, params: I) -> Result<RowStream, Error>
164 where
165 P: BorrowToSql,
166 I: IntoIterator<Item = (P, Type)> + Sync + Send,
167 {
168 self.query_typed_raw(statement, params).await
169 }
170
171 async fn prepare(&self, query: &str) -> Result<Statement, Error> {
172 self.prepare(query).await
173 }
174
175 async fn prepare_typed(
176 &self,
177 query: &str,
178 parameter_types: &[Type],
179 ) -> Result<Statement, Error> {
180 self.prepare_typed(query, parameter_types).await
181 }
182
183 async fn transaction(&mut self) -> Result<Transaction<'_>, Error> {
184 self.transaction().await
185 }
186
187 async fn batch_execute(&self, query: &str) -> Result<(), Error> {
188 self.batch_execute(query).await
189 }
190
191 async fn simple_query(&self, query: &str) -> Result<Vec<SimpleQueryMessage>, Error> {
192 self.simple_query(query).await
193 }
194
195 fn client(&self) -> &Client {
196 self
197 }
198}
199
200impl private::Sealed for Transaction<'_> {}
201
202#[async_trait]
203#[allow(clippy::needless_lifetimes)]
204impl GenericClient for Transaction<'_> {
205 async fn execute<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
206 where
207 T: ?Sized + ToStatement + Sync + Send,
208 {
209 self.execute(query, params).await
210 }
211
212 async fn execute_raw<P, I, T>(&self, statement: &T, params: I) -> Result<u64, Error>
213 where
214 T: ?Sized + ToStatement + Sync + Send,
215 P: BorrowToSql,
216 I: IntoIterator<Item = P> + Sync + Send,
217 I::IntoIter: ExactSizeIterator,
218 {
219 self.execute_raw(statement, params).await
220 }
221
222 async fn query<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
223 where
224 T: ?Sized + ToStatement + Sync + Send,
225 {
226 self.query(query, params).await
227 }
228
229 async fn query_one<T>(
230 &self,
231 statement: &T,
232 params: &[&(dyn ToSql + Sync)],
233 ) -> Result<Row, Error>
234 where
235 T: ?Sized + ToStatement + Sync + Send,
236 {
237 self.query_one(statement, params).await
238 }
239
240 async fn query_opt<T>(
241 &self,
242 statement: &T,
243 params: &[&(dyn ToSql + Sync)],
244 ) -> Result<Option<Row>, Error>
245 where
246 T: ?Sized + ToStatement + Sync + Send,
247 {
248 self.query_opt(statement, params).await
249 }
250
251 async fn query_raw<T, P, I>(&self, statement: &T, params: I) -> Result<RowStream, Error>
252 where
253 T: ?Sized + ToStatement + Sync + Send,
254 P: BorrowToSql,
255 I: IntoIterator<Item = P> + Sync + Send,
256 I::IntoIter: ExactSizeIterator,
257 {
258 self.query_raw(statement, params).await
259 }
260
261 async fn query_typed(
262 &self,
263 statement: &str,
264 params: &[(&(dyn ToSql + Sync), Type)],
265 ) -> Result<Vec<Row>, Error> {
266 self.query_typed(statement, params).await
267 }
268
269 async fn query_typed_raw<P, I>(&self, statement: &str, params: I) -> Result<RowStream, Error>
270 where
271 P: BorrowToSql,
272 I: IntoIterator<Item = (P, Type)> + Sync + Send,
273 {
274 self.query_typed_raw(statement, params).await
275 }
276
277 async fn prepare(&self, query: &str) -> Result<Statement, Error> {
278 self.prepare(query).await
279 }
280
281 async fn prepare_typed(
282 &self,
283 query: &str,
284 parameter_types: &[Type],
285 ) -> Result<Statement, Error> {
286 self.prepare_typed(query, parameter_types).await
287 }
288
289 #[allow(clippy::needless_lifetimes)]
290 async fn transaction<'a>(&'a mut self) -> Result<Transaction<'a>, Error> {
291 self.transaction().await
292 }
293
294 async fn batch_execute(&self, query: &str) -> Result<(), Error> {
295 self.batch_execute(query).await
296 }
297
298 async fn simple_query(&self, query: &str) -> Result<Vec<SimpleQueryMessage>, Error> {
299 self.simple_query(query).await
300 }
301
302 fn client(&self) -> &Client {
303 self.client()
304 }
305}