[QGIS Commit] r10972 - trunk/qgis/src/providers/ogr

svn_qgis at osgeo.org svn_qgis at osgeo.org
Wed Jun 24 05:17:08 EDT 2009


Author: jef
Date: 2009-06-24 05:17:07 -0400 (Wed, 24 Jun 2009)
New Revision: 10972

Modified:
   trunk/qgis/src/providers/ogr/qgsogrprovider.cpp
Log:
OGR provider update (fixes #1746)
- use OGR and not the filename to deduce the layername
- fall back to QgsVectorDataProvider methods if OGR SQL doesn't work
- check error code of OGR_L_SetFeature


Modified: trunk/qgis/src/providers/ogr/qgsogrprovider.cpp
===================================================================
--- trunk/qgis/src/providers/ogr/qgsogrprovider.cpp	2009-06-23 13:56:22 UTC (rev 10971)
+++ trunk/qgis/src/providers/ogr/qgsogrprovider.cpp	2009-06-24 09:17:07 UTC (rev 10972)
@@ -53,8 +53,6 @@
   + GDALVersionInfo( "RELEASE_NAME" )
   + ")";
 
-
-
 QgsOgrProvider::QgsOgrProvider( QString const & uri )
     : QgsVectorDataProvider( uri ),
     ogrDataSource( 0 ),
@@ -768,7 +766,11 @@
       }
     }
 
-    OGR_L_SetFeature( ogrLayer, of );
+    OGRErr res;
+    if (( res = OGR_L_SetFeature( ogrLayer, of ) ) != OGRERR_NONE )
+    {
+      QgsLogger::warning( "QgsOgrProvider::changeAttributeValues, setting the feature failed: " + QString::number( res ) );
+    }
   }
 
   OGR_L_SyncToDisk( ogrLayer );
@@ -778,6 +780,7 @@
 
 bool QgsOgrProvider::changeGeometryValues( QgsGeometryMap & geometry_map )
 {
+  OGRErr res;
   OGRFeatureH theOGRFeature = 0;
   OGRGeometryH theNewGeometry = 0;
 
@@ -809,15 +812,23 @@
     }
 
     //set the new geometry
-    if ( OGR_F_SetGeometryDirectly( theOGRFeature, theNewGeometry ) != OGRERR_NONE )
+    if (( res = OGR_F_SetGeometryDirectly( theOGRFeature, theNewGeometry ) ) != OGRERR_NONE )
     {
-      QgsLogger::warning( "QgsOgrProvider::changeGeometryValues, error while replacing geometry" );
+      QgsLogger::warning( "QgsOgrProvider::changeGeometryValues, error while replacing geometry: " + QString::number( res ) );
       OGR_G_DestroyGeometry( theNewGeometry );
       theNewGeometry = 0;
       continue;
     }
 
-    OGR_L_SetFeature( ogrLayer, theOGRFeature );
+
+    if (( res = OGR_L_SetFeature( ogrLayer, theOGRFeature ) ) != OGRERR_NONE )
+    {
+      QgsLogger::warning( "QgsOgrProvider::changeGeometryValues, error while setting feature: " + QString::number( res ) );
+      OGR_G_DestroyGeometry( theNewGeometry );
+      theNewGeometry = 0;
+      continue;
+    }
+
     OGR_F_Destroy( theOGRFeature );
   }
   OGR_L_SyncToDisk( ogrLayer );
@@ -914,7 +925,7 @@
       // TODO And test appropriately.
 
       ability |= ChangeAttributeValues;
-      ability |= QgsVectorDataProvider::ChangeGeometries;
+      ability |= ChangeGeometries;
     }
 
     if ( OGR_L_TestCapability( ogrLayer, "FastSpatialFilter" ) )
