Skip to content

Commit 449c9ce

Browse files
committed
Better thread safety in package layers alg
1 parent 2d64437 commit 449c9ce

2 files changed

Lines changed: 19 additions & 6 deletions

File tree

src/analysis/processing/qgsalgorithmpackage.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,16 @@ QgsPackageAlgorithm *QgsPackageAlgorithm::createInstance() const
6868
return new QgsPackageAlgorithm();
6969
}
7070

71+
bool QgsPackageAlgorithm::prepareAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback * )
72+
{
73+
const QList< QgsMapLayer * > layers = parameterAsLayerList( parameters, QStringLiteral( "LAYERS" ), context );
74+
for ( QgsMapLayer *layer : layers )
75+
{
76+
mLayers.emplace_back( layer->clone() );
77+
}
78+
return true;
79+
}
80+
7181
QVariantMap QgsPackageAlgorithm::processAlgorithm( const QVariantMap &parameters, QgsProcessingContext &context, QgsProcessingFeedback *feedback )
7282
{
7383
const bool overwrite = parameterAsBoolean( parameters, QStringLiteral( "OVERWRITE" ), context );
@@ -97,22 +107,19 @@ QVariantMap QgsPackageAlgorithm::processAlgorithm( const QVariantMap &parameters
97107
throw QgsProcessingException( QObject::tr( "Creation of database failed (OGR error: %1)" ).arg( QString::fromUtf8( CPLGetLastErrorMsg() ) ) );
98108

99109
bool errored = false;
100-
const QList< QgsMapLayer * > layers = parameterAsLayerList( parameters, QStringLiteral( "LAYERS" ), context );
101110

102-
QgsProcessingMultiStepFeedback multiStepFeedback( layers.count(), feedback );
111+
QgsProcessingMultiStepFeedback multiStepFeedback( mLayers.size(), feedback );
103112

104113
QStringList outputLayers;
105114
int i = 0;
106-
for ( QgsMapLayer *layer : layers )
115+
for ( const auto &layer : mLayers )
107116
{
108117
if ( feedback->isCanceled() )
109118
break;
110119

111120
multiStepFeedback.setCurrentStep( i );
112121
i++;
113122

114-
feedback->pushInfo( QObject::tr( "Packaging layer %1/%2: %3" ).arg( i ).arg( layers.count() ).arg( layer ? layer->name() : QString() ) );
115-
116123
if ( !layer )
117124
{
118125
// don't throw immediately - instead do what we can and error out later
@@ -121,11 +128,13 @@ QVariantMap QgsPackageAlgorithm::processAlgorithm( const QVariantMap &parameters
121128
continue;
122129
}
123130

131+
feedback->pushInfo( QObject::tr( "Packaging layer %1/%2: %3" ).arg( i ).arg( mLayers.size() ).arg( layer ? layer->name() : QString() ) );
132+
124133
switch ( layer->type() )
125134
{
126135
case QgsMapLayerType::VectorLayer:
127136
{
128-
if ( !packageVectorLayer( qobject_cast< QgsVectorLayer * >( layer ), packagePath,
137+
if ( !packageVectorLayer( qobject_cast< QgsVectorLayer * >( layer.get() ), packagePath,
129138
context, &multiStepFeedback, saveStyles ) )
130139
errored = true;
131140
else

src/analysis/processing/qgsalgorithmpackage.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,17 @@ class QgsPackageAlgorithm : public QgsProcessingAlgorithm
4747

4848
protected:
4949

50+
bool prepareAlgorithm( const QVariantMap &parameters,
51+
QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
5052
QVariantMap processAlgorithm( const QVariantMap &parameters,
5153
QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;
5254

5355
private:
5456

5557
bool packageVectorLayer( QgsVectorLayer *layer, const QString &path, QgsProcessingContext &context, QgsProcessingFeedback *feedback, bool saveStyles );
5658

59+
std::vector< std::unique_ptr< QgsMapLayer> > mLayers;
60+
5761
};
5862

5963
///@endcond PRIVATE

0 commit comments

Comments
 (0)