Browse Source

add error management in the implementation

merge-requests/107/head
Tglman 5 years ago
parent
commit
01af1b0086
  1. 105
      src/database/abstraction.rs

105
src/database/abstraction.rs

@ -473,18 +473,22 @@ impl Tree for PersyTree { @@ -473,18 +473,22 @@ impl Tree for PersyTree {
}
fn iter<'a>(&'a self) -> Box<dyn Iterator<Item = (Box<[u8]>, Box<[u8]>)> + Send + Sync + 'a> {
let result = Box::new(
self.persy
.range::<ByteVec, ByteVec, _>(&self.name, ..)
.unwrap()
.filter_map(|(k, v)| {
let iter = self.persy.range::<ByteVec, ByteVec, _>(&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 { @@ -492,30 +496,36 @@ impl Tree for PersyTree {
from: &[u8],
backwards: bool,
) -> Box<dyn Iterator<Item = (Box<[u8]>, Box<[u8]>)> + 'a> {
let iter = if backwards {
let range = if backwards {
self.persy
.range::<ByteVec, ByteVec, _>(&self.name, ..ByteVec(from.to_owned()))
.unwrap()
} else {
self.persy
.range::<ByteVec, ByteVec, _>(&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<dyn Iterator<Item = (Box<[u8]>, 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<dyn Iterator<Item = (Box<[u8]>, 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<Vec<u8>> {
@ -530,23 +540,32 @@ impl Tree for PersyTree { @@ -530,23 +540,32 @@ impl Tree for PersyTree {
prefix: Vec<u8>,
) -> Box<dyn Iterator<Item = (Box<[u8]>, Box<[u8]>)> + Send + 'a> {
let range_prefix = ByteVec(prefix.to_owned());
let owned_prefix = prefix.clone();
let result = Box::new(
self.persy
.range::<ByteVec, ByteVec, _>(&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::<ByteVec, ByteVec, _>(&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<Box<dyn Future<Output = ()> + Send + 'a>> {

Loading…
Cancel
Save