pub struct PostgresHandler { /* private fields */ }Expand description
PostgreSQL database handler.
Composes one [PostgresConnection] (which owns every pool
and the pool initialization logic) with the per-backend MCP tool
router.
Implementations§
Source§impl PostgresHandler
impl PostgresHandler
Sourcepub fn new(config: &Config) -> Result<Self, RedactorInitError>
pub fn new(config: &Config) -> Result<Self, RedactorInitError>
Creates a new PostgreSQL handler.
Constructs the [PostgresConnection] (which builds the
lazy default pool and the per-database pool cache) and the MCP
tool router. No network I/O happens here.
§Errors
Returns dbmcp_pii::RedactorInitError when PII redaction is enabled
with a NER model that fails to load (fail-closed startup).
Source§impl PostgresHandler
impl PostgresHandler
Sourcepub async fn create_database(
&self,
__arg1: CreateDatabaseRequest,
) -> Result<MessageResponse, ErrorData>
pub async fn create_database( &self, __arg1: CreateDatabaseRequest, ) -> Result<MessageResponse, ErrorData>
Source§impl PostgresHandler
impl PostgresHandler
Sourcepub async fn drop_database(
&self,
__arg1: DropDatabaseRequest,
) -> Result<MessageResponse, ErrorData>
pub async fn drop_database( &self, __arg1: DropDatabaseRequest, ) -> Result<MessageResponse, ErrorData>
Drops an existing database.
Refuses to drop the currently connected (default) database and evicts the corresponding pool cache entry after a successful drop.
§Errors
Returns SqlError::ReadOnlyViolation in read-only mode,
SqlError::InvalidIdentifier for invalid names,
or SqlError::Query if the target is the active database
or the backend reports an error.
Source§impl PostgresHandler
impl PostgresHandler
Sourcepub async fn drop_table(
&self,
database: Option<String>,
table: String,
cascade: bool,
) -> Result<MessageResponse, ErrorData>
pub async fn drop_table( &self, database: Option<String>, table: String, cascade: bool, ) -> Result<MessageResponse, ErrorData>
Drops a table from a database.
Validates identifiers, then executes DROP TABLE. When cascade
is true the statement uses CASCADE to also remove dependent
foreign-key constraints.
§Errors
Returns SqlError::ReadOnlyViolation in read-only mode,
SqlError::InvalidIdentifier for invalid names,
or SqlError::Query if the backend reports an error.
Source§impl PostgresHandler
impl PostgresHandler
Sourcepub async fn explain_query(
&self,
database: Option<String>,
query: String,
analyze: bool,
) -> Result<QueryResponse, ErrorData>
pub async fn explain_query( &self, database: Option<String>, query: String, analyze: bool, ) -> Result<QueryResponse, ErrorData>
Returns the execution plan for a query.
The inner query must be a single statement. When analyze is true
and read-only mode is enabled, it must also be read-only.
§Errors
Returns [SqlError::MultiStatement] if the query holds more than
one statement.
Returns [SqlError::ReadOnlyViolation] if analyze is true,
read-only mode is enabled, and the query is a write statement.
Returns [SqlError::Query] if the backend reports an error.
Source§impl PostgresHandler
impl PostgresHandler
Sourcepub async fn list_databases(
&self,
__arg1: ListDatabasesRequest,
) -> Result<ListDatabasesResponse, ErrorData>
pub async fn list_databases( &self, __arg1: ListDatabasesRequest, ) -> Result<ListDatabasesResponse, ErrorData>
Lists one page of accessible databases.
Uses the default pool intentionally — pg_database is a server-wide
catalog that returns all databases regardless of which database the
connection targets.
§Errors
Returns ErrorData with code -32602 if cursor is malformed,
or an internal-error ErrorData if the underlying query fails.
Source§impl PostgresHandler
impl PostgresHandler
Source§impl PostgresHandler
impl PostgresHandler
Source§impl PostgresHandler
impl PostgresHandler
Source§impl PostgresHandler
impl PostgresHandler
Source§impl PostgresHandler
impl PostgresHandler
Source§impl PostgresHandler
impl PostgresHandler
Source§impl PostgresHandler
impl PostgresHandler
Sourcepub async fn read_query(
&self,
query: String,
database: Option<String>,
cursor: Option<Cursor>,
) -> Result<ReadQueryResponse, ErrorData>
pub async fn read_query( &self, query: String, database: Option<String>, cursor: Option<Cursor>, ) -> Result<ReadQueryResponse, ErrorData>
Executes a read-only SQL query, paginating SELECT result rows.
Validates that the query is read-only, then dispatches on the
classified StatementKind: Select is wrapped in a subquery with
a server-controlled LIMIT/OFFSET; NonSelect (SHOW, EXPLAIN
under the PG dialect) is executed as-is and returned in a single
page. A malformed cursor is rejected by the serde deserializer
before this method is called, producing JSON-RPC -32602.
§Errors
Returns [SqlError::ReadOnlyViolation] if the query is not
read-only, or [SqlError::Query] if the backend reports an error.
Source§impl PostgresHandler
impl PostgresHandler
Sourcepub async fn write_query(
&self,
query: String,
database: Option<String>,
) -> Result<QueryResponse, ErrorData>
pub async fn write_query( &self, query: String, database: Option<String>, ) -> Result<QueryResponse, ErrorData>
Trait Implementations§
Source§impl Clone for PostgresHandler
impl Clone for PostgresHandler
Source§impl Debug for PostgresHandler
impl Debug for PostgresHandler
Source§impl From<PostgresHandler> for Server
impl From<PostgresHandler> for Server
Source§fn from(handler: PostgresHandler) -> Self
fn from(handler: PostgresHandler) -> Self
Wraps a PostgresHandler in the type-erased MCP server.
Source§impl ServerHandler for PostgresHandler
impl ServerHandler for PostgresHandler
fn get_info(&self) -> ServerConfig
Source§async fn call_tool(
&self,
request: CallToolRequestParams,
context: RequestContext<RoleServer>,
) -> Result<CallToolResponse, ErrorData>
async fn call_tool( &self, request: CallToolRequestParams, context: RequestContext<RoleServer>, ) -> Result<CallToolResponse, ErrorData>
tools/call request from a client. Read moreasync fn list_tools( &self, _request: Option<PaginatedRequestParams>, _context: RequestContext<RoleServer>, ) -> Result<ListToolsResult, ErrorData>
fn ping( &self, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
fn initialize( &self, request: InitializeRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<InitializeResult, ErrorData>> + MaybeSendFuture
Source§fn negotiate_initialize(
&self,
request: &InitializeRequestParams,
) -> Result<InitializeResult, ErrorData>
fn negotiate_initialize( &self, request: &InitializeRequestParams, ) -> Result<InitializeResult, ErrorData>
initialize response for request, negotiating the
protocol version against Self::supported_protocol_versions. Read moreSource§fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>
fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>
Source§fn discover(
&self,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<DiscoverResult, ErrorData>> + MaybeSendFuture
fn discover( &self, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<DiscoverResult, ErrorData>> + MaybeSendFuture
fn complete( &self, request: CompleteRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CompleteResult, ErrorData>> + MaybeSendFuture
fn set_level( &self, request: SetLevelRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
fn get_prompt( &self, request: GetPromptRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<GetPromptResponse, ErrorData>> + MaybeSendFuture
fn list_prompts( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListPromptsResult, ErrorData>> + MaybeSendFuture
fn list_resources( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListResourcesResult, ErrorData>> + MaybeSendFuture
fn list_resource_templates( &self, request: Option<PaginatedRequestParams>, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ListResourceTemplatesResult, ErrorData>> + MaybeSendFuture
fn read_resource( &self, request: ReadResourceRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<ReadResourceResponse, ErrorData>> + MaybeSendFuture
Source§fn accepted_subscription_filter(
&self,
requested: &SubscriptionFilter,
) -> Option<SubscriptionFilter>
fn accepted_subscription_filter( &self, requested: &SubscriptionFilter, ) -> Option<SubscriptionFilter>
Source§fn listen(
&self,
context: SubscriptionContext,
) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
fn listen( &self, context: SubscriptionContext, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
Source§fn subscribe(
&self,
request: SubscribeRequestParams,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
fn subscribe( &self, request: SubscribeRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
resources/subscribe is legacy-only; implement accepted_subscription_filter and listen for protocol version 2026-07-28
Source§fn unsubscribe(
&self,
request: UnsubscribeRequestParams,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
fn unsubscribe( &self, request: UnsubscribeRequestParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
resources/unsubscribe is legacy-only; subscriptions/listen is cancelled through its request lifecycle
fn on_custom_request( &self, request: CustomRequest, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<CustomResult, ErrorData>> + MaybeSendFuture
fn on_cancelled( &self, notification: CancelledNotificationParam, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture
fn on_progress( &self, notification: ProgressNotificationParam, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture
fn on_initialized( &self, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture
fn on_roots_list_changed( &self, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture
fn on_custom_notification( &self, notification: CustomNotification, context: NotificationContext<RoleServer>, ) -> impl Future<Output = ()> + MaybeSendFuture
Source§fn get_task(
&self,
request: GetTaskParams,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<GetTaskResult, ErrorData>> + MaybeSendFuture
fn get_task( &self, request: GetTaskParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<GetTaskResult, ErrorData>> + MaybeSendFuture
tasks/get: return the current DetailedTask state.Source§fn update_task(
&self,
request: UpdateTaskParams,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
fn update_task( &self, request: UpdateTaskParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
tasks/update: accept responses to outstanding in-task
input requests. Returns an empty acknowledgement on success.Source§fn cancel_task(
&self,
request: CancelTaskParams,
context: RequestContext<RoleServer>,
) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
fn cancel_task( &self, request: CancelTaskParams, context: RequestContext<RoleServer>, ) -> impl Future<Output = Result<(), ErrorData>> + MaybeSendFuture
tasks/cancel: cooperative cancellation. Returns an empty
acknowledgement; the task’s observable status may lag.Source§impl Shutdown for PostgresHandler
impl Shutdown for PostgresHandler
Source§fn shutdown(&self) -> ShutdownFuture<'_>
fn shutdown(&self) -> ShutdownFuture<'_>
Auto Trait Implementations§
impl !RefUnwindSafe for PostgresHandler
impl !UnwindSafe for PostgresHandler
impl Freeze for PostgresHandler
impl Send for PostgresHandler
impl Sync for PostgresHandler
impl Unpin for PostgresHandler
impl UnsafeUnpin for PostgresHandler
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<R, S> DynService<R> for Swhere
R: ServiceRole,
S: Service<R>,
impl<R, S> DynService<R> for Swhere
R: ServiceRole,
S: Service<R>,
fn handle_request( &self, request: <R as ServiceRole>::PeerReq, context: RequestContext<R>, ) -> Pin<Box<dyn Future<Output = Result<<R as ServiceRole>::Resp, ErrorData>> + Send + '_>>
fn handle_notification( &self, notification: <R as ServiceRole>::PeerNot, context: NotificationContext<R>, ) -> Pin<Box<dyn Future<Output = Result<(), ErrorData>> + Send + '_>>
fn get_info(&self) -> <R as ServiceRole>::Info
Source§fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>
fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<H> Service<RoleServer> for Hwhere
H: ServerHandler,
impl<H> Service<RoleServer> for Hwhere
H: ServerHandler,
async fn handle_request( &self, request: <RoleServer as ServiceRole>::PeerReq, context: RequestContext<RoleServer>, ) -> Result<<RoleServer as ServiceRole>::Resp, ErrorData>
async fn handle_notification( &self, notification: <RoleServer as ServiceRole>::PeerNot, context: NotificationContext<RoleServer>, ) -> Result<(), ErrorData>
fn get_info(&self) -> <RoleServer as ServiceRole>::Info
Source§fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>
fn supported_protocol_versions(&self) -> Cow<'static, [ProtocolVersion]>
initialize
negotiation may agree to. Read more