diff --git a/src/database/abstraction.rs b/src/database/abstraction.rs index 91bcff9..bfd7614 100644 --- a/src/database/abstraction.rs +++ b/src/database/abstraction.rs @@ -473,18 +473,22 @@ impl Tree for PersyTree { } fn iter<'a>(&'a self) -> Box, Box<[u8]>)> + Send + Sync + 'a> { - let result = Box::new( - self.persy - .range::(&self.name, ..) - .unwrap() - .filter_map(|(k, v)| { + let iter = self.persy.range::(&self.name, ..); + match iter { + Ok(iter) => { + let result = Box::new(iter.filter_map(|(k, v)| { v.into_iter() .map(|val| (k.0.to_owned().into(), val.0.to_owned().into())) .next() - }), - ); + })); - self.write_cache.read().unwrap().iter(&self.name, result) + self.write_cache.read().unwrap().iter(&self.name, result) + } + Err(e) => { + log::warn!("error iterating {:?}", e); + Box::new(std::iter::empty()) + } + } } fn iter_from<'a>( @@ -492,30 +496,36 @@ impl Tree for PersyTree { from: &[u8], backwards: bool, ) -> Box, Box<[u8]>)> + 'a> { - let iter = if backwards { + let range = if backwards { self.persy .range::(&self.name, ..ByteVec(from.to_owned())) - .unwrap() } else { self.persy .range::(&self.name, ByteVec(from.to_owned())..) - .unwrap() - }; - let map = iter.filter_map(|(k, v)| { - v.into_iter() - .map(|val| (k.0.to_owned().into(), val.0.to_owned().into())) - .next() - }); - let result: Box, Box<[u8]>)>> = if backwards { - Box::new(map.rev()) - } else { - Box::new(map) }; - - self.write_cache - .read() - .unwrap() - .iter_from(&self.name, from, backwards, result) + match range { + Ok(iter) => { + let map = iter.filter_map(|(k, v)| { + v.into_iter() + .map(|val| (k.0.to_owned().into(), val.0.to_owned().into())) + .next() + }); + let result: Box, Box<[u8]>)>> = if backwards { + Box::new(map.rev()) + } else { + Box::new(map) + }; + + self.write_cache + .read() + .unwrap() + .iter_from(&self.name, from, backwards, result) + } + Err(e) => { + log::warn!("error iterating with prefix {:?}", e); + Box::new(std::iter::empty()) + } + } } fn increment(&self, key: &[u8]) -> Result> { @@ -530,23 +540,32 @@ impl Tree for PersyTree { prefix: Vec, ) -> Box, Box<[u8]>)> + Send + 'a> { let range_prefix = ByteVec(prefix.to_owned()); - let owned_prefix = prefix.clone(); - let result = Box::new( - self.persy - .range::(&self.name, range_prefix..) - .unwrap() - .take_while(move |(k, _)| k.0.starts_with(&owned_prefix)) - .filter_map(|(k, v)| { - v.into_iter() - .map(|val| (k.0.to_owned().into(), val.0.to_owned().into())) - .next() - }), - ); - - self.write_cache - .read() - .unwrap() - .scan_prefix(&self.name, prefix, result) + let range = self + .persy + .range::(&self.name, range_prefix..); + + match range { + Ok(iter) => { + let owned_prefix = prefix.clone(); + let result = Box::new( + iter.take_while(move |(k, _)| k.0.starts_with(&owned_prefix)) + .filter_map(|(k, v)| { + v.into_iter() + .map(|val| (k.0.to_owned().into(), val.0.to_owned().into())) + .next() + }), + ); + + self.write_cache + .read() + .unwrap() + .scan_prefix(&self.name, prefix, result) + } + Err(e) => { + log::warn!("error scanning prefix {:?}", e); + Box::new(std::iter::empty()) + } + } } fn watch_prefix<'a>(&'a self, prefix: &[u8]) -> Pin + Send + 'a>> {