pub mod clock;
pub mod log;
pub mod registry;
pub mod store;
pub mod transaction;
pub use clock::MvccClock;
pub use log::{MVCC_BODY_MAGIC, MVCC_FRAME_MARKER, MvccCommitBatch, MvccLogRecord};
pub use registry::{ActiveTxRegistry, TxHandle, TxId, TxTimestampOrId};
pub use store::{MvStore, MvStoreError, RowID, RowVersion, RowVersionChain, VersionPayload};
pub use transaction::ConcurrentTx;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum JournalMode {
#[default]
Wal,
Mvcc,
}
impl JournalMode {
pub fn from_str_lossless(s: &str) -> Option<Self> {
match s.to_ascii_lowercase().as_str() {
"wal" => Some(Self::Wal),
"mvcc" => Some(Self::Mvcc),
_ => None,
}
}
pub fn as_str(&self) -> &'static str {
match self {
Self::Wal => "wal",
Self::Mvcc => "mvcc",
}
}
}
impl std::fmt::Display for JournalMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn journal_mode_default_is_wal() {
assert_eq!(JournalMode::default(), JournalMode::Wal);
}
#[test]
fn journal_mode_round_trips_through_str() {
assert_eq!(
JournalMode::from_str_lossless("wal"),
Some(JournalMode::Wal)
);
assert_eq!(
JournalMode::from_str_lossless("WAL"),
Some(JournalMode::Wal)
);
assert_eq!(
JournalMode::from_str_lossless("Mvcc"),
Some(JournalMode::Mvcc)
);
assert_eq!(JournalMode::from_str_lossless("delete"), None);
assert_eq!(JournalMode::from_str_lossless(""), None);
}
#[test]
fn journal_mode_displays_lowercase() {
assert_eq!(format!("{}", JournalMode::Wal), "wal");
assert_eq!(format!("{}", JournalMode::Mvcc), "mvcc");
}
}