Ok(&b[0..n])
}
-fn decode_varint(b: &[u8]) -> Result<(usize, usize)> {
- let (mut i, mut shift) = (0, 0);
- let mut ret: usize = 0;
- while i < b.len() {
- let v = (b[i] & 0x7f) as usize;
- ret |= v.checked_shl(shift).ok_or("varint-1")?;
- if b[i] & 0x80 == 0 {
- return Ok((ret, i + 1));
- }
- i += 1;
- shift += 7;
- }
- Err("varint-2".into())
-}
-
impl<D: AsRef<[u8]>> BlockIter<D> {
fn seek_restart(&mut self, ridx: usize) -> Option<&[u8]> {
self.off = self.block.restart(ridx).ok()?;
len,
}
}
-
- fn len(&self) -> usize {
- self.len
- }
}
#[test]
impl<D: AsRef<[u8]>> Reader<D> {
pub fn new(d: D) -> Self {
- let mut cur = Cursor::new(&d.as_ref()[d.as_ref().len() - 512..]);
- cur.seek(SeekFrom::End(-512)).expect("bad seek");
+ let cur = Cursor::new(&d.as_ref()[d.as_ref().len() - 512..]);
let metadata = Metadata::read_from(cur).expect("bad meta");
Self {
data: DataSlice::new(d),
}
fn index_iter(&self) -> block::BlockIter<D> {
- block::Block::new(self.data.clone_range(
- self.metadata.index_block_offset,
- self.metadata.bytes_index_block,
- ))
- .expect("bad block")
- .into_iter()
+ let mut off = self.metadata.index_block_offset;
+ let d = &self.data.as_ref()[off..];
+ let (size, len_size) = usize::decode_var(d).unwrap();
+ let prelude = len_size + std::mem::size_of::<u32>(); // TODO read and verify CRC
+ assert!(size + prelude == self.metadata.bytes_index_block);
+ off += prelude;
+ block::Block::new(self.data.clone_range(off, size))
+ .expect("bad block")
+ .into_iter()
}
}
// write block
let b = self.block.as_slice();
let cb = self.comp.compress(b)?;
+ let start = self.written;
self.written += self.out.write_varint(cb.len())?;
self.written += self.out.write_fixedint(crc32c(&cb))?;
self.out.write_all(&cb)?;
self.written += cb.len();
+
+ self.meta.add_data_block(self.written - start);
self.block.reset();
Ok(())
}
self.write_block()?;
}
let b = self.index.as_slice();
- self.meta.index_block_offset = self.written;
- self.meta.bytes_index_block = b.len();
+ let start = self.written;
+ self.written += self.out.write_varint(b.len())?;
+ self.written += self.out.write_fixedint(crc32c(&b))?;
self.out.write_all(b)?;
+ self.written += b.len();
+ self.meta.add_index_block(start, self.written - start);
self.meta.write_to(&mut self.out)
}
}