Skip to content

Commit 9692dae

Browse files
Atreyagauravlnicola
authored andcommitted
Add Dataset::has_capability for dataset capabilities test
1 parent 6d93482 commit 9692dae

File tree

3 files changed

+49
-3
lines changed

3 files changed

+49
-3
lines changed

CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
- Add methods `alternative_name`, `is_nullable`, `is_unique`, `default_value` to `Field` ([#561](https://github.com/georust/gdal/pull/561))
2424
- Add `Defn::geometry_type` ([#562](https://github.com/georust/gdal/pull/562))
2525
- Add `Defn::field_index` and `Feature::field_index` ([#581](https://github.com/georust/gdal/pull/581))
26+
- Add `Dataset::has_capability` for dataset capability check ([#581](https://github.com/georust/gdal/pull/585))
2627

2728
### Fixed
2829

src/dataset.rs

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
use std::{ffi::CString, ffi::NulError, path::Path, ptr};
1+
use std::{
2+
ffi::{CStr, CString, NulError},
3+
path::Path,
4+
ptr,
5+
};
26

37
use gdal_sys::{CPLErr, GDALDatasetH, GDALMajorObjectH};
48

@@ -11,6 +15,29 @@ use crate::{
1115
gdal_major_object::MajorObject, spatial_ref::SpatialRef, Driver, GeoTransform, Metadata,
1216
};
1317

18+
pub struct DatasetCapability(&'static CStr);
19+
20+
/// Dataset capabilities
21+
impl DatasetCapability {
22+
/// Dataset can create new layers.
23+
pub const CREATE_LAYER: DatasetCapability = DatasetCapability(c"CreateLayer");
24+
/// Dataset can delete existing layers.
25+
pub const DELETE_LAYER: DatasetCapability = DatasetCapability(c"DeleteLayer");
26+
/// Layers of this datasource support CreateGeomField() just after layer creation.
27+
pub const CREATE_GEOM_FIELD_AFTER_CREATE_LAYER: DatasetCapability =
28+
DatasetCapability(c"CreateGeomFieldAfterCreateLayer");
29+
/// Dataset supports curve geometries.
30+
pub const CURVE_GEOMETRIES: DatasetCapability = DatasetCapability(c"CurveGeometries");
31+
/// Dataset supports (efficient) transactions.
32+
pub const TRANSACTIONS: DatasetCapability = DatasetCapability(c"Transactions");
33+
/// Dataset supports transactions through emulation.
34+
pub const EMULATED_TRANSACTIONS: DatasetCapability = DatasetCapability(c"EmulatedTransactions");
35+
/// Dataset has a dedicated GetNextFeature() implementation, potentially returning features from layers in a non sequential way.
36+
pub const RANDOM_LAYER_READ: DatasetCapability = DatasetCapability(c"RandomLayerRead");
37+
/// Dataset supports calling CreateFeature() on layers in a non sequential way.
38+
pub const RANDOM_LAYER_WRITE: DatasetCapability = DatasetCapability(c"RandomLayerWrite");
39+
}
40+
1441
/// Wrapper around a [`GDALDataset`][GDALDataset] object.
1542
///
1643
/// Represents both a [vector dataset][vector-data-model]
@@ -327,6 +354,10 @@ impl Dataset {
327354
}
328355
Ok(transformation)
329356
}
357+
358+
pub fn has_capability(&self, capability: DatasetCapability) -> bool {
359+
unsafe { gdal_sys::GDALDatasetTestCapability(self.c_dataset(), capability.0.as_ptr()) == 1 }
360+
}
330361
}
331362

332363
impl MajorObject for Dataset {
@@ -351,7 +382,8 @@ impl Drop for Dataset {
351382
mod tests {
352383
use gdal_sys::GDALAccess;
353384

354-
use crate::test_utils::fixture;
385+
use crate::dataset::DatasetCapability;
386+
use crate::test_utils::{fixture, open_gpkg_for_update};
355387
use crate::GdalOpenFlags;
356388

357389
use super::*;
@@ -446,6 +478,19 @@ mod tests {
446478
.unwrap_err();
447479
}
448480

481+
#[test]
482+
fn test_dataset_capabilities() {
483+
let ds = Dataset::open(fixture("poly.gpkg")).unwrap();
484+
assert!(!ds.has_capability(DatasetCapability::CREATE_LAYER));
485+
assert!(!ds.has_capability(DatasetCapability::DELETE_LAYER));
486+
assert!(ds.has_capability(DatasetCapability::TRANSACTIONS));
487+
488+
let (_tmp_path, ds) = open_gpkg_for_update(&fixture("poly.gpkg"));
489+
assert!(ds.has_capability(DatasetCapability::CREATE_LAYER));
490+
assert!(ds.has_capability(DatasetCapability::DELETE_LAYER));
491+
assert!(ds.has_capability(DatasetCapability::TRANSACTIONS));
492+
}
493+
449494
#[test]
450495
fn test_raster_count_on_vector() {
451496
let ds = Dataset::open(fixture("roads.geojson")).unwrap();

src/vector/layer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ pub enum LayerCaps {
4141
OLCAlterFieldDefn,
4242
/// Layer capability for transactions
4343
OLCTransactions,
44-
/// Layer capability for feature deletiond
44+
/// Layer capability for feature deletion
4545
OLCDeleteFeature,
4646
/// Layer capability for setting next feature index
4747
OLCFastSetNextByIndex,

0 commit comments

Comments
 (0)