1
- use std:: { ffi:: CString , ffi:: NulError , path:: Path , ptr} ;
1
+ use std:: {
2
+ ffi:: { CStr , CString , NulError } ,
3
+ path:: Path ,
4
+ ptr,
5
+ } ;
2
6
3
7
use gdal_sys:: { CPLErr , GDALDatasetH , GDALMajorObjectH } ;
4
8
@@ -11,6 +15,29 @@ use crate::{
11
15
gdal_major_object:: MajorObject , spatial_ref:: SpatialRef , Driver , GeoTransform , Metadata ,
12
16
} ;
13
17
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
+
14
41
/// Wrapper around a [`GDALDataset`][GDALDataset] object.
15
42
///
16
43
/// Represents both a [vector dataset][vector-data-model]
@@ -327,6 +354,10 @@ impl Dataset {
327
354
}
328
355
Ok ( transformation)
329
356
}
357
+
358
+ pub fn has_capability ( & self , capability : DatasetCapability ) -> bool {
359
+ unsafe { gdal_sys:: GDALDatasetTestCapability ( self . c_dataset ( ) , capability. 0 . as_ptr ( ) ) == 1 }
360
+ }
330
361
}
331
362
332
363
impl MajorObject for Dataset {
@@ -351,7 +382,8 @@ impl Drop for Dataset {
351
382
mod tests {
352
383
use gdal_sys:: GDALAccess ;
353
384
354
- use crate :: test_utils:: fixture;
385
+ use crate :: dataset:: DatasetCapability ;
386
+ use crate :: test_utils:: { fixture, open_gpkg_for_update} ;
355
387
use crate :: GdalOpenFlags ;
356
388
357
389
use super :: * ;
@@ -446,6 +478,19 @@ mod tests {
446
478
. unwrap_err ( ) ;
447
479
}
448
480
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
+
449
494
#[ test]
450
495
fn test_raster_count_on_vector ( ) {
451
496
let ds = Dataset :: open ( fixture ( "roads.geojson" ) ) . unwrap ( ) ;
0 commit comments