@@ -1505,48 +1516,42 @@
 void QgsOgrProvider::uniqueValues( int index, QList<QVariant> &uniqueValues )
 {
   QgsField fld = mAttributeFields[index];
-  QFileInfo fi( dataSourceUri() );
-  if ( !fi.exists() )
-    return;
+  QString theLayerName = OGR_FD_GetName( OGR_L_GetLayerDefn( ogrLayer ) );
 
   QString sql = QString( "SELECT DISTINCT %1 FROM %2 ORDER BY %1" )
                 .arg( quotedIdentifier( fld.name() ) )
-                .arg( quotedIdentifier( fi.completeBaseName() ) );
+                .arg( quotedIdentifier( theLayerName ) );
 
   uniqueValues.clear();
 
   QgsDebugMsg( QString( "SQL: %1" ).arg( sql ) );
-  OGRLayerH lyr = OGR_DS_ExecuteSQL( ogrDataSource, mEncoding->fromUnicode( sql ).data(), NULL, "SQL" );
-  if ( 0 == lyr )
-    return;
+  OGRLayerH l = OGR_DS_ExecuteSQL( ogrDataSource, mEncoding->fromUnicode( sql ).data(), NULL, "SQL" );
+  if ( l == 0 )
+    return QgsVectorDataProvider::uniqueValues( index, uniqueValues );
 
   OGRFeatureH f;
-  while ( 0 != ( f = OGR_L_GetNextFeature( lyr ) ) )
+  while ( 0 != ( f = OGR_L_GetNextFeature( l ) ) )
   {
     uniqueValues << convertValue( fld.type(), mEncoding->toUnicode( OGR_F_GetFieldAsString( f, 0 ) ) );
     OGR_F_Destroy( f );
   }
 
-  OGR_DS_ReleaseResultSet( ogrDataSource, lyr );
+  OGR_DS_ReleaseResultSet( ogrDataSource, l );
 }
 
-
-
 QVariant QgsOgrProvider::minimumValue( int index )
 {
   QgsField fld = mAttributeFields[index];
-  QFileInfo fi( dataSourceUri() );
-  if ( !fi.exists() )
-    return QVariant();
+  QString theLayerName = OGR_FD_GetName( OGR_L_GetLayerDefn( ogrLayer ) );
 
   QString sql = QString( "SELECT MIN(%1) FROM %2" )
                 .arg( quotedIdentifier( fld.name() ) )
-                .arg( quotedIdentifier( fi.completeBaseName() ) );
+                .arg( quotedIdentifier( theLayerName ) );
 
   OGRLayerH l = OGR_DS_ExecuteSQL( ogrDataSource, mEncoding->fromUnicode( sql ).data(), NULL, "SQL" );
 
   if ( l == 0 )
-    return QVariant();
+    return QgsVectorDataProvider::minimumValue( index );
 
   OGRFeatureH f = OGR_L_GetNextFeature( l );
   if ( f == 0 )
@@ -1566,17 +1571,15 @@
 QVariant QgsOgrProvider::maximumValue( int index )
 {
   QgsField fld = mAttributeFields[index];
-  QFileInfo fi( dataSourceUri() );
-  if ( !fi.exists() )
-    return QVariant();
+  QString theLayerName = OGR_FD_GetName( OGR_L_GetLayerDefn( ogrLayer ) );
 
   QString sql = QString( "SELECT MAX(%1) FROM %2" )
                 .arg( quotedIdentifier( fld.name() ) )
-                .arg( quotedIdentifier( fi.completeBaseName() ) );
+                .arg( quotedIdentifier( theLayerName ) );
 
   OGRLayerH l = OGR_DS_ExecuteSQL( ogrDataSource, mEncoding->fromUnicode( sql ).data(), NULL, "SQL" );
   if ( l == 0 )
-    return QVariant();
+    return QgsVectorDataProvider::maximumValue( index );
 
   OGRFeatureH f = OGR_L_GetNextFeature( l );
   if ( f == 0 )



More information about the QGIS-commit mailing list