From 867646093b24a9bb7e4b24a7f2248615c6e03fde Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Fri, 17 Apr 2020 14:49:10 +0200 Subject: Table range deletion --- src/table.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'src/table.rs') diff --git a/src/table.rs b/src/table.rs index 33364514..6b7d1779 100644 --- a/src/table.rs +++ b/src/table.rs @@ -119,7 +119,7 @@ pub trait TableSchema: Send + Sync { type S: SortKey + Clone + Serialize + for<'de> Deserialize<'de> + Send + Sync; type E: Entry; - async fn updated(&self, old: Option, new: Self::E); + async fn updated(&self, old: Option, new: Option); } impl Table { @@ -370,10 +370,10 @@ impl Table { .map_err(Error::RMPEncode) .map_err(sled::ConflictableTransactionError::Abort)?; db.insert(tree_key.clone(), new_bytes)?; - Ok((old_entry, new_entry)) + Ok((old_entry, Some(new_entry))) })?; - if old_entry.as_ref() != Some(&new_entry) { + if old_entry != new_entry { self.instance.updated(old_entry, new_entry).await; let syncer = self.syncer.read().await.as_ref().unwrap().clone(); @@ -385,7 +385,18 @@ impl Table { pub async fn delete_range(&self, begin: &Hash, end: &Hash) -> Result<(), Error> { eprintln!("({}) Deleting range {:?} - {:?}", self.name, begin, end); - // TODO + let mut count = 0; + while let Some((key, _value)) = self.store.get_lt(end.as_slice())? { + if key.as_ref() < begin.as_slice() { + break; + } + if let Some(old_val) = self.store.remove(&key)? { + let old_entry = rmp_serde::decode::from_read_ref::<_, F::E>(&old_val)?; + self.instance.updated(Some(old_entry), None).await; + count += 1; + } + } + eprintln!("({}) {} entries deleted", self.name, count); Ok(()) } -- cgit v1.2.3