use crate::SnapshotSource;
use std::io::{self, Write};
struct CountWriter(u64);
impl Write for CountWriter {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.0 += buf.len() as u64;
Ok(buf.len())
}
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}
pub fn estimate_rewrite_size<S: SnapshotSource>(src: &S) -> u64 {
let mut w = CountWriter(crate::record::AOF2_MAGIC.len() as u64);
let mut scratch = Vec::new();
src.for_each_entry(|key, value, ttl_ms| {
if matches!(value, kevy_store::Value::Cold(_)) {
return;
}
let _ = crate::rewrite_fmt::write_value_as_commands(
&mut w,
key,
value,
ttl_ms,
crate::AofFormat::V2,
&mut scratch,
);
});
src.for_each_hash_ttl(|key, field, deadline_ms| {
let ms = deadline_ms.to_string();
let mut argv = kevy_resp::Argv::with_capacity(6, 0);
argv.push(b"HPEXPIREAT");
argv.push(key);
argv.push(ms.as_bytes());
argv.push(b"FIELDS");
argv.push(b"1");
argv.push(field);
let _ = crate::rewrite_fmt::emit(&mut w, &argv, crate::AofFormat::V2, &mut scratch);
});
w.0
}