3232
3333
3434QgsOgrFeatureIterator::QgsOgrFeatureIterator ( QgsOgrProvider* p, const QgsFeatureRequest& request )
35- : QgsAbstractFeatureIterator( request ), P( p ), ogrDataSource(0 ), ogrLayer(0 ), ogrDriver( 0 )
35+ : QgsAbstractFeatureIterator( request ), P( p ), ogrDataSource(0 ), ogrLayer(0 ), mSubsetStringSet( false )
3636{
37+ mFeatureFetched = false ;
3738
3839 ogrDataSource = OGROpen ( TO8F ( P->filePath () ), false , NULL );
3940
@@ -46,7 +47,15 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrProvider* p, const QgsFeatur
4647 ogrLayer = OGR_DS_GetLayerByName ( ogrDataSource, TO8 ( p->layerName () ) );
4748 }
4849
49- mFeatureFetched = false ;
50+ if ( !P->subsetString ().isEmpty () )
51+ {
52+ QString sql = QString ( " SELECT * FROM %1 WHERE %2" )
53+ .arg ( P->quotedIdentifier ( FROM8 ( OGR_FD_GetName ( OGR_L_GetLayerDefn ( ogrLayer ) ) ) ) )
54+ .arg ( P->subsetString () );
55+ QgsDebugMsg ( QString ( " SQL: %1" ).arg ( sql ) );
56+ ogrLayer = OGR_DS_ExecuteSQL ( ogrDataSource, P->textEncoding ()->fromUnicode ( sql ).constData (), NULL , NULL );
57+ mSubsetStringSet = true ;
58+ }
5059
5160 ensureRelevantFields ();
5261
@@ -150,6 +159,11 @@ bool QgsOgrFeatureIterator::close()
150159 if ( mClosed )
151160 return false ;
152161
162+ if (mSubsetStringSet )
163+ {
164+ OGR_DS_ReleaseResultSet (ogrDataSource, ogrLayer );
165+ }
166+
153167 OGR_DS_Destroy ( ogrDataSource );
154168
155169 mClosed = true ;
0 commit comments