use std::sync::Arc;
use tokio::runtime::Handle;
use tokio::sync::OwnedRwLockWriteGuard;
use tokio_postgres::Client;
pub(crate) struct SharedClientRollbackGuard {
client: Arc<Client>,
gate: Option<OwnedRwLockWriteGuard<()>>,
handle: Handle,
armed: bool,
}
impl SharedClientRollbackGuard {
pub(crate) fn new(client: Arc<Client>, gate: OwnedRwLockWriteGuard<()>) -> Self {
Self {
client,
gate: Some(gate),
handle: Handle::current(),
armed: true,
}
}
pub(crate) fn disarm(&mut self) {
self.armed = false;
}
}
impl Drop for SharedClientRollbackGuard {
fn drop(&mut self) {
if !self.armed {
return;
}
let client = Arc::clone(&self.client);
let gate = self.gate.take();
let _rollback_task = self.handle.spawn(async move {
let _rollback_result = client.batch_execute("ROLLBACK").await;
drop(gate);
});
}
}