lmdb: handle errors at iterator

This commit is contained in:
ardocrat
2026-05-17 12:36:31 +03:00
parent 418d865c01
commit fc66b73e5b
7 changed files with 72 additions and 51 deletions
+22 -24
View File
@@ -770,35 +770,33 @@ impl<F, T> Iterator for DatabaseIterator<F, T>
where
F: Fn(&[u8], &[u8]) -> Result<T, Error>,
{
type Item = T;
type Item = Result<T, Error>;
fn next(&mut self) -> Option<Self::Item> {
if let Some(k) = self.keys.iter().skip(self.skip).next() {
let v = self.db.get(&self.read, k).unwrap_or(None);
if let Some(v) = v {
return match (self.deserialize)(k, v) {
Ok(v) => {
self.skip += 1;
self.skip_keys += 1;
Some(v)
match self.db.get(&self.read, k) {
Ok(v) => {
if let Some(v) = v {
return match (self.deserialize)(k, v) {
Ok(v) => {
self.skip += 1;
self.skip_keys += 1;
Some(Ok(v))
}
Err(e) => {
error!("db iter: error deserializing: {}", e);
Some(Err(Error::from(e)))
}
};
}
Err(_) => None,
};
}
Err(e) => {
return {
error!("db iter: error read value: {}", e);
Some(Err(Error::from(e)))
}
}
}
} else if self.total_keys > self.skip_keys {
let keys = if let Ok(iter) = self.db.iter(&self.read) {
iter.move_between_keys()
.skip(self.skip_keys)
.take(10000)
.filter(|kv| kv.is_ok())
.map(|kv| kv.unwrap().0.to_vec())
.collect::<Vec<Vec<u8>>>()
} else {
vec![]
};
self.skip = 0;
self.keys = keys;
return self.next();
}
None
}