From 649f3ef7ee613bbdc86dd4c5a4e000dc59126e4e Mon Sep 17 00:00:00 2001 From: Chris Mikkelson Date: Mon, 12 Aug 2024 14:21:14 -0500 Subject: [PATCH] Write index block with length, crc Remove dead code --- src/reader/block.rs | 15 --------------- src/reader/mod.rs | 22 ++++++++++------------ src/writer/mod.rs | 10 ++++++++-- 3 files changed, 18 insertions(+), 29 deletions(-) diff --git a/src/reader/block.rs b/src/reader/block.rs index bf130fb..b770b05 100644 --- a/src/reader/block.rs +++ b/src/reader/block.rs @@ -108,21 +108,6 @@ fn get_bytes(b: &[u8], n: usize) -> Result<&[u8]> { 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> BlockIter { fn seek_restart(&mut self, ridx: usize) -> Option<&[u8]> { self.off = self.block.restart(ridx).ok()?; diff --git a/src/reader/mod.rs b/src/reader/mod.rs index 6eb739f..cebbd8a 100644 --- a/src/reader/mod.rs +++ b/src/reader/mod.rs @@ -51,10 +51,6 @@ impl> DataSlice { len, } } - - fn len(&self) -> usize { - self.len - } } #[test] @@ -88,8 +84,7 @@ pub fn from_file(fname: impl AsRef) -> Reader { impl> Reader { 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), @@ -98,12 +93,15 @@ impl> Reader { } fn index_iter(&self) -> block::BlockIter { - 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::(); // 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() } } diff --git a/src/writer/mod.rs b/src/writer/mod.rs index 5862914..2da054a 100644 --- a/src/writer/mod.rs +++ b/src/writer/mod.rs @@ -150,10 +150,13 @@ impl Writer { // 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(()) } @@ -164,9 +167,12 @@ impl Writer { 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) } } -- 2.50.1