use std::sync::Arc;
use crate::control::security::catalog::SystemCatalog;
pub trait DatabaseHwmPersist: Send + Sync {
fn checkpoint(&self, hwm: u64) -> crate::Result<()>;
fn load(&self) -> crate::Result<u64>;
}
pub struct SystemCatalogDatabaseHwm {
catalog: Arc<SystemCatalog>,
}
impl SystemCatalogDatabaseHwm {
pub fn new(catalog: Arc<SystemCatalog>) -> Self {
Self { catalog }
}
}
impl DatabaseHwmPersist for SystemCatalogDatabaseHwm {
fn checkpoint(&self, hwm: u64) -> crate::Result<()> {
self.catalog.put_database_hwm(hwm)
}
fn load(&self) -> crate::Result<u64> {
self.catalog.get_database_hwm()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn handle_roundtrip_via_catalog() {
let dir = tempfile::tempdir().unwrap();
let catalog = Arc::new(SystemCatalog::open(&dir.path().join("system.redb")).unwrap());
let p = SystemCatalogDatabaseHwm::new(catalog);
assert_eq!(p.load().unwrap(), 0);
p.checkpoint(1024).unwrap();
assert_eq!(p.load().unwrap(), 1024);
}
}