Skip to content

Commit 0ec08f6

Browse files
committed
Implement wrapper for OGR_L_TestCapability
1 parent 29a9585 commit 0ec08f6

File tree

4 files changed

+90
-2
lines changed

4 files changed

+90
-2
lines changed

CHANGES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Changes
22

33
## Unreleased
4+
* Implement wrapper for `OGR_L_TestCapability`
5+
* <https://github.com/georust/gdal/pull/160>
46
* **Breaking**: Use `DatasetOptions` to pass as `Dataset::open_ex` parameters and
57
add support for extended open flags.
68

src/vector/layer.rs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,73 @@ use std::{convert::TryInto, ffi::CString, marker::PhantomData};
1313

1414
use crate::errors::*;
1515

16+
/// Layer capabilities
17+
pub enum LayerCaps {
18+
/// Layer capability for random read
19+
OLCRandomRead,
20+
/// Layer capability for sequential write
21+
OLCSequentialWrite,
22+
/// Layer capability for random write
23+
OLCRandomWrite,
24+
/// Layer capability for fast spatial filter
25+
OLCFastSpatialFilter,
26+
/// Layer capability for fast feature count retrieval
27+
OLCFastFeatureCount,
28+
/// Layer capability for fast extent retrieval
29+
OLCFastGetExtent,
30+
/// Layer capability for field creation
31+
OLCCreateField,
32+
/// Layer capability for field deletion
33+
OLCDeleteField,
34+
/// Layer capability for field reordering
35+
OLCReorderFields,
36+
/// Layer capability for field alteration
37+
OLCAlterFieldDefn,
38+
/// Layer capability for transactions
39+
OLCTransactions,
40+
/// Layer capability for feature deletiond
41+
OLCDeleteFeature,
42+
/// Layer capability for setting next feature index
43+
OLCFastSetNextByIndex,
44+
/// Layer capability for strings returned with UTF-8 encoding
45+
OLCStringsAsUTF8,
46+
/// Layer capability for field ignoring
47+
OLCIgnoreFields,
48+
/// Layer capability for geometry field creation
49+
OLCCreateGeomField,
50+
/// Layer capability for curve geometries support
51+
OLCCurveGeometries,
52+
/// Layer capability for measured geometries support
53+
OLCMeasuredGeometries,
54+
}
55+
56+
// Manage conversion to Gdal values
57+
impl LayerCaps {
58+
fn into_cstring(self) -> CString {
59+
CString::new(match self {
60+
Self::OLCRandomRead => "RandomRead",
61+
Self::OLCSequentialWrite => "SequentialWrite",
62+
Self::OLCRandomWrite => "RandomWrite",
63+
Self::OLCFastSpatialFilter => "FastSpatialFilter",
64+
Self::OLCFastFeatureCount => "FastFeatureCount",
65+
Self::OLCFastGetExtent => "FastGetExtent",
66+
Self::OLCCreateField => "CreateField",
67+
Self::OLCDeleteField => "DeleteField",
68+
Self::OLCReorderFields => "ReorderFields",
69+
Self::OLCAlterFieldDefn => "AlterFieldDefn",
70+
Self::OLCTransactions => "Transactions",
71+
Self::OLCDeleteFeature => "DeleteFeature",
72+
Self::OLCFastSetNextByIndex => "FastSetNextByIndex",
73+
Self::OLCStringsAsUTF8 => "StringsAsUTF8",
74+
Self::OLCIgnoreFields => "IgnoreFields",
75+
Self::OLCCreateGeomField => "CreateGeomField",
76+
Self::OLCCurveGeometries => "CurveGeometries",
77+
Self::OLCMeasuredGeometries => "MeasuredGeometries",
78+
})
79+
.unwrap()
80+
}
81+
}
82+
1683
/// Layer in a vector dataset
1784
///
1885
/// ```
@@ -101,6 +168,12 @@ impl<'a> Layer<'a> {
101168
_string(rv)
102169
}
103170

171+
pub fn has_capability(&self, capability: LayerCaps) -> bool {
172+
unsafe {
173+
gdal_sys::OGR_L_TestCapability(self.c_layer, capability.into_cstring().as_ptr()) == 1
174+
}
175+
}
176+
104177
pub fn defn(&self) -> &Defn {
105178
&self.defn
106179
}

src/vector/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub use defn::{Defn, Field, FieldIterator};
2727
pub use feature::{Feature, FieldValue, FieldValueIterator};
2828
pub use gdal_sys::{OGRFieldType, OGRwkbGeometryType};
2929
pub use geometry::Geometry;
30-
pub use layer::{FeatureIterator, FieldDefn, Layer};
30+
pub use layer::{FeatureIterator, FieldDefn, Layer, LayerCaps};
3131
pub use ops::GeometryIntersection;
3232

3333
use crate::errors::Result;

src/vector/vector_tests/mod.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::{
2-
Feature, FeatureIterator, FieldValue, Geometry, Layer, OGRFieldType, OGRwkbGeometryType,
2+
Feature, FeatureIterator, FieldValue, Geometry, Layer, LayerCaps::*, OGRFieldType,
3+
OGRwkbGeometryType,
34
};
45
use crate::spatial_ref::SpatialRef;
56
use crate::{assert_almost_eq, Dataset, Driver};
@@ -63,6 +64,18 @@ fn test_layer_spatial_ref() {
6364
assert_eq!(srs.auth_code().unwrap(), 4326);
6465
}
6566

67+
#[test]
68+
fn test_layer_capabilities() {
69+
let mut ds = Dataset::open(fixture!("roads.geojson")).unwrap();
70+
let layer = ds.layer(0).unwrap();
71+
72+
assert_eq!(layer.has_capability(OLCFastSpatialFilter), false);
73+
assert_eq!(layer.has_capability(OLCFastFeatureCount), true);
74+
assert_eq!(layer.has_capability(OLCFastGetExtent), false);
75+
assert_eq!(layer.has_capability(OLCRandomRead), true);
76+
assert_eq!(layer.has_capability(OLCStringsAsUTF8), true);
77+
}
78+
6679
fn ds_with_layer<F>(ds_name: &str, layer_name: &str, f: F)
6780
where
6881
F: Fn(Layer),

0 commit comments

Comments
 (0)