bool QgsOgrFeatureIterator::fetchFeature( QgsFeature& feature ) { feature.setValid( false ); if ( mClosed || !ogrLayer ) return false; if ( mRequest.filterType() == QgsFeatureRequest::FilterFid ) { bool result = fetchFeatureWithId( mRequest.filterFid(), feature ); close(); // the feature has been read or was not found: we have finished here return result; } else if ( mRequest.filterType() == QgsFeatureRequest::FilterFids ) { while ( mFilterFidsIt != mFilterFids.constEnd() ) { QgsFeatureId nextId = *mFilterFidsIt; mFilterFidsIt++; if ( fetchFeatureWithId( nextId, feature ) ) return true; } close(); return false; } OGRFeatureH fet; while (( fet = OGR_L_GetNextFeature( ogrLayer ) ) ) { if ( !readFeature( fet, feature ) ) continue; else OGR_F_Destroy( fet ); if ( !mRequest.filterRect().isNull() && !feature.hasGeometry() ) continue; // we have a feature, end this cycle feature.setValid( true ); return true; } // while close(); return false; }
bool QgsOgrFeatureIterator::fetchFeature( QgsFeature &feature ) { QMutexLocker locker( mSharedDS ? &mSharedDS->mutex() : nullptr ); feature.setValid( false ); if ( mClosed || !mOgrLayer ) return false; if ( mRequest.filterType() == QgsFeatureRequest::FilterFid ) { bool result = fetchFeatureWithId( mRequest.filterFid(), feature ); close(); // the feature has been read or was not found: we have finished here return result; } else if ( mRequest.filterType() == QgsFeatureRequest::FilterFids ) { while ( mFilterFidsIt != mFilterFids.end() ) { QgsFeatureId nextId = *mFilterFidsIt; ++mFilterFidsIt; if ( fetchFeatureWithId( nextId, feature ) ) return true; } close(); return false; } gdal::ogr_feature_unique_ptr fet; // OSM layers (especially large ones) need the GDALDataset::GetNextFeature() call rather than OGRLayer::GetNextFeature() // see more details here: https://trac.osgeo.org/gdal/wiki/rfc66_randomlayerreadwrite #if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(2,2,0) if ( !QgsOgrProviderUtils::canDriverShareSameDatasetAmongLayers( mSource->mDriverName ) ) { OGRLayerH nextFeatureBelongingLayer; while ( fet.reset( GDALDatasetGetNextFeature( mConn->ds, &nextFeatureBelongingLayer, nullptr, nullptr, nullptr ) ), fet ) { if ( nextFeatureBelongingLayer == mOgrLayer && checkFeature( fet, feature ) ) { return true; } } } else #endif { while ( fet.reset( OGR_L_GetNextFeature( mOgrLayer ) ), fet ) { if ( checkFeature( fet, feature ) ) { return true; } } } close(); return false; }