]> git.mikk.net Git - mtbl-rs/commitdiff
Write index block with length, crc
authorChris Mikkelson <cmikk@fsi.io>
Mon, 12 Aug 2024 19:21:14 +0000 (14:21 -0500)
committerChris Mikkelson <cmikk@fsi.io>
Mon, 12 Aug 2024 19:21:14 +0000 (14:21 -0500)
Remove dead code

src/reader/block.rs
src/reader/mod.rs
src/writer/mod.rs

index bf130fb03a76cafb6fbbc120a9b9f0c2f72b837c..b770b0501e8234af0cf01538421a8df630f28de3 100644 (file)
@@ -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<D: AsRef<[u8]>> BlockIter<D> {
     fn seek_restart(&mut self, ridx: usize) -> Option<&[u8]> {
         self.off = self.block.restart(ridx).ok()?;
index 6eb739fb79ff988eaa37ab9256579166db4407c8..cebbd8a8824a295ccfb0d97699d748285dcc6878 100644 (file)
@@ -51,10 +51,6 @@ impl<D: AsRef<[u8]>> DataSlice<D> {
             len,
         }
     }
-
-    fn len(&self) -> usize {
-        self.len
-    }
 }
 
 #[test]
@@ -88,8 +84,7 @@ pub fn from_file(fname: impl AsRef<Path>) -> Reader<Mmap> {
 
 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),
@@ -98,12 +93,15 @@ impl<D: AsRef<[u8]>> Reader<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()
     }
 }
 
index 58629147feaa84c8c96bf827becc7ca916936712..2da054a858e4288ba7c39b158b9c49bee1e680e8 100644 (file)
@@ -150,10 +150,13 @@ impl<W: std::io::Write> Writer<W> {
         // 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<W: std::io::Write> Writer<W> {
             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)
     }
 }