|
3 | 3 | use crate::{FixedSizeInfo, MdbxError}; |
4 | 4 | use signet_hot::{ |
5 | 5 | MAX_FIXED_VAL_SIZE, MAX_KEY_SIZE, |
6 | | - model::{DualKeyTraverse, KvTraverse, KvTraverseMut, RawDualKeyValue, RawKeyValue, RawValue}, |
| 6 | + model::{ |
| 7 | + DualKeyTraverse, DualKeyTraverseMut, KvTraverse, KvTraverseMut, RawDualKeyValue, |
| 8 | + RawKeyValue, RawValue, |
| 9 | + }, |
7 | 10 | }; |
8 | 11 | use signet_libmdbx::{Ro, Rw, RwSync, TransactionKind, tx::WriteMarker}; |
9 | 12 | use std::{ |
@@ -104,7 +107,7 @@ where |
104 | 107 |
|
105 | 108 | impl<K: TransactionKind + WriteMarker> KvTraverseMut<MdbxError> for Cursor<'_, K> { |
106 | 109 | fn delete_current(&mut self) -> Result<(), MdbxError> { |
107 | | - self.inner.del(Default::default()).map_err(MdbxError::Mdbx) |
| 110 | + self.inner.del().map_err(MdbxError::Mdbx) |
108 | 111 | } |
109 | 112 | } |
110 | 113 |
|
@@ -502,3 +505,24 @@ where |
502 | 505 | } |
503 | 506 | } |
504 | 507 | } |
| 508 | + |
| 509 | +impl<K: TransactionKind + WriteMarker> DualKeyTraverseMut<MdbxError> for Cursor<'_, K> { |
| 510 | + fn delete_current(&mut self) -> Result<(), MdbxError> { |
| 511 | + // For DUPSORT tables, del() deletes only the current duplicate |
| 512 | + self.inner.del().map_err(MdbxError::Mdbx) |
| 513 | + } |
| 514 | + |
| 515 | + fn clear_k1(&mut self, key1: &[u8]) -> Result<(), MdbxError> { |
| 516 | + if !self.fsi.is_dupsort() { |
| 517 | + return Err(MdbxError::NotDupSort); |
| 518 | + } |
| 519 | + |
| 520 | + // Position at the K1 - if it doesn't exist, nothing to delete |
| 521 | + if self.inner.set::<()>(key1)?.is_none() { |
| 522 | + return Ok(()); |
| 523 | + } |
| 524 | + // Delete all K2 entries for this K1 |
| 525 | + self.inner.del_all_dups()?; |
| 526 | + Ok(()) |
| 527 | + } |
| 528 | +} |
0 commit comments