mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-12 07:41:08 +00:00
Further storage iterator refactoring (#13445)
* Remove `Backend::apply_to_key_values_while` * Add `IterArgs::start_at_exclusive` * Use `start_at_exclusive` in functions which used `Backend::apply_to_key_values_while` * Remove `Backend::apply_to_keys_while` * Remove `for_keys_with_prefix`, `for_key_values_with_prefix` and `for_child_keys_with_prefix` * Remove unnecessary `to_vec` calls * Fix unused method warning in no_std * Remove unnecessary import * Also check proof sizes in the test * Iterate over both keys and values in `prove_range_read_with_size` and add a test
This commit is contained in:
@@ -43,6 +43,10 @@ pub struct IterArgs<'a> {
|
||||
/// This is inclusive and the iteration will include the key which is specified here.
|
||||
pub start_at: Option<&'a [u8]>,
|
||||
|
||||
/// If this is `true` then the iteration will *not* include
|
||||
/// the key specified in `start_at`, if there is such a key.
|
||||
pub start_at_exclusive: bool,
|
||||
|
||||
/// The info of the child trie over which to iterate over.
|
||||
pub child_info: Option<ChildInfo>,
|
||||
|
||||
@@ -117,6 +121,17 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, H, I> PairsIter<'a, H, I>
|
||||
where
|
||||
H: Hasher,
|
||||
I: StorageIterator<H> + Default,
|
||||
{
|
||||
#[cfg(feature = "std")]
|
||||
pub(crate) fn was_complete(&self) -> bool {
|
||||
self.raw_iter.was_complete()
|
||||
}
|
||||
}
|
||||
|
||||
/// An iterator over storage keys.
|
||||
pub struct KeysIter<'a, H, I>
|
||||
where
|
||||
@@ -214,111 +229,6 @@ pub trait Backend<H: Hasher>: sp_std::fmt::Debug {
|
||||
key: &[u8],
|
||||
) -> Result<Option<StorageKey>, Self::Error>;
|
||||
|
||||
/// Iterate over storage starting at key, for a given prefix and child trie.
|
||||
/// Aborts as soon as `f` returns false.
|
||||
/// Warning, this fails at first error when usual iteration skips errors.
|
||||
/// If `allow_missing` is true, iteration stops when it reaches a missing trie node.
|
||||
/// Otherwise an error is produced.
|
||||
///
|
||||
/// Returns `true` if trie end is reached.
|
||||
// TODO: Remove this.
|
||||
fn apply_to_key_values_while<F: FnMut(Vec<u8>, Vec<u8>) -> bool>(
|
||||
&self,
|
||||
child_info: Option<&ChildInfo>,
|
||||
prefix: Option<&[u8]>,
|
||||
start_at: Option<&[u8]>,
|
||||
mut f: F,
|
||||
allow_missing: bool,
|
||||
) -> Result<bool, Self::Error> {
|
||||
let args = IterArgs {
|
||||
child_info: child_info.cloned(),
|
||||
prefix,
|
||||
start_at,
|
||||
stop_on_incomplete_database: allow_missing,
|
||||
..IterArgs::default()
|
||||
};
|
||||
let mut iter = self.pairs(args)?;
|
||||
while let Some(key_value) = iter.next() {
|
||||
let (key, value) = key_value?;
|
||||
if !f(key, value) {
|
||||
return Ok(false)
|
||||
}
|
||||
}
|
||||
Ok(iter.raw_iter.was_complete())
|
||||
}
|
||||
|
||||
/// Retrieve all entries keys of storage and call `f` for each of those keys.
|
||||
/// Aborts as soon as `f` returns false.
|
||||
// TODO: Remove this.
|
||||
fn apply_to_keys_while<F: FnMut(&[u8]) -> bool>(
|
||||
&self,
|
||||
child_info: Option<&ChildInfo>,
|
||||
prefix: Option<&[u8]>,
|
||||
start_at: Option<&[u8]>,
|
||||
mut f: F,
|
||||
) -> Result<(), Self::Error> {
|
||||
let args =
|
||||
IterArgs { child_info: child_info.cloned(), prefix, start_at, ..IterArgs::default() };
|
||||
|
||||
for key in self.keys(args)? {
|
||||
if !f(&key?) {
|
||||
return Ok(())
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Retrieve all entries keys which start with the given prefix and
|
||||
/// call `f` for each of those keys.
|
||||
// TODO: Remove this.
|
||||
fn for_keys_with_prefix<F: FnMut(&[u8])>(
|
||||
&self,
|
||||
prefix: &[u8],
|
||||
mut f: F,
|
||||
) -> Result<(), Self::Error> {
|
||||
let args = IterArgs { prefix: Some(prefix), ..IterArgs::default() };
|
||||
self.keys(args)?.try_for_each(|key| {
|
||||
f(&key?);
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
|
||||
/// Retrieve all entries keys and values of which start with the given prefix and
|
||||
/// call `f` for each of those keys.
|
||||
// TODO: Remove this.
|
||||
fn for_key_values_with_prefix<F: FnMut(&[u8], &[u8])>(
|
||||
&self,
|
||||
prefix: &[u8],
|
||||
mut f: F,
|
||||
) -> Result<(), Self::Error> {
|
||||
let args = IterArgs { prefix: Some(prefix), ..IterArgs::default() };
|
||||
self.pairs(args)?.try_for_each(|key_value| {
|
||||
let (key, value) = key_value?;
|
||||
f(&key, &value);
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
|
||||
/// Retrieve all child entries keys which start with the given prefix and
|
||||
/// call `f` for each of those keys.
|
||||
// TODO: Remove this.
|
||||
fn for_child_keys_with_prefix<F: FnMut(&[u8])>(
|
||||
&self,
|
||||
child_info: &ChildInfo,
|
||||
prefix: &[u8],
|
||||
mut f: F,
|
||||
) -> Result<(), Self::Error> {
|
||||
let args = IterArgs {
|
||||
child_info: Some(child_info.clone()),
|
||||
prefix: Some(prefix),
|
||||
..IterArgs::default()
|
||||
};
|
||||
self.keys(args)?.try_for_each(|key| {
|
||||
f(&key?);
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
|
||||
/// Calculate the storage root, with given delta over what is already stored in
|
||||
/// the backend, and produce a "transaction" that can be used to commit.
|
||||
/// Does not include child storage updates.
|
||||
|
||||
Reference in New Issue
Block a user