use crate::error::Result;
use crate::wal::Wal;
pub struct TxnWriter {
wal: Wal,
stream: String,
buffer: Vec<Vec<u8>>,
}
impl TxnWriter {
pub(crate) fn new(wal: Wal, stream: String) -> Self {
Self {
wal,
stream,
buffer: Vec::new(),
}
}
pub fn add(&mut self, data: impl Into<Vec<u8>>) {
self.buffer.push(data.into());
}
pub fn commit(mut self) -> Result<std::ops::Range<u64>> {
if self.buffer.is_empty() {
return Ok(0..0);
}
let refs: Vec<&[u8]> = self.buffer.iter().map(|v| v.as_slice()).collect();
let range = self.wal.append_batch(&self.stream, &refs)?;
self.buffer.clear();
Ok(range)
}
}