Skip to content

Commit b777ab2

Browse files
authoredOct 15, 2018
Merge pull request #8184 from rouault/fix_20098
[OGR provider] Make again a feature iterator to be resetable on a OSM layer (fixes #20098)
2 parents 530397c + 906f802 commit b777ab2

File tree

3 files changed

+24
-12
lines changed

3 files changed

+24
-12
lines changed
 

‎src/providers/ogr/qgsogrfeatureiterator.cpp

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ bool QgsOgrFeatureIterator::fetchFeature( QgsFeature &feature )
311311
// see more details here: https://trac.osgeo.org/gdal/wiki/rfc66_randomlayerreadwrite
312312

313313
#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,2,0)
314-
if ( mSource->mDriverName == QLatin1String( "OSM" ) )
314+
if ( !QgsOgrProviderUtils::canDriverShareSameDatasetAmongLayers( mSource->mDriverName ) )
315315
{
316316
OGRLayerH nextFeatureBelongingLayer;
317317
while ( fet.reset( GDALDatasetGetNextFeature( mConn->ds, &nextFeatureBelongingLayer, nullptr, nullptr, nullptr ) ), fet )
@@ -323,6 +323,7 @@ bool QgsOgrFeatureIterator::fetchFeature( QgsFeature &feature )
323323
}
324324
}
325325
else
326+
#endif
326327
{
327328

328329
while ( fet.reset( OGR_L_GetNextFeature( mOgrLayer ) ), fet )
@@ -333,20 +334,25 @@ bool QgsOgrFeatureIterator::fetchFeature( QgsFeature &feature )
333334
}
334335
}
335336
}
336-
#else
337-
while ( fet.reset( OGR_L_GetNextFeature( mOgrLayer ) ), fet )
338-
{
339-
if ( checkFeature( fet, feature ) )
340-
{
341-
return true;
342-
}
343-
}
344-
#endif
345337

346338
close();
347339
return false;
348340
}
349341

342+
void QgsOgrFeatureIterator::resetReading()
343+
{
344+
#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,2,0)
345+
if ( !QgsOgrProviderUtils::canDriverShareSameDatasetAmongLayers( mSource->mDriverName ) )
346+
{
347+
GDALDatasetResetReading( mConn->ds );
348+
}
349+
else
350+
#endif
351+
{
352+
OGR_L_ResetReading( mOgrLayer );
353+
}
354+
}
355+
350356

351357
bool QgsOgrFeatureIterator::rewind()
352358
{
@@ -355,7 +361,7 @@ bool QgsOgrFeatureIterator::rewind()
355361
if ( mClosed || !mOgrLayer )
356362
return false;
357363

358-
OGR_L_ResetReading( mOgrLayer );
364+
resetReading();
359365

360366
mFilterFidsIt = mFilterFids.constBegin();
361367

@@ -387,7 +393,7 @@ bool QgsOgrFeatureIterator::close()
387393
// Will for example release SQLite3 statements
388394
if ( mOgrLayer )
389395
{
390-
OGR_L_ResetReading( mOgrLayer );
396+
resetReading();
391397
}
392398

393399
if ( mOgrOrigLayer )

‎src/providers/ogr/qgsogrfeatureiterator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ class QgsOgrFeatureIterator : public QgsAbstractFeatureIteratorFromSource<QgsOgr
100100
QgsFields mFieldsWithoutFid;
101101

102102
bool fetchFeatureWithId( QgsFeatureId id, QgsFeature &feature ) const;
103+
104+
void resetReading();
103105
};
104106

105107
#endif // QGSOGRFEATUREITERATOR_H

‎tests/src/python/test_provider_ogr.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,10 @@ def testOSM(self):
454454
self.assertTrue(iter_multipolygons.nextFeature(f))
455455
self.assertFalse(iter_multipolygons.nextFeature(f))
456456

457+
# Re-start an iterator (tests #20098)
458+
iter_multipolygons = vl_multipolygons.getFeatures(QgsFeatureRequest())
459+
self.assertTrue(iter_multipolygons.nextFeature(f))
460+
457461

458462
if __name__ == '__main__':
459463
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.