Skip to content

Commit b51cb21

Browse files
committedSep 21, 2018
GPKG Browser VACUUM menu item
Fixes #19895 - Garbage-collection is not performed after deletion of vector layer from geopackage By design, VACUUM (being a potentially time-consuming operation) was automatically performed only after deleting a raster while when deleting a vector layer it was not executed. This commit adds a menu item in the browser that allows the user to perform this operation on the DB.
1 parent 1b2d885 commit b51cb21

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed
 

‎src/providers/ogr/qgsgeopackagedataitems.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,44 @@ bool QgsGeoPackageCollectionItem::deleteGeoPackageRasterLayer( const QString &ur
469469
return result;
470470
}
471471

472+
void QgsGeoPackageCollectionItem::vacuumGeoPackageDb()
473+
{
474+
QString errCause;
475+
// Better safe than sorry
476+
if ( ! mPath.isEmpty( ) )
477+
{
478+
char *errmsg = nullptr;
479+
sqlite3_database_unique_ptr database;
480+
int status = database.open_v2( mPath, SQLITE_OPEN_READWRITE, nullptr );
481+
if ( status != SQLITE_OK )
482+
{
483+
errCause = sqlite3_errmsg( database.get() );
484+
}
485+
else
486+
{
487+
( void )sqlite3_exec(
488+
database.get(), /* An open database */
489+
"VACUUM", /* SQL to be evaluated */
490+
nullptr, /* Callback function */
491+
nullptr, /* 1st argument to callback */
492+
&errmsg /* Error msg written here */
493+
);
494+
}
495+
if ( status == SQLITE_OK && ! errmsg )
496+
{
497+
QMessageBox::information( nullptr, tr( "Database compact (VACUUM)" ), tr( "Database <b>%1</b> has been compacted successfully." ).arg( mName ) );
498+
}
499+
else
500+
{
501+
errCause = tr( "There was an error compacting (VACUUM) the database <b>%1</b>: %2" )
502+
.arg( mName )
503+
.arg( QString::fromUtf8( errmsg ) );
504+
QMessageBox::warning( nullptr, tr( "Database compact (VACUUM)" ), errCause );
505+
}
506+
sqlite3_free( errmsg );
507+
}
508+
}
509+
472510
QgsGeoPackageConnectionItem::QgsGeoPackageConnectionItem( QgsDataItem *parent, const QString &name, const QString &path )
473511
: QgsGeoPackageCollectionItem( parent, name, path )
474512
{
@@ -500,6 +538,11 @@ QList<QAction *> QgsGeoPackageConnectionItem::actions( QWidget *parent )
500538
connect( actionAddTable, &QAction::triggered, this, &QgsGeoPackageConnectionItem::addTable );
501539
lst.append( actionAddTable );
502540

541+
// Run VACUUM
542+
QAction *actionVacuumDb = new QAction( tr( "Compact database (VACUUM)" ), parent );
543+
connect( actionVacuumDb, &QAction::triggered, this, &QgsGeoPackageConnectionItem::vacuumGeoPackageDb );
544+
lst.append( actionVacuumDb );
545+
503546

504547
return lst;
505548
}

‎src/providers/ogr/qgsgeopackagedataitems.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,18 @@ class QgsGeoPackageCollectionItem : public QgsDataCollectionItem
8888
//! Returns the layer type from \a geometryType
8989
static QgsLayerItem::LayerType layerTypeFromDb( const QString &geometryType );
9090

91-
//! Delete a geopackage layer
91+
//! Deletes a geopackage layer
9292
static bool deleteGeoPackageRasterLayer( const QString &uri, QString &errCause );
9393

94+
95+
9496
public slots:
9597
#ifdef HAVE_GUI
9698
void addTable();
9799
void addConnection();
98100
void deleteConnection();
101+
//! Compacts (VACUUM) a geopackage database
102+
void vacuumGeoPackageDb();
99103
#endif
100104

101105
protected:

0 commit comments

Comments
 (0)
Please sign in to comment.