diff --git a/cozo-core/src/runtime/db.rs b/cozo-core/src/runtime/db.rs index 44abdb26..40ea2621 100644 --- a/cozo-core/src/runtime/db.rs +++ b/cozo-core/src/runtime/db.rs @@ -110,7 +110,10 @@ impl<'s, S: Storage<'s>> Db { #[cfg(not(feature = "wasm"))] let start = Instant::now(); - let params = params.into_iter().map(|(k, v)| (k, DataValue::from(v))).collect(); + let params = params + .into_iter() + .map(|(k, v)| (k, DataValue::from(v))) + .collect(); match self.do_run_script(payload, ¶ms) { Ok(mut json) => { { @@ -144,10 +147,10 @@ impl<'s, S: Storage<'s>> Db { if handle.access_level < AccessLevel::ReadOnly { bail!(InsufficientAccessLevel( - handle.name.to_string(), - "data export".to_string(), - handle.access_level - )); + handle.name.to_string(), + "data export".to_string(), + handle.access_level + )); } let mut cols = handle @@ -230,10 +233,10 @@ impl<'s, S: Storage<'s>> Db { if handle.access_level < AccessLevel::Protected { bail!(InsufficientAccessLevel( - handle.name.to_string(), - "data import".to_string(), - handle.access_level - )); + handle.name.to_string(), + "data import".to_string(), + handle.access_level + )); } match in_data { @@ -377,10 +380,15 @@ impl<'s, S: Storage<'s>> Db { #[cfg(feature = "storage-sqlite")] { let sqlite_db = crate::new_cozo_sqlite(out_file)?; + if sqlite_db.relation_store_id.load(Ordering::SeqCst) != 0 { + bail!("Cannot create backup: data exists in the target database."); + } let mut s_tx = sqlite_db.transact_write()?; - let tx = self.transact()?; - let iter = tx.tx.range_scan(&[], &[1]); + let mut tx = self.transact()?; + let iter = tx.tx.range_scan(&[], &[0xFF]); s_tx.tx.batch_put(iter)?; + tx.commit_tx()?; + s_tx.commit_tx()?; Ok(()) } #[cfg(not(feature = "storage-sqlite"))] @@ -391,7 +399,7 @@ impl<'s, S: Storage<'s>> Db { #[cfg(feature = "storage-sqlite")] { let sqlite_db = crate::new_cozo_sqlite(in_file.to_string())?; - let s_tx = sqlite_db.transact_write()?; + let mut s_tx = sqlite_db.transact_write()?; let store_id = s_tx.relation_store_id.load(Ordering::SeqCst); if store_id != 0 { bail!( @@ -402,6 +410,8 @@ impl<'s, S: Storage<'s>> Db { let mut tx = self.transact()?; let iter = s_tx.tx.range_scan(&[], &[1]); tx.tx.batch_put(iter)?; + s_tx.commit_tx()?; + tx.commit_tx()?; Ok(()) } #[cfg(not(feature = "storage-sqlite"))]