Skip to content

Commit ad66eb9

Browse files
committed
lookup load func
1 parent 3f70060 commit ad66eb9

File tree

3 files changed

+49
-2
lines changed

3 files changed

+49
-2
lines changed

src/notes/kvs/Cargo.lock

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/notes/kvs/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ log = "0.4.14"
1515
env_logger = "0.9.0"
1616
clap = "2.33.3"
1717
failure = "0.1.8"
18+
serde_json = "1.0.79"

src/notes/kvs/src/kv.rs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use super::util::HandyRwLock;
66
use crate::{KvsError, Result};
77
use indexmap::IndexMap;
8+
use serde_json::Deserializer;
89
use std::{
910
collections::{BTreeMap, HashMap},
1011
ffi::OsStr,
@@ -77,7 +78,28 @@ fn load(
7778
reader: BufReaderWithPos<File>,
7879
index: &mut BTreeMap<String, CommandPos>,
7980
) -> Result<u64> {
80-
todo!()
81+
// 确定从文件的某个位置开始读
82+
let mut pos = reader.reader.seek(SeekFrom::Start(0))?;
83+
let mut stream = Deserializer::from_reader(reader).into_iter::<Command>();
84+
let mut uncompacted = 0;
85+
while let Some(cmd) = stream.next() {
86+
let new_pos = stream.byte_offset() as u64;
87+
match cmd? {
88+
Command::Set{key, ..} => {
89+
if let Some(old_cmd) = index.insert(key, (gen, pos..new_pos).into()) {
90+
uncompacted += old_cmd.len();
91+
}
92+
},
93+
_ => {todo!()},
94+
}
95+
pos = new_pos;
96+
}
97+
Ok(uncompacted)
98+
}
99+
100+
enum Command {
101+
Set { key: String, value: String },
102+
Remove { key: String },
81103
}
82104

83105
/// 命令位置
@@ -100,7 +122,7 @@ impl From<(u64, Range<u64>)> for CommandPos {
100122
impl KVStore {
101123
fn new() -> Self {
102124
// KVStore::from_map(IndexMap::new())
103-
KVStore{
125+
KVStore {
104126
path: todo!(),
105127
readers: todo!(),
106128
inner: todo!(),

0 commit comments

Comments
 (0)