From 57ea79f605aad10c3226b26d63b2010bca34c718 Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Thu, 17 Nov 2011 01:07:10 -0300 Subject: [PATCH] Optimize SpatiaLite feature reading speed --- src/providers/spatialite/qgsspatialiteprovider.cpp | 6 ++++-- src/providers/spatialite/qgsspatialiteprovider.h | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/providers/spatialite/qgsspatialiteprovider.cpp b/src/providers/spatialite/qgsspatialiteprovider.cpp index c13bf33a4990..9791eddbd6f4 100644 --- a/src/providers/spatialite/qgsspatialiteprovider.cpp +++ b/src/providers/spatialite/qgsspatialiteprovider.cpp @@ -795,8 +795,7 @@ bool QgsSpatiaLiteProvider::getFeature( sqlite3_stmt *stmt, bool fetchGeometry, } if ( fetchGeometry ) { - QString geoCol = QString( "AsBinary(%1)" ).arg( quotedIdentifier( mGeometryColumn ) ); - if ( strcasecmp( geoCol.toUtf8().constData(), sqlite3_column_name( stmt, ic ) ) == 0 ) + if ( ic == mGeomColIdx ) { if ( sqlite3_column_type( stmt, ic ) == SQLITE_BLOB ) { @@ -3247,6 +3246,7 @@ bool QgsSpatiaLiteProvider::prepareStatement( QString primaryKey = !isQuery ? "ROWID" : quotedIdentifier( mPrimaryKey ); QString sql = QString( "SELECT %1" ).arg( primaryKey ); + int colIdx = 1; // column 0 is primary key for ( QgsAttributeList::const_iterator it = fetchAttributes.constBegin(); it != fetchAttributes.constEnd(); ++it ) { const QgsField & fld = field( *it ); @@ -3258,10 +3258,12 @@ bool QgsSpatiaLiteProvider::prepareStatement( fieldname = QString( "AsText(%1)" ).arg( fieldname ); } sql += "," + fieldname; + colIdx++; } if ( fetchGeometry ) { sql += QString( ", AsBinary(%1)" ).arg( quotedIdentifier( mGeometryColumn ) ); + mGeomColIdx = colIdx; } sql += QString( " FROM %1" ).arg( mQuery ); diff --git a/src/providers/spatialite/qgsspatialiteprovider.h b/src/providers/spatialite/qgsspatialiteprovider.h index 5547219e1670..b184c40a3b40 100644 --- a/src/providers/spatialite/qgsspatialiteprovider.h +++ b/src/providers/spatialite/qgsspatialiteprovider.h @@ -382,6 +382,9 @@ class QgsSpatiaLiteProvider: public QgsVectorDataProvider const QgsField & field( int index ) const; + /** geometry column index used when fetching geometry */ + int mGeomColIdx; + /** * internal utility functions used to handle common SQLite tasks */