@@ -578,6 +578,8 @@ QGISEXTERN QgsDataItem *dataItem( QString path, QgsDataItem *parentItem )
578
578
// TODO: add more OGR supported multiple layers formats here!
579
579
QStringList ogrSupportedDbLayersExtensions;
580
580
ogrSupportedDbLayersExtensions << QLatin1String ( " gpkg" ) << QLatin1String ( " sqlite" ) << QLatin1String ( " db" );
581
+ QStringList ogrSupportedDbDriverNames;
582
+ ogrSupportedDbDriverNames << QLatin1String ( " GPKG" ) << QLatin1String ( " db" );
581
583
582
584
// Fast track: return item without testing if:
583
585
// scanExtSetting or zipfile and scan zip == "Basic scan"
@@ -624,13 +626,16 @@ QGISEXTERN QgsDataItem *dataItem( QString path, QgsDataItem *parentItem )
624
626
return item;
625
627
}
626
628
629
+ // Slow track: scan file contents
630
+ QgsDataItem *item = nullptr ;
631
+
627
632
// test that file is valid with OGR
628
633
OGRRegisterAll ();
629
- GDALDriverH hDriver;
634
+ OGRSFDriverH hDriver;
630
635
// do not print errors, but write to debug
631
636
CPLPushErrorHandler ( CPLQuietErrorHandler );
632
637
CPLErrorReset ();
633
- GDALDatasetH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper ( path.toUtf8 ().constData (), false , &hDriver );
638
+ OGRDataSourceH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper ( path.toUtf8 ().constData (), false , &hDriver );
634
639
CPLPopErrorHandler ();
635
640
636
641
if ( ! hDataSource )
@@ -639,26 +644,24 @@ QGISEXTERN QgsDataItem *dataItem( QString path, QgsDataItem *parentItem )
639
644
return nullptr ;
640
645
}
641
646
642
- QgsDebugMsgLevel ( QString ( " GDAL Driver : %1" ).arg ( GDALGetDriverShortName ( hDriver ) ), 2 );
643
-
644
- QgsDataItem *item = nullptr ;
645
-
647
+ QgsDebugMsgLevel ( QString ( " GDAL Driver : %1" ).arg ( OGR_Dr_GetName ( hDriver ) ), 2 );
648
+ QString ogrDriverName = OGR_Dr_GetName ( hDriver );
646
649
int numLayers = OGR_DS_GetLayerCount ( hDataSource );
647
- if ( numLayers == 1 )
650
+
651
+ // GeoPackage needs a specialized data item, mainly because of raster deletion not
652
+ // yet implemented in GDAL (2.2.1)
653
+ if ( ogrDriverName == QLatin1String ( " GPKG" ) )
648
654
{
649
- QgsDebugMsgLevel ( QString ( " using name = %1" ).arg ( name ), 2 );
650
- item = dataItemForLayer ( parentItem, name, path, hDataSource, 0 );
655
+ item = new QgsGeoPackageCollectionItem ( parentItem, name, path );
651
656
}
652
- else if ( numLayers > 1 )
657
+ else if ( numLayers > 1 || ogrSupportedDbDriverNames. contains ( ogrDriverName ) )
653
658
{
654
- QgsDebugMsgLevel ( QString ( " using name = %1" ).arg ( name ), 2 );
655
659
item = new QgsOgrDataCollectionItem ( parentItem, name, path );
656
660
}
657
- else if ( suffix. compare ( QLatin1String ( " gpkg " ), Qt::CaseInsensitive ) == 0 )
661
+ else
658
662
{
659
- item = new QgsGeoPackageCollectionItem ( parentItem, name, path );
663
+ item = dataItemForLayer ( parentItem, name, path, hDataSource, 0 );
660
664
}
661
-
662
- GDALClose ( hDataSource );
665
+ OGR_DS_Destroy ( hDataSource );
663
666
return item;
664
667
}
0 commit comments