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 execute_typed(
30 &self,
31 statement: &str,
32 params: &[(&(dyn ToSql + Sync), Type)],
33 ) -> Result<u64, Error>;
34
35 async fn query<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
37 where
38 T: ?Sized + ToStatement + Sync + Send;
39
40 async fn query_one<T>(
42 &self,
43 statement: &T,
44 params: &[&(dyn ToSql + Sync)],
45 ) -> Result<Row, Error>
46 where
47 T: ?Sized + ToStatement + Sync + Send;
48
49 async fn query_opt<T>(
51 &self,
52 statement: &T,
53 params: &[&(dyn ToSql + Sync)],
54 ) -> Result<Option<Row>, Error>
55 where
56 T: ?Sized + ToStatement + Sync + Send;
57
58 async fn query_raw<T, P, I>(&self, statement: &T, params: I) -> Result<RowStream, Error>
60 where
61 T: ?Sized + ToStatement + Sync + Send,
62 P: BorrowToSql,
63 I: IntoIterator<Item = P> + Sync + Send,
64 I::IntoIter: ExactSizeIterator;
65
66 async fn query_typed(
68 &self,
69 statement: &str,
70 params: &[(&(dyn ToSql + Sync), Type)],
71 ) -> Result<Vec<Row>, Error>;
72
73 async fn query_typed_one(
75 &self,
76 statement: &str,
77 params: &[(&(dyn ToSql + Sync), Type)],
78 ) -> Result<Row, Error>;
79
80 async fn query_typed_opt(
82 &self,
83 statement: &str,
84 params: &[(&(dyn ToSql + Sync), Type)],
85 ) -> Result<Option<Row>, Error>;
86
87 async fn query_typed_raw<P, I>(&self, statement: &str, params: I) -> Result<RowStream, Error>
89 where
90 P: BorrowToSql,
91 I: IntoIterator<Item = (P, Type)> + Sync + Send;
92
93 async fn prepare(&self, query: &str) -> Result<Statement, Error>;
95
96 async fn prepare_typed(
98 &self,
99 query: &str,
100 parameter_types: &[Type],
101 ) -> Result<Statement, Error>;
102
103 async fn transaction<'a>(&'a mut self) -> Result<Transaction<'a>, Error>;
105
106 async fn batch_execute(&self, query: &str) -> Result<(), Error>;
108
109 async fn simple_query(&self, query: &str) -> Result<Vec<SimpleQueryMessage>, Error>;
111
112 fn client(&self) -> &Client;
114}
115
116impl private::Sealed for Client {}
117
118#[async_trait]
119impl GenericClient for Client {
120 async fn execute<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
121 where
122 T: ?Sized + ToStatement + Sync + Send,
123 {
124 self.execute(query, params).await
125 }
126
127 async fn execute_typed(
128 &self,
129 statement: &str,
130 params: &[(&(dyn ToSql + Sync), Type)],
131 ) -> Result<u64, Error> {
132 self.execute_typed(statement, params).await
133 }
134
135 async fn execute_raw<P, I, T>(&self, statement: &T, params: I) -> Result<u64, Error>
136 where
137 T: ?Sized + ToStatement + Sync + Send,
138 P: BorrowToSql,
139 I: IntoIterator<Item = P> + Sync + Send,
140 I::IntoIter: ExactSizeIterator,
141 {
142 self.execute_raw(statement, params).await
143 }
144
145 async fn query<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
146 where
147 T: ?Sized + ToStatement + Sync + Send,
148 {
149 self.query(query, params).await
150 }
151
152 async fn query_one<T>(
153 &self,
154 statement: &T,
155 params: &[&(dyn ToSql + Sync)],
156 ) -> Result<Row, Error>
157 where
158 T: ?Sized + ToStatement + Sync + Send,
159 {
160 self.query_one(statement, params).await
161 }
162
163 async fn query_opt<T>(
164 &self,
165 statement: &T,
166 params: &[&(dyn ToSql + Sync)],
167 ) -> Result<Option<Row>, Error>
168 where
169 T: ?Sized + ToStatement + Sync + Send,
170 {
171 self.query_opt(statement, params).await
172 }
173
174 async fn query_raw<T, P, I>(&self, statement: &T, params: I) -> Result<RowStream, Error>
175 where
176 T: ?Sized + ToStatement + Sync + Send,
177 P: BorrowToSql,
178 I: IntoIterator<Item = P> + Sync + Send,
179 I::IntoIter: ExactSizeIterator,
180 {
181 self.query_raw(statement, params).await
182 }
183
184 async fn query_typed(
185 &self,
186 statement: &str,
187 params: &[(&(dyn ToSql + Sync), Type)],
188 ) -> Result<Vec<Row>, Error> {
189 self.query_typed(statement, params).await
190 }
191
192 async fn query_typed_one(
193 &self,
194 statement: &str,
195 params: &[(&(dyn ToSql + Sync), Type)],
196 ) -> Result<Row, Error> {
197 self.query_typed_one(statement, params).await
198 }
199
200 async fn query_typed_opt(
202 &self,
203 statement: &str,
204 params: &[(&(dyn ToSql + Sync), Type)],
205 ) -> Result<Option<Row>, Error> {
206 self.query_typed_opt(statement, params).await
207 }
208
209 async fn query_typed_raw<P, I>(&self, statement: &str, params: I) -> Result<RowStream, Error>
210 where
211 P: BorrowToSql,
212 I: IntoIterator<Item = (P, Type)> + Sync + Send,
213 {
214 self.query_typed_raw(statement, params).await
215 }
216
217 async fn prepare(&self, query: &str) -> Result<Statement, Error> {
218 self.prepare(query).await
219 }
220
221 async fn prepare_typed(
222 &self,
223 query: &str,
224 parameter_types: &[Type],
225 ) -> Result<Statement, Error> {
226 self.prepare_typed(query, parameter_types).await
227 }
228
229 async fn transaction<'a>(&'a mut self) -> Result<Transaction<'a>, Error> {
230 self.transaction().await
231 }
232
233 async fn batch_execute(&self, query: &str) -> Result<(), Error> {
234 self.batch_execute(query).await
235 }
236
237 async fn simple_query(&self, query: &str) -> Result<Vec<SimpleQueryMessage>, Error> {
238 self.simple_query(query).await
239 }
240
241 fn client(&self) -> &Client {
242 self
243 }
244}
245
246impl private::Sealed for Transaction<'_> {}
247
248#[async_trait]
249#[allow(clippy::needless_lifetimes)]
250impl GenericClient for Transaction<'_> {
251 async fn execute<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
252 where
253 T: ?Sized + ToStatement + Sync + Send,
254 {
255 self.execute(query, params).await
256 }
257
258 async fn execute_raw<P, I, T>(&self, statement: &T, params: I) -> Result<u64, Error>
259 where
260 T: ?Sized + ToStatement + Sync + Send,
261 P: BorrowToSql,
262 I: IntoIterator<Item = P> + Sync + Send,
263 I::IntoIter: ExactSizeIterator,
264 {
265 self.execute_raw(statement, params).await
266 }
267
268 async fn query<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
269 where
270 T: ?Sized + ToStatement + Sync + Send,
271 {
272 self.query(query, params).await
273 }
274
275 async fn query_one<T>(
276 &self,
277 statement: &T,
278 params: &[&(dyn ToSql + Sync)],
279 ) -> Result<Row, Error>
280 where
281 T: ?Sized + ToStatement + Sync + Send,
282 {
283 self.query_one(statement, params).await
284 }
285
286 async fn query_opt<T>(
287 &self,
288 statement: &T,
289 params: &[&(dyn ToSql + Sync)],
290 ) -> Result<Option<Row>, Error>
291 where
292 T: ?Sized + ToStatement + Sync + Send,
293 {
294 self.query_opt(statement, params).await
295 }
296
297 async fn query_raw<T, P, I>(&self, statement: &T, params: I) -> Result<RowStream, Error>
298 where
299 T: ?Sized + ToStatement + Sync + Send,
300 P: BorrowToSql,
301 I: IntoIterator<Item = P> + Sync + Send,
302 I::IntoIter: ExactSizeIterator,
303 {
304 self.query_raw(statement, params).await
305 }
306
307 async fn query_typed(
308 &self,
309 statement: &str,
310 params: &[(&(dyn ToSql + Sync), Type)],
311 ) -> Result<Vec<Row>, Error> {
312 self.query_typed(statement, params).await
313 }
314
315 async fn query_typed_one(
316 &self,
317 statement: &str,
318 params: &[(&(dyn ToSql + Sync), Type)],
319 ) -> Result<Row, Error> {
320 self.query_typed_one(statement, params).await
321 }
322
323 async fn query_typed_opt(
325 &self,
326 statement: &str,
327 params: &[(&(dyn ToSql + Sync), Type)],
328 ) -> Result<Option<Row>, Error> {
329 self.query_typed_opt(statement, params).await
330 }
331
332 async fn query_typed_raw<P, I>(&self, statement: &str, params: I) -> Result<RowStream, Error>
333 where
334 P: BorrowToSql,
335 I: IntoIterator<Item = (P, Type)> + Sync + Send,
336 {
337 self.query_typed_raw(statement, params).await
338 }
339
340 async fn prepare(&self, query: &str) -> Result<Statement, Error> {
341 self.prepare(query).await
342 }
343
344 async fn prepare_typed(
345 &self,
346 query: &str,
347 parameter_types: &[Type],
348 ) -> Result<Statement, Error> {
349 self.prepare_typed(query, parameter_types).await
350 }
351
352 #[allow(clippy::needless_lifetimes)]
353 async fn transaction<'a>(&'a mut self) -> Result<Transaction<'a>, Error> {
354 self.transaction().await
355 }
356
357 async fn batch_execute(&self, query: &str) -> Result<(), Error> {
358 self.batch_execute(query).await
359 }
360
361 async fn simple_query(&self, query: &str) -> Result<Vec<SimpleQueryMessage>, Error> {
362 self.simple_query(query).await
363 }
364
365 fn client(&self) -> &Client {
366 self.client()
367 }
368
369 async fn execute_typed(
370 &self,
371 statement: &str,
372 params: &[(&(dyn ToSql + Sync), Type)],
373 ) -> Result<u64, Error> {
374 self.client().execute_typed(statement, params).await
375 }
376}