Skip to content

Commit 5a9067e

Browse files
pblottierenyalldawson
authored andcommittedOct 7, 2018
Fixes #19826 - Use subset layer to manage fid
1 parent 2b71c9c commit 5a9067e

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed
 

‎src/providers/ogr/qgsogrfeatureiterator.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource *source, bool
4444
, mFilterFids( mRequest.filterFids() )
4545
, mFilterFidsIt( mFilterFids.constBegin() )
4646
, mSharedDS( source->mSharedDS )
47+
, mFirstFieldIsFid( source->mFirstFieldIsFid )
48+
, mFieldsWithoutFid( source->mFieldsWithoutFid )
4749
{
4850
// Since connection timeout for OGR connections is problematic and can lead to crashes, disable for now.
4951
mRequest.setTimeout( -1 );
@@ -82,6 +84,15 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource *source, bool
8284
mOgrOrigLayer = mOgrLayer;
8385
mOgrLayerWithFid = QgsOgrProviderUtils::setSubsetString( mOgrLayer, mConn->ds, mSource->mEncoding, QString(), true, &mOrigFidAdded );
8486
mOgrLayer = QgsOgrProviderUtils::setSubsetString( mOgrLayer, mConn->ds, mSource->mEncoding, mSource->mSubsetString, true, &mOrigFidAdded );
87+
88+
OGRFeatureDefnH fdef = OGR_L_GetLayerDefn( mOgrLayer );
89+
QByteArray fidColumn( OGR_L_GetFIDColumn( mOgrLayer ) );
90+
mFirstFieldIsFid = !fidColumn.isEmpty() && OGR_FD_GetFieldIndex( fdef, fidColumn ) < 0;
91+
92+
mFieldsWithoutFid.clear();
93+
for ( int i = ( mFirstFieldIsFid ) ? 1 : 0; i < mSource->mFields.size(); i++ )
94+
mFieldsWithoutFid.append( mSource->mFields.at( i ) );
95+
8596
if ( !mOgrLayer )
8697
{
8798
close();
@@ -404,15 +415,15 @@ bool QgsOgrFeatureIterator::close()
404415

405416
void QgsOgrFeatureIterator::getFeatureAttribute( OGRFeatureH ogrFet, QgsFeature &f, int attindex ) const
406417
{
407-
if ( mSource->mFirstFieldIsFid && attindex == 0 )
418+
if ( mFirstFieldIsFid && attindex == 0 )
408419
{
409420
f.setAttribute( 0, static_cast<qint64>( OGR_F_GetFID( ogrFet ) ) );
410421
return;
411422
}
412423

413-
int attindexWithoutFid = ( mSource->mFirstFieldIsFid ) ? attindex - 1 : attindex;
424+
int attindexWithoutFid = ( mFirstFieldIsFid ) ? attindex - 1 : attindex;
414425
bool ok = false;
415-
QVariant value = QgsOgrUtils::getOgrFeatureAttribute( ogrFet, mSource->mFieldsWithoutFid, attindexWithoutFid, mSource->mEncoding, &ok );
426+
QVariant value = QgsOgrUtils::getOgrFeatureAttribute( ogrFet, mFieldsWithoutFid, attindexWithoutFid, mSource->mEncoding, &ok );
416427
if ( !ok )
417428
return;
418429

‎src/providers/ogr/qgsogrfeatureiterator.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@ class QgsOgrFeatureIterator : public QgsAbstractFeatureIteratorFromSource<QgsOgr
9696
QgsCoordinateTransform mTransform;
9797
QgsOgrDatasetSharedPtr mSharedDS = nullptr;
9898

99+
bool mFirstFieldIsFid = false;
100+
QgsFields mFieldsWithoutFid;
101+
99102
bool fetchFeatureWithId( QgsFeatureId id, QgsFeature &feature ) const;
100103
};
101104

0 commit comments

Comments
 (0)
Please sign in to comment.