Always return a typed structure from lmdb store (#3312)
We have a method get which returns a Vec, it's used in cases when we can't implement FromLmdbBytes or Readable on a desired type, eg when both traits and type are external for the current crate. This approach requires an extra allocation of a Vec, this PR introduces a method which accepts desirialzer as closure, which allows to desrialize in place without an intermidiate heap allocation. It's still possible to get a Vec if needed, just pass a Vec constructor to get_with.
This commit is contained in:
+10
-6
@@ -235,14 +235,15 @@ impl Store {
|
||||
}
|
||||
|
||||
/// Gets a value from the db, provided its key
|
||||
pub fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>, Error> {
|
||||
pub fn get_with<T, F>(&self, key: &[u8], f: F) -> Result<Option<T>, Error>
|
||||
where
|
||||
F: Fn(&[u8]) -> T,
|
||||
{
|
||||
let db = self.db.read();
|
||||
let txn = lmdb::ReadTransaction::new(self.env.clone())?;
|
||||
let access = txn.access();
|
||||
let res = access.get(&db.as_ref().unwrap(), key);
|
||||
res.map(|res: &[u8]| res.to_vec())
|
||||
.to_opt()
|
||||
.map_err(From::from)
|
||||
res.map(f).to_opt().map_err(From::from)
|
||||
}
|
||||
|
||||
/// Gets a `Readable` value from the db, provided its key. Encapsulates
|
||||
@@ -345,8 +346,11 @@ impl<'a> Batch<'a> {
|
||||
}
|
||||
|
||||
/// gets a value from the db, provided its key
|
||||
pub fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>, Error> {
|
||||
self.store.get(key)
|
||||
pub fn get_with<T, F>(&self, key: &[u8], f: F) -> Result<Option<T>, Error>
|
||||
where
|
||||
F: Fn(&[u8]) -> T,
|
||||
{
|
||||
self.store.get_with(key, f)
|
||||
}
|
||||
|
||||
/// Whether the provided key exists
|
||||
|
||||
Reference in New Issue
Block a user