diff --git a/python/plugins/db_manager/db_plugins/gpkg/connector.py b/python/plugins/db_manager/db_plugins/gpkg/connector.py index 11cae39e9d7..aab38584e46 100644 --- a/python/plugins/db_manager/db_plugins/gpkg/connector.py +++ b/python/plugins/db_manager/db_plugins/gpkg/connector.py @@ -165,6 +165,10 @@ class GPKGDBConnector(DBConnector): self._rollback() raise DbError(e) + def cancel(self): + if self.connection: + self.connection.interrupt() + @classmethod def isValidDatabase(cls, path): if hasattr(gdal, 'OpenEx'): diff --git a/python/plugins/db_manager/db_plugins/gpkg/data_model.py b/python/plugins/db_manager/db_plugins/gpkg/data_model.py index f5f5af06e31..5e6774d5527 100644 --- a/python/plugins/db_manager/db_plugins/gpkg/data_model.py +++ b/python/plugins/db_manager/db_plugins/gpkg/data_model.py @@ -20,7 +20,13 @@ email : brush.tyler@gmail.com ***************************************************************************/ """ -from ..data_model import TableDataModel, SqlResultModel +from qgis.core import QgsMessageLog + +from ..data_model import (TableDataModel, + SqlResultModel, + SqlResultModelAsync, + SqlResultModelTask) +from ..plugin import BaseError class GPKGTableDataModel(TableDataModel): @@ -47,5 +53,34 @@ class GPKGTableDataModel(TableDataModel): return self.fetchedCount +class GPKGSqlResultModelTask(SqlResultModelTask): + + def __init__(self, db, sql, parent): + SqlResultModelTask.__init__(self, db, sql, parent) + + def run(self): + try: + self.model = GPKGSqlResultModel(self.db, self.sql, None) + except BaseError as e: + self.error = e + QgsMessageLog.logMessage(e.msg) + return False + return True + + def cancel(self): + self.db.connector.cancel() + SqlResultModelTask.cancel(self) + + +class GPKGSqlResultModelAsync(SqlResultModelAsync): + + def __init__(self, db, sql, parent): + SqlResultModelAsync.__init__(self) + + self.task = GPKGSqlResultModelTask(db, sql, parent) + self.task.taskCompleted.connect(self.modelDone) + self.task.taskTerminated.connect(self.modelDone) + + class GPKGSqlResultModel(SqlResultModel): pass diff --git a/python/plugins/db_manager/db_plugins/gpkg/plugin.py b/python/plugins/db_manager/db_plugins/gpkg/plugin.py index 32fcd4e0dcc..0a452e41475 100644 --- a/python/plugins/db_manager/db_plugins/gpkg/plugin.py +++ b/python/plugins/db_manager/db_plugins/gpkg/plugin.py @@ -132,6 +132,11 @@ class GPKGDatabase(Database): return GPKGSqlResultModel(self, sql, parent) + def sqlResultModelAsync(self, sql, parent): + from .data_model import GPKGSqlResultModelAsync + + return GPKGSqlResultModelAsync(self, sql, parent) + def registerDatabaseActions(self, mainWindow): action = QAction(self.tr("Run &Vacuum"), self) mainWindow.registerAction(action, self.tr("&Database"), self.runVacuumActionSlot)