Skip to content

Commit 5429a79

Browse files
authored
Merge pull request sfackler#561 from dvic/add-methods-generic-client
Add missing methods to GenericClient
2 parents a54ee29 + 5d08af0 commit 5429a79

File tree

3 files changed

+145
-21
lines changed

3 files changed

+145
-21
lines changed

tokio-postgres/src/client.rs

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -506,28 +506,72 @@ impl Client {
506506

507507
#[async_trait]
508508
impl GenericClient for Client {
509-
async fn execute<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
509+
async fn execute<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
510510
where
511511
T: ?Sized + ToStatement + Sync + Send,
512512
{
513513
self.execute(query, params).await
514514
}
515515

516-
async fn query<T>(
517-
&mut self,
518-
query: &T,
519-
params: &[&(dyn ToSql + Sync)],
520-
) -> Result<Vec<Row>, Error>
516+
async fn execute_raw<'b, I, T>(&self, statement: &T, params: I) -> Result<u64, Error>
517+
where
518+
T: ?Sized + ToStatement + Sync + Send,
519+
I: IntoIterator<Item = &'b dyn ToSql> + Sync + Send,
520+
I::IntoIter: ExactSizeIterator,
521+
{
522+
self.execute_raw(statement, params).await
523+
}
524+
525+
async fn query<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
521526
where
522527
T: ?Sized + ToStatement + Sync + Send,
523528
{
524529
self.query(query, params).await
525530
}
526531

527-
async fn prepare(&mut self, query: &str) -> Result<Statement, Error> {
532+
async fn query_one<T>(
533+
&self,
534+
statement: &T,
535+
params: &[&(dyn ToSql + Sync)],
536+
) -> Result<Row, Error>
537+
where
538+
T: ?Sized + ToStatement + Sync + Send,
539+
{
540+
self.query_one(statement, params).await
541+
}
542+
543+
async fn query_opt<T>(
544+
&self,
545+
statement: &T,
546+
params: &[&(dyn ToSql + Sync)],
547+
) -> Result<Option<Row>, Error>
548+
where
549+
T: ?Sized + ToStatement + Sync + Send,
550+
{
551+
self.query_opt(statement, params).await
552+
}
553+
554+
async fn query_raw<'b, T, I>(&self, statement: &T, params: I) -> Result<RowStream, Error>
555+
where
556+
T: ?Sized + ToStatement + Sync + Send,
557+
I: IntoIterator<Item = &'b dyn ToSql> + Sync + Send,
558+
I::IntoIter: ExactSizeIterator,
559+
{
560+
self.query_raw(statement, params).await
561+
}
562+
563+
async fn prepare(&self, query: &str) -> Result<Statement, Error> {
528564
self.prepare(query).await
529565
}
530566

567+
async fn prepare_typed(
568+
&self,
569+
query: &str,
570+
parameter_types: &[Type],
571+
) -> Result<Statement, Error> {
572+
self.prepare_typed(query, parameter_types).await
573+
}
574+
531575
async fn transaction(&mut self) -> Result<Transaction<'_>, Error> {
532576
self.transaction().await
533577
}

tokio-postgres/src/generic_client.rs

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,62 @@
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

56
/// A trait allowing abstraction over connections and transactions.
67
#[async_trait]
78
pub trait GenericClient {
89
/// Like `Client::execute`.
9-
async fn execute<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
10+
async fn execute<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
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`.
14-
async fn query<T>(
15-
&mut self,
16-
query: &T,
22+
async fn query<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
23+
where
24+
T: ?Sized + ToStatement + Sync + Send;
25+
26+
/// Like `Client::query_one`.
27+
async fn query_one<T>(
28+
&self,
29+
statement: &T,
30+
params: &[&(dyn ToSql + Sync)],
31+
) -> Result<Row, Error>
32+
where
33+
T: ?Sized + ToStatement + Sync + Send;
34+
35+
/// Like `Client::query_opt`.
36+
async fn query_opt<T>(
37+
&self,
38+
statement: &T,
1739
params: &[&(dyn ToSql + Sync)],
18-
) -> Result<Vec<Row>, Error>
40+
) -> Result<Option<Row>, Error>
1941
where
2042
T: ?Sized + ToStatement + Sync + Send;
2143

44+
/// Like `Client::query_raw`.
45+
async fn query_raw<'b, T, I>(&self, statement: &T, params: I) -> Result<RowStream, Error>
46+
where
47+
T: ?Sized + ToStatement + Sync + Send,
48+
I: IntoIterator<Item = &'b dyn ToSql> + Sync + Send,
49+
I::IntoIter: ExactSizeIterator;
50+
2251
/// Like `Client::prepare`.
23-
async fn prepare(&mut self, query: &str) -> Result<Statement, Error>;
52+
async fn prepare(&self, query: &str) -> Result<Statement, Error>;
53+
54+
/// Like `Client::prepare_typed`.
55+
async fn prepare_typed(
56+
&self,
57+
query: &str,
58+
parameter_types: &[Type],
59+
) -> Result<Statement, Error>;
2460

2561
/// Like `Client::transaction`.
2662
async fn transaction(&mut self) -> Result<Transaction<'_>, Error>;

tokio-postgres/src/transaction.rs

Lines changed: 51 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -289,28 +289,72 @@ impl<'a> Transaction<'a> {
289289

290290
#[async_trait]
291291
impl crate::GenericClient for Transaction<'_> {
292-
async fn execute<T>(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
292+
async fn execute<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<u64, Error>
293293
where
294294
T: ?Sized + ToStatement + Sync + Send,
295295
{
296296
self.execute(query, params).await
297297
}
298298

299-
async fn query<T>(
300-
&mut self,
301-
query: &T,
302-
params: &[&(dyn ToSql + Sync)],
303-
) -> Result<Vec<Row>, Error>
299+
async fn execute_raw<'b, I, T>(&self, statement: &T, params: I) -> Result<u64, Error>
300+
where
301+
T: ?Sized + ToStatement + Sync + Send,
302+
I: IntoIterator<Item = &'b dyn ToSql> + Sync + Send,
303+
I::IntoIter: ExactSizeIterator,
304+
{
305+
self.execute_raw(statement, params).await
306+
}
307+
308+
async fn query<T>(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result<Vec<Row>, Error>
304309
where
305310
T: ?Sized + ToStatement + Sync + Send,
306311
{
307312
self.query(query, params).await
308313
}
309314

310-
async fn prepare(&mut self, query: &str) -> Result<Statement, Error> {
315+
async fn query_one<T>(
316+
&self,
317+
statement: &T,
318+
params: &[&(dyn ToSql + Sync)],
319+
) -> Result<Row, Error>
320+
where
321+
T: ?Sized + ToStatement + Sync + Send,
322+
{
323+
self.query_one(statement, params).await
324+
}
325+
326+
async fn query_opt<T>(
327+
&self,
328+
statement: &T,
329+
params: &[&(dyn ToSql + Sync)],
330+
) -> Result<Option<Row>, Error>
331+
where
332+
T: ?Sized + ToStatement + Sync + Send,
333+
{
334+
self.query_opt(statement, params).await
335+
}
336+
337+
async fn query_raw<'b, T, I>(&self, statement: &T, params: I) -> Result<RowStream, Error>
338+
where
339+
T: ?Sized + ToStatement + Sync + Send,
340+
I: IntoIterator<Item = &'b dyn ToSql> + Sync + Send,
341+
I::IntoIter: ExactSizeIterator,
342+
{
343+
self.query_raw(statement, params).await
344+
}
345+
346+
async fn prepare(&self, query: &str) -> Result<Statement, Error> {
311347
self.prepare(query).await
312348
}
313349

350+
async fn prepare_typed(
351+
&self,
352+
query: &str,
353+
parameter_types: &[Type],
354+
) -> Result<Statement, Error> {
355+
self.prepare_typed(query, parameter_types).await
356+
}
357+
314358
#[allow(clippy::needless_lifetimes)]
315359
async fn transaction<'a>(&'a mut self) -> Result<Transaction<'a>, Error> {
316360
self.transaction().await

0 commit comments

Comments
 (0)