mirror of
https://github.com/qgis/QGIS.git
synced 2025-12-24 00:05:18 -05:00
[processing] Use core connections API for Spatialite algorithms instead
of Python reimplementation
This commit is contained in:
parent
2dc4329f19
commit
ba010f8803
@ -32,10 +32,12 @@ from qgis.core import (QgsDataSourceUri,
|
||||
QgsProcessingParameterField,
|
||||
QgsProcessingParameterString,
|
||||
QgsProcessingParameterBoolean,
|
||||
QgsWkbTypes)
|
||||
QgsWkbTypes,
|
||||
QgsProviderRegistry,
|
||||
QgsProviderConnectionException,
|
||||
QgsAbstractDatabaseProviderConnection)
|
||||
|
||||
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
|
||||
from processing.tools import spatialite
|
||||
|
||||
|
||||
class ImportIntoSpatialite(QgisAlgorithm):
|
||||
@ -98,6 +100,7 @@ class ImportIntoSpatialite(QgisAlgorithm):
|
||||
|
||||
def processAlgorithm(self, parameters, context, feedback):
|
||||
database = self.parameterAsVectorLayer(parameters, self.DATABASE, context)
|
||||
|
||||
databaseuri = database.dataProvider().dataSourceUri()
|
||||
uri = QgsDataSourceUri(databaseuri)
|
||||
if uri.database() is '':
|
||||
@ -106,7 +109,12 @@ class ImportIntoSpatialite(QgisAlgorithm):
|
||||
elif '|layerid' in databaseuri:
|
||||
databaseuri = databaseuri[:databaseuri.find('|layerid')]
|
||||
uri = QgsDataSourceUri('dbname=\'%s\'' % (databaseuri))
|
||||
db = spatialite.GeoDB(uri)
|
||||
|
||||
try:
|
||||
md = QgsProviderRegistry.instance().providerMetadata('spatialite')
|
||||
conn = md.createConnection(uri.uri(), {})
|
||||
except QgsProviderConnectionException:
|
||||
raise QgsProcessingException(self.tr('Could not connect to {}').format(uri.uri()))
|
||||
|
||||
overwrite = self.parameterAsBoolean(parameters, self.OVERWRITE, context)
|
||||
createIndex = self.parameterAsBoolean(parameters, self.CREATEINDEX, context)
|
||||
@ -148,7 +156,6 @@ class ImportIntoSpatialite(QgisAlgorithm):
|
||||
if source.wkbType() == QgsWkbTypes.NoGeometry:
|
||||
geomColumn = None
|
||||
|
||||
uri = db.uri
|
||||
uri.setDataSource('', table, geomColumn, '', primaryKeyField)
|
||||
|
||||
if encoding:
|
||||
@ -178,6 +185,11 @@ class ImportIntoSpatialite(QgisAlgorithm):
|
||||
self.tr('Error importing to Spatialite\n{0}').format(exporter.errorMessage()))
|
||||
|
||||
if geomColumn and createIndex:
|
||||
db.create_spatial_index(table, geomColumn)
|
||||
try:
|
||||
options = QgsAbstractDatabaseProviderConnection.SpatialIndexOptions()
|
||||
options.geometryColumnName = geomColumn
|
||||
conn.createSpatialIndex('', table, options)
|
||||
except QgsProviderConnectionException as e:
|
||||
raise QgsProcessingException(self.tr('Error creating spatial index:\n{0}').format(e))
|
||||
|
||||
return {}
|
||||
|
||||
@ -26,7 +26,9 @@ from qgis.core import (QgsDataSourceUri,
|
||||
QgsProcessingAlgorithm,
|
||||
QgsProcessingException,
|
||||
QgsProcessingParameterVectorLayer,
|
||||
QgsProcessingParameterString)
|
||||
QgsProcessingParameterString,
|
||||
QgsProviderRegistry,
|
||||
QgsProviderConnectionException)
|
||||
|
||||
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
|
||||
from processing.tools import spatialite
|
||||
@ -72,12 +74,17 @@ class SpatialiteExecuteSQL(QgisAlgorithm):
|
||||
elif '|layerid' in databaseuri:
|
||||
databaseuri = databaseuri[:databaseuri.find('|layerid')]
|
||||
uri = QgsDataSourceUri('dbname=\'%s\'' % (databaseuri))
|
||||
db = spatialite.GeoDB(uri)
|
||||
|
||||
try:
|
||||
md = QgsProviderRegistry.instance().providerMetadata('spatialite')
|
||||
conn = md.createConnection(uri.uri(), {})
|
||||
except QgsProviderConnectionException:
|
||||
raise QgsProcessingException(self.tr('Could not connect to {}').format(uri.uri()))
|
||||
|
||||
sql = self.parameterAsString(parameters, self.SQL, context).replace('\n', ' ')
|
||||
try:
|
||||
db._exec_sql_and_commit(str(sql))
|
||||
except spatialite.DbError as e:
|
||||
raise QgsProcessingException(
|
||||
self.tr('Error executing SQL:\n{0}').format(str(e)))
|
||||
conn.executeSql(sql)
|
||||
except QgsProviderConnectionException as e:
|
||||
raise QgsProcessingException(self.tr('Error executing SQL:\n{0}').format(e))
|
||||
|
||||
return {}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user