diff --git a/beacon_node/db2/src/lib.rs b/beacon_node/db2/src/lib.rs index 0704a84f5..55f419978 100644 --- a/beacon_node/db2/src/lib.rs +++ b/beacon_node/db2/src/lib.rs @@ -83,8 +83,6 @@ where T: ClientDB, { /// Put `item` in the store as `key`. - /// - /// The `item` must implement `DBRecord` which defines the db column used. fn put(&self, key: &Hash256, item: &I) -> Result<(), Error> where I: DBRecord, @@ -96,9 +94,7 @@ where self.db.put(column, key, &val).map_err(|e| e.into()) } - /// Retrieves an `Ok(Some(item)` from the store if `key` exists, otherwise returns `Ok(None)`. - /// - /// The `item` must implement `DBRecord` which defines the db column used. + /// Retrieves an `Ok(Some(item))` from the store if `key` exists, otherwise returns `Ok(None)`. fn get(&self, key: &Hash256) -> Result, Error> where I: DBRecord, @@ -114,6 +110,28 @@ where None => Ok(None), } } + + /// Returns `Ok(true)` `key` exists in the store. + fn exists(&self, key: &Hash256) -> Result + where + I: DBRecord, + { + let column = I::db_column().into(); + let key = key.as_bytes(); + + self.db.exists(column, key).map_err(|e| e.into()) + } + + /// Returns `Ok(())` if `key` was deleted from the database or did not exist. + fn delete(&self, key: &Hash256) -> Result<(), Error> + where + I: DBRecord, + { + let column = I::db_column().into(); + let key = key.as_bytes(); + + self.db.delete(column, key).map_err(|e| e.into()) + } } #[cfg(test)] @@ -136,7 +154,7 @@ mod tests { } #[test] - fn memorydb_can_store() { + fn memorydb_can_store_and_retrieve() { let store = Store::new_in_memory(); let key = Hash256::random(); @@ -148,4 +166,21 @@ mod tests { assert_eq!(item, retrieved); } + + #[test] + fn exists() { + let store = Store::new_in_memory(); + let key = Hash256::random(); + let item = StorableThing { a: 1, b: 42 }; + + assert_eq!(store.exists::(&key).unwrap(), false); + + store.put(&key, &item).unwrap(); + + assert_eq!(store.exists::(&key).unwrap(), true); + + store.delete::(&key).unwrap(); + + assert_eq!(store.exists::(&key).unwrap(), false); + } }