diff --git a/src/api/query.rs b/src/api/query.rs index bd5b42f..3eec130 100644 --- a/src/api/query.rs +++ b/src/api/query.rs @@ -385,10 +385,14 @@ pub trait ExtendedQueryHandler: Send + Sync { /// `READY_FOR_QUERY` response to client async fn on_sync(&self, client: &mut C, _message: PgSync) -> PgWireResult<()> where - C: ClientInfo + Sink + Unpin + Send + Sync, + C: ClientInfo + ClientPortalStore + Sink + Unpin + Send + Sync, + C::PortalStore: PortalStore, C::Error: Debug, PgWireError: From<>::Error>, { + // cleanup all portals + client.portal_store().clear_portals(); + client .send(PgWireBackendMessage::ReadyForQuery(ReadyForQuery::new( client.transaction_status(), diff --git a/src/api/store.rs b/src/api/store.rs index fd7dd4f..4a28642 100644 --- a/src/api/store.rs +++ b/src/api/store.rs @@ -17,6 +17,8 @@ pub trait PortalStore: Send + Sync { fn rm_portal(&self, name: &str); + fn clear_portals(&self); + fn get_portal(&self, name: &str) -> Option>>; } @@ -56,6 +58,11 @@ impl PortalStore for MemPortalStore { guard.remove(name); } + fn clear_portals(&self) { + let mut guard = self.portals.write().unwrap(); + guard.clear(); + } + fn get_portal(&self, name: &str) -> Option>> { let guard = self.portals.read().unwrap(); guard.get(name).cloned()