Skip to content

Commit

Permalink
Add Dataset::has_capability for dataset capabilities test
Browse files Browse the repository at this point in the history
  • Loading branch information
Atreyagaurav committed Nov 28, 2024
1 parent 2ffd176 commit 2f90f90
Showing 1 changed file with 21 additions and 36 deletions.
57 changes: 21 additions & 36 deletions src/dataset.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::{ffi::CString, ffi::NulError, path::Path, ptr};
use std::{ffi::{CString, CStr}, ffi::NulError, path::Path, ptr};

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

Expand All @@ -11,43 +11,28 @@ use crate::{
gdal_major_object::MajorObject, spatial_ref::SpatialRef, Driver, GeoTransform, Metadata,
};

pub struct DatasetCapability(&'static CStr);

/// Dataset capabilities
#[allow(clippy::enum_variant_names)]
pub enum DatasetCaps {
impl DatasetCapability {
/// datasource can create new layers
ODsCCreateLayer,
pub const CREATE_LAYER: DatasetCapability = DatasetCapability(c"CreateLayer");
/// datasource can delete existing layers
ODsCDeleteLayer,
pub const DELETE_LAYER: DatasetCapability = DatasetCapability(c"DeleteLayer");
/// layers of this datasource support CreateGeomField() just after layer creation
ODsCCreateGeomFieldAfterCreateLayer,
pub const CREATE_GEOM_FIELD_AFTER_CREATE_LAYER: DatasetCapability = DatasetCapability(c"CreateGeomFieldAfterCreateLayer");
/// datasource supports curve geometries
ODsCCurveGeometries,
pub const CURVE_GEOMETRIES: DatasetCapability = DatasetCapability(c"CurveGeometries");
/// datasource supports (efficient) transactions
ODsCTransactions,
pub const TRANSACTIONS: DatasetCapability = DatasetCapability(c"Transactions");
/// datasource supports transactions through emulation
ODsCEmulatedTransactions,
pub const EMULATED_TRANSACTIONS: DatasetCapability = DatasetCapability(c"EmulatedTransactions");
/// datasource has a dedicated GetNextFeature() implementation, potentially returning features from layers in a non sequential way
ODsCRandomLayerRead,
pub const RANDOM_LAYER_READ: DatasetCapability = DatasetCapability(c"RandomLayerRead");
/// datasource supports calling CreateFeature() on layers in a non sequential way
ODsCRandomLayerWrite,
pub const RANDOM_LAYER_WRITE: DatasetCapability = DatasetCapability(c"RandomLayerWrite");
}

// Manage conversion to Gdal values
impl DatasetCaps {
fn into_cstring(self) -> CString {
CString::new(match self {
Self::ODsCCreateLayer => "CreateLayer",
Self::ODsCDeleteLayer => "DeleteLayer",
Self::ODsCCreateGeomFieldAfterCreateLayer => "CreateGeomFieldAfterCreateLayer",
Self::ODsCCurveGeometries => "CurveGeometries",
Self::ODsCTransactions => "Transactions",
Self::ODsCEmulatedTransactions => "EmulatedTransactions",
Self::ODsCRandomLayerRead => "RandomLayerRead",
Self::ODsCRandomLayerWrite => "RandomLayerWrite",
})
.unwrap()
}
}

/// Wrapper around a [`GDALDataset`][GDALDataset] object.
///
Expand Down Expand Up @@ -366,11 +351,11 @@ impl Dataset {
Ok(transformation)
}

pub fn has_capability(&self, capability: DatasetCaps) -> bool {
pub fn has_capability(&self, capability: DatasetCapability) -> bool {
unsafe {
gdal_sys::GDALDatasetTestCapability(
self.c_dataset(),
capability.into_cstring().as_ptr(),
capability.0.as_ptr(),
) == 1
}
}
Expand Down Expand Up @@ -398,7 +383,7 @@ impl Drop for Dataset {
mod tests {
use gdal_sys::GDALAccess;

use crate::dataset::DatasetCaps::*;
use crate::dataset::DatasetCapability;
use crate::test_utils::{fixture, open_gpkg_for_update};
use crate::GdalOpenFlags;

Expand Down Expand Up @@ -497,14 +482,14 @@ mod tests {
#[test]
fn test_dataset_capabilities() {
let ds = Dataset::open(fixture("poly.gpkg")).unwrap();
assert!(!ds.has_capability(ODsCCreateLayer));
assert!(!ds.has_capability(ODsCDeleteLayer));
assert!(ds.has_capability(ODsCTransactions));
assert!(!ds.has_capability(DatasetCapability::CREATE_LAYER));
assert!(!ds.has_capability(DatasetCapability::DELETE_LAYER));
assert!(ds.has_capability(DatasetCapability::TRANSACTIONS));

let (_tmp_path, ds) = open_gpkg_for_update(&fixture("poly.gpkg"));
assert!(ds.has_capability(ODsCCreateLayer));
assert!(ds.has_capability(ODsCDeleteLayer));
assert!(ds.has_capability(ODsCTransactions));
assert!(ds.has_capability(DatasetCapability::CREATE_LAYER));
assert!(ds.has_capability(DatasetCapability::DELETE_LAYER));
assert!(ds.has_capability(DatasetCapability::TRANSACTIONS));
}

#[test]
Expand Down

0 comments on commit 2f90f90

Please sign in to comment.