From afc9b2835d84aed76ae6f64d11b507e34e775585 Mon Sep 17 00:00:00 2001 From: dvic Date: Mon, 27 Jan 2020 10:20:30 +0100 Subject: [PATCH] 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 955435cd..f87e11ba 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 949ad4f0..53473737 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 75a93930..b165cbed 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