68 bool editingStarted =
true;
71 if ( !layer->isValid() )
73 editingStarted =
false;
74 QgsLogger::debug( tr(
"Can't start editing invalid layer '%1'." ).arg( layer->name() ) );
78 if ( !layer->dataProvider() )
80 editingStarted =
false;
81 QgsLogger::debug( tr(
"Can't start editing layer '%1' with invalid data provider." ).arg( layer->name() ) );
86 if ( !layer->supportsEditing() )
88 editingStarted =
false;
89 QgsLogger::debug( tr(
"Can't start editing. Layer '%1' doesn't support editing." ).arg( layer->name() ) );
93 if ( layer->editBuffer() )
96 layer->editBuffer()->setEditBufferGroup(
this );
101 emit layer->beforeEditingStarted();
102 layer->dataProvider()->enterUpdateMode();
103 layer->createEditBuffer();
104 layer->editBuffer()->setEditBufferGroup(
this );
105 layer->updateFields();
106 emit layer->editingStarted();
109 if ( !editingStarted )
111 QStringList rollbackErrors;
112 if ( !
rollBack( rollbackErrors,
true ) )
113 QgsLogger::debug( tr(
"Can't rollback after start editing failure. Roll back detailed errors: %1" ).arg( rollbackErrors.join(
" / " ) ) );
116 mIsEditing = editingStarted;
124 const QSet<QgsVectorLayer *> constModifiedLayers =
modifiedLayers();
126 if ( constModifiedLayers.isEmpty() )
128 editingFinished( stopEditing );
129 mIsEditing = !stopEditing;
136 emit modifiedLayer->beforeCommitChecks( stopEditing );
142 if ( !modifiedLayer->allowCommit() )
144 commitErrors << tr(
"ERROR: Commit not allowed because of failed checks." );
149 QMap<QString, QSet<QgsVectorLayer *> > connectionStringsLayers;
154 QList<QgsVectorLayer *> transactionLayers;
155 QList<std::shared_ptr<QgsTransaction> > openTransactions;
156 const QStringList connectionStrings = connectionStringsLayers.keys();
157 for (
const QString &connectionString : connectionStrings )
159 const QString providerKey = ( *connectionStringsLayers.value( connectionString ).begin() )->providerType();
161 std::shared_ptr<QgsTransaction> transaction;
165 commitErrors << tr(
"ERROR: data source '%1', is not available for transactions." ).arg( connectionString );
171 if ( !transaction->begin( errorMsg ) )
173 commitErrors << tr(
"ERROR: could not start a transaction on data provider '%1', detailed error: '%2'." ).arg( providerKey, errorMsg );
178 const auto constLayers = connectionStringsLayers.value( connectionString );
181 if ( !transaction->addLayer( layer,
true ) )
183 commitErrors << tr(
"ERROR: could not add layer '%1' to transaction on data provider '%2'." ).arg( layer->name(), providerKey );
188 transactionLayers.append( layer );
191 openTransactions.append( transaction );
198 const QList<QgsVectorLayer *> orderedLayers = orderLayersParentsToChildren( constModifiedLayers );
199 QList<QgsVectorLayer *>::const_iterator orderedLayersIterator;
204 for ( orderedLayersIterator = orderedLayers.constBegin(); orderedLayersIterator != orderedLayers.constEnd(); ++orderedLayersIterator )
206 if ( !( *orderedLayersIterator )->editBuffer() )
208 commitErrors << tr(
"ERROR: edit buffer of layer '%1' is not valid." ).arg( ( *orderedLayersIterator )->name() );
213 success = ( *orderedLayersIterator )->editBuffer()->commitChangesCheckGeometryTypeCompatibility( commitErrors );
219 QSet<QgsVectorLayer *> modifiedLayersOnProviderSide;
224 for ( orderedLayersIterator = orderedLayers.constBegin(); orderedLayersIterator != orderedLayers.constEnd(); ++orderedLayersIterator )
226 QgsFields oldFields = ( *orderedLayersIterator )->fields();
228 bool attributesDeleted =
false;
229 success = ( *orderedLayersIterator )->editBuffer()->commitChangesDeleteAttributes( attributesDeleted, commitErrors );
233 bool attributesRenamed =
false;
234 success = ( *orderedLayersIterator )->editBuffer()->commitChangesRenameAttributes( attributesRenamed, commitErrors );
238 bool attributesAdded =
false;
239 success = ( *orderedLayersIterator )->editBuffer()->commitChangesAddAttributes( attributesAdded, commitErrors );
243 if ( attributesDeleted || attributesRenamed || attributesAdded )
245 if ( !transactionLayers.contains( ( *orderedLayersIterator ) ) )
246 modifiedLayersOnProviderSide.insert( ( *orderedLayersIterator ) );
248 success = ( *orderedLayersIterator )->editBuffer()->commitChangesCheckAttributesModifications( oldFields, commitErrors );
258 orderedLayersIterator = orderedLayers.constEnd();
259 while ( orderedLayersIterator != orderedLayers.constBegin() )
261 --orderedLayersIterator;
262 bool featuresDeleted;
263 success = ( *orderedLayersIterator )->editBuffer()->commitChangesDeleteFeatures( featuresDeleted, commitErrors );
267 if ( featuresDeleted && transactionLayers.contains( ( *orderedLayersIterator ) ) )
268 modifiedLayersOnProviderSide.insert( ( *orderedLayersIterator ) );
275 for ( orderedLayersIterator = orderedLayers.constBegin(); orderedLayersIterator != orderedLayers.constEnd(); ++orderedLayersIterator )
278 success = ( *orderedLayersIterator )->editBuffer()->commitChangesAddFeatures( featuresAdded, commitErrors );
282 if ( featuresAdded && transactionLayers.contains( ( *orderedLayersIterator ) ) )
283 modifiedLayersOnProviderSide.insert( ( *orderedLayersIterator ) );
290 orderedLayersIterator = orderedLayers.constEnd();
291 while ( orderedLayersIterator != orderedLayers.constBegin() )
293 --orderedLayersIterator;
295 bool attributesChanged;
296 success = ( *orderedLayersIterator )->editBuffer()->commitChangesChangeAttributes( attributesChanged, commitErrors );
300 if ( attributesChanged && transactionLayers.contains( ( *orderedLayersIterator ) ) )
301 modifiedLayersOnProviderSide.insert( ( *orderedLayersIterator ) );
308 QList<std::shared_ptr<QgsTransaction> >::iterator openTransactionsIterator = openTransactions.begin();
309 while ( openTransactionsIterator != openTransactions.end() )
312 if ( !( *openTransactionsIterator )->commit( errorMsg ) )
315 commitErrors << tr(
"ERROR: could not commit a transaction, detailed error: '%1'." ).arg( errorMsg );
319 modifiedLayersOnProviderSide += connectionStringsLayers.value( ( *openTransactionsIterator )->connectionString() );
320 openTransactionsIterator = openTransactions.erase( openTransactionsIterator );
328 if ( !modifiedLayersOnProviderSide.isEmpty() )
330 if ( modifiedLayersOnProviderSide.size() == 1 )
331 commitErrors << tr(
"WARNING: changes to layer '%1' were already sent to data provider and cannot be rolled back." ).arg( ( *modifiedLayersOnProviderSide.begin() )->name() );
334 commitErrors << tr(
"WARNING: changes to following layers were already sent to data provider and cannot be rolled back:" );
335 for (
QgsVectorLayer *layer : std::as_const( modifiedLayersOnProviderSide ) )
336 commitErrors << tr(
"- '%1'" ).arg( layer->name() );
340 QString rollbackError;
341 for (
const std::shared_ptr<QgsTransaction> &transaction : openTransactions )
342 transaction->rollback( rollbackError );
347 editingFinished( stopEditing );
349 if ( success && stopEditing )
359 if ( !layer->editBuffer() )
362 if ( !layer->dataProvider() )
364 rollbackErrors << tr(
"Layer '%1' doesn't have a valid data provider" ).arg( layer->name() );
368 bool rollbackExtent = !layer->editBuffer()->deletedFeatureIds().isEmpty() || !layer->editBuffer()->addedFeatures().isEmpty() || !layer->editBuffer()->changedGeometries().isEmpty();
370 emit layer->beforeRollBack();
372 layer->editBuffer()->rollBack();
374 emit layer->afterRollBack();
376 if ( layer->isModified() )
380 layer->undoStack()->setIndex( 0 );
383 layer->updateFields();
387 layer->clearEditBuffer();
388 layer->undoStack()->clear();
389 emit layer->editingStopped();
392 if ( rollbackExtent )
393 layer->updateExtents();
396 layer->dataProvider()->leaveUpdateMode();
398 layer->triggerRepaint();
401 mIsEditing = !stopEditing;