Skip to content

Commit 3747c2b

Browse files
committedJun 21, 2013
vector providers: allow multiple iterators - testing required
1 parent 4164d6e commit 3747c2b

31 files changed

+177
-179
lines changed
 

‎src/core/qgsfeatureiterator.cpp

+4-3
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616

1717

1818
QgsAbstractFeatureIterator::QgsAbstractFeatureIterator( const QgsFeatureRequest& request )
19-
: mRequest( request ),
20-
mClosed( false ),
21-
refs( 0 )
19+
: mRequest( request )
20+
, mClosed( false )
21+
, refs( 0 )
2222
{
2323
}
2424

@@ -30,6 +30,7 @@ void QgsAbstractFeatureIterator::ref()
3030
{
3131
refs++;
3232
}
33+
3334
void QgsAbstractFeatureIterator::deref()
3435
{
3536
refs--;

‎src/core/qgsfeatureiterator.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -129,15 +129,14 @@ inline bool QgsFeatureIterator::isClosed()
129129
return mIter ? mIter->mClosed : true;
130130
}
131131

132-
133132
inline bool operator== ( const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2 )
134133
{
135134
return ( fi1.mIter == fi2.mIter );
136135
}
136+
137137
inline bool operator!= ( const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2 )
138138
{
139139
return !( fi1 == fi2 );
140140
}
141141

142-
143142
#endif // QGSFEATUREITERATOR_H

‎src/core/qgsvectorlayer.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -3582,6 +3582,15 @@ QString QgsVectorLayer::metadata()
35823582
myMetadata += storageType();
35833583
myMetadata += "</p>\n";
35843584

3585+
if ( dataProvider() )
3586+
{
3587+
//provider description
3588+
myMetadata += "<p class=\"glossy\">" + tr( "Description of this provider" ) + "</p>\n";
3589+
myMetadata += "<p>";
3590+
myMetadata += dataProvider()->description().replace( "\n", "<br>" );
3591+
myMetadata += "</p>\n";
3592+
}
3593+
35853594
// data source
35863595
myMetadata += "<p class=\"glossy\">" + tr( "Source for this layer" ) + "</p>\n";
35873596
myMetadata += "<p>";

‎src/providers/delimitedtext/qgsdelimitedtextfeatureiterator.cpp

+5-11
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,12 @@
2626
#include <QTextStream>
2727

