use crate::connection::{Connection, ScalarValue};
use crate::error::Result;
#[derive(Debug)]
pub struct Transaction<'conn> {
connection: &'conn mut Connection,
completed: bool,
}
impl<'conn> Transaction<'conn> {
pub(crate) fn new(connection: &'conn mut Connection) -> Result<Self> {
connection.begin_transaction()?;
Ok(Self {
connection,
completed: false,
})
}
pub fn commit(mut self) -> Result<()> {
self.completed = true;
self.connection.commit()
}
pub fn rollback(mut self) -> Result<()> {
self.completed = true;
self.connection.rollback()
}
#[must_use]
pub fn connection(&self) -> &Connection {
self.connection
}
pub fn execute_command(&self, sql: &str) -> Result<u64> {
self.connection.execute_command(sql)
}
pub fn execute_query(&self, query: &str) -> Result<crate::Rowset<'_>> {
self.connection.execute_query(query)
}
pub fn fetch_one<Q: AsRef<str>>(&self, query: Q) -> Result<crate::Row> {
self.connection.fetch_one(query)
}
pub fn fetch_optional<Q: AsRef<str>>(&self, query: Q) -> Result<Option<crate::Row>> {
self.connection.fetch_optional(query)
}
pub fn fetch_all<Q: AsRef<str>>(&self, query: Q) -> Result<Vec<crate::Row>> {
self.connection.fetch_all(query)
}
pub fn fetch_scalar<T, Q>(&self, query: Q) -> Result<T>
where
T: ScalarValue + crate::result::RowValue,
Q: AsRef<str>,
{
self.connection.fetch_scalar(query)
}
pub fn fetch_optional_scalar<T, Q>(&self, query: Q) -> Result<Option<T>>
where
T: ScalarValue + crate::result::RowValue,
Q: AsRef<str>,
{
self.connection.fetch_optional_scalar(query)
}
pub fn query_count(&self, query: &str) -> Result<i64> {
self.connection.query_count(query)
}
}
impl Drop for Transaction<'_> {
fn drop(&mut self) {
if !self.completed {
let _ = self.connection.rollback();
}
}
}