Skip to content

Commit 7c06add

Browse files
committed
feat: sstable iterator
1 parent f2f1818 commit 7c06add

3 files changed

Lines changed: 77 additions & 3 deletions

File tree

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
pub mod database;
22
mod mem_table;
33
mod sstable;
4+
mod sstable_iterator;
45
mod utils;
56
mod wal;
67
mod wal_iterator;

src/sstable.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ use crate::mem_table::MemTable;
1010
///
1111
/// A `None` value indicates the key was deleted (tombstone).
1212
pub struct SSTableEntry {
13-
key: Vec<u8>,
14-
value: Option<Vec<u8>>,
15-
timestamp: u128,
13+
pub key: Vec<u8>,
14+
pub value: Option<Vec<u8>>,
15+
pub timestamp: u128,
1616
}
1717

1818
/// SSTable is an immutable, sorted on-disk table flushed from a [`MemTable`].

src/sstable_iterator.rs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
use crate::sstable::SSTableEntry;
2+
use std::io::prelude::*;
3+
use std::{
4+
fs::{File, OpenOptions},
5+
io::{self, BufReader},
6+
path::PathBuf,
7+
};
8+
9+
/// SSTableIterator to iterate over the items in a SSTable file.
10+
pub struct SSTableIterator {
11+
reader: BufReader<File>,
12+
}
13+
14+
impl SSTableIterator {
15+
/// Creates a new SSTableIterator from a path to a SSTable file.
16+
pub fn new(path: PathBuf) -> io::Result<SSTableIterator> {
17+
let file = OpenOptions::new().read(true).open(path)?;
18+
let reader = BufReader::new(file);
19+
Ok(SSTableIterator { reader })
20+
}
21+
}
22+
23+
impl Iterator for SSTableIterator {
24+
type Item = SSTableEntry;
25+
26+
/// Gets the next entry in the SSTable file.
27+
fn next(&mut self) -> Option<Self::Item> {
28+
let mut len_buf = [0u8; size_of::<usize>()];
29+
if self.reader.read_exact(&mut len_buf).is_err() {
30+
return None;
31+
}
32+
let key_len = usize::from_le_bytes(len_buf);
33+
34+
let mut key = vec![0u8; key_len];
35+
if self.reader.read_exact(&mut key).is_err() {
36+
return None;
37+
}
38+
39+
let mut deleted_buf = [0u8; size_of::<u8>()];
40+
if self.reader.read_exact(&mut deleted_buf).is_err() {
41+
return None;
42+
}
43+
let deleted = deleted_buf[0] == 1;
44+
45+
let mut value = None;
46+
if !deleted {
47+
let mut len_buf = [0u8; size_of::<usize>()];
48+
if self.reader.read_exact(&mut len_buf).is_err() {
49+
return None;
50+
}
51+
let value_len = usize::from_le_bytes(len_buf);
52+
53+
let mut value_buf = vec![0u8; value_len];
54+
if self.reader.read_exact(&mut value_buf).is_err() {
55+
return None;
56+
}
57+
58+
value = Some(value_buf);
59+
}
60+
61+
let mut timestamp_buf = [0; size_of::<u128>()];
62+
if self.reader.read_exact(&mut timestamp_buf).is_err() {
63+
return None;
64+
}
65+
let timestamp = u128::from_le_bytes(timestamp_buf);
66+
67+
Some(SSTableEntry {
68+
key,
69+
value,
70+
timestamp,
71+
})
72+
}
73+
}

0 commit comments

Comments
 (0)