mirror of
https://github.com/neondatabase/neon.git
synced 2026-05-15 04:00:38 +00:00
Our rust-postgres fork is getting messy. Mostly because proxy wants more
control over the raw protocol than tokio-postgres provides. As such,
it's diverging more and more. Storage and compute also make use of
rust-postgres, but in more normal usage, thus they don't need our crazy
changes.
Idea:
* proxy maintains their subset
* other teams use a minimal patch set against upstream rust-postgres
Reviewing this code will be difficult. To implement it, I
1. Copied tokio-postgres, postgres-protocol and postgres-types from
00940fcdb5
2. Updated their package names with the `2` suffix to make them compile
in the workspace.
3. Updated proxy to use those packages
4. Copied in the code from tokio-postgres-rustls 0.13 (with some patches
applied https://github.com/jbg/tokio-postgres-rustls/pull/32
https://github.com/jbg/tokio-postgres-rustls/pull/33)
5. Removed as much dead code as I could find in the vendored libraries
6. Updated the tokio-postgres-rustls code to use our existing channel
binding implementation
58 lines
1.4 KiB
Rust
58 lines
1.4 KiB
Rust
use crate::to_statement::private::{Sealed, ToStatementType};
|
|
use crate::Statement;
|
|
|
|
mod private {
|
|
use crate::{Client, Error, Statement};
|
|
|
|
pub trait Sealed {}
|
|
|
|
pub enum ToStatementType<'a> {
|
|
Statement(&'a Statement),
|
|
Query(&'a str),
|
|
}
|
|
|
|
impl<'a> ToStatementType<'a> {
|
|
pub async fn into_statement(self, client: &Client) -> Result<Statement, Error> {
|
|
match self {
|
|
ToStatementType::Statement(s) => Ok(s.clone()),
|
|
ToStatementType::Query(s) => client.prepare(s).await,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// A trait abstracting over prepared and unprepared statements.
|
|
///
|
|
/// Many methods are generic over this bound, so that they support both a raw query string as well as a statement which
|
|
/// was prepared previously.
|
|
///
|
|
/// This trait is "sealed" and cannot be implemented by anything outside this crate.
|
|
pub trait ToStatement: Sealed {
|
|
#[doc(hidden)]
|
|
fn __convert(&self) -> ToStatementType<'_>;
|
|
}
|
|
|
|
impl ToStatement for Statement {
|
|
fn __convert(&self) -> ToStatementType<'_> {
|
|
ToStatementType::Statement(self)
|
|
}
|
|
}
|
|
|
|
impl Sealed for Statement {}
|
|
|
|
impl ToStatement for str {
|
|
fn __convert(&self) -> ToStatementType<'_> {
|
|
ToStatementType::Query(self)
|
|
}
|
|
}
|
|
|
|
impl Sealed for str {}
|
|
|
|
impl ToStatement for String {
|
|
fn __convert(&self) -> ToStatementType<'_> {
|
|
ToStatementType::Query(self)
|
|
}
|
|
}
|
|
|
|
impl Sealed for String {}
|