perf(db): use Cow::Borrowed in walk_dup to avoid allocation (#21220)

This commit is contained in:
Georgios Konstantopoulos
2026-01-20 11:31:50 -08:00
committed by GitHub
parent bc79cc44c9
commit 78de3d8f61

View File

@@ -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())))
}