use crate::database::manifest::ManifestRec;
use std::{
fs::{File, OpenOptions},
io::{self, Write},
path::Path,
};
pub struct ManifestWriter {
file: File,
pub seq: u64,
}
impl ManifestWriter {
pub fn open(path: &Path, start_seq: u64) -> io::Result<Self> {
let f = OpenOptions::new()
.create(true)
.append(true)
.read(true)
.open(path)?;
Ok(Self {
file: f,
seq: start_seq,
})
}
pub fn append(&mut self, mut rec: ManifestRec) -> io::Result<u64> {
self.seq += 1;
set_seq(&mut rec, self.seq);
let mut buf = Vec::new();
rec.encode(&mut buf)?;
let crc = crc32fast::hash(&buf);
self.file.write_all(&buf)?;
self.file.write_all(&crc.to_le_bytes())?;
self.file.flush()?;
Ok(self.seq)
}
pub fn fsync(&self) -> io::Result<()> {
self.file.sync_all()
}
}
fn set_seq(rec: &mut ManifestRec, seq: u64) {
match rec {
ManifestRec::CreateTree { seq: s, .. } => *s = seq,
ManifestRec::RenameTree { seq: s, .. } => *s = seq,
ManifestRec::DeleteTree { seq: s, .. } => *s = seq,
}
}