#[macro_export]
macro_rules! in_transaction {
($pool:expr, $err:ty, |$tx:ident| $body:expr) => {
async {
use $crate::Transaction as _;
use $crate::Transactional as _;
let __rdbi_tx = match $pool.begin_with($crate::IsolationLevel::default()).await {
Ok(tx) => tx,
Err(e) => return Err(<$err as ::std::convert::From<$crate::Error>>::from(e)),
};
let $tx = &__rdbi_tx;
let __rdbi_result: ::std::result::Result<_, $err> = (async { $body }).await;
match __rdbi_result {
Ok(v) => match __rdbi_tx.commit().await {
Ok(()) => Ok(v),
Err(e) => Err(<$err as ::std::convert::From<$crate::Error>>::from(e)),
},
Err(e) => {
let _ = __rdbi_tx.rollback().await;
Err(e)
}
}
}
};
($pool:expr, |$tx:ident| $body:expr) => {
async {
use $crate::Transaction as _;
use $crate::Transactional as _;
let __rdbi_tx = match $pool.begin_with($crate::IsolationLevel::default()).await {
Ok(tx) => tx,
Err(e) => return Err(e),
};
let $tx = &__rdbi_tx;
let __rdbi_result: $crate::Result<_> = (async { $body }).await;
match __rdbi_result {
Ok(v) => match __rdbi_tx.commit().await {
Ok(()) => Ok(v),
Err(e) => Err(e),
},
Err(e) => {
let _ = __rdbi_tx.rollback().await;
Err(e)
}
}
}
};
}
#[macro_export]
macro_rules! in_transaction_with {
($pool:expr, $level:expr, $err:ty, |$tx:ident| $body:expr) => {
async {
use $crate::Transaction as _;
use $crate::Transactional as _;
let __rdbi_tx = match $pool.begin_with($level).await {
Ok(tx) => tx,
Err(e) => return Err(<$err as ::std::convert::From<$crate::Error>>::from(e)),
};
let $tx = &__rdbi_tx;
let __rdbi_result: ::std::result::Result<_, $err> = (async { $body }).await;
match __rdbi_result {
Ok(v) => match __rdbi_tx.commit().await {
Ok(()) => Ok(v),
Err(e) => Err(<$err as ::std::convert::From<$crate::Error>>::from(e)),
},
Err(e) => {
let _ = __rdbi_tx.rollback().await;
Err(e)
}
}
}
};
($pool:expr, $level:expr, |$tx:ident| $body:expr) => {
async {
use $crate::Transaction as _;
use $crate::Transactional as _;
let __rdbi_tx = match $pool.begin_with($level).await {
Ok(tx) => tx,
Err(e) => return Err(e),
};
let $tx = &__rdbi_tx;
let __rdbi_result: $crate::Result<_> = (async { $body }).await;
match __rdbi_result {
Ok(v) => match __rdbi_tx.commit().await {
Ok(()) => Ok(v),
Err(e) => Err(e),
},
Err(e) => {
let _ = __rdbi_tx.rollback().await;
Err(e)
}
}
}
};
}
#[macro_export]
macro_rules! with_connection {
($pool:expr, $err:ty, |$conn:ident| $body:expr) => {
async {
let $conn = &$pool;
let __rdbi_result: ::std::result::Result<_, $err> = (async { $body }).await;
__rdbi_result
}
};
($pool:expr, |$conn:ident| $body:expr) => {
async {
let $conn = &$pool;
let __rdbi_result: $crate::Result<_> = (async { $body }).await;
__rdbi_result
}
};
}