mirror of
https://github.com/paradigmxyz/reth.git
synced 2026-02-19 03:04:27 -05:00
perf(db): use Cow::Borrowed in walk_dup to avoid allocation (#21220)
This commit is contained in:
committed by
GitHub
parent
bc79cc44c9
commit
78de3d8f61
@@ -215,27 +215,26 @@ impl<K: TransactionKind, T: DupSort> DbDupCursorRO<T> for Cursor<K, T> {
|
||||
) -> Result<DupWalker<'_, T, Self>, DatabaseError> {
|
||||
let start = match (key, subkey) {
|
||||
(Some(key), Some(subkey)) => {
|
||||
// encode key and decode it after.
|
||||
let key: Vec<u8> = key.encode().into();
|
||||
let encoded_key = key.encode();
|
||||
self.inner
|
||||
.get_both_range(key.as_ref(), subkey.encode().as_ref())
|
||||
.get_both_range(encoded_key.as_ref(), subkey.encode().as_ref())
|
||||
.map_err(|e| DatabaseError::Read(e.into()))?
|
||||
.map(|val| decoder::<T>((Cow::Owned(key), val)))
|
||||
.map(|val| decoder::<T>((Cow::Borrowed(encoded_key.as_ref()), val)))
|
||||
}
|
||||
(Some(key), None) => {
|
||||
let key: Vec<u8> = key.encode().into();
|
||||
let encoded_key = key.encode();
|
||||
self.inner
|
||||
.set(key.as_ref())
|
||||
.set(encoded_key.as_ref())
|
||||
.map_err(|e| DatabaseError::Read(e.into()))?
|
||||
.map(|val| decoder::<T>((Cow::Owned(key), val)))
|
||||
.map(|val| decoder::<T>((Cow::Borrowed(encoded_key.as_ref()), val)))
|
||||
}
|
||||
(None, Some(subkey)) => {
|
||||
if let Some((key, _)) = self.first()? {
|
||||
let key: Vec<u8> = key.encode().into();
|
||||
let encoded_key = key.encode();
|
||||
self.inner
|
||||
.get_both_range(key.as_ref(), subkey.encode().as_ref())
|
||||
.get_both_range(encoded_key.as_ref(), subkey.encode().as_ref())
|
||||
.map_err(|e| DatabaseError::Read(e.into()))?
|
||||
.map(|val| decoder::<T>((Cow::Owned(key), val)))
|
||||
.map(|val| decoder::<T>((Cow::Borrowed(encoded_key.as_ref()), val)))
|
||||
} else {
|
||||
Some(Err(DatabaseError::Read(MDBXError::NotFound.into())))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user