use super::*;
use crate::ast::*;
pub struct Transaction<'a> {
pub(crate) inner: &'a dyn Queryable,
}
impl<'a> Transaction<'a> {
pub(crate) async fn new(inner: &'a dyn Queryable) -> crate::Result<Transaction<'a>> {
inner.raw_cmd("BEGIN").await?;
Ok(Self { inner })
}
pub async fn commit(&self) -> crate::Result<()> {
self.inner.raw_cmd("COMMIT").await?;
Ok(())
}
pub async fn rollback(&self) -> crate::Result<()> {
self.inner.raw_cmd("ROLLBACK").await?;
Ok(())
}
}
impl<'a> Queryable for Transaction<'a> {
fn execute<'b>(&'b self, q: Query<'b>) -> DBIO<'b, Option<Id>> {
self.inner.execute(q)
}
fn query<'b>(&'b self, q: Query<'b>) -> DBIO<'b, ResultSet> {
self.inner.query(q)
}
fn query_raw<'b>(&'b self, sql: &'b str, params: &'b [ParameterizedValue]) -> DBIO<'b, ResultSet> {
self.inner.query_raw(sql, params)
}
fn execute_raw<'b>(&'b self, sql: &'b str, params: &'b [ParameterizedValue]) -> DBIO<'b, u64> {
self.inner.execute_raw(sql, params)
}
fn raw_cmd<'b>(&'b self, cmd: &'b str) -> DBIO<'b, ()> {
self.inner.raw_cmd(cmd)
}
}