@@ -43,6 +43,8 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource* source, bool
4343 , mSubsetStringSet( false )
4444 , mFetchGeometry( false )
4545 , mExpressionCompiled( false )
46+ , mFilterFids( mRequest .filterFids() )
47+ , mFilterFidsIt( mFilterFids .constBegin() )
4648{
4749 mConn = QgsOgrConnPool::instance ()->acquireConnection ( mSource ->mProvider ->dataSourceUri () );
4850 if ( !mConn ->ds )
@@ -166,6 +168,22 @@ bool QgsOgrFeatureIterator::nextFeatureFilterExpression( QgsFeature& f )
166168 return fetchFeature ( f );
167169}
168170
171+ bool QgsOgrFeatureIterator::fetchFeatureWithId ( QgsFeatureId id, QgsFeature& feature ) const
172+ {
173+ feature.setValid ( false );
174+ OGRFeatureH fet = OGR_L_GetFeature ( ogrLayer, FID_TO_NUMBER ( id ) );
175+ if ( !fet )
176+ {
177+ return false ;
178+ }
179+
180+ if ( readFeature ( fet, feature ) )
181+ OGR_F_Destroy ( fet );
182+
183+ feature.setValid ( true );
184+ return true ;
185+ }
186+
169187bool QgsOgrFeatureIterator::fetchFeature ( QgsFeature& feature )
170188{
171189 feature.setValid ( false );
@@ -175,19 +193,26 @@ bool QgsOgrFeatureIterator::fetchFeature( QgsFeature& feature )
175193
176194 if ( mRequest .filterType () == QgsFeatureRequest::FilterFid )
177195 {
178- OGRFeatureH fet = OGR_L_GetFeature ( ogrLayer, FID_TO_NUMBER ( mRequest .filterFid () ) );
179- if ( !fet )
196+ bool result = fetchFeatureWithId ( mRequest .filterFid (), feature );
197+ close (); // the feature has been read or was not found: we have finished here
198+ return result;
199+ }
200+ else if ( mRequest .filterType () == QgsFeatureRequest::FilterFids )
201+ {
202+ if ( mFilterFidsIt == mFilterFids .constEnd () )
180203 {
181204 close ();
182205 return false ;
183206 }
184-
185- if ( readFeature ( fet, feature ) )
186- OGR_F_Destroy ( fet );
187-
188- feature.setValid ( true );
189- close (); // the feature has been read: we have finished here
190- return true ;
207+ else
208+ {
209+ QgsFeatureId nextId = *mFilterFidsIt ;
210+ mFilterFidsIt ++;
211+ bool result = fetchFeatureWithId ( nextId, feature );
212+ if ( !result )
213+ close ();
214+ return result;
215+ }
191216 }
192217
193218 OGRFeatureH fet;
@@ -220,6 +245,8 @@ bool QgsOgrFeatureIterator::rewind()
220245
221246 OGR_L_ResetReading ( ogrLayer );
222247
248+ mFilterFidsIt = mFilterFids .constBegin ();
249+
223250 return true ;
224251}
225252
@@ -246,7 +273,7 @@ bool QgsOgrFeatureIterator::close()
246273}
247274
248275
249- void QgsOgrFeatureIterator::getFeatureAttribute ( OGRFeatureH ogrFet, QgsFeature & f, int attindex )
276+ void QgsOgrFeatureIterator::getFeatureAttribute ( OGRFeatureH ogrFet, QgsFeature & f, int attindex ) const
250277{
251278 if ( mSource ->mFirstFieldIsFid && attindex == 0 )
252279 {
@@ -264,7 +291,7 @@ void QgsOgrFeatureIterator::getFeatureAttribute( OGRFeatureH ogrFet, QgsFeature
264291}
265292
266293
267- bool QgsOgrFeatureIterator::readFeature ( OGRFeatureH fet, QgsFeature& feature )
294+ bool QgsOgrFeatureIterator::readFeature ( OGRFeatureH fet, QgsFeature& feature ) const
268295{
269296 feature.setFeatureId ( OGR_F_GetFID ( fet ) );
270297 feature.initAttributes ( mSource ->mFields .count () );
0 commit comments