Skip to content

Commit 3b34458

Browse files
committedJun 23, 2021
Respect FastScan flag in gdal provider
1 parent 2b384ce commit 3b34458

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed
 

‎src/core/providers/gdal/qgsgdalprovider.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3553,7 +3553,7 @@ QgsProviderMetadata::ProviderCapabilities QgsGdalProviderMetadata::providerCapab
35533553
return FileBasedUris;
35543554
}
35553555

3556-
QList<QgsProviderSublayerDetails> QgsGdalProviderMetadata::querySublayers( const QString &uri, Qgis::SublayerQueryFlags, QgsFeedback * ) const
3556+
QList<QgsProviderSublayerDetails> QgsGdalProviderMetadata::querySublayers( const QString &uri, Qgis::SublayerQueryFlags flags, QgsFeedback * ) const
35573557
{
35583558
gdal::dataset_unique_ptr dataset;
35593559

@@ -3571,6 +3571,36 @@ QList<QgsProviderSublayerDetails> QgsGdalProviderMetadata::querySublayers( const
35713571
gdalUri = vsiPrefix + gdalUri;
35723572
}
35733573

3574+
if ( flags & Qgis::SublayerQueryFlag::FastScan )
3575+
{
3576+
// filter based on extension
3577+
const QVariantMap uriParts = decodeUri( uri );
3578+
const QString path = uriParts.value( QStringLiteral( "path" ) ).toString();
3579+
QFileInfo info( path );
3580+
if ( info.isFile() )
3581+
{
3582+
const QString suffix = info.suffix().toLower();
3583+
3584+
static QString sFilterString;
3585+
static QStringList sExtensions;
3586+
static QStringList sWildcards;
3587+
3588+
// get supported extensions
3589+
static std::once_flag initialized;
3590+
std::call_once( initialized, [ = ]
3591+
{
3592+
buildSupportedRasterFileFilterAndExtensions( sFilterString, sExtensions, sWildcards );
3593+
QgsDebugMsgLevel( QStringLiteral( "extensions: " ) + sExtensions.join( ' ' ), 2 );
3594+
QgsDebugMsgLevel( QStringLiteral( "wildcards: " ) + sWildcards.join( ' ' ), 2 );
3595+
} );
3596+
3597+
if ( !sExtensions.contains( suffix ) )
3598+
{
3599+
return {};
3600+
}
3601+
}
3602+
}
3603+
35743604
dataset.reset( QgsGdalProviderBase::gdalOpen( gdalUri, GDAL_OF_READONLY ) );
35753605
if ( !dataset )
35763606
{

‎tests/src/core/testqgsgdalprovider.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,8 @@ void TestQgsGdalProvider::testGdalProviderQuerySublayers()
428428
// not a raster
429429
res = gdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/lines.shp" );
430430
QVERIFY( res.empty() );
431+
res = gdalMetadata->querySublayers( QString( TEST_DATA_DIR ) + "/lines.shp", Qgis::SublayerQueryFlag::FastScan );
432+
QVERIFY( res.empty() );
431433

432434
// single layer raster
433435
res = gdalMetadata->querySublayers( QStringLiteral( TEST_DATA_DIR ) + "/landsat.tif" );
@@ -463,6 +465,8 @@ void TestQgsGdalProvider::testGdalProviderQuerySublayers()
463465
QCOMPARE( res.at( 1 ).type(), QgsMapLayerType::RasterLayer );
464466
rl.reset( qgis::down_cast< QgsRasterLayer * >( res.at( 1 ).toLayer( options ) ) );
465467
QVERIFY( rl->isValid() );
468+
res = gdalMetadata->querySublayers( QStringLiteral( TEST_DATA_DIR ) + "/mixed_layers.gpkg", Qgis::SublayerQueryFlag::FastScan );
469+
QCOMPARE( res.count(), 2 );
466470

467471
// netcdf file
468472
res = gdalMetadata->querySublayers( QStringLiteral( TEST_DATA_DIR ) + "/mesh/trap_steady_05_3D.nc" );
@@ -483,6 +487,9 @@ void TestQgsGdalProvider::testGdalProviderQuerySublayers()
483487
QCOMPARE( res.at( 1 ).type(), QgsMapLayerType::RasterLayer );
484488
rl.reset( qgis::down_cast< QgsRasterLayer * >( res.at( 1 ).toLayer( options ) ) );
485489
QVERIFY( rl->isValid() );
490+
491+
res = gdalMetadata->querySublayers( QStringLiteral( TEST_DATA_DIR ) + "/mesh/trap_steady_05_3D.nc", Qgis::SublayerQueryFlag::FastScan );
492+
QCOMPARE( res.count(), 8 );
486493
}
487494

488495
QGSTEST_MAIN( TestQgsGdalProvider )

0 commit comments

Comments
 (0)
Please sign in to comment.