From 3ce5275800b11cf7b7f6cd9e45fac8f6c661d5a9 Mon Sep 17 00:00:00 2001 From: Hugo Mercier Date: Mon, 5 Jan 2015 12:04:15 +0100 Subject: [PATCH] Test for write access mode for editing capabilities --- src/providers/ogr/qgsogrprovider.cpp | 17 +++++++++++------ src/providers/ogr/qgsogrprovider.h | 3 +++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/providers/ogr/qgsogrprovider.cpp b/src/providers/ogr/qgsogrprovider.cpp index 05341657777..5c13eb8f53e 100644 --- a/src/providers/ogr/qgsogrprovider.cpp +++ b/src/providers/ogr/qgsogrprovider.cpp @@ -268,6 +268,7 @@ QgsOgrProvider::QgsOgrProvider( QString const & uri ) , valid( false ) , featuresCounted( -1 ) , mDataModified( false ) + , mWriteAccess( false ) { QgsCPLErrorHandler handler; @@ -368,7 +369,11 @@ QgsOgrProvider::QgsOgrProvider( QString const & uri ) if ( !openReadOnly ) ogrDataSource = OGROpen( TO8F( mFilePath ), true, &ogrDriver ); - if ( !ogrDataSource ) + if ( ogrDataSource ) + { + mWriteAccess = true; + } + else { QgsDebugMsg( "OGR failed to opened in update mode, trying in read-only mode" ); @@ -1442,19 +1447,19 @@ int QgsOgrProvider::capabilities() const ability |= QgsVectorDataProvider::SelectAtId | QgsVectorDataProvider::SelectGeometryAtId; } - if ( OGR_L_TestCapability( ogrLayer, "SequentialWrite" ) ) + if ( mWriteAccess && OGR_L_TestCapability( ogrLayer, "SequentialWrite" ) ) // true if the CreateFeature() method works for this layer. { ability |= QgsVectorDataProvider::AddFeatures; } - if ( OGR_L_TestCapability( ogrLayer, "DeleteFeature" ) ) + if ( mWriteAccess && OGR_L_TestCapability( ogrLayer, "DeleteFeature" ) ) // true if this layer can delete its features { ability |= DeleteFeatures; } - if ( OGR_L_TestCapability( ogrLayer, "RandomWrite" ) ) + if ( mWriteAccess && OGR_L_TestCapability( ogrLayer, "RandomWrite" ) ) // true if the SetFeature() method is operational on this layer. { // TODO According to http://shapelib.maptools.org/ (Shapefile C Library V1.2) @@ -1502,12 +1507,12 @@ int QgsOgrProvider::capabilities() const } #endif - if ( OGR_L_TestCapability( ogrLayer, "CreateField" ) ) + if ( mWriteAccess && OGR_L_TestCapability( ogrLayer, "CreateField" ) ) { ability |= AddAttributes; } - if ( OGR_L_TestCapability( ogrLayer, "DeleteField" ) ) + if ( mWriteAccess && OGR_L_TestCapability( ogrLayer, "DeleteField" ) ) { ability |= DeleteAttributes; } diff --git a/src/providers/ogr/qgsogrprovider.h b/src/providers/ogr/qgsogrprovider.h index bd4da19692e..56a0c4bfba9 100644 --- a/src/providers/ogr/qgsogrprovider.h +++ b/src/providers/ogr/qgsogrprovider.h @@ -344,6 +344,9 @@ class QgsOgrProvider : public QgsVectorDataProvider OGRLayerH setSubsetString( OGRLayerH layer, OGRDataSourceH ds ); friend class QgsOgrFeatureSource; + + /** whether the file is opened in write mode*/ + bool mWriteAccess; };