Skip to content

Commit 92c150e

Browse files
authored
Merge pull request #20 from buffrr/reset
Support reset to undo all snapshots
2 parents 956799b + 43dd7ad commit 92c150e

3 files changed

Lines changed: 49 additions & 1 deletion

File tree

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ workspace = { members = ["example"] }
22

33
[package]
44
name = "spacedb"
5-
version = "0.0.11"
5+
version = "0.0.12"
66
edition = "2021"
77
description = "A cryptographically verifiable data store and universal accumulator for the Spaces protocol."
88
repository = "https://github.com/spacesprotocol/spacedb"

src/db.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,14 @@ impl<H: NodeHasher> Database<H> {
207207
Ok(save_point)
208208
}
209209

210+
pub fn reset(&self) -> Result<()> {
211+
let mut header = self.header.lock().expect("acquire lock");
212+
*header = DatabaseHeader::new();
213+
self.write_header(&header)?;
214+
self.file.set_len(header.len())?;
215+
Ok(())
216+
}
217+
210218
pub fn begin_write(&self) -> Result<WriteTransaction<'_, H>> {
211219
Ok(WriteTransaction::new(self))
212220
}

tests/integration_test.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1359,3 +1359,43 @@ fn read_only_while_writer_holds_db() {
13591359
drop(db);
13601360
let _ = fs::remove_file(&db_path);
13611361
}
1362+
1363+
#[test]
1364+
fn reset_to_empty() {
1365+
let db = Database::memory().unwrap();
1366+
let empty_root = db.begin_read().unwrap().compute_root().unwrap();
1367+
1368+
// Insert data across multiple snapshots
1369+
let mut write = db.begin_write().unwrap();
1370+
for i in 0u8..10 {
1371+
let mut k = [0u8; 32];
1372+
k[0] = i;
1373+
write = write.insert(k, vec![i]).unwrap();
1374+
}
1375+
write.commit().unwrap();
1376+
1377+
db.begin_write().unwrap()
1378+
.insert([0xFFu8; 32], vec![0xFF]).unwrap()
1379+
.commit().unwrap();
1380+
1381+
assert_eq!(db.iter().count(), 2, "should have 2 snapshots");
1382+
assert_ne!(db.begin_read().unwrap().compute_root().unwrap(), empty_root);
1383+
1384+
// Reset to empty
1385+
db.reset().unwrap();
1386+
1387+
// Should behave like a fresh database
1388+
let mut snapshot = db.begin_read().unwrap();
1389+
assert_eq!(snapshot.compute_root().unwrap(), empty_root);
1390+
assert_eq!(snapshot.get(&[0u8; 32]).unwrap(), None);
1391+
assert_eq!(db.iter().count(), 0, "should have 0 snapshots after reset");
1392+
1393+
// Should be able to write again after reset
1394+
db.begin_write().unwrap()
1395+
.insert([0x42u8; 32], vec![1, 2, 3]).unwrap()
1396+
.commit().unwrap();
1397+
1398+
let mut snapshot = db.begin_read().unwrap();
1399+
assert_eq!(snapshot.get(&[0x42u8; 32]).unwrap(), Some(vec![1, 2, 3]));
1400+
assert_ne!(snapshot.compute_root().unwrap(), empty_root);
1401+
}

0 commit comments

Comments
 (0)