diff --git a/src/transaction.rs b/src/transaction.rs index 08b176ed2..7f559bbb6 100644 --- a/src/transaction.rs +++ b/src/transaction.rs @@ -299,9 +299,9 @@ impl TransactionalTree { /// Atomically apply multiple inserts and removals. pub fn apply_batch( &self, - batch: Batch, + batch: &Batch, ) -> UnabortableTransactionResult<()> { - for (k, v_opt) in batch.writes { + for (k, v_opt) in &batch.writes { if let Some(v) = v_opt { let _old = self.insert(k, v)?; } else { diff --git a/tests/test_tree.rs b/tests/test_tree.rs index 935d3c997..a61ffb34c 100644 --- a/tests/test_tree.rs +++ b/tests/test_tree.rs @@ -479,6 +479,29 @@ fn many_tree_transactions() -> TransactionResult<()> { }) } +#[test] +fn batch_outside_of_transaction() -> TransactionResult<()> { + common::setup_logger(); + + let config = Config::new().temporary(true).flush_every_ms(None); + let db = config.open().unwrap(); + + let t1 = db.open_tree(b"1")?; + + let mut b1 = Batch::default(); + b1.insert(b"k1", b"v1"); + b1.insert(b"k2", b"v2"); + + t1.transaction(|tree| { + tree.apply_batch(&b1)?; + Ok(()) + })?; + + assert_eq!(t1.get(b"k1")?, Some(b"v1".into())); + assert_eq!(t1.get(b"k2")?, Some(b"v2".into())); + Ok(()) +} + #[test] fn tree_subdir() { let mut parent_path = std::env::temp_dir();