diff --git a/frmts/pds/pdsdrivercore.cpp b/frmts/pds/pdsdrivercore.cpp index 1c036758f427..7ffc3322eeae 100644 --- a/frmts/pds/pdsdrivercore.cpp +++ b/frmts/pds/pdsdrivercore.cpp @@ -318,6 +318,9 @@ void PDS4DriverSetCommonMetadata(GDALDriver *poDriver) poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); poDriver->SetMetadataItem(GDAL_DCAP_CREATE, "YES"); poDriver->SetMetadataItem(GDAL_DCAP_CREATECOPY, "YES"); + + poDriver->SetMetadataItem(GDAL_DCAP_UPDATE, "YES"); + poDriver->SetMetadataItem(GDAL_DMD_UPDATE_ITEMS, "Features"); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/mem/ogr_mem.h b/ogr/ogrsf_frmts/mem/ogr_mem.h index 432601fb43f3..5e3cfb96eb68 100644 --- a/ogr/ogrsf_frmts/mem/ogr_mem.h +++ b/ogr/ogrsf_frmts/mem/ogr_mem.h @@ -185,6 +185,9 @@ class OGRMemDataSource CPL_NON_FINAL : public GDALDataset int TestCapability(const char *) override; + OGRLayer *ExecuteSQL(const char *pszStatement, OGRGeometry *poSpatialFilter, + const char *pszDialect) override; + bool AddFieldDomain(std::unique_ptr &&domain, std::string &failureReason) override; diff --git a/ogr/ogrsf_frmts/mem/ogrmemdatasource.cpp b/ogr/ogrsf_frmts/mem/ogrmemdatasource.cpp index 636ca4e3ea4a..3593f3943e4e 100644 --- a/ogr/ogrsf_frmts/mem/ogrmemdatasource.cpp +++ b/ogr/ogrsf_frmts/mem/ogrmemdatasource.cpp @@ -219,3 +219,20 @@ bool OGRMemDataSource::UpdateFieldDomain( m_oMapFieldDomains[domainName] = std::move(domain); return true; } + +/************************************************************************/ +/* ExecuteSQL() */ +/************************************************************************/ + +OGRLayer *OGRMemDataSource::ExecuteSQL(const char *pszStatement, + OGRGeometry *poSpatialFilter, + const char *pszDialect) +{ + if (EQUAL(pszStatement, "PRAGMA read_only=1")) // as used by VDV driver + { + for (int i = 0; i < nLayers; ++i) + papoLayers[i]->SetUpdatable(false); + return nullptr; + } + return GDALDataset::ExecuteSQL(pszStatement, poSpatialFilter, pszDialect); +} diff --git a/ogr/ogrsf_frmts/mongodbv3/ogrmongodbv3drivercore.cpp b/ogr/ogrsf_frmts/mongodbv3/ogrmongodbv3drivercore.cpp index 2c4c142d882d..20b97007497b 100644 --- a/ogr/ogrsf_frmts/mongodbv3/ogrmongodbv3drivercore.cpp +++ b/ogr/ogrsf_frmts/mongodbv3/ogrmongodbv3drivercore.cpp @@ -117,6 +117,9 @@ void OGRMongoDBv3DriverSetCommonMetadata(GDALDriver *poDriver) poDriver->pfnIdentify = OGRMongoDBv3DriverIdentify; poDriver->SetMetadataItem(GDAL_DCAP_OPEN, "YES"); + + poDriver->SetMetadataItem(GDAL_DCAP_UPDATE, "YES"); + poDriver->SetMetadataItem(GDAL_DMD_UPDATE_ITEMS, "Features"); } /************************************************************************/ diff --git a/ogr/ogrsf_frmts/ods/ogrodsdriver.cpp b/ogr/ogrsf_frmts/ods/ogrodsdriver.cpp index af7625b12dcf..77ade27cac94 100644 --- a/ogr/ogrsf_frmts/ods/ogrodsdriver.cpp +++ b/ogr/ogrsf_frmts/ods/ogrodsdriver.cpp @@ -240,6 +240,9 @@ void RegisterOGRODS() poDriver->SetMetadataItem(GDAL_DMD_ALTER_FIELD_DEFN_FLAGS, "Name Type"); poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE"); + poDriver->SetMetadataItem(GDAL_DCAP_UPDATE, "YES"); + poDriver->SetMetadataItem(GDAL_DMD_UPDATE_ITEMS, "Features"); + poDriver->SetMetadataItem( GDAL_DMD_OPENOPTIONLIST, "" diff --git a/ogr/ogrsf_frmts/vdv/ogrvdvdatasource.cpp b/ogr/ogrsf_frmts/vdv/ogrvdvdatasource.cpp index 040e1d0426bb..60a6e0654e23 100644 --- a/ogr/ogrsf_frmts/vdv/ogrvdvdatasource.cpp +++ b/ogr/ogrsf_frmts/vdv/ogrvdvdatasource.cpp @@ -226,8 +226,10 @@ void OGRIDFDataSource::Parse() } } + bool bIsMEMLayer = false; if (m_poTmpDS == nullptr) { + bIsMEMLayer = true; m_poTmpDS = poMEMDriver->Create("", 0, 0, 0, GDT_Unknown, nullptr); } @@ -583,6 +585,9 @@ void OGRIDFDataSource::Parse() m_poTmpDS->CommitTransaction(); + if (bIsMEMLayer) + m_poTmpDS->ExecuteSQL("PRAGMA read_only=1", nullptr, nullptr); + std::map::iterator oMapLinkCoordinateIter = oMapLinkCoordinate.begin(); for (; oMapLinkCoordinateIter != oMapLinkCoordinate.end(); diff --git a/ogr/ogrsf_frmts/xlsx/ogrxlsxdriver.cpp b/ogr/ogrsf_frmts/xlsx/ogrxlsxdriver.cpp index d969a9c6b457..bdad9da84f54 100644 --- a/ogr/ogrsf_frmts/xlsx/ogrxlsxdriver.cpp +++ b/ogr/ogrsf_frmts/xlsx/ogrxlsxdriver.cpp @@ -247,6 +247,9 @@ void RegisterOGRXLSX() poDriver->SetMetadataItem(GDAL_DCAP_Z_GEOMETRIES, "YES"); poDriver->SetMetadataItem(GDAL_DMD_SUPPORTED_SQL_DIALECTS, "OGRSQL SQLITE"); + poDriver->SetMetadataItem(GDAL_DCAP_UPDATE, "YES"); + poDriver->SetMetadataItem(GDAL_DMD_UPDATE_ITEMS, "Features"); + poDriver->SetMetadataItem( GDAL_DMD_OPENOPTIONLIST, ""