From b0b068d4cce2f39fb6b2cf2fc2817acb3b5f7576 Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Mon, 11 Mar 2019 15:04:00 +0000 Subject: [PATCH] [db-manager] Invalidate sqlite connection if it was created in another thread Fixes #21028 - DB manager: SQLite objects created in a thread can only be used in that same thread --- .../db_manager/db_plugins/gpkg/connector.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/python/plugins/db_manager/db_plugins/gpkg/connector.py b/python/plugins/db_manager/db_plugins/gpkg/connector.py index a73af66ed37..8deef653c25 100644 --- a/python/plugins/db_manager/db_plugins/gpkg/connector.py +++ b/python/plugins/db_manager/db_plugins/gpkg/connector.py @@ -25,6 +25,7 @@ from builtins import str from functools import cmp_to_key from qgis.PyQt.QtWidgets import QApplication +from qgis.PyQt.QtCore import QThread from ..connector import DBConnector from ..plugin import ConnectionError, DbError, Table @@ -63,6 +64,26 @@ class GPKGDBConnector(DBConnector): raise ConnectionError(QApplication.translate("DBManagerPlugin", '"{0}" not found').format(self.dbname)) self.has_raster = self.gdal_ds.RasterCount != 0 or self.gdal_ds.GetMetadata('SUBDATASETS') is not None self.connection = None + self._current_thread = None + + @property + def connection(self): + """Creates and returns a spatialite connection, if + the existing connection was created in another thread + invalidates it and create a new one. + """ + + if self._connection is None or self._current_thread != int(QThread.currentThreadId()): + self._current_thread = int(QThread.currentThreadId()) + try: + self._connection = spatialite_connect(str(self.dbname)) + except self.connection_error_types() as e: + raise ConnectionError(e) + return self._connection + + @connection.setter + def connection(self, conn): + self._connection = conn def unquoteId(self, quotedId): if len(quotedId) <= 2 or quotedId[0] != '"' or quotedId[len(quotedId) - 1] != '"':