70 bool editingStarted =
true;
73 if ( !layer->isValid() )
75 editingStarted =
false;
76 QgsLogger::debug( tr(
"Can't start editing invalid layer '%1'." ).arg( layer->name() ) );
80 if ( !layer->dataProvider() )
82 editingStarted =
false;
83 QgsLogger::debug( tr(
"Can't start editing layer '%1' with invalid data provider." ).arg( layer->name() ) );
88 if ( !layer->supportsEditing() )
90 editingStarted =
false;
91 QgsLogger::debug( tr(
"Can't start editing. Layer '%1' doesn't support editing." ).arg( layer->name() ) );
95 if ( layer->editBuffer() )
98 layer->editBuffer()->setEditBufferGroup(
this );
103 emit layer->beforeEditingStarted();
104 layer->dataProvider()->enterUpdateMode();
105 layer->createEditBuffer();
106 layer->editBuffer()->setEditBufferGroup(
this );
107 layer->updateFields();
108 emit layer->editingStarted();
111 if ( ! editingStarted )
113 QStringList rollbackErrors;
114 if ( !
rollBack( rollbackErrors,
true ) )
115 QgsLogger::debug( tr(
"Can't rollback after start editing failure. Roll back detailed errors: %1" ).arg( rollbackErrors.join(
" / " ) ) );
118 mIsEditing = editingStarted;
126 const QSet<QgsVectorLayer *> constModifiedLayers =
modifiedLayers();
127 if ( constModifiedLayers.isEmpty() )
129 editingFinished( stopEditing );
130 mIsEditing = !stopEditing;
134 QMap<QString, QSet<QgsVectorLayer *> > connectionStringsLayers;
139 QList<QgsVectorLayer *> transactionLayers;
140 QList<std::shared_ptr<QgsTransaction> > openTransactions;
141 const QStringList connectionStrings = connectionStringsLayers.keys();
142 for (
const QString &connectionString : connectionStrings )
144 const QString providerKey = ( *connectionStringsLayers.value( connectionString ).begin() )->providerType();
146 std::shared_ptr<QgsTransaction> transaction;
150 commitErrors << tr(
"ERROR: data source '%1', is not available for transactions." ).arg( connectionString );
156 if ( ! transaction->begin( errorMsg ) )
158 commitErrors << tr(
"ERROR: could not start a transaction on data provider '%1', detailed error: '%2'." ).arg( providerKey, errorMsg );
163 const auto constLayers = connectionStringsLayers.value( connectionString );
166 if ( ! transaction->addLayer( layer,
true ) )
168 commitErrors << tr(
"ERROR: could not add layer '%1' to transaction on data provider '%2'." ).arg( layer->name(), providerKey );
173 transactionLayers.append( layer );
176 openTransactions.append( transaction );
183 const QList<QgsVectorLayer *> orderedLayers = orderLayersParentsToChildren( constModifiedLayers );
184 QList<QgsVectorLayer *>::const_iterator orderedLayersIterator;
189 for ( orderedLayersIterator = orderedLayers.constBegin(); orderedLayersIterator != orderedLayers.constEnd(); ++orderedLayersIterator )
191 if ( !( *orderedLayersIterator )->editBuffer() )
193 commitErrors << tr(
"ERROR: edit buffer of layer '%1' is not valid." ).arg( ( *orderedLayersIterator )->name() );
198 success = ( *orderedLayersIterator )->editBuffer()->commitChangesCheckGeometryTypeCompatibility( commitErrors );
204 QSet<QgsVectorLayer *> modifiedLayersOnProviderSide;
209 for ( orderedLayersIterator = orderedLayers.constBegin(); orderedLayersIterator != orderedLayers.constEnd(); ++orderedLayersIterator )
211 QgsFields oldFields = ( *orderedLayersIterator )->fields();
213 bool attributesDeleted =
false;
214 success = ( *orderedLayersIterator )->editBuffer()->commitChangesDeleteAttributes( attributesDeleted, commitErrors );
218 bool attributesRenamed =
false;
219 success = ( *orderedLayersIterator )->editBuffer()->commitChangesRenameAttributes( attributesRenamed, commitErrors );
223 bool attributesAdded =
false;
224 success = ( *orderedLayersIterator )->editBuffer()->commitChangesAddAttributes( attributesAdded, commitErrors );
228 if ( attributesDeleted || attributesRenamed || attributesAdded )
230 if ( ! transactionLayers.contains( ( *orderedLayersIterator ) ) )
231 modifiedLayersOnProviderSide.insert( ( *orderedLayersIterator ) );
233 success = ( *orderedLayersIterator )->editBuffer()->commitChangesCheckAttributesModifications( oldFields, commitErrors );
243 orderedLayersIterator = orderedLayers.constEnd();
244 while ( orderedLayersIterator != orderedLayers.constBegin() )
246 --orderedLayersIterator;
247 bool featuresDeleted;
248 success = ( *orderedLayersIterator )->editBuffer()->commitChangesDeleteFeatures( featuresDeleted, commitErrors );
252 if ( featuresDeleted && transactionLayers.contains( ( *orderedLayersIterator ) ) )
253 modifiedLayersOnProviderSide.insert( ( *orderedLayersIterator ) );
260 for ( orderedLayersIterator = orderedLayers.constBegin(); orderedLayersIterator != orderedLayers.constEnd(); ++orderedLayersIterator )
263 ( *orderedLayersIterator )->editBuffer()->commitChangesAddFeatures( featuresAdded, commitErrors );
267 if ( featuresAdded && transactionLayers.contains( ( *orderedLayersIterator ) ) )
268 modifiedLayersOnProviderSide.insert( ( *orderedLayersIterator ) );
275 orderedLayersIterator = orderedLayers.constEnd();
276 while ( orderedLayersIterator != orderedLayers.constBegin() )
278 --orderedLayersIterator;
280 bool attributesChanged;
281 success = ( *orderedLayersIterator )->editBuffer()->commitChangesChangeAttributes( attributesChanged, commitErrors );
285 if ( attributesChanged && transactionLayers.contains( ( *orderedLayersIterator ) ) )
286 modifiedLayersOnProviderSide.insert( ( *orderedLayersIterator ) );
293 QList<std::shared_ptr<QgsTransaction> >::iterator openTransactionsIterator = openTransactions.begin();
294 while ( openTransactionsIterator != openTransactions.end() )
297 if ( !( *openTransactionsIterator )->commit( errorMsg ) )
300 commitErrors << tr(
"ERROR: could not commit a transaction, detailed error: '%1'." ).arg( errorMsg );
304 modifiedLayersOnProviderSide += connectionStringsLayers.value( ( *openTransactionsIterator )->connectionString() );
305 openTransactionsIterator = openTransactions.erase( openTransactionsIterator );
313 if ( ! modifiedLayersOnProviderSide.isEmpty() )
315 if ( modifiedLayersOnProviderSide.size() == 1 )
316 commitErrors << tr(
"WARNING: changes to layer '%1' were already sent to data provider and cannot be rolled back." ).arg( ( *modifiedLayersOnProviderSide.begin() )->name() );
319 commitErrors << tr(
"WARNING: changes to following layers were already sent to data provider and cannot be rolled back:" );
320 for (
QgsVectorLayer *layer : std::as_const( modifiedLayersOnProviderSide ) )
321 commitErrors << tr(
"- '%1'" ).arg( layer->name() );
325 QString rollbackError;
326 for (
const std::shared_ptr<QgsTransaction> &transaction : openTransactions )
327 transaction->rollback( rollbackError );
332 editingFinished( stopEditing );
334 if ( success && stopEditing )
344 if ( ! layer->editBuffer() )
347 if ( !layer->dataProvider() )
349 rollbackErrors << tr(
"Layer '%1' doesn't have a valid data provider" ).arg( layer->name() );
353 bool rollbackExtent = !layer->editBuffer()->deletedFeatureIds().isEmpty() ||
354 !layer->editBuffer()->addedFeatures().isEmpty() ||
355 !layer->editBuffer()->changedGeometries().isEmpty();
357 emit layer->beforeRollBack();
359 layer->editBuffer()->rollBack();
361 emit layer->afterRollBack();
363 if ( layer->isModified() )
367 layer->undoStack()->setIndex( 0 );
370 layer->updateFields();
374 layer->clearEditBuffer();
375 layer->undoStack()->clear();
376 emit layer->editingStopped();
379 if ( rollbackExtent )
380 layer->updateExtents();
383 layer->dataProvider()->leaveUpdateMode();
385 layer->triggerRepaint();
388 mIsEditing = ! stopEditing;