diff --git a/postgres/src/client.rs b/postgres/src/client.rs index 3e69670d..c4a18b79 100644 --- a/postgres/src/client.rs +++ b/postgres/src/client.rs @@ -1,4 +1,4 @@ -use crate::{Config, CopyInWriter, CopyOutReader, RowIter, Statement, ToStatement, Transaction}; +use crate::{Config, CopyInWriter, CopyOutReader, GenericConnection, RowIter, Statement, ToStatement, Transaction}; use std::ops::{Deref, DerefMut}; use tokio::runtime::Runtime; use tokio_postgres::tls::{MakeTlsConnect, TlsConnect}; @@ -450,3 +450,18 @@ impl Client { self.client.is_closed() } } + +impl GenericConnection for Client { + fn execute(&mut self, query: &str, params: &[&(dyn ToSql + Sync)]) -> Result { + self.execute(query, params) + } + fn query(&mut self, query: &str, params: &[&(dyn ToSql + Sync)]) -> Result, Error> { + self.query(query, params) + } + fn prepare(&mut self, query: &str) -> Result { + self.prepare(query) + } + fn transaction(&mut self) -> Result, Error> { + self.transaction() + } +} diff --git a/postgres/src/generic_connection.rs b/postgres/src/generic_connection.rs new file mode 100644 index 00000000..fcf1755e --- /dev/null +++ b/postgres/src/generic_connection.rs @@ -0,0 +1,18 @@ +use crate::{Statement, Transaction}; +use tokio_postgres::types::{ToSql}; +use tokio_postgres::{Error, Row}; + +/// A trait allowing abstraction over connections and transactions +pub trait GenericConnection { + /// Like `Client::execute`. + fn execute(&mut self, query: &str, params: &[&(dyn ToSql + Sync)]) -> Result; + + /// Like `Client::query`. + fn query(&mut self, query: &str, params: &[&(dyn ToSql + Sync)]) -> Result, Error>; + + /// Like `Client::prepare`. + fn prepare(&mut self, query: &str) -> Result; + + /// Like `Client::transaction`. + fn transaction(&mut self) -> Result, Error>; +} diff --git a/postgres/src/lib.rs b/postgres/src/lib.rs index 801eeb9c..0831b80a 100644 --- a/postgres/src/lib.rs +++ b/postgres/src/lib.rs @@ -60,6 +60,7 @@ pub use crate::copy_in_writer::CopyInWriter; pub use crate::copy_out_reader::CopyOutReader; #[doc(no_inline)] pub use crate::error::Error; +pub use crate::generic_connection::GenericConnection; #[doc(no_inline)] pub use crate::row::{Row, SimpleQueryRow}; pub use crate::row_iter::RowIter; @@ -72,6 +73,7 @@ mod client; pub mod config; mod copy_in_writer; mod copy_out_reader; +mod generic_connection; mod lazy_pin; mod row_iter; mod transaction; diff --git a/postgres/src/transaction.rs b/postgres/src/transaction.rs index 010e8b62..f3288029 100644 --- a/postgres/src/transaction.rs +++ b/postgres/src/transaction.rs @@ -1,4 +1,4 @@ -use crate::{CopyInWriter, CopyOutReader, Portal, RowIter, Rt, Statement, ToStatement}; +use crate::{CopyInWriter, CopyOutReader, GenericConnection, Portal, RowIter, Rt, Statement, ToStatement}; use tokio::runtime::Runtime; use tokio_postgres::types::{ToSql, Type}; use tokio_postgres::{Error, Row, SimpleQueryMessage}; @@ -177,3 +177,18 @@ impl<'a> Transaction<'a> { }) } } + +impl<'a> GenericConnection for Transaction<'a> { + fn execute(&mut self, query: &str, params: &[&(dyn ToSql + Sync)]) -> Result { + self.execute(query, params) + } + fn query(&mut self, query: &str, params: &[&(dyn ToSql + Sync)]) -> Result, Error> { + self.query(query, params) + } + fn prepare(&mut self, query: &str) -> Result { + self.prepare(query) + } + fn transaction(&mut self) -> Result, Error> { + self.transaction() + } +}