#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum TxIsolationLevel {
ReadUncommitted,
#[default]
ReadCommitted,
RepeatableRead,
Serializable,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum TxAccessMode {
ReadOnly,
#[default]
ReadWrite,
}
#[derive(Debug, Clone, Default)]
pub struct TxConfig {
pub isolation: Option<TxIsolationLevel>,
pub access_mode: Option<TxAccessMode>,
}
impl TxConfig {
#[must_use]
pub fn with_isolation(isolation: TxIsolationLevel) -> Self {
Self {
isolation: Some(isolation),
access_mode: None,
}
}
#[must_use]
pub fn read_only() -> Self {
Self {
isolation: None,
access_mode: Some(TxAccessMode::ReadOnly),
}
}
#[must_use]
pub fn serializable() -> Self {
Self {
isolation: Some(TxIsolationLevel::Serializable),
access_mode: None,
}
}
}
use sea_orm::{AccessMode, IsolationLevel};
impl From<TxIsolationLevel> for IsolationLevel {
fn from(level: TxIsolationLevel) -> Self {
match level {
TxIsolationLevel::ReadUncommitted => IsolationLevel::ReadUncommitted,
TxIsolationLevel::ReadCommitted => IsolationLevel::ReadCommitted,
TxIsolationLevel::RepeatableRead => IsolationLevel::RepeatableRead,
TxIsolationLevel::Serializable => IsolationLevel::Serializable,
}
}
}
impl From<TxAccessMode> for AccessMode {
fn from(mode: TxAccessMode) -> Self {
match mode {
TxAccessMode::ReadOnly => AccessMode::ReadOnly,
TxAccessMode::ReadWrite => AccessMode::ReadWrite,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_tx_config() {
let cfg = TxConfig::default();
assert!(cfg.isolation.is_none());
assert!(cfg.access_mode.is_none());
}
#[test]
fn test_tx_config_with_isolation() {
let cfg = TxConfig::with_isolation(TxIsolationLevel::Serializable);
assert_eq!(cfg.isolation, Some(TxIsolationLevel::Serializable));
assert!(cfg.access_mode.is_none());
}
#[test]
fn test_tx_config_read_only() {
let cfg = TxConfig::read_only();
assert!(cfg.isolation.is_none());
assert_eq!(cfg.access_mode, Some(TxAccessMode::ReadOnly));
}
#[test]
fn test_tx_config_serializable() {
let cfg = TxConfig::serializable();
assert_eq!(cfg.isolation, Some(TxIsolationLevel::Serializable));
assert!(cfg.access_mode.is_none());
}
#[test]
fn test_isolation_level_conversion() {
assert!(matches!(
IsolationLevel::from(TxIsolationLevel::ReadUncommitted),
IsolationLevel::ReadUncommitted
));
assert!(matches!(
IsolationLevel::from(TxIsolationLevel::ReadCommitted),
IsolationLevel::ReadCommitted
));
assert!(matches!(
IsolationLevel::from(TxIsolationLevel::RepeatableRead),
IsolationLevel::RepeatableRead
));
assert!(matches!(
IsolationLevel::from(TxIsolationLevel::Serializable),
IsolationLevel::Serializable
));
}
#[test]
fn test_access_mode_conversion() {
assert!(matches!(
AccessMode::from(TxAccessMode::ReadOnly),
AccessMode::ReadOnly
));
assert!(matches!(
AccessMode::from(TxAccessMode::ReadWrite),
AccessMode::ReadWrite
));
}
}