Skip to content

Commit 9d90923

Browse files
committed
[BUGFIX] 10638 WFS GetFeature may be incomplete if layer reports estimated feature count
layer->featureCount() sometimes returns an estimated feature count. In this case, the WFS server returns an incomplete reply (if called without maxfeatures). To make QgsWFSServer::getFeature a bit more robust, it's better to do not take account of layer->featureCount() and use while ( fit.nextFeature( feature ) && ( featureCounter < maxFeat || maxFeatures == -1 ) )
1 parent 2a4684a commit 9d90923

File tree

1 file changed

+7
-13
lines changed

1 file changed

+7
-13
lines changed

src/mapserver/qgswfsserver.cpp

+7-13
Original file line numberDiff line numberDiff line change
@@ -492,9 +492,6 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
492492
, searchRect.yMaximum() + 0.000001 );
493493
layerCrs = layer->crs();
494494

495-
if ( maxFeatures == -1 )
496-
maxFeat += layer->featureCount();
497-
498495
QgsFeatureIterator fit = layer->getFeatures(
499496
QgsFeatureRequest()
500497
.setFlags( QgsFeatureRequest::ExactIntersect | ( mWithGeom ? QgsFeatureRequest::NoFlags : QgsFeatureRequest::NoGeometry ) )
@@ -563,7 +560,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
563560
req.setSubsetOfAttributes( attrIndexes );
564561

565562
QgsFeatureIterator fit = layer->getFeatures( req );
566-
while ( fit.nextFeature( feature ) && featureCounter < maxFeat )
563+
while ( fit.nextFeature( feature ) && (maxFeatures == -1 || featureCounter < maxFeat) )
567564
{
568565
if ( featureCounter == 0 )
569566
startGetFeature( request, format, layerCrs, &searchRect );
@@ -582,7 +579,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
582579
{
583580
throw QgsMapServiceException( "RequestNotWellFormed", mFilter->parserErrorString() );
584581
}
585-
while ( fit.nextFeature( feature ) && featureCounter < maxFeat )
582+
while ( fit.nextFeature( feature ) && (maxFeatures == -1 || featureCounter < maxFeat) )
586583
{
587584
QVariant res = mFilter->evaluate( &feature, fields );
588585
if ( mFilter->hasEvalError() )
@@ -604,7 +601,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
604601
}
605602
else
606603
{
607-
while ( fit.nextFeature( feature ) && featureCounter < maxFeat )
604+
while ( fit.nextFeature( feature ) && (maxFeatures == -1 || featureCounter < maxFeat) )
608605
{
609606
if ( featureCounter == 0 )
610607
startGetFeature( request, format, layerCrs, &searchRect );
@@ -820,9 +817,6 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
820817
}
821818
}
822819

823-
if ( maxFeatures == -1 )
824-
maxFeat += layer->featureCount();
825-
826820
if ( bboxOk )
827821
searchRect.set( minx, miny, maxx, maxy );
828822
else
@@ -883,7 +877,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
883877
{
884878
throw QgsMapServiceException( "RequestNotWellFormed", QString( "Expression filter error message: %1." ).arg( mFilter->parserErrorString() ) );
885879
}
886-
while ( fit.nextFeature( feature ) && featureCounter < maxFeat )
880+
while ( fit.nextFeature( feature ) && (maxFeatures == -1 || featureCounter < maxFeat) )
887881
{
888882
QVariant res = mFilter->evaluate( &feature, fields );
889883
if ( mFilter->hasEvalError() )
@@ -964,7 +958,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
964958
req.setSubsetOfAttributes( attrIndexes );
965959

966960
QgsFeatureIterator fit = layer->getFeatures( req );
967-
while ( fit.nextFeature( feature ) && featureCounter < maxFeat )
961+
while ( fit.nextFeature( feature ) && (maxFeatures == -1 || featureCounter < maxFeat) )
968962
{
969963
if ( featureCounter == 0 )
970964
startGetFeature( request, format, layerCrs, &searchRect );
@@ -1002,7 +996,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1002996
}
1003997
req.setSubsetOfAttributes( attrIndexes );
1004998
QgsFeatureIterator fit = layer->getFeatures( req );
1005-
while ( fit.nextFeature( feature ) && featureCounter < maxFeat )
999+
while ( fit.nextFeature( feature ) && (maxFeatures == -1 || featureCounter < maxFeat) )
10061000
{
10071001
QVariant res = mFilter->evaluate( &feature, fields );
10081002
if ( mFilter->hasEvalError() )
@@ -1045,7 +1039,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
10451039
}
10461040
req.setSubsetOfAttributes( attrIndexes );
10471041
QgsFeatureIterator fit = layer->getFeatures( req );
1048-
while ( fit.nextFeature( feature ) && featureCounter < maxFeat )
1042+
while ( fit.nextFeature( feature ) && (maxFeatures == -1 || featureCounter < maxFeat) )
10491043
{
10501044
mErrors << QString( "The feature %2 of layer for the TypeName '%1'" ).arg( tnStr ).arg( featureCounter );
10511045
if ( featureCounter == 0 )

0 commit comments

Comments
 (0)