<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<p>Hi Alessandro,</p>
<p>This problem also applies to editing multiple layers in parallel
(especially with foreign keys), that was one of the drivers to
introduce transaction editing.</p>
<p>For individual layers, I think we can keep track of all the
changes in the local edit buffer. For issue 16935, I think the
order wouldn't actually change much, it would still fail, just in
a different order? One thing there is, the commands could be sent
in a single transaction (which doesn't necessarily need to be
managed by QgsTransaction).</p>
<p>On the other hand, I think splitFeature should be using
QgsVectorLayer.createFeature() which should take care of unique
constraints detected on the provider. If I'm not mistaken, this
works fine on postgres, possibly there's an issue with unique
constraint detection in sqlite based providers?</p>
<p>Cheers</p>
<p>Matthias<br>
</p>
<br>
<div class="moz-cite-prefix">On 11/20/2017 01:02 PM, Alessandro
Pasotti wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CAL5Q6708Q=FL1+zCNXgk084TQ5WmrzxWbosSDQV9qH0n9kLh+w@mail.gmail.com">
<div dir="ltr">
<div>
<div>Hi,<br>
<br>
</div>
I'm facing a bug [1] that led me to a potential issue in the
editing buffer implementation: when commitChanges is called,
different operations (change geometry, change attrs, add
features, delete features ...) are grouped and executed in a
fixed order.<br>
<br>
</div>
So, if I wanted for example insert a feature and (after the
insert has been successful)<br>
<div>change the geometry of another feature I cannot do that
because all geometry editing operations are grouped and
executed before all the insert feature operations are executed
[2]<br>
</div>
<div><br>
</div>
<div>This issue can lead to data loss in several scenarios, one
is the bug I'm working on here but there are more: for example
when you want to merge features you cannot delete features
after you have successfully created the merged one, just
because all delete operations are performed before the insert
ones.</div>
<div><br>
</div>
<div>I guess that by grouping related commands together we
probably wanted to make it easier to optimize the operations
in the back-end.<br>
</div>
<div><br>
</div>
<div>Wrapping the commitChanges into transactions would help
with DB-like backends that support it (I think that the
implementation is not yet completed), but I'm still convinced
that the order of edit commands within an editing buffer
should be respected (that does not mean that certain commands
cannot be grouped if the programmer choose to do so).</div>
<div><br>
</div>
<div>I'd like to hear your opinion about the possible solutions
to this problem.<br>
</div>
<div><br>
<br>
[1] <a href="https://issues.qgis.org/issues/16935"
moz-do-not-send="true">https://issues.qgis.org/issues/16935</a></div>
<div>[2] <a
href="https://github.com/qgis/QGIS/blob/master/src/core/qgsvectorlayereditbuffer.cpp#L300"
moz-do-not-send="true">https://github.com/qgis/QGIS/blob/master/src/core/qgsvectorlayereditbuffer.cpp#L300</a></div>
<div><br clear="all">
<div>
<div><br>
-- <br>
<div class="gmail_signature">Alessandro Pasotti<br>
w3: <a href="http://www.itopen.it" target="_blank"
moz-do-not-send="true">www.itopen.it</a></div>
</div>
</div>
</div>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
QGIS-Developer mailing list
<a class="moz-txt-link-abbreviated" href="mailto:QGIS-Developer@lists.osgeo.org">QGIS-Developer@lists.osgeo.org</a>
List info: <a class="moz-txt-link-freetext" href="https://lists.osgeo.org/mailman/listinfo/qgis-developer">https://lists.osgeo.org/mailman/listinfo/qgis-developer</a>
Unsubscribe: <a class="moz-txt-link-freetext" href="https://lists.osgeo.org/mailman/listinfo/qgis-developer">https://lists.osgeo.org/mailman/listinfo/qgis-developer</a></pre>
</blockquote>
<br>
</body>
</html>