Geopackage: fix crash when deleting raster layers

This commit is contained in:
Alessandro Pasotti 2017-08-21 22:43:16 +02:00
parent f867b65cd2
commit 4d3c7e558b

View File

@ -577,7 +577,7 @@ bool QgsGeoPackageRasterLayerItem::executeDeleteLayer( QString &errCause )
else else
{ {
// Remove table // Remove table
char *errmsg = NULL; char *errmsg = nullptr;
char *sql = sqlite3_mprintf( char *sql = sqlite3_mprintf(
"DROP table %w;" "DROP table %w;"
"DELETE FROM gpkg_contents WHERE table_name = '%q';" "DELETE FROM gpkg_contents WHERE table_name = '%q';"
@ -596,20 +596,21 @@ bool QgsGeoPackageRasterLayerItem::executeDeleteLayer( QString &errCause )
); );
sqlite3_free( sql ); sqlite3_free( sql );
// Remove from optional tables, may silently fail // Remove from optional tables, may silently fail
for ( const auto tableName : QStringList() QStringList optionalTables;
<< QStringLiteral( "gpkg_extensions" ) optionalTables << QStringLiteral( "gpkg_extensions" )
<< QStringLiteral( "gpkg_metadata_reference" ) ) << QStringLiteral( "gpkg_metadata_reference" );
for ( const auto tableName : optionalTables )
{ {
char *sql = sqlite3_mprintf( "DELETE FROM table %w WHERE table_name = '%q", char *sql = sqlite3_mprintf( "DELETE FROM table %w WHERE table_name = '%q",
tableName.toUtf8().constData(), tableName.toUtf8().constData(),
layerName.toUtf8().constData() ); layerName.toUtf8().constData() );
status = sqlite3_exec( sqlite3_exec(
handle, /* An open database */ handle, /* An open database */
sql, /* SQL to be evaluated */ sql, /* SQL to be evaluated */
NULL, /* Callback function */ NULL, /* Callback function */
NULL, /* 1st argument to callback */ NULL, /* 1st argument to callback */
NULL /* Error msg written here */ NULL /* Error msg written here */
); );
sqlite3_free( sql ); sqlite3_free( sql );
} }
if ( status == SQLITE_OK ) if ( status == SQLITE_OK )
@ -618,9 +619,9 @@ bool QgsGeoPackageRasterLayerItem::executeDeleteLayer( QString &errCause )
} }
else else
{ {
errCause = tr( "There was an error deleting the layer: %1" ).arg( errmsg ); errCause = tr( "There was an error deleting the layer: %1" ).arg( QString::fromUtf8( errmsg ) );
sqlite3_free( errmsg );
} }
sqlite3_free( errmsg );
} }
sqlite3_close( handle ); sqlite3_close( handle );
} }