-
Notifications
You must be signed in to change notification settings - Fork 100
Description
Would it be possible to use transaction if supported, else use normal dataset.
Considering the output dataset being able to use any driver user wants, I want to speed up the writing process when I can. If the output is to gpkg file I'd like to use transaction, if it's to shp then the code I have will fail. So I'm hoping for something that can work on both cases.
The Idea I have is, considering the code for Transaction::commit uses the internal Dataset, we can probably add the commit method on the Dataset and do something like this:
let trans = d.start_transaction().is_ok();
// do stuffs with d: Dataset
if trans {
d.commit()?;
}Currently, You have to do something like this:
let mut trans = false;
if let Some(txn) = d.start_transaction() {
// do stuffs with txn
trans = true;
}
if !trans {
// do stuffs with d
}You can't use if let ... {} else {} pattern, as you can't borrow d mutably on start_transaction() and on the else block at the same time. And due to rust's type system, you can't replace d: Dataset with txn: Transaction to do the same thing (although you can with deref).
But basically to write a code that works with drivers that support transaction and drivers that don't, I think the first pattern I suggested feels like the best way to do it, as the code is internally calling commit on the Dataset anyway.
gdal/src/vector/transaction.rs
Lines 48 to 58 in 5d886ab
| pub fn commit(mut self) -> Result<()> { | |
| let rv = unsafe { gdal_sys::GDALDatasetCommitTransaction(self.dataset.c_dataset()) }; | |
| self.rollback_on_drop = false; | |
| if rv != OGRErr::OGRERR_NONE { | |
| return Err(GdalError::OgrError { | |
| err: rv, | |
| method_name: "GDALDatasetCommitTransaction", | |
| }); | |
| } | |
| Ok(()) | |
| } |