Skip to content

Commit

Permalink
Make get_feature_by_id thread safe
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Dec 13, 2022
1 parent 2242f64 commit baf9cc4
Showing 1 changed file with 19 additions and 15 deletions.
34 changes: 19 additions & 15 deletions src/core/expression/qgsexpressionfunction.cpp
Expand Up @@ -5877,24 +5877,28 @@ static QVariant fcnTransformGeometry( const QVariantList &values, const QgsExpre

static QVariant fcnGetFeatureById( const QVariantList &values, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction * )
{
QVariant result;
QgsVectorLayer *vl = QgsExpressionUtils::getVectorLayer( values.at( 0 ), context, parent );
if ( vl )
std::unique_ptr<QgsVectorLayerFeatureSource> featureSource = QgsExpressionUtils::getFeatureSource( values.at( 0 ), context, parent );

//no layer found
if ( !featureSource )
{
QgsFeatureId fid = QgsExpressionUtils::getIntValue( values.at( 1 ), parent );
return QVariant();
}

QgsFeatureRequest req;
req.setFilterFid( fid );
req.setTimeout( 10000 );
req.setRequestMayBeNested( true );
if ( context )
req.setFeedback( context->feedback() );
QgsFeatureIterator fIt = vl->getFeatures( req );
const QgsFeatureId fid = QgsExpressionUtils::getIntValue( values.at( 1 ), parent );

QgsFeature fet;
if ( fIt.nextFeature( fet ) )
result = QVariant::fromValue( fet );
}
QgsFeatureRequest req;
req.setFilterFid( fid );
req.setTimeout( 10000 );
req.setRequestMayBeNested( true );
if ( context )
req.setFeedback( context->feedback() );
QgsFeatureIterator fIt = featureSource->getFeatures( req );

QgsFeature fet;
QVariant result;
if ( fIt.nextFeature( fet ) )
result = QVariant::fromValue( fet );

return result;
}
Expand Down

0 comments on commit baf9cc4

Please sign in to comment.