From afc9b2835d84aed76ae6f64d11b507e34e775585 Mon Sep 17 00:00:00 2001 From: dvic Date: Mon, 27 Jan 2020 10:20:30 +0100 Subject: [PATCH 1/3] Add missing methods to GenericClient This adds `execute_raw`, `query_one`, `query_opt`, `query_raw`, and `prepare_typed` to the generic trait introduced in #525. --- tokio-postgres/src/client.rs | 57 ++++++++++++++++++++++++++++ tokio-postgres/src/generic_client.rs | 42 +++++++++++++++++++- tokio-postgres/src/transaction.rs | 57 ++++++++++++++++++++++++++++ 3 files changed, 155 insertions(+), 1 deletion(-) diff --git a/tokio-postgres/src/client.rs b/tokio-postgres/src/client.rs index 955435cd6..f87e11ba3 100644 --- a/tokio-postgres/src/client.rs +++ b/tokio-postgres/src/client.rs @@ -506,6 +506,7 @@ impl Client { #[async_trait] impl GenericClient for Client { + /// Like `Client::execute`. async fn execute(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result where T: ?Sized + ToStatement + Sync + Send, @@ -513,6 +514,17 @@ impl GenericClient for Client { self.execute(query, params).await } + /// Like `Client::execute_raw`. + async fn execute_raw<'b, I, T>(&self, statement: &T, params: I) -> Result + where + T: ?Sized + ToStatement + Sync + Send, + I: IntoIterator + Sync + Send, + I::IntoIter: ExactSizeIterator, + { + self.execute_raw(statement, params).await + } + + /// Like `Client::query`. async fn query( &mut self, query: &T, @@ -524,10 +536,55 @@ impl GenericClient for Client { self.query(query, params).await } + /// Like `Client::query_one`. + async fn query_one( + &self, + statement: &T, + params: &[&(dyn ToSql + Sync)], + ) -> Result + where + T: ?Sized + ToStatement + Sync + Send, + { + self.query_one(statement, params).await + } + + /// Like `Client::query_opt`. + async fn query_opt( + &self, + statement: &T, + params: &[&(dyn ToSql + Sync)], + ) -> Result, Error> + where + T: ?Sized + ToStatement + Sync + Send, + { + self.query_opt(statement, params).await + } + + /// Like `Client::query_raw`. + async fn query_raw<'b, T, I>(&self, statement: &T, params: I) -> Result + where + T: ?Sized + ToStatement + Sync + Send, + I: IntoIterator + Sync + Send, + I::IntoIter: ExactSizeIterator, + { + self.query_raw(statement, params).await + } + + /// Like `Client::prepare`. async fn prepare(&mut self, query: &str) -> Result { self.prepare(query).await } + /// Like `Client::prepare_typed`. + async fn prepare_typed( + &self, + query: &str, + parameter_types: &[Type], + ) -> Result { + self.prepare_typed(query, parameter_types).await + } + + /// Like `Client::transaction`. async fn transaction(&mut self) -> Result, Error> { self.transaction().await } diff --git a/tokio-postgres/src/generic_client.rs b/tokio-postgres/src/generic_client.rs index 949ad4f06..534737374 100644 --- a/tokio-postgres/src/generic_client.rs +++ b/tokio-postgres/src/generic_client.rs @@ -1,4 +1,5 @@ -use crate::types::ToSql; +use crate::query::RowStream; +use crate::types::{ToSql, Type}; use crate::{Error, Row, Statement, ToStatement, Transaction}; use async_trait::async_trait; @@ -10,6 +11,13 @@ pub trait GenericClient { where T: ?Sized + ToStatement + Sync + Send; + /// Like `Client::execute_raw`. + async fn execute_raw<'b, I, T>(&self, statement: &T, params: I) -> Result + where + T: ?Sized + ToStatement + Sync + Send, + I: IntoIterator + Sync + Send, + I::IntoIter: ExactSizeIterator; + /// Like `Client::query`. async fn query( &mut self, @@ -19,9 +27,41 @@ pub trait GenericClient { where T: ?Sized + ToStatement + Sync + Send; + /// Like `Client::query_one`. + async fn query_one( + &self, + statement: &T, + params: &[&(dyn ToSql + Sync)], + ) -> Result + where + T: ?Sized + ToStatement + Sync + Send; + + /// Like `Client::query_opt`. + async fn query_opt( + &self, + statement: &T, + params: &[&(dyn ToSql + Sync)], + ) -> Result, Error> + where + T: ?Sized + ToStatement + Sync + Send; + + /// Like `Client::query_raw`. + async fn query_raw<'b, T, I>(&self, statement: &T, params: I) -> Result + where + T: ?Sized + ToStatement + Sync + Send, + I: IntoIterator + Sync + Send, + I::IntoIter: ExactSizeIterator; + /// Like `Client::prepare`. async fn prepare(&mut self, query: &str) -> Result; + /// Like `Client::prepare_typed`. + async fn prepare_typed( + &self, + query: &str, + parameter_types: &[Type], + ) -> Result; + /// Like `Client::transaction`. async fn transaction(&mut self) -> Result, Error>; } diff --git a/tokio-postgres/src/transaction.rs b/tokio-postgres/src/transaction.rs index 75a939302..b165cbedc 100644 --- a/tokio-postgres/src/transaction.rs +++ b/tokio-postgres/src/transaction.rs @@ -289,6 +289,7 @@ impl<'a> Transaction<'a> { #[async_trait] impl crate::GenericClient for Transaction<'_> { + /// Like `Transaction::execute`. async fn execute(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result where T: ?Sized + ToStatement + Sync + Send, @@ -296,6 +297,17 @@ impl crate::GenericClient for Transaction<'_> { self.execute(query, params).await } + /// Like `Transaction::execute_raw`. + async fn execute_raw<'b, I, T>(&self, statement: &T, params: I) -> Result + where + T: ?Sized + ToStatement + Sync + Send, + I: IntoIterator + Sync + Send, + I::IntoIter: ExactSizeIterator, + { + self.execute_raw(statement, params).await + } + + /// Like `Transaction::query`. async fn query( &mut self, query: &T, @@ -307,10 +319,55 @@ impl crate::GenericClient for Transaction<'_> { self.query(query, params).await } + /// Like `Transaction::query_one`. + async fn query_one( + &self, + statement: &T, + params: &[&(dyn ToSql + Sync)], + ) -> Result + where + T: ?Sized + ToStatement + Sync + Send, + { + self.query_one(statement, params).await + } + + /// Like `Transaction::query_opt`. + async fn query_opt( + &self, + statement: &T, + params: &[&(dyn ToSql + Sync)], + ) -> Result, Error> + where + T: ?Sized + ToStatement + Sync + Send, + { + self.query_opt(statement, params).await + } + + /// Like `Transaction::query_raw`. + async fn query_raw<'b, T, I>(&self, statement: &T, params: I) -> Result + where + T: ?Sized + ToStatement + Sync + Send, + I: IntoIterator + Sync + Send, + I::IntoIter: ExactSizeIterator, + { + self.query_raw(statement, params).await + } + + /// Like `Transaction::prepare`. async fn prepare(&mut self, query: &str) -> Result { self.prepare(query).await } + /// Like `Transaction::prepare_typed`. + async fn prepare_typed( + &self, + query: &str, + parameter_types: &[Type], + ) -> Result { + self.prepare_typed(query, parameter_types).await + } + + /// Like `Transaction::transaction`. #[allow(clippy::needless_lifetimes)] async fn transaction<'a>(&'a mut self) -> Result, Error> { self.transaction().await From 1ea8b7b2d467b2da49c94de522dd6ec054b5d159 Mon Sep 17 00:00:00 2001 From: dvic Date: Mon, 27 Jan 2020 11:14:27 +0100 Subject: [PATCH 2/3] Fix self references in GenericClient --- tokio-postgres/src/client.rs | 10 +++------- tokio-postgres/src/generic_client.rs | 10 +++------- tokio-postgres/src/transaction.rs | 10 +++------- 3 files changed, 9 insertions(+), 21 deletions(-) diff --git a/tokio-postgres/src/client.rs b/tokio-postgres/src/client.rs index f87e11ba3..96e724d48 100644 --- a/tokio-postgres/src/client.rs +++ b/tokio-postgres/src/client.rs @@ -507,7 +507,7 @@ impl Client { #[async_trait] impl GenericClient for Client { /// Like `Client::execute`. - async fn execute(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result + async fn execute(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result where T: ?Sized + ToStatement + Sync + Send, { @@ -525,11 +525,7 @@ impl GenericClient for Client { } /// Like `Client::query`. - async fn query( - &mut self, - query: &T, - params: &[&(dyn ToSql + Sync)], - ) -> Result, Error> + async fn query(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result, Error> where T: ?Sized + ToStatement + Sync + Send, { @@ -571,7 +567,7 @@ impl GenericClient for Client { } /// Like `Client::prepare`. - async fn prepare(&mut self, query: &str) -> Result { + async fn prepare(&self, query: &str) -> Result { self.prepare(query).await } diff --git a/tokio-postgres/src/generic_client.rs b/tokio-postgres/src/generic_client.rs index 534737374..cfbd83e93 100644 --- a/tokio-postgres/src/generic_client.rs +++ b/tokio-postgres/src/generic_client.rs @@ -7,7 +7,7 @@ use async_trait::async_trait; #[async_trait] pub trait GenericClient { /// Like `Client::execute`. - async fn execute(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result + async fn execute(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result where T: ?Sized + ToStatement + Sync + Send; @@ -19,11 +19,7 @@ pub trait GenericClient { I::IntoIter: ExactSizeIterator; /// Like `Client::query`. - async fn query( - &mut self, - query: &T, - params: &[&(dyn ToSql + Sync)], - ) -> Result, Error> + async fn query(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result, Error> where T: ?Sized + ToStatement + Sync + Send; @@ -53,7 +49,7 @@ pub trait GenericClient { I::IntoIter: ExactSizeIterator; /// Like `Client::prepare`. - async fn prepare(&mut self, query: &str) -> Result; + async fn prepare(&self, query: &str) -> Result; /// Like `Client::prepare_typed`. async fn prepare_typed( diff --git a/tokio-postgres/src/transaction.rs b/tokio-postgres/src/transaction.rs index b165cbedc..6d02ec523 100644 --- a/tokio-postgres/src/transaction.rs +++ b/tokio-postgres/src/transaction.rs @@ -290,7 +290,7 @@ impl<'a> Transaction<'a> { #[async_trait] impl crate::GenericClient for Transaction<'_> { /// Like `Transaction::execute`. - async fn execute(&mut self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result + async fn execute(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result where T: ?Sized + ToStatement + Sync + Send, { @@ -308,11 +308,7 @@ impl crate::GenericClient for Transaction<'_> { } /// Like `Transaction::query`. - async fn query( - &mut self, - query: &T, - params: &[&(dyn ToSql + Sync)], - ) -> Result, Error> + async fn query(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result, Error> where T: ?Sized + ToStatement + Sync + Send, { @@ -354,7 +350,7 @@ impl crate::GenericClient for Transaction<'_> { } /// Like `Transaction::prepare`. - async fn prepare(&mut self, query: &str) -> Result { + async fn prepare(&self, query: &str) -> Result { self.prepare(query).await } From 5d08af01ec520cba1a8642cb7c66ce070b03f4ca Mon Sep 17 00:00:00 2001 From: dvic Date: Mon, 27 Jan 2020 15:25:02 +0100 Subject: [PATCH 3/3] Remove unnecessary impl GenericClient docs --- tokio-postgres/src/client.rs | 9 --------- tokio-postgres/src/transaction.rs | 9 --------- 2 files changed, 18 deletions(-) diff --git a/tokio-postgres/src/client.rs b/tokio-postgres/src/client.rs index 96e724d48..78f295e30 100644 --- a/tokio-postgres/src/client.rs +++ b/tokio-postgres/src/client.rs @@ -506,7 +506,6 @@ impl Client { #[async_trait] impl GenericClient for Client { - /// Like `Client::execute`. async fn execute(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result where T: ?Sized + ToStatement + Sync + Send, @@ -514,7 +513,6 @@ impl GenericClient for Client { self.execute(query, params).await } - /// Like `Client::execute_raw`. async fn execute_raw<'b, I, T>(&self, statement: &T, params: I) -> Result where T: ?Sized + ToStatement + Sync + Send, @@ -524,7 +522,6 @@ impl GenericClient for Client { self.execute_raw(statement, params).await } - /// Like `Client::query`. async fn query(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result, Error> where T: ?Sized + ToStatement + Sync + Send, @@ -532,7 +529,6 @@ impl GenericClient for Client { self.query(query, params).await } - /// Like `Client::query_one`. async fn query_one( &self, statement: &T, @@ -544,7 +540,6 @@ impl GenericClient for Client { self.query_one(statement, params).await } - /// Like `Client::query_opt`. async fn query_opt( &self, statement: &T, @@ -556,7 +551,6 @@ impl GenericClient for Client { self.query_opt(statement, params).await } - /// Like `Client::query_raw`. async fn query_raw<'b, T, I>(&self, statement: &T, params: I) -> Result where T: ?Sized + ToStatement + Sync + Send, @@ -566,12 +560,10 @@ impl GenericClient for Client { self.query_raw(statement, params).await } - /// Like `Client::prepare`. async fn prepare(&self, query: &str) -> Result { self.prepare(query).await } - /// Like `Client::prepare_typed`. async fn prepare_typed( &self, query: &str, @@ -580,7 +572,6 @@ impl GenericClient for Client { self.prepare_typed(query, parameter_types).await } - /// Like `Client::transaction`. async fn transaction(&mut self) -> Result, Error> { self.transaction().await } diff --git a/tokio-postgres/src/transaction.rs b/tokio-postgres/src/transaction.rs index 6d02ec523..c75087377 100644 --- a/tokio-postgres/src/transaction.rs +++ b/tokio-postgres/src/transaction.rs @@ -289,7 +289,6 @@ impl<'a> Transaction<'a> { #[async_trait] impl crate::GenericClient for Transaction<'_> { - /// Like `Transaction::execute`. async fn execute(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result where T: ?Sized + ToStatement + Sync + Send, @@ -297,7 +296,6 @@ impl crate::GenericClient for Transaction<'_> { self.execute(query, params).await } - /// Like `Transaction::execute_raw`. async fn execute_raw<'b, I, T>(&self, statement: &T, params: I) -> Result where T: ?Sized + ToStatement + Sync + Send, @@ -307,7 +305,6 @@ impl crate::GenericClient for Transaction<'_> { self.execute_raw(statement, params).await } - /// Like `Transaction::query`. async fn query(&self, query: &T, params: &[&(dyn ToSql + Sync)]) -> Result, Error> where T: ?Sized + ToStatement + Sync + Send, @@ -315,7 +312,6 @@ impl crate::GenericClient for Transaction<'_> { self.query(query, params).await } - /// Like `Transaction::query_one`. async fn query_one( &self, statement: &T, @@ -327,7 +323,6 @@ impl crate::GenericClient for Transaction<'_> { self.query_one(statement, params).await } - /// Like `Transaction::query_opt`. async fn query_opt( &self, statement: &T, @@ -339,7 +334,6 @@ impl crate::GenericClient for Transaction<'_> { self.query_opt(statement, params).await } - /// Like `Transaction::query_raw`. async fn query_raw<'b, T, I>(&self, statement: &T, params: I) -> Result where T: ?Sized + ToStatement + Sync + Send, @@ -349,12 +343,10 @@ impl crate::GenericClient for Transaction<'_> { self.query_raw(statement, params).await } - /// Like `Transaction::prepare`. async fn prepare(&self, query: &str) -> Result { self.prepare(query).await } - /// Like `Transaction::prepare_typed`. async fn prepare_typed( &self, query: &str, @@ -363,7 +355,6 @@ impl crate::GenericClient for Transaction<'_> { self.prepare_typed(query, parameter_types).await } - /// Like `Transaction::transaction`. #[allow(clippy::needless_lifetimes)] async fn transaction<'a>(&'a mut self) -> Result, Error> { self.transaction().await