mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-16 09:52:54 +00:00
In our json encoding, we only need to know about array types. Information about composites or enums are not actually used. Enums are quite popular, needing to type query them when not needed can add some latency cost for no gain.
63 lines
1.8 KiB
Rust
63 lines
1.8 KiB
Rust
#![allow(async_fn_in_trait)]
|
|
|
|
use postgres_protocol2::Oid;
|
|
|
|
use crate::query::RowStream;
|
|
use crate::types::Type;
|
|
use crate::{Client, Error, Transaction};
|
|
|
|
mod private {
|
|
pub trait Sealed {}
|
|
}
|
|
|
|
/// A trait allowing abstraction over connections and transactions.
|
|
///
|
|
/// This trait is "sealed", and cannot be implemented outside of this crate.
|
|
pub trait GenericClient: private::Sealed {
|
|
/// Like `Client::query_raw_txt`.
|
|
async fn query_raw_txt<S, I>(&self, statement: &str, params: I) -> Result<RowStream, Error>
|
|
where
|
|
S: AsRef<str> + Sync + Send,
|
|
I: IntoIterator<Item = Option<S>> + Sync + Send,
|
|
I::IntoIter: ExactSizeIterator + Sync + Send;
|
|
|
|
/// Query for type information
|
|
async fn get_type(&mut self, oid: Oid) -> Result<Type, Error>;
|
|
}
|
|
|
|
impl private::Sealed for Client {}
|
|
|
|
impl GenericClient for Client {
|
|
async fn query_raw_txt<S, I>(&self, statement: &str, params: I) -> Result<RowStream, Error>
|
|
where
|
|
S: AsRef<str> + Sync + Send,
|
|
I: IntoIterator<Item = Option<S>> + Sync + Send,
|
|
I::IntoIter: ExactSizeIterator + Sync + Send,
|
|
{
|
|
self.query_raw_txt(statement, params).await
|
|
}
|
|
|
|
/// Query for type information
|
|
async fn get_type(&mut self, oid: Oid) -> Result<Type, Error> {
|
|
self.get_type_inner(oid).await
|
|
}
|
|
}
|
|
|
|
impl private::Sealed for Transaction<'_> {}
|
|
|
|
impl GenericClient for Transaction<'_> {
|
|
async fn query_raw_txt<S, I>(&self, statement: &str, params: I) -> Result<RowStream, Error>
|
|
where
|
|
S: AsRef<str> + Sync + Send,
|
|
I: IntoIterator<Item = Option<S>> + Sync + Send,
|
|
I::IntoIter: ExactSizeIterator + Sync + Send,
|
|
{
|
|
self.query_raw_txt(statement, params).await
|
|
}
|
|
|
|
/// Query for type information
|
|
async fn get_type(&mut self, oid: Oid) -> Result<Type, Error> {
|
|
self.client_mut().get_type(oid).await
|
|
}
|
|
}
|