Skip to content

Commit f59294c

Browse files
committed
added remove feature and safely add.
1 parent 7d1df34 commit f59294c

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

p7_persistent_data/blobfile/src/blobstore.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,13 @@ impl BlobStore {
9292
Ok(())
9393
}
9494

95+
fn insert<K: Serialize, V: Serialize>(&mut self, k: K, v: V) -> Result<(), BlobError> {
96+
97+
self.remove(&k).ok();
98+
self.insert_only(k, v)
99+
}
100+
101+
95102
fn insert_only<K: Serialize, V: Serialize>(&mut self, k: K, v: V) -> Result<(), BlobError> {
96103
let blob = Blob::from(&k, &v).unwrap();
97104
if blob.len() > self.block_size {
@@ -114,6 +121,7 @@ impl BlobStore {
114121
// add pointer immediately after data ends
115122
write_u64(f, 0)?;
116123
write_u64(f, (vlen - blob.len())-16)?;
124+
self.inc_elems(1)?;
117125
return Ok(());
118126
}
119127
pos = f.seek(SeekFrom::Start(pos + 16 + klen + vlen))?;
@@ -149,7 +157,43 @@ impl BlobStore {
149157

150158
}
151159

160+
pub fn remove<K: Serialize>(&mut self, k: &K) -> Result<(), BlobError> {
161+
let s_blob = Blob::from(k, &0)?;
162+
let bucket = s_blob.k_hash(self.hseed) % self.nblocks;
163+
let b_start = self.b_start(bucket);
164+
let b_end = self.b_start(bucket+1);
165+
166+
let f = &mut self.file;
167+
let mut pos = f.seek(SeekFrom::Start(b_start))?;
168+
loop {
169+
if pos >= b_end {
170+
return Ok(());
171+
}
172+
173+
let b = Blob::read(f)?;
174+
if b.key_match(&s_blob){
175+
let l = b.len();
176+
if pos + l < b_end {
177+
if read_u64(f)? == 0 {
178+
let nlen = read_u64(f)?;
179+
f.seek(SeekFrom::Start(pos))?;
180+
write_u64(f, 0)?;
181+
write_u64(f, l + nlen + 16)?;
182+
return Ok(());
183+
}
184+
}
185+
f.seek(SeekFrom::Start(pos))?;
186+
write_u64(f, 0)?;
187+
write_u64(f, l -16)?;
188+
self.inc_elems(-1);
189+
return Ok(());
190+
191+
}
192+
193+
pos = f.seek(SeekFrom::Start(pos + b.len()))?;
152194

195+
}
196+
}
153197

154198
}
155199

@@ -178,5 +222,9 @@ mod test {
178222
let mut b3 = BlobStore::open(fs).unwrap();
179223
assert_eq!(b3.get(&"green").unwrap().get_v::<String>().unwrap(), "wats up, im a green".to_string());
180224

225+
b3.remove(&"green").ok();
226+
assert!(b3.get(&"green").is_err());
227+
assert!(b3.get(&"fish").is_ok());
228+
181229
}
182230
}
Binary file not shown.

0 commit comments

Comments
 (0)