Skip to content

Commit afc9b28

Browse files
committed
Add missing methods to GenericClient
This adds `execute_raw`, `query_one`, `query_opt`, `query_raw`, and `prepare_typed` to the generic trait introduced in sfackler#525.
1 parent a54ee29 commit afc9b28

File tree

3 files changed

+155
-1
lines changed

3 files changed

+155
-1
lines changed

tokio-postgres/src/client.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,13 +506,25 @@ impl Client {
506506

507507
#[async_trait]
508508
impl GenericClient for Client {
509+
/// Like `Client::execute`.
509510
async fn execute<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
510511
where
511512
T: ?Sized + ToStatement + Sync + Send,
512513
{
513514
self.execute(query, params).await
514515
}
515516

517+
/// Like `Client::execute_raw`.
518+
async fn execute_raw<'b, I, T>(&self, statement: &T, params: I) -> Result<u64, Error>
519+
where
520+
T: ?Sized + ToStatement + Sync + Send,
521+
I: IntoIterator<Item = &'b dyn ToSql> + Sync + Send,
522+
I::IntoIter: ExactSizeIterator,
523+
{
524+
self.execute_raw(statement, params).await
525+
}
526+
527+
/// Like `Client::query`.
516528
async fn query<T>(
517529
&mut self,
518530
query: &T,
@@ -524,10 +536,55 @@ impl GenericClient for Client {
524536
self.query(query, params).await
525537
}
526538

539+
/// Like `Client::query_one`.
540+
async fn query_one<T>(
541+
&self,
542+
statement: &T,
543+
params: &[&(dyn ToSql + Sync)],
544+
) -> Result<Row, Error>
545+
where
546+
T: ?Sized + ToStatement + Sync + Send,
547+
{
548+
self.query_one(statement, params).await
549+
}
550+
551+
/// Like `Client::query_opt`.
552+
async fn query_opt<T>(
553+
&self,
554+
statement: &T,
555+
params: &[&(dyn ToSql + Sync)],
556+
) -> Result<Option<Row>, Error>
557+
where
558+
T: ?Sized + ToStatement + Sync + Send,
559+
{
560+
self.query_opt(statement, params).await
561+
}
562+
563+
/// Like `Client::query_raw`.
564+
async fn query_raw<'b, T, I>(&self, statement: &T, params: I) -> Result<RowStream, Error>
565+
where
566+
T: ?Sized + ToStatement + Sync + Send,
567+
I: IntoIterator<Item = &'b dyn ToSql> + Sync + Send,
568+
I::IntoIter: ExactSizeIterator,
569+
{
570+
self.query_raw(statement, params).await
571+
}
572+
573+
/// Like `Client::prepare`.
527574
async fn prepare(&mut self, query: &str) -> Result<Statement, Error> {
528575
self.prepare(query).await
529576
}
530577

578+
/// Like `Client::prepare_typed`.
579+
async fn prepare_typed(
580+
&self,
581+
query: &str,
582+
parameter_types: &[Type],
583+
) -> Result<Statement, Error> {
584+
self.prepare_typed(query, parameter_types).await
585+
}
586+
587+
/// Like `Client::transaction`.
531588
async fn transaction(&mut self) -> Result<Transaction<'_>, Error> {
532589
self.transaction().await
533590
}

tokio-postgres/src/generic_client.rs

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
use crate::types::ToSql;
1+
use crate::query::RowStream;
2+
use crate::types::{ToSql, Type};
23
use crate::{Error, Row, Statement, ToStatement, Transaction};
34
use async_trait::async_trait;
45

@@ -10,6 +11,13 @@ pub trait GenericClient {
1011
where
1112
T: ?Sized + ToStatement + Sync + Send;
1213

14+
/// Like `Client::execute_raw`.
15+
async fn execute_raw<'b, I, T>(&self, statement: &T, params: I) -> Result<u64, Error>
16+
where
17+
T: ?Sized + ToStatement + Sync + Send,
18+
I: IntoIterator<Item = &'b dyn ToSql> + Sync + Send,
19+
I::IntoIter: ExactSizeIterator;
20+
1321
/// Like `Client::query`.
1422
async fn query<T>(
1523
&mut self,
@@ -19,9 +27,41 @@ pub trait GenericClient {
1927
where
2028
T: ?Sized + ToStatement + Sync + Send;
2129

30+
/// Like `Client::query_one`.
31+
async fn query_one<T>(
32+
&self,
33+
statement: &T,
34+
params: &[&(dyn ToSql + Sync)],
35+
) -> Result<Row, Error>
36+
where
37+
T: ?Sized + ToStatement + Sync + Send;
38+
39+
/// Like `Client::query_opt`.
40+
async fn query_opt<T>(
41+
&self,
42+
statement: &T,
43+
params: &[&(dyn ToSql + Sync)],
44+
) -> Result<Option<Row>, Error>
45+
where
46+
T: ?Sized + ToStatement + Sync + Send;
47+
48+
/// Like `Client::query_raw`.
49+
async fn query_raw<'b, T, I>(&self, statement: &T, params: I) -> Result<RowStream, Error>
50+
where
51+
T: ?Sized + ToStatement + Sync + Send,
52+
I: IntoIterator<Item = &'b dyn ToSql> + Sync + Send,
53+
I::IntoIter: ExactSizeIterator;
54+
2255
/// Like `Client::prepare`.
2356
async fn prepare(&mut self, query: &str) -> Result<Statement, Error>;
2457

58+
/// Like `Client::prepare_typed`.
59+
async fn prepare_typed(
60+
&self,
61+
query: &str,
62+
parameter_types: &[Type],
63+
) -> Result<Statement, Error>;
64+
2565
/// Like `Client::transaction`.
2666
async fn transaction(&mut self) -> Result<Transaction<'_>, Error>;
2767
}

tokio-postgres/src/transaction.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,13 +289,25 @@ impl<'a> Transaction<'a> {
289289

290290
#[async_trait]
291291
impl crate::GenericClient for Transaction<'_> {
292+
/// Like `Transaction::execute`.
292293
async fn execute<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
293294
where
294295
T: ?Sized + ToStatement + Sync + Send,
295296
{
296297
self.execute(query, params).await
297298
}
298299

300+
/// Like `Transaction::execute_raw`.
301+
async fn execute_raw<'b, I, T>(&self, statement: &T, params: I) -> Result<u64, Error>
302+
where
303+
T: ?Sized + ToStatement + Sync + Send,
304+
I: IntoIterator<Item = &'b dyn ToSql> + Sync + Send,
305+
I::IntoIter: ExactSizeIterator,
306+
{
307+
self.execute_raw(statement, params).await
308+
}
309+
310+
/// Like `Transaction::query`.
299311
async fn query<T>(
300312
&mut self,
301313
query: &T,
@@ -307,10 +319,55 @@ impl crate::GenericClient for Transaction<'_> {
307319
self.query(query, params).await
308320
}
309321

322+
/// Like `Transaction::query_one`.
323+
async fn query_one<T>(
324+
&self,
325+
statement: &T,
326+
params: &[&(dyn ToSql + Sync)],
327+
) -> Result<Row, Error>
328+
where
329+
T: ?Sized + ToStatement + Sync + Send,
330+
{
331+
self.query_one(statement, params).await
332+
}
333+
334+
/// Like `Transaction::query_opt`.
335+
async fn query_opt<T>(
336+
&self,
337+
statement: &T,
338+
params: &[&(dyn ToSql + Sync)],
339+
) -> Result<Option<Row>, Error>
340+
where
341+
T: ?Sized + ToStatement + Sync + Send,
342+
{
343+
self.query_opt(statement, params).await
344+
}
345+
346+
/// Like `Transaction::query_raw`.
347+
async fn query_raw<'b, T, I>(&self, statement: &T, params: I) -> Result<RowStream, Error>
348+
where
349+
T: ?Sized + ToStatement + Sync + Send,
350+
I: IntoIterator<Item = &'b dyn ToSql> + Sync + Send,
351+
I::IntoIter: ExactSizeIterator,
352+
{
353+
self.query_raw(statement, params).await
354+
}
355+
356+
/// Like `Transaction::prepare`.
310357
async fn prepare(&mut self, query: &str) -> Result<Statement, Error> {
311358
self.prepare(query).await
312359
}
313360

361+
/// Like `Transaction::prepare_typed`.
362+
async fn prepare_typed(
363+
&self,
364+
query: &str,
365+
parameter_types: &[Type],
366+
) -> Result<Statement, Error> {
367+
self.prepare_typed(query, parameter_types).await
368+
}
369+
370+
/// Like `Transaction::transaction`.
314371
#[allow(clippy::needless_lifetimes)]
315372
async fn transaction<'a>(&'a mut self) -> Result<Transaction<'a>, Error> {
316373
self.transaction().await

0 commit comments

Comments
 (0)