meta: Metadata,
block: BlockBuilder,
index: BlockBuilder,
+ offset: usize,
written: usize,
last_key: Vec<u8>,
}
meta: Default::default(),
block: BlockBuilder::default(),
index: BlockBuilder::default(),
+ offset: 0,
written: 0,
last_key: Vec::new(),
}
pub fn add(&mut self, e: Entry) -> Result<()> {
let est = e.key.len() + e.value.len() + 15;
if self.block.len() + est >= self.blocksize {
- let mut off_buf: [u8; 10] = Default::default();
- let offlen = self.written.encode_var(&mut off_buf);
bytesep(&mut self.last_key, e.key.as_slice());
- self.index.add(self.last_key.as_slice(), &off_buf[..offlen]);
self.write_block()?;
}
self.meta.add_entry(e.key.len(), e.value.len());
}
fn write_block(&mut self) -> Result<()> {
+ // update index entry
+ let mut off_buf: [u8; 10] = Default::default();
+ let offlen = self.offset.encode_var(&mut off_buf);
+ self.offset = self.written;
+ self.index.add(self.last_key.as_slice(), &off_buf[..offlen]);
+
+ // write block
let b = self.block.as_slice();
let cb = self.comp.compress(b)?;
self.written += self.out.write_varint(cb.len())?;