use sqlx_core::{sql_str::SqlStr, transaction::TransactionManager};
use crate::{
connection::websocket::future::{Commit, Rollback, WebSocketFuture},
database::Exasol,
error::ExaProtocolError,
ExaConnection, SqlxResult,
};
#[derive(Debug, Clone, Copy)]
pub struct ExaTransactionManager;
impl TransactionManager for ExaTransactionManager {
type Database = Exasol;
async fn begin(conn: &mut ExaConnection, _: Option<SqlStr>) -> SqlxResult<()> {
if conn.attributes().open_transaction() {
match conn.ws.pending_rollback.take() {
Some(rollback) => rollback.future(&mut conn.ws).await?,
None => return Err(ExaProtocolError::TransactionAlreadyOpen)?,
}
}
conn.attributes_mut().set_autocommit(false);
Ok(())
}
async fn commit(conn: &mut ExaConnection) -> SqlxResult<()> {
Commit::default().future(&mut conn.ws).await
}
async fn rollback(conn: &mut ExaConnection) -> SqlxResult<()> {
Rollback::default().future(&mut conn.ws).await
}
fn start_rollback(conn: &mut ExaConnection) {
conn.ws.pending_rollback = Some(Rollback::default());
}
fn get_transaction_depth(conn: &ExaConnection) -> usize {
conn.attributes().open_transaction().into()
}
}