2929 QgsFeatureSink ,
3030 QgsVectorLayerExporter ,
3131 QgsApplication ,
32- QgsProcessingUtils )
32+ QgsProcessingUtils ,
33+ QgsProcessingParameterFeatureSource ,
34+ QgsProcessingParameterVectorLayer ,
35+ QgsProcessingParameterField ,
36+ QgsProcessingParameterString ,
37+ QgsProcessingParameterBoolean ,
38+ QgsWkbTypes )
3339
3440from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
3541from processing .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
36- from processing .core .parameters import ParameterBoolean
37- from processing .core .parameters import ParameterVector
38- from processing .core .parameters import ParameterString
39- from processing .core .parameters import ParameterTableField
4042from processing .tools import spatialite
4143
4244
@@ -59,17 +61,17 @@ def group(self):
5961
6062 def __init__ (self ):
6163 super ().__init__ ()
62- self .addParameter (ParameterVector (self .INPUT , self .tr ('Layer to import' )))
63- self .addParameter (ParameterVector (self .DATABASE , self .tr ('File database' ), False , False ))
64- self .addParameter (ParameterString (self .TABLENAME , self .tr ('Table to import to (leave blank to use layer name)' ), optional = True ))
65- self .addParameter (ParameterTableField (self .PRIMARY_KEY , self .tr ('Primary key field' ), self .INPUT , optional = True ))
66- self .addParameter (ParameterString (self .GEOMETRY_COLUMN , self .tr ('Geometry column' ), 'geom' ))
67- self .addParameter (ParameterString (self .ENCODING , self .tr ('Encoding' ), 'UTF-8' , optional = True ))
68- self .addParameter (ParameterBoolean (self .OVERWRITE , self .tr ('Overwrite' ), True ))
69- self .addParameter (ParameterBoolean (self .CREATEINDEX , self .tr ('Create spatial index' ), True ))
70- self .addParameter (ParameterBoolean (self .LOWERCASE_NAMES , self .tr ('Convert field names to lowercase' ), True ))
71- self .addParameter (ParameterBoolean (self .DROP_STRING_LENGTH , self .tr ('Drop length constraints on character fields' ), False ))
72- self .addParameter (ParameterBoolean (self .FORCE_SINGLEPART , self .tr ('Create single-part geometries instead of multi-part' ), False ))
64+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT , self .tr ('Layer to import' )))
65+ self .addParameter (QgsProcessingParameterVectorLayer (self .DATABASE , self .tr ('File database' ), False , False ))
66+ self .addParameter (QgsProcessingParameterString (self .TABLENAME , self .tr ('Table to import to (leave blank to use layer name)' ), optional = True ))
67+ self .addParameter (QgsProcessingParameterField (self .PRIMARY_KEY , self .tr ('Primary key field' ), self .INPUT , optional = True ))
68+ self .addParameter (QgsProcessingParameterString (self .GEOMETRY_COLUMN , self .tr ('Geometry column' ), 'geom' ))
69+ self .addParameter (QgsProcessingParameterString (self .ENCODING , self .tr ('Encoding' ), 'UTF-8' , optional = True ))
70+ self .addParameter (QgsProcessingParameterBoolean (self .OVERWRITE , self .tr ('Overwrite' ), True ))
71+ self .addParameter (QgsProcessingParameterBoolean (self .CREATEINDEX , self .tr ('Create spatial index' ), True ))
72+ self .addParameter (QgsProcessingParameterBoolean (self .LOWERCASE_NAMES , self .tr ('Convert field names to lowercase' ), True ))
73+ self .addParameter (QgsProcessingParameterBoolean (self .DROP_STRING_LENGTH , self .tr ('Drop length constraints on character fields' ), False ))
74+ self .addParameter (QgsProcessingParameterBoolean (self .FORCE_SINGLEPART , self .tr ('Create single-part geometries instead of multi-part' ), False ))
7375
7476 def name (self ):
7577 return 'importintospatialite'
@@ -78,36 +80,37 @@ def displayName(self):
7880 return self .tr ('Import into Spatialite' )
7981
8082 def processAlgorithm (self , parameters , context , feedback ):
81- database = self .getParameterValue (self .DATABASE )
82- uri = QgsDataSourceUri (database )
83+ database = self .parameterAsVectorLayer (parameters , self .DATABASE , context )
84+ databaseuri = database .dataProvider ().dataSourceUri ()
85+ uri = QgsDataSourceUri (databaseuri )
8386 if uri .database () is '' :
84- if '|layerid' in database :
85- database = database [: database .find ('|layerid' )]
86- uri = QgsDataSourceUri ('dbname=\' %s\' ' % (database ))
87+ if '|layerid' in databaseuri :
88+ databaseuri = databaseuri [: databaseuri .find ('|layerid' )]
89+ uri = QgsDataSourceUri ('dbname=\' %s\' ' % (databaseuri ))
8790 db = spatialite .GeoDB (uri )
8891
89- overwrite = self .getParameterValue ( self .OVERWRITE )
90- createIndex = self .getParameterValue ( self .CREATEINDEX )
91- convertLowerCase = self .getParameterValue ( self .LOWERCASE_NAMES )
92- dropStringLength = self .getParameterValue ( self .DROP_STRING_LENGTH )
93- forceSinglePart = self .getParameterValue ( self .FORCE_SINGLEPART )
94- primaryKeyField = self .getParameterValue ( self .PRIMARY_KEY ) or 'id'
95- encoding = self .getParameterValue ( self .ENCODING )
92+ overwrite = self .parameterAsBool ( parameters , self .OVERWRITE , context )
93+ createIndex = self .parameterAsBool ( parameters , self .CREATEINDEX , context )
94+ convertLowerCase = self .parameterAsBool ( parameters , self .LOWERCASE_NAMES , context )
95+ dropStringLength = self .parameterAsBool ( parameters , self .DROP_STRING_LENGTH , context )
96+ forceSinglePart = self .parameterAsBool ( parameters , self .FORCE_SINGLEPART , context )
97+ primaryKeyField = self .parameterAsString ( parameters , self .PRIMARY_KEY , context ) or 'id'
98+ encoding = self .parameterAsString ( parameters , self .ENCODING , context )
9699
97- layerUri = self .getParameterValue (self .INPUT )
98- layer = QgsProcessingUtils .mapLayerFromString (layerUri , context )
100+ source = self .parameterAsSource (parameters , self .INPUT , context )
99101
100- table = self .getParameterValue ( self .TABLENAME )
102+ table = self .parameterAsString ( parameters , self .TABLENAME , context )
101103 if table :
102104 table .strip ()
103105 if not table or table == '' :
104- table = layer .name ()
106+ table = source .sourceName ()
107+ table = table .replace ('.' , '_' )
105108 table = table .replace (' ' , '' ).lower ()
106109 providerName = 'spatialite'
107110
108- geomColumn = self .getParameterValue ( self .GEOMETRY_COLUMN )
111+ geomColumn = self .parameterAsString ( parameters , self .GEOMETRY_COLUMN , context )
109112 if not geomColumn :
110- geomColumn = 'the_geom '
113+ geomColumn = 'geom '
111114
112115 options = {}
113116 if overwrite :
@@ -121,26 +124,39 @@ def processAlgorithm(self, parameters, context, feedback):
121124 options ['forceSinglePartGeometryType' ] = True
122125
123126 # Clear geometry column for non-geometry tables
124- if not layer . hasGeometryType () :
127+ if source . wkbType () == QgsWkbTypes . NoGeometry :
125128 geomColumn = None
126129
127130 uri = db .uri
128131 uri .setDataSource ('' , table , geomColumn , '' , primaryKeyField )
129132
130133 if encoding :
131- layer .setProviderEncoding (encoding )
132-
133- (ret , errMsg ) = QgsVectorLayerExporter .exportLayer (
134- layer ,
135- uri .uri (),
136- providerName ,
137- self .crs ,
138- False ,
139- options ,
140- )
141- if ret != 0 :
134+ options ['fileEncoding' ] = encoding
135+
136+ exporter = QgsVectorLayerExporter (uri .uri (), providerName , source .fields (),
137+ source .wkbType (), source .sourceCrs (), overwrite , options )
138+
139+ if exporter .errorCode () != QgsVectorLayerExporter .NoError :
140+ raise GeoAlgorithmExecutionException (
141+ self .tr ('Error importing to Spatialite\n {0}' ).format (exporter .errorMessage ()))
142+
143+ features = source .getFeatures ()
144+ total = 100.0 / source .featureCount () if source .featureCount () else 0
145+ for current , f in enumerate (features ):
146+ if feedback .isCanceled ():
147+ break
148+
149+ if not exporter .addFeature (f , QgsFeatureSink .FastInsert ):
150+ feedback .reportError (exporter .errorMessage ())
151+
152+ feedback .setProgress (int (current * total ))
153+
154+ exporter .flushBuffer ()
155+ if exporter .errorCode () != QgsVectorLayerExporter .NoError :
142156 raise GeoAlgorithmExecutionException (
143- self .tr ('Error importing to Spatialite\n {0}' ).format (errMsg ))
157+ self .tr ('Error importing to Spatialite\n {0}' ).format (exporter . errorMessage () ))
144158
145159 if geomColumn and createIndex :
146160 db .create_spatial_index (table , geomColumn )
161+
162+ return {}
0 commit comments