Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions pyogrio/_ogr.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,14 @@ def get_gdal_config_option(str name):
return str_value


def ogr_driver_supports_update(driver):
# check metadata for driver to see if it supports update
if _get_driver_metadata_item(driver, "DCAP_UPDATE") == "YES":
return True

return False


def ogr_driver_supports_write(driver):
# check metadata for driver to see if it supports write
if _get_driver_metadata_item(driver, "DCAP_CREATE") == "YES":
Expand All @@ -125,14 +133,15 @@ def ogr_list_drivers():
for i in range(OGRGetDriverCount()):
driver = OGRGetDriver(i)
name_c = <char *>OGR_Dr_GetName(driver)

name = get_string(name_c)

capability = "r"
IF CTE_GDAL_VERSION >= (3, 11, 0):
if ogr_driver_supports_update(name):
capability += "a"
if ogr_driver_supports_write(name):
drivers[name] = "rw"

else:
drivers[name] = "r"
capability += "w"
drivers[name] = capability

return drivers

Expand Down
9 changes: 6 additions & 3 deletions pyogrio/tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
vsi_rmtree,
vsi_unlink,
)
from pyogrio._compat import GDAL_GE_38
from pyogrio._compat import GDAL_GE_38, GDAL_GE_311
from pyogrio._env import GDALEnv
from pyogrio.errors import DataLayerError, DataSourceError
from pyogrio.raw import read, write
Expand Down Expand Up @@ -136,11 +136,14 @@ def test_list_drivers():
for name in ("ESRI Shapefile", "GeoJSON", "GeoJSONSeq", "GPKG", "OpenFileGDB"):
assert name in all_drivers

expected_capability = "rw"
if GDAL_GE_311:
expected_capability = "raw"
else:
expected_capability = "rw"
if name == "OpenFileGDB" and __gdal_version__ < (3, 6, 0):
expected_capability = "r"

assert all_drivers[name] == expected_capability
assert all_drivers[name] == expected_capability, f"Error for {name}"

drivers = list_drivers(read=True)
expected = {k: v for k, v in all_drivers.items() if v.startswith("r")}
Expand Down
Loading