]> git.mikk.net Git - mtbl-rs/commitdiff
Give ReaderIter a Reader Clone for flexibility
authorChris Mikkelson <cmikk@fsi.io>
Wed, 7 Aug 2024 22:13:17 +0000 (16:13 -0600)
committerChris Mikkelson <cmikk@fsi.io>
Wed, 7 Aug 2024 22:13:17 +0000 (16:13 -0600)
src/metadata.rs
src/reader/block.rs
src/reader/mod.rs
tests/rwtest.rs

index df08ce9375f296864836878e83db820c7da501a0..ea5ee1636a7befc0460584e8b5889a8fd879bc7e 100644 (file)
@@ -20,7 +20,7 @@ use std::mem::size_of;
 
 const MTBL_MAGIC: u32 = 0x4D54424C;
 
-#[derive(Default)]
+#[derive(Default, Clone)]
 pub(crate) struct Metadata {
     pub(crate) index_block_offset: usize,
     pub(crate) data_block_size: usize,
index b2bf25c53ebf9280847b6d05937bf2329bfe23cc..72d5558e10fd6f7fd3750bb637871c3cfc953060 100644 (file)
@@ -45,12 +45,14 @@ pub(crate) struct Block<D: AsRef<[u8]>> {
 
 impl<D: AsRef<[u8]>> Block<D> {
     pub(crate) fn new(data: DataSlice<D>) -> Result<Self> {
+        println!("Block::new( {:?} )", data.as_ref());
         if data.as_ref().len() < size_of::<u32>() {
             return Err("block data too short".into());
         }
         let rc_off = data.as_ref().len() - size_of::<u32>();
 
         let restart_count = u32::from_be_bytes(data.as_ref()[rc_off..].try_into()?) as usize;
+        println!("restart_count = {}", restart_count);
 
         // try 32-bit restarts
         if (restart_count * size_of::<u32>()) > rc_off {
index 4e1178719d2fb8aba89fdb8c4bae2934fca9f934..939ee6b29b21b3331ff0f8f6fe700b5eca986c26 100644 (file)
@@ -2,7 +2,7 @@ use crate::metadata::Metadata;
 use crate::source::{DefaultSource, IterSource};
 use crate::Entry;
 use crate::Iter;
-use integer_encoding::{FixedInt, VarInt};
+use integer_encoding::VarInt;
 pub(crate) mod block;
 use std::io::{Cursor, Seek, SeekFrom};
 use std::sync::Arc;
@@ -15,6 +15,16 @@ pub(crate) struct DataSlice<D: AsRef<[u8]>> {
     len: usize,
 }
 
+impl<D: AsRef<[u8]>> Clone for DataSlice<D> {
+    fn clone(&self) -> Self {
+        Self {
+            data: self.data.clone(),
+            off: self.off,
+            len: self.len,
+        }
+    }
+}
+
 impl<D: AsRef<[u8]>> AsRef<[u8]> for DataSlice<D> {
     fn as_ref(&self) -> &[u8] {
         &((*self.data).as_ref())[self.off..self.off + self.len]
@@ -59,6 +69,15 @@ pub struct Reader<D: AsRef<[u8]>> {
     metadata: Metadata,
 }
 
+impl<D: AsRef<[u8]>> Clone for Reader<D> {
+    fn clone(&self) -> Self {
+        Self {
+            data: self.data.clone(),
+            metadata: self.metadata.clone(),
+        }
+    }
+}
+
 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..]);
@@ -80,25 +99,14 @@ impl<D: AsRef<[u8]>> Reader<D> {
     }
 }
 
-pub struct ReaderIter<'r, D: AsRef<[u8]>> {
-    reader: &'r Reader<D>,
+pub struct ReaderIter<D: AsRef<[u8]>> {
+    reader: Reader<D>,
     next_offset: usize,
     index_iter: block::BlockIter<D>,
     data_iter: Option<block::BlockIter<D>>,
 }
 
-impl<D: AsRef<[u8]>> Reader<D> {
-    pub fn iter(&self) -> ReaderIter<'_, D> {
-        ReaderIter {
-            reader: self,
-            next_offset: 0,
-            index_iter: self.index_iter(),
-            data_iter: None,
-        }
-    }
-}
-
-impl<'r, D: AsRef<[u8]>> ReaderIter<'r, D> {
+impl<D: AsRef<[u8]>> ReaderIter<D> {
     fn next_block(&mut self) -> Option<()> {
         if self.next_offset >= self.reader.metadata.index_block_offset {
             return None;
@@ -107,6 +115,10 @@ impl<'r, D: AsRef<[u8]>> ReaderIter<'r, D> {
             .expect("bad block size");
         let crc_off = self.next_offset + len_size;
         let data_off = crc_off + std::mem::size_of::<u32>();
+        println!(
+            "Block: {};{}, data_off = {}",
+            self.next_offset, size, data_off
+        );
         let _crc = u32::from_be_bytes(
             self.reader.data.as_ref()[crc_off..crc_off + 4]
                 .try_into()
@@ -122,7 +134,7 @@ impl<'r, D: AsRef<[u8]>> ReaderIter<'r, D> {
     }
 }
 
-impl<'r, D: AsRef<[u8]>> Iterator for ReaderIter<'r, D> {
+impl<D: AsRef<[u8]>> Iterator for ReaderIter<D> {
     type Item = Entry;
     fn next(&mut self) -> Option<Self::Item> {
         if self.data_iter.is_none() {
@@ -140,7 +152,7 @@ impl<'r, D: AsRef<[u8]>> Iterator for ReaderIter<'r, D> {
     }
 }
 
-impl<'r, D: AsRef<[u8]>> Iter for ReaderIter<'r, D> {
+impl<D: AsRef<[u8]>> Iter for ReaderIter<D> {
     fn seek(&mut self, key: &[u8]) {
         // TODO: detect and skip unneeded seek in iter.
         self.index_iter.seek(key);
@@ -154,11 +166,11 @@ impl<'r, D: AsRef<[u8]>> Iter for ReaderIter<'r, D> {
     }
 }
 
-impl<'r, D: AsRef<[u8]>> IterSource for &'r Reader<D> {
-    type It = ReaderIter<'r, D>;
+impl<D: AsRef<[u8]>> IterSource for Reader<D> {
+    type It = ReaderIter<D>;
     fn iter(&self) -> Self::It {
         ReaderIter {
-            reader: self,
+            reader: self.clone(),
             next_offset: 0,
             index_iter: self.index_iter(),
             data_iter: None,
@@ -166,4 +178,4 @@ impl<'r, D: AsRef<[u8]>> IterSource for &'r Reader<D> {
     }
 }
 
-impl<'r, D: AsRef<[u8]>> DefaultSource for &'r Reader<D> {}
+impl<D: AsRef<[u8]>> DefaultSource for Reader<D> {}
index a378f21039bc85dacc55fa131310b63a0bc39e9c..6dde2ce0a7e681c83c3d5e98b4a59877c1c0d54a 100644 (file)
@@ -1,5 +1,6 @@
 use mtbl::entry::Entry;
 use mtbl::reader::Reader;
+use mtbl::source::IterSource;
 use mtbl::writer::Writer;
 
 #[test]
@@ -16,7 +17,6 @@ fn test_write_readback() {
     }
 
     assert!(store.len() > 512);
-    let r = Reader::new(&store);
-    let ri = r.iter();
+    let ri = Reader::new(&store).iter();
     assert_eq!(ri.collect::<Vec<Entry>>(), reference);
 }