diff options
| author | Jan Tuomi <jan@jantuomi.fi> | 2025-01-17 12:34:41 +0200 |
|---|---|---|
| committer | Jan Tuomi <jan@jantuomi.fi> | 2025-01-17 12:34:41 +0200 |
| commit | be5fcde4989ac883201a1895be519f63fa6e6dd4 (patch) | |
| tree | 11f20d824fb573449908756d4ec7fb50615eda91 /log_db/src/log_reader_reverse.rs | |
| parent | 14b77c5cdfdcb1112deeacba010879037b456020 (diff) | |
Refactor interfaces to use more moves, remove log_reader_reverse
Diffstat (limited to 'log_db/src/log_reader_reverse.rs')
| -rw-r--r-- | log_db/src/log_reader_reverse.rs | 118 |
1 files changed, 0 insertions, 118 deletions
diff --git a/log_db/src/log_reader_reverse.rs b/log_db/src/log_reader_reverse.rs deleted file mode 100644 index ef2b0dc..0000000 --- a/log_db/src/log_reader_reverse.rs +++ /dev/null @@ -1,118 +0,0 @@ -use super::common::*; -use super::record::*; -use std::fs::{self}; -use std::io::{self, Read, Seek}; - -pub struct ReverseLogReader { - /// The contents of the metadata file are read into this buffer in one go. - metadata_buf: Vec<u8>, - - /// The data log file that is read based on offset + length information from the metadata file. - data_reader: io::BufReader<fs::File>, - - /// The current position in metadata_buf. - metadata_pos: usize, -} - -impl ReverseLogReader { - pub fn new( - mut metadata_file: fs::File, - data_file: fs::File, - ) -> Result<ReverseLogReader, io::Error> { - let mut metadata_buf = vec![]; - metadata_file.seek(io::SeekFrom::Start(0))?; - metadata_file.read_to_end(&mut metadata_buf)?; - let len = metadata_buf.len(); - - let ret = ReverseLogReader { - metadata_buf, - data_reader: io::BufReader::new(data_file), - metadata_pos: len, - }; - Ok(ret) - } - - fn read_record(&mut self) -> Result<Option<Record>, io::Error> { - loop { - assert!( - (self.metadata_pos - METADATA_FILE_HEADER_SIZE) % 16 == 0, - "metadata_pos is not aligned" - ); - // Return None if we have read the entire metadata file and - // reached the end of the header - if self.metadata_pos == METADATA_FILE_HEADER_SIZE { - return Ok(None); - } - - self.metadata_pos -= 16; - let i = self.metadata_pos; // shorter alias - - // First u64 is the offset of the record in the data file, second is the length of the record - let entry_offset = u64::from_be_bytes(self.metadata_buf[i..i + 8].try_into().unwrap()); - let entry_length = - u64::from_be_bytes(self.metadata_buf[i + 8..i + 16].try_into().unwrap()); - - if entry_offset == 0 && entry_length == 0 { - // This is an unused entry in the metadata file, skip - continue; - } - - self.data_reader.seek(io::SeekFrom::Start(entry_offset))?; - let mut result_buf = vec![0; entry_length as usize]; - self.data_reader.read_exact(&mut result_buf)?; - - let record = Record::deserialize(&result_buf); - - assert!( - (self.metadata_pos - METADATA_FILE_HEADER_SIZE) % 16 == 0, - "metadata_pos is not aligned" - ); - - return Ok(Some(record)); - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use std::path::Path; - - #[test] - fn test_reverse_log_reader_fixture_db1() { - let _ = env_logger::builder().is_test(true).try_init(); - let metadata_path = Path::new(TEST_RESOURCES_DIR).join("test_metadata_1"); - let metadata_file = fs::OpenOptions::new() - .read(true) - .open(&metadata_path) - .expect("Failed to open file"); - let data_file = fs::OpenOptions::new() - .read(true) - .open(Path::new(TEST_RESOURCES_DIR).join("test_data_1")) - .expect("Failed to open file"); - - let mut reverse_log_reader = ReverseLogReader::new(metadata_file, data_file).unwrap(); - - // There are two records in the log with "schema": Int - - let last_record = reverse_log_reader - .next() - .expect("Failed to read the last record"); - assert!(match &last_record.values[..] { - [Value::Bytes(bytes)] => bytes.len() == 256, - _ => false, - }); - - assert!(reverse_log_reader.next().is_none()); - } -} - -impl Iterator for ReverseLogReader { - type Item = Record; - - fn next(&mut self) -> Option<Self::Item> { - self.read_record().unwrap_or_else(|err| { - panic!("Error reading record: {:?}", err); - }) - } -} |
