Skip to content

Commit bf82454

Browse files
committed
cache sublayer feature counts and don't retrieve expensive ones (fixes #5322)
1 parent 75dad1b commit bf82454

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

src/providers/ogr/qgsogrprovider.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -456,18 +456,22 @@ QString QgsOgrProvider::subsetString()
456456

457457
QStringList QgsOgrProvider::subLayers() const
458458
{
459-
QStringList theList = QStringList();
460459
if ( !valid )
461460
{
462-
return theList;
461+
return QStringList();
463462
}
464463

464+
if ( !mSubLayerList.isEmpty() )
465+
return mSubLayerList;
466+
465467
for ( unsigned int i = 0; i < layerCount() ; i++ )
466468
{
467-
QString theLayerName = FROM8( OGR_FD_GetName( OGR_L_GetLayerDefn( OGR_DS_GetLayer( ogrDataSource, i ) ) ) );
468-
OGRwkbGeometryType layerGeomType = OGR_FD_GetGeomType( OGR_L_GetLayerDefn( OGR_DS_GetLayer( ogrDataSource, i ) ) );
469+
OGRLayerH layer = OGR_DS_GetLayer( ogrDataSource, i );
470+
OGRFeatureDefnH fdef = OGR_L_GetLayerDefn( layer );
471+
QString theLayerName = FROM8( OGR_FD_GetName( fdef ) );
472+
OGRwkbGeometryType layerGeomType = OGR_FD_GetGeomType( fdef );
469473

470-
int theLayerFeatureCount = OGR_L_GetFeatureCount( OGR_DS_GetLayer( ogrDataSource, i ), 1 ) ;
474+
int theLayerFeatureCount = OGR_L_GetFeatureCount( layer, 0 );
471475

472476
QString geom;
473477
switch ( layerGeomType )
@@ -486,11 +490,13 @@ QStringList QgsOgrProvider::subLayers() const
486490
case wkbMultiPoint25D: geom = "MultiPoint25D"; break;
487491
case wkbMultiLineString25D: geom = "MultiLineString25D"; break;
488492
case wkbMultiPolygon25D: geom = "MultiPolygon25D"; break;
489-
default: geom="Unknown WKB: " + QString::number( layerGeomType );
493+
default: geom = QString( "Unknown WKB: %1" ).arg( layerGeomType );
490494
}
491-
theList.append( QString::number( i ) + ":" + theLayerName + ":" + QString::number( theLayerFeatureCount ) + ":" + geom );
495+
496+
mSubLayerList << QString( "%1:%2:%3:%4" ).arg( i ).arg( theLayerName ).arg( theLayerFeatureCount ).arg( geom );
492497
}
493-
return theList;
498+
499+
return mSubLayerList;
494500
}
495501

496502
void QgsOgrProvider::setEncoding( const QString& e )

src/providers/ogr/qgsogrprovider.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,8 @@ class QgsOgrProvider : public QgsVectorDataProvider
338338
int geomType;
339339
long featuresCounted;
340340

341+
mutable QStringList mSubLayerList;
342+
341343
/** Flag whether OGR will return fields required by nextFeature() calls.
342344
The relevant fields are first set in select(), however the setting may be
343345
interferred by some other calls. This flag ensures they are set again

0 commit comments

Comments
 (0)