2828
QgsDelimitedTextFeatureIterator::QgsDelimitedTextFeatureIterator( QgsDelimitedTextProvider* p, const QgsFeatureRequest& request )
29-
: QgsAbstractFeatureIterator( request ), P( p )
29+
: QgsAbstractFeatureIterator( request )
30+
, P( p )
3031
{
31-
// make sure that only one iterator is active
32-
if ( P->mActiveIterator )
33-
{
34-
QgsMessageLog::logMessage( QObject::tr( "Already active iterator on this provider was closed." ), QObject::tr( "Delimited text" ) );
35-
P->mActiveIterator->close();
36-
}
37-
P->mActiveIterator = this;
32+
P->mActiveIterators << this;
3833

3934
// Determine mode to use based on request...
40-
4135
QgsDebugMsg( "Setting up QgsDelimitedTextIterator" );
4236

4337
// Does the layer have geometry - will revise later to determine if we actually need to
@@ -212,8 +206,8 @@ bool QgsDelimitedTextFeatureIterator::close()
212206
if ( mClosed )
213207
return false;
214208

215-
// tell provider that this iterator is not active anymore
216-
P->mActiveIterator = 0;
209+
P->mActiveIterators.remove( this );
210+
217211
mFeatureIds = QList<QgsFeatureId>();
218212
mClosed = true;
219213
return true;

‎src/providers/delimitedtext/qgsdelimitedtextprovider.cpp

+13-5
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,7 @@ QgsDelimitedTextProvider::QgsDelimitedTextProvider( QString uri )
8282
, mGeometryType( QGis::UnknownGeometry )
8383
, mBuildSpatialIndex( false )
8484
, mSpatialIndex( 0 )
85-
, mActiveIterator( 0 )
8685
{
87-
8886
QgsDebugMsg( "Delimited text file uri is " + uri );
8987

9088
QUrl url = QUrl::fromEncoded( uri.toAscii() );
@@ -169,8 +167,12 @@ QgsDelimitedTextProvider::QgsDelimitedTextProvider( QString uri )
169167

170168
QgsDelimitedTextProvider::~QgsDelimitedTextProvider()
171169
{
172-
if ( mActiveIterator )
173-
mActiveIterator->close();
170+
while ( !mActiveIterators.empty() )
171+
{
172+
QgsDelimitedTextFeatureIterator *it = *mActiveIterators.begin();
173+
QgsDebugMsg( "closing active iterator" );
174+
it->close();
175+
}
174176

175177
if ( mFile )
176178
{
@@ -1052,7 +1054,13 @@ void QgsDelimitedTextProvider::onFileUpdated()
10521054
messages.append( tr( "The file has been updated by another application - reloading" ) );
10531055
reportErrors( messages, false );
10541056

1055-
if ( mActiveIterator ) mActiveIterator->close();
1057+
while ( !mActiveIterators.empty() )
1058+
{
1059+
QgsDelimitedTextFeatureIterator *it = *mActiveIterators.begin();
1060+
QgsDebugMsg( "closing active iterator" );
1061+
it->close();
1062+
}
1063+
10561064
rescanFile();
10571065
}
10581066

‎src/providers/delimitedtext/qgsdelimitedtextprovider.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ class QgsDelimitedTextProvider : public QgsVectorDataProvider
318318
QgsSpatialIndex *mSpatialIndex;
319319

320320
friend class QgsDelimitedTextFeatureIterator;
321-
QgsDelimitedTextFeatureIterator* mActiveIterator;
321+
QSet< QgsDelimitedTextFeatureIterator* > mActiveIterators;
322322
};
323323

324324
#endif

‎src/providers/gpx/qgsgpxfeatureiterator.cpp

+4-18
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,10 @@
2626

2727

2828
QgsGPXFeatureIterator::QgsGPXFeatureIterator( QgsGPXProvider* p, const QgsFeatureRequest& request )
29-
: QgsAbstractFeatureIterator( request ), P( p )
29+
: QgsAbstractFeatureIterator( request )
30+
, P( p )
3031
{
31-
// make sure that only one iterator is active
32-
if ( P->mActiveIterator )
33-
{
34-
QgsMessageLog::logMessage( QObject::tr( "Already active iterator on this provider was closed." ), QObject::tr( "GPX" ) );
35-
P->mActiveIterator->close();
36-
}
37-
P->mActiveIterator = this;
38-
32+
P->mActiveIterators << this;
3933
rewind();
4034
}
4135

@@ -71,19 +65,12 @@ bool QgsGPXFeatureIterator::close()
7165
if ( mClosed )
7266
return false;
7367

74-
// nothing to do
75-
76-
// tell provider that this iterator is not active anymore
77-
P->mActiveIterator = 0;
68+
P->mActiveIterators.remove( this );
7869

7970
mClosed = true;
8071
return true;
8172
}
8273

83-
84-
85-
86-
8774
bool QgsGPXFeatureIterator::nextFeature( QgsFeature& feature )
8875
{
8976
feature.setValid( false );
@@ -98,7 +85,6 @@ bool QgsGPXFeatureIterator::nextFeature( QgsFeature& feature )
9885
return res;
9986
}
10087

101-
10288
if ( P->mFeatureType == QgsGPXProvider::WaypointType )
10389
{
10490
// go through the list of waypoints and return the first one that is in

‎src/providers/gpx/qgsgpxfeatureiterator.h

-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ class QgsGPXFeatureIterator : public QgsAbstractFeatureIterator
6363
//! Current track iterator
6464
QgsGPSData::TrackIterator mTrkIter;
6565

66-
6766
bool mFetchedFid;
6867
};
6968

‎src/providers/gpx/qgsgpxprovider.cpp

+8-5
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,8 @@ const QString GPX_KEY = "gpx";
6767
const QString GPX_DESCRIPTION = QObject::tr( "GPS eXchange format provider" );
6868

6969

70-
QgsGPXProvider::QgsGPXProvider( QString uri ) :
71-
QgsVectorDataProvider( uri )
72-
, mActiveIterator( 0 )
70+
QgsGPXProvider::QgsGPXProvider( QString uri )
71+
: QgsVectorDataProvider( uri )
7372
{
7473
// assume that it won't work
7574
mValid = false;
@@ -114,8 +113,12 @@ QgsGPXProvider::QgsGPXProvider( QString uri ) :
114113

115114
QgsGPXProvider::~QgsGPXProvider()
116115
{
117-
if ( mActiveIterator )
118-
mActiveIterator->close();
116+
while ( !mActiveIterators.empty() )
117+
{
118+
QgsGPXFeatureIterator *it = *mActiveIterators.begin();
119+
QgsDebugMsg( "closing active iterator" );
120+
it->close();
121+
}
119122

120123
QgsGPSData::releaseData( mFileName );
121124
}

‎src/providers/gpx/qgsgpxprovider.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -173,5 +173,5 @@ class QgsGPXProvider : public QgsVectorDataProvider
173173
wkbPoint mWKBpt;
174174

175175
friend class QgsGPXFeatureIterator;
176-
QgsGPXFeatureIterator* mActiveIterator;
176+
QSet< QgsGPXFeatureIterator * > mActiveIterators;
177177
};

‎src/providers/grass/qgsgrassfeatureiterator.cpp

+3-10
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,7 @@ extern "C"
3939
QgsGrassFeatureIterator::QgsGrassFeatureIterator( QgsGrassProvider* p, const QgsFeatureRequest& request )
4040
: QgsAbstractFeatureIterator( request ), P( p )
4141
{
42-
// make sure that only one iterator is active
43-
if ( P->mActiveIterator )
44-
{
45-
QgsMessageLog::logMessage( QObject::tr( "Already active iterator on this provider was closed." ), QObject::tr( "GRASS" ) );
46-
P->mActiveIterator->close();
47-
}
48-
P->mActiveIterator = this;
42+
P->mActiveIterators << this;
4943

5044
// check if outdated and update if necessary
5145
P->ensureUpdated();
@@ -242,16 +236,15 @@ bool QgsGrassFeatureIterator::close()
242236
if ( mClosed )
243237
return false;
244238

239+
P->mActiveIterators.remove( this );
240+
245241
// finalization
246242
Vect_destroy_line_struct( mPoints );
247243
Vect_destroy_cats_struct( mCats );
248244
Vect_destroy_list( mList );
249245

250246
free( mSelection );
251247

252-
// tell provider that this iterator is not active anymore
253-
P->mActiveIterator = 0;
254-
255248
mClosed = true;
256249
return true;
257250
}

‎src/providers/grass/qgsgrassprovider.cpp

+6-3
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ static QString GRASS_DESCRIPTION = "Grass provider"; // XXX verify this
7373

7474
QgsGrassProvider::QgsGrassProvider( QString uri )
7575
: QgsVectorDataProvider( uri )
76-
, mActiveIterator( 0 )
7776
{
7877
QgsDebugMsg( QString( "QgsGrassProvider URI: %1" ).arg( uri ) );
7978

@@ -258,8 +257,12 @@ QgsGrassProvider::~QgsGrassProvider()
258257
{
259258
QgsDebugMsg( "entered." );
260259

261-
if ( mActiveIterator )
262-
mActiveIterator->close();
260+
while ( !mActiveIterators.empty() )
261+
{
262+
QgsGrassFeatureIterator *it = *mActiveIterators.begin();
263+
QgsDebugMsg( "closing active iterator" );
264+
it->close();
265+
}
263266

264267
closeLayer( mLayerId );
265268
}

‎src/providers/grass/qgsgrassprovider.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ class GRASS_LIB_EXPORT QgsGrassProvider : public QgsVectorDataProvider
644644
static std::vector<GMAP> mMaps; // Map
645645

646646
friend class QgsGrassFeatureIterator;
647-
QgsGrassFeatureIterator* mActiveIterator;
647+
QSet< QgsGrassFeatureIterator *> mActiveIterators;
648648
};
649649

650650
#endif // QGSGRASSPROVIDER_H

‎src/providers/memory/qgsmemoryfeatureiterator.cpp

+6-11
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,11 @@
2222

2323

2424
QgsMemoryFeatureIterator::QgsMemoryFeatureIterator( QgsMemoryProvider* p, const QgsFeatureRequest& request )
25-
: QgsAbstractFeatureIterator( request ), P( p ), mSelectRectGeom( NULL )
25+
: QgsAbstractFeatureIterator( request )
26+
, P( p )
27+
, mSelectRectGeom( 0 )
2628
{
27-
// make sure that only one iterator is active
28-
if ( P->mActiveIterator )
29-
{
30-
QgsMessageLog::logMessage( QObject::tr( "Already active iterator on this provider was closed." ), QObject::tr( "Memory provider" ) );
31-
P->mActiveIterator->close();
32-
}
33-
P->mActiveIterator = this;
29+
P->mActiveIterators << this;
3430

3531
if ( mRequest.filterType() == QgsFeatureRequest::FilterRect && mRequest.flags() & QgsFeatureRequest::ExactIntersect )
3632
{
@@ -181,12 +177,11 @@ bool QgsMemoryFeatureIterator::close()
181177
if ( mClosed )
182178
return false;
183179

180+
P->mActiveIterators.remove( this );
181+
184182
delete mSelectRectGeom;
185183
mSelectRectGeom = NULL;
186184

187-
// tell provider that this iterator is not active anymore
188-
P->mActiveIterator = 0;
189-
190185
mClosed = true;
191186
return true;
192187
}

‎src/providers/memory/qgsmemoryprovider.cpp

+7-4
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ static const QString TEXT_PROVIDER_DESCRIPTION = "Memory provider";
3232

3333
QgsMemoryProvider::QgsMemoryProvider( QString uri )
3434
: QgsVectorDataProvider( uri )
35-
, mSpatialIndex( NULL )
36-
, mActiveIterator( 0 )
35+
, mSpatialIndex( 0 )
3736
{
3837
// Initialize the geometry with the uri to support old style uri's
3938
// (ie, just 'point', 'line', 'polygon')
@@ -139,8 +138,12 @@ QgsMemoryProvider::QgsMemoryProvider( QString uri )
139138

140139
QgsMemoryProvider::~QgsMemoryProvider()
141140
{
142-
if ( mActiveIterator )
143-
mActiveIterator->close();
141+
while ( !mActiveIterators.empty() )
142+
{
143+
QgsMemoryFeatureIterator *it = *mActiveIterators.begin();
144+
QgsDebugMsg( "closing active iterator" );
145+
it->close();
146+
}
144147

145148
delete mSpatialIndex;
146149
}

‎src/providers/memory/qgsmemoryprovider.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,5 +169,5 @@ class QgsMemoryProvider : public QgsVectorDataProvider
169169
QgsSpatialIndex* mSpatialIndex;
170170

171171
friend class QgsMemoryFeatureIterator;
172-
QgsMemoryFeatureIterator* mActiveIterator;
172+
QSet< QgsMemoryFeatureIterator *> mActiveIterators;
173173
};

0 commit comments

Comments
 (0)
Please sign in to comment.