pub mod checkpointer;
pub mod layout;
pub mod source_offsets;
#[allow(clippy::disallowed_types)] use std::collections::HashMap;
use std::path::PathBuf;
use anyhow::{Context, Result};
use crate::wal::WalPosition;
#[derive(Debug)]
pub struct CheckpointMetadata {
pub id: u64,
pub timestamp: u64,
pub wal_position: WalPosition,
pub source_offsets: HashMap<String, u64>,
pub state_size: u64,
pub watermark: Option<i64>,
}
#[derive(Debug)]
pub struct Checkpoint {
pub metadata: CheckpointMetadata,
pub path: PathBuf,
}
impl Checkpoint {
#[must_use]
pub fn metadata_path(&self) -> PathBuf {
self.path.join("metadata.rkyv")
}
#[must_use]
pub fn state_path(&self) -> PathBuf {
self.path.join("state.rkyv")
}
#[must_use]
pub fn offsets_path(&self) -> PathBuf {
self.path.join("offsets.json")
}
pub fn load_state(&self) -> Result<Vec<u8>> {
std::fs::read(self.state_path()).context("Failed to read state snapshot")
}
pub fn load_offsets(&self) -> Result<HashMap<String, u64>> {
let path = self.offsets_path();
if path.exists() {
let data = std::fs::read_to_string(&path).context("Failed to read source offsets")?;
serde_json::from_str(&data).context("Failed to parse source offsets")
} else {
Ok(HashMap::new())
}
}
}