#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum IsolationLevel {
ReadUncommitted,
ReadCommitted,
RepeatableRead,
Serializable,
}
impl IsolationLevel {
pub fn as_str(&self) -> &'static str {
match self {
IsolationLevel::ReadUncommitted => "READ UNCOMMITTED",
IsolationLevel::ReadCommitted => "READ COMMITTED",
IsolationLevel::RepeatableRead => "REPEATABLE READ",
IsolationLevel::Serializable => "SERIALIZABLE",
}
}
}
#[derive(Debug, Clone, Default)]
#[non_exhaustive]
pub struct TransactionOptions {
pub isolation_level: Option<IsolationLevel>,
pub read_only: Option<bool>,
pub deferrable: Option<bool>,
}
impl TransactionOptions {
pub fn new() -> Self {
Self::default()
}
pub fn isolation_level(mut self, level: IsolationLevel) -> Self {
self.isolation_level = Some(level);
self
}
pub fn read_only(mut self, read_only: bool) -> Self {
self.read_only = Some(read_only);
self
}
pub fn deferrable(mut self, deferrable: bool) -> Self {
self.deferrable = Some(deferrable);
self
}
pub fn to_begin_sql(&self) -> String {
let mut sql = String::from("BEGIN");
if let Some(level) = self.isolation_level {
sql.push_str(" ISOLATION LEVEL ");
sql.push_str(level.as_str());
}
if let Some(read_only) = self.read_only {
sql.push_str(if read_only {
" READ ONLY"
} else {
" READ WRITE"
});
}
if self.deferrable == Some(true) {
sql.push_str(" DEFERRABLE");
}
sql
}
}