Don't allocate when creating 'from' and 'dup_of' iterators

Signed-off-by: Victor Porof <victor.porof@gmail.com>
without.crypto
Victor Porof 5 years ago
parent c8fac3bb43
commit a5389008b6
  1. 8
      src/backend/impl_lmdb/cursor.rs
  2. 16
      src/backend/impl_safe/cursor.rs
  3. 4
      src/backend/traits.rs
  4. 1
      src/store/integermulti.rs
  5. 2
      src/store/multi.rs
  6. 2
      src/store/single.rs
  7. 2
      tests/test_txn.rs

@ -30,14 +30,14 @@ impl<'c> BackendRoCursor<'c> for RoCursorImpl<'c> {
fn into_iter_from<K>(self, key: K) -> Self::Iter
where
K: AsRef<[u8]>,
K: AsRef<[u8]> + 'c,
{
IterImpl::new(self.0, |cursor| cursor.iter_from(key))
}
fn into_iter_dup_of<K>(self, key: K) -> Self::Iter
where
K: AsRef<[u8]>,
K: AsRef<[u8]> + 'c,
{
IterImpl::new(self.0, |cursor| cursor.iter_dup_of(key))
}
@ -55,14 +55,14 @@ impl<'c> BackendRoCursor<'c> for RwCursorImpl<'c> {
fn into_iter_from<K>(self, key: K) -> Self::Iter
where
K: AsRef<[u8]>,
K: AsRef<[u8]> + 'c,
{
IterImpl::new(self.0, |cursor| cursor.iter_from(key))
}
fn into_iter_dup_of<K>(self, key: K) -> Self::Iter
where
K: AsRef<[u8]>,
K: AsRef<[u8]> + 'c,
{
IterImpl::new(self.0, |cursor| cursor.iter_dup_of(key))
}

@ -26,20 +26,16 @@ impl<'c> BackendRoCursor<'c> for RoCursorImpl<'c> {
fn into_iter_from<K>(self, key: K) -> Self::Iter
where
K: AsRef<[u8]>,
K: AsRef<[u8]> + 'c,
{
// FIXME: Don't allocate.
let key = key.as_ref().to_vec();
IterImpl(Box::new(self.0.iter().skip_while(move |&(k, _)| k < key.as_slice())))
IterImpl(Box::new(self.0.iter().skip_while(move |&(k, _)| k < key.as_ref())))
}
fn into_iter_dup_of<K>(self, key: K) -> Self::Iter
where
K: AsRef<[u8]>,
K: AsRef<[u8]> + 'c,
{
// FIXME: Don't allocate.
let key = key.as_ref().to_vec();
IterImpl(Box::new(self.0.iter().filter(move |&(k, _)| k == key.as_slice())))
IterImpl(Box::new(self.0.iter().filter(move |&(k, _)| k == key.as_ref())))
}
}
@ -55,14 +51,14 @@ impl<'c> BackendRoCursor<'c> for RwCursorImpl<'c> {
fn into_iter_from<K>(self, _key: K) -> Self::Iter
where
K: AsRef<[u8]>,
K: AsRef<[u8]> + 'c,
{
unimplemented!()
}
fn into_iter_dup_of<K>(self, _key: K) -> Self::Iter
where
K: AsRef<[u8]>,
K: AsRef<[u8]> + 'c,
{
unimplemented!()
}

@ -165,11 +165,11 @@ pub trait BackendRoCursor<'c>: Debug {
fn into_iter_from<K>(self, key: K) -> Self::Iter
where
K: AsRef<[u8]>;
K: AsRef<[u8]> + 'c;
fn into_iter_dup_of<K>(self, key: K) -> Self::Iter
where
K: AsRef<[u8]>;
K: AsRef<[u8]> + 'c;
}
pub trait BackendIter<'i> {

@ -56,6 +56,7 @@ where
R: Readable<'r, Database = D, RoCursor = C>,
I: BackendIter<'r>,
C: BackendRoCursor<'r, Iter = I>,
K: 'r,
{
self.inner.get(reader, Key::new(&k)?)
}

@ -53,7 +53,7 @@ where
R: Readable<'r, Database = D, RoCursor = C>,
I: BackendIter<'r>,
C: BackendRoCursor<'r, Iter = I>,
K: AsRef<[u8]>,
K: AsRef<[u8]> + 'r,
{
let cursor = reader.open_ro_cursor(&self.db)?;
let iter = cursor.into_iter_dup_of(k);

@ -102,7 +102,7 @@ where
R: Readable<'r, Database = D, RoCursor = C>,
I: BackendIter<'r>,
C: BackendRoCursor<'r, Iter = I>,
K: AsRef<[u8]>,
K: AsRef<[u8]> + 'r,
{
let cursor = reader.open_ro_cursor(&self.db)?;
let iter = cursor.into_iter_from(k);

@ -90,7 +90,7 @@ fn read_many() {
}
}
fn get_ids_by_field<'t, T>(txn: &'t T, store: MultiStore, field: &str) -> Vec<u64>
fn get_ids_by_field<'t, T>(txn: &'t T, store: MultiStore, field: &'t str) -> Vec<u64>
where
T: Readable<'t, Database = LmdbDatabase, RoCursor = LmdbRoCursor<'t>>,
{

Loading…
Cancel
Save