<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>