Skip to content

Commit 7603f3e

Browse files
committedApr 25, 2013
Fixes bug #7688
1 parent 17dea1a commit 7603f3e

File tree

3 files changed

+544
-207
lines changed

3 files changed

+544
-207
lines changed
 

‎src/core/qgsvectorlayerfeatureiterator.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,12 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayer* la
3838
// prepare list of attributes to match provider fields
3939
QgsAttributeList providerSubset;
4040
QgsAttributeList subset = mProviderRequest.subsetOfAttributes();
41+
const QgsFields &pendingFields = L->pendingFields();
42+
int nPendingFields = pendingFields.count();
4143
for ( int i = 0; i < subset.count(); ++i )
4244
{
4345
int attrIndex = subset[i];
46+
if( attrIndex < 0 || attrIndex >= nPendingFields ) continue;
4447
if ( L->pendingFields().fieldOrigin( attrIndex ) == QgsFields::OriginProvider )
4548
providerSubset << L->pendingFields().fieldOriginIndex( attrIndex );
4649
}

‎src/providers/delimitedtext/qgsdelimitedtextfeatureiterator.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,11 @@ bool QgsDelimitedTextFeatureIterator::nextFeature( QgsFeature& feature )
5353
while ( true )
5454
{
5555
QgsDelimitedTextFile::Status status = P->mFile->nextRecord( tokens );
56-
int fid = P->mFile->recordLineNumber();
5756
if ( status == QgsDelimitedTextFile::RecordEOF ) break;
5857
if ( status != QgsDelimitedTextFile::RecordOk ) continue;
58+
59+
int fid = P->mFile->recordLineNumber();
60+
if( mRequest.filterType() == QgsFeatureRequest::FilterFid && fid != mRequest.filterFid()) continue;
5961
if ( P->recordIsEmpty( tokens ) ) continue;
6062

6163
while ( tokens.size() < P->mFieldCount )
@@ -98,8 +100,6 @@ bool QgsDelimitedTextFeatureIterator::nextFeature( QgsFeature& feature )
98100
for ( QgsAttributeList::const_iterator i = attrs.begin(); i != attrs.end(); ++i )
99101
{
100102
int fieldIdx = *i;
101-
if ( fieldIdx < 0 || fieldIdx >= P->attributeColumns.count() )
102-
continue; // ignore non-existant fields
103103
fetchAttribute( feature, fieldIdx, tokens );
104104
}
105105
}
@@ -209,7 +209,10 @@ bool QgsDelimitedTextFeatureIterator::boundsCheck( QgsGeometry *geom )
209209

210210
void QgsDelimitedTextFeatureIterator::fetchAttribute( QgsFeature& feature, int fieldIdx, const QStringList& tokens )
211211
{
212-
const QString &value = tokens[P->attributeColumns[fieldIdx]];
212+
if( fieldIdx < 0 || fieldIdx >= P->attributeColumns.count()) return;
213+
int column = P->attributeColumns[fieldIdx];
214+
if( column < 0 || column >= tokens.count()) return;
215+
const QString &value = tokens[column];
213216
QVariant val;
214217
switch ( P->attributeFields[fieldIdx].type() )
215218
{

‎tests/src/python/test_qgsdelimitedtextprovider.py

Lines changed: 534 additions & 203 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)
Please sign in to comment.