Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions src/api/client/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use postgres_types::Oid;
use crate::api::results::{FieldInfo, Tag};
use crate::error::{ErrorInfo, PgWireClientError, PgWireClientResult};
use crate::messages::data::{DataRow, RowDescription};
use crate::messages::extendedquery::{Bind, Close, Execute, Flush, Parse, Sync};
use crate::messages::response::{CommandComplete, EmptyQueryResponse, ReadyForQuery};
use crate::messages::simplequery::Query;
use crate::messages::{PgWireBackendMessage, PgWireFrontendMessage};
Expand Down Expand Up @@ -102,6 +103,47 @@ pub trait SimpleQueryHandler: Send {
PgWireClientError: From<<C as Sink<PgWireFrontendMessage>>::Error>;
}

#[async_trait]
pub trait ExtendedQueryHandler: Send {
type QueryResponse;

// TODO: do we need to cover message building here, to pass raw message or
// pass statement name and id?
async fn parse<C>(&mut self, client: &mut C, query: Parse) -> PgWireClientResult<()>
where
C: ClientInfo + Sink<PgWireFrontendMessage> + Unpin + Send,
PgWireClientError: From<<C as Sink<PgWireFrontendMessage>>::Error>;

async fn bind<C>(&mut self, client: &mut C, bind: Bind) -> PgWireClientResult<()>
where
C: ClientInfo + Sink<PgWireFrontendMessage> + Unpin + Send,
PgWireClientError: From<<C as Sink<PgWireFrontendMessage>>::Error>;

async fn execute<C>(
&mut self,
client: &mut C,
execute: Execute,
) -> PgWireClientResult<Self::QueryResponse>
where
C: ClientInfo + Sink<PgWireFrontendMessage> + Unpin + Send,
PgWireClientError: From<<C as Sink<PgWireFrontendMessage>>::Error>;

async fn close<C>(&mut self, client: &mut C, close: Close) -> PgWireClientResult<()>
where
C: ClientInfo + Sink<PgWireFrontendMessage> + Unpin + Send,
PgWireClientError: From<<C as Sink<PgWireFrontendMessage>>::Error>;

async fn sync<C>(&mut self, client: &mut C, sync: Sync) -> PgWireClientResult<()>
where
C: ClientInfo + Sink<PgWireFrontendMessage> + Unpin + Send,
PgWireClientError: From<<C as Sink<PgWireFrontendMessage>>::Error>;

async fn flush<C>(&mut self, client: &mut C, flush: Flush) -> PgWireClientResult<()>
where
C: ClientInfo + Sink<PgWireFrontendMessage> + Unpin + Send,
PgWireClientError: From<<C as Sink<PgWireFrontendMessage>>::Error>;
}

#[derive(Debug)]
pub enum Response {
EmptyQuery,
Expand Down
20 changes: 20 additions & 0 deletions src/tokio/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,26 @@ impl PgWireClient {

Err(PgWireClientError::UnexpectedEOF)
}

/// Parse a query to server side
pub async fn parse<H>(
&mut self,
mut extended_query_handler: H,
name: Option<&str>,
query: &str,
) -> PgWireClientResult<()> {
todo!()
}

/// Execute the query
pub async fn execute<H>(
&mut self,
mut extended_query_handler: H,
name: Option<&str>,
parameters: Vec<String>, //TODO
) -> PgWireClientResult<()> {
todo!()
}
}

#[pin_project(project = ClientSocketProj)]
Expand Down
Loading