File tree Expand file tree Collapse file tree 5 files changed +22
-8
lines changed Expand file tree Collapse file tree 5 files changed +22
-8
lines changed Original file line number Diff line number Diff line change @@ -120,6 +120,7 @@ class QgsExpressionSorter
120
120
QgsAbstractFeatureIterator::QgsAbstractFeatureIterator ( const QgsFeatureRequest& request )
121
121
: mRequest( request )
122
122
, mClosed( false )
123
+ , mZombie( false )
123
124
, refs( 0 )
124
125
, mFetchedCount( 0 )
125
126
, mGeometrySimplifier( nullptr )
@@ -152,8 +153,8 @@ bool QgsAbstractFeatureIterator::nextFeature( QgsFeature& f )
152
153
else
153
154
{
154
155
dataOk = false ;
155
- // don't call close, the provider connection has already been closed
156
- mClosed = true ;
156
+ // even the zombie dies at this point...
157
+ mZombie = false ;
157
158
}
158
159
}
159
160
else
@@ -289,7 +290,8 @@ void QgsAbstractFeatureIterator::setupOrderBy( const QList<QgsFeatureRequest::Or
289
290
290
291
mFeatureIterator = mCachedFeatures .constBegin ();
291
292
mUseCachedFeatures = true ;
292
- mClosed = false ;
293
+ // The real iterator is closed, we are only serving cached features
294
+ mZombie = true ;
293
295
}
294
296
}
295
297
Original file line number Diff line number Diff line change @@ -89,7 +89,17 @@ class CORE_EXPORT QgsAbstractFeatureIterator
89
89
/* * Set to true, as soon as the iterator is closed. */
90
90
bool mClosed ;
91
91
92
+ /* *
93
+ * A feature iterator may be closed already but still be serving features from the cache.
94
+ * This is done when we serve features which have been pre-fetched and the order by has
95
+ * been locally sorted.
96
+ * In such a scenario, all resources have been released (mClosed is true) but the deads
97
+ * are still alive.
98
+ */
99
+ bool mZombie ;
100
+
92
101
// ! reference counting (to allow seamless copying of QgsFeatureIterator instances)
102
+ // ! TODO QGIS3: make this private
93
103
int refs;
94
104
void ref (); // !< add reference
95
105
void deref (); // !< remove reference, delete if refs == 0
@@ -247,7 +257,7 @@ inline bool QgsFeatureIterator::close()
247
257
248
258
inline bool QgsFeatureIterator::isClosed () const
249
259
{
250
- return mIter ? mIter ->mClosed : true ;
260
+ return mIter ? mIter ->mClosed && ! mIter -> mZombie : true ;
251
261
}
252
262
253
263
inline bool operator == ( const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2 )
Original file line number Diff line number Diff line change @@ -243,7 +243,7 @@ bool QgsOgrFeatureIterator::rewind()
243
243
244
244
bool QgsOgrFeatureIterator::close ()
245
245
{
246
- if ( mClosed )
246
+ if ( ! mConn )
247
247
return false ;
248
248
249
249
iteratorClosed ();
@@ -253,7 +253,9 @@ bool QgsOgrFeatureIterator::close()
253
253
OGR_DS_ReleaseResultSet ( mConn ->ds , ogrLayer );
254
254
}
255
255
256
- QgsOgrConnPool::instance ()->releaseConnection ( mConn );
256
+ if ( mConn )
257
+ QgsOgrConnPool::instance ()->releaseConnection ( mConn );
258
+
257
259
mConn = nullptr ;
258
260
259
261
mClosed = true ;
Original file line number Diff line number Diff line change @@ -313,7 +313,7 @@ bool QgsPostgresFeatureIterator::rewind()
313
313
314
314
bool QgsPostgresFeatureIterator::close ()
315
315
{
316
- if ( mClosed )
316
+ if ( ! mConn )
317
317
return false ;
318
318
319
319
mConn ->closeCursor ( mCursorName );
Original file line number Diff line number Diff line change @@ -235,7 +235,7 @@ bool QgsSpatiaLiteFeatureIterator::rewind()
235
235
236
236
bool QgsSpatiaLiteFeatureIterator::close ()
237
237
{
238
- if ( mClosed )
238
+ if ( ! mHandle )
239
239
return false ;
240
240
241
241
iteratorClosed ();
You can’t perform that action at this time.
0 commit comments