use crate::backend::Backend;
use crate::connection::Connection;
use crate::error::SqlError;
fn begin_sql_for(backend: Backend) -> Option<&'static str> {
match backend {
#[cfg(feature = "mssql")]
Backend::MsSql => Some("BEGIN TRANSACTION"),
#[cfg(feature = "oracle")]
Backend::Oracle => None,
_ => Some("BEGIN"),
}
}
fn commit_sql_for(backend: Backend) -> &'static str {
match backend {
#[cfg(feature = "mssql")]
Backend::MsSql => "COMMIT TRANSACTION",
_ => "COMMIT",
}
}
fn rollback_sql_for(backend: Backend) -> &'static str {
match backend {
#[cfg(feature = "mssql")]
Backend::MsSql => "ROLLBACK TRANSACTION",
_ => "ROLLBACK",
}
}
#[must_use]
pub fn begin_transaction(conn: &mut dyn Connection, backend: Backend) -> bool {
match begin_sql_for(backend) {
None => true,
Some(stmt) => conn.execute(stmt).is_ok(),
}
}
#[must_use = "commit_transaction returns a SqlError on wire failure that the caller must surface"]
pub fn commit_transaction(conn: &mut dyn Connection, backend: Backend) -> Result<(), SqlError> {
conn.execute(commit_sql_for(backend)).map(|_| ())
}
#[must_use = "rollback_transaction returns a SqlError on wire failure; best-effort callers should still `let _ =`"]
pub fn rollback_transaction(conn: &mut dyn Connection, backend: Backend) -> Result<(), SqlError> {
conn.execute(rollback_sql_for(backend)).map(|_| ())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn statements_per_backend() {
#[cfg(feature = "postgres")]
{
let b = Backend::Postgres;
assert_eq!(begin_sql_for(b), Some("BEGIN"));
assert_eq!(commit_sql_for(b), "COMMIT");
assert_eq!(rollback_sql_for(b), "ROLLBACK");
}
#[cfg(feature = "mysql")]
{
let b = Backend::MySql;
assert_eq!(begin_sql_for(b), Some("BEGIN"));
assert_eq!(commit_sql_for(b), "COMMIT");
assert_eq!(rollback_sql_for(b), "ROLLBACK");
}
#[cfg(feature = "sqlite")]
{
let b = Backend::Sqlite;
assert_eq!(begin_sql_for(b), Some("BEGIN"));
assert_eq!(commit_sql_for(b), "COMMIT");
assert_eq!(rollback_sql_for(b), "ROLLBACK");
}
#[cfg(feature = "mssql")]
{
assert_eq!(begin_sql_for(Backend::MsSql), Some("BEGIN TRANSACTION"));
assert_eq!(commit_sql_for(Backend::MsSql), "COMMIT TRANSACTION");
assert_eq!(rollback_sql_for(Backend::MsSql), "ROLLBACK TRANSACTION");
}
#[cfg(feature = "oracle")]
{
assert_eq!(begin_sql_for(Backend::Oracle), None);
assert_eq!(commit_sql_for(Backend::Oracle), "COMMIT");
assert_eq!(rollback_sql_for(Backend::Oracle), "ROLLBACK");
}
}
}