use std::sync::Arc;
use deadpool_postgres::Client as DeadpoolClient;
use tokio::runtime::Handle;
use tokio::sync::Mutex;
pub(crate) struct PooledClientRollbackGuard {
client: Arc<Mutex<DeadpoolClient>>,
handle: Handle,
armed: bool,
}
impl PooledClientRollbackGuard {
pub(crate) fn new(client: Arc<Mutex<DeadpoolClient>>) -> Self {
Self {
client,
handle: Handle::current(),
armed: true,
}
}
pub(crate) fn disarm(&mut self) {
self.armed = false;
}
}
impl Drop for PooledClientRollbackGuard {
fn drop(&mut self) {
if !self.armed {
return;
}
let client = Arc::clone(&self.client);
let _rollback_task = self.handle.spawn(async move {
let locked = client.lock().await;
let _rollback_result = locked.batch_execute("ROLLBACK").await;
});
}
}