use crate::client::Client;
use crate::error::Result;
use crate::row::ResultSet;
use dameng_types::ToDmValue;
pub struct Transaction<'a> {
client: &'a mut Client,
finished: bool,
}
impl<'a> Transaction<'a> {
pub fn commit(mut self) -> Result<()> {
self.finish_inner("COMMIT")
}
pub fn rollback(mut self) -> Result<()> {
self.finish_inner("ROLLBACK")
}
pub fn execute(&mut self, sql: &str) -> Result<u64> {
self.client.execute(sql)
}
pub fn execute_with_params(&mut self, sql: &str, params: &[&dyn ToDmValue]) -> Result<u64> {
self.client.execute_with_params(sql, params)
}
pub fn query(&mut self, sql: &str) -> Result<ResultSet> {
self.client.query(sql)
}
pub fn query_with_params(&mut self, sql: &str, params: &[&dyn ToDmValue]) -> Result<ResultSet> {
self.client.query_with_params(sql, params)
}
fn finish_inner(&mut self, command: &str) -> Result<()> {
self.client.execute(command)?;
self.client.auto_commit = true;
self.finished = true;
Ok(())
}
}
impl<'a> Drop for Transaction<'a> {
fn drop(&mut self) {
if !self.finished {
let _ = self.client.execute("ROLLBACK");
self.client.auto_commit = true;
}
}
}
impl Client {
pub fn transaction(&mut self) -> Result<Transaction<'_>> {
self.begin()?;
Ok(Transaction {
client: self,
finished: false,
})
}
}