[QGIS-Developer] QGIS/OGR: FeatureIds reassigned on write to data provider?

Sandro Mani manisandro at gmail.com
Wed Sep 20 08:32:27 PDT 2017


On 19.09.2017 19:15, Even Rouault wrote:
>
> On mardi 19 septembre 2017 18:30:50 CEST Sandro Mani wrote:
>
> > On 11.07.2017 14:31, Even Rouault wrote:
>
> > > We could potentially imagine to defer the repacking at
>
> > > leaveUpdateMode() time, actually in the close() method which is called
>
> > > when the reference counter of the update mode drops to zero (*),
>
> > > instead of doing it at the end of each operation.
>
> >
>
> > To come back to this, I was looking at moving replack() to close(), but
>
> > noticed that syncToDisc() has the logic "for shapefiles, remove spatial
>
> > index files and create a new index" which calls close. And syncToDisk is
>
> > still called after every change. So should syncToDisk be also moved to
>
> > close(), or at least blocked if an updateMode is active?
>
> >
>
> Yes that would probably make sense to block syncToDisk() while in 
> updateMode (so when mUpdateModeStackDepth > 0), but probably only if 
> enterUpdateMode() is called by QgsVectorLayer::startEditing(), and not 
> when called implicitly by doInitialActionsForEdition(), which might be 
> the case if someone directly works at the provider level
>
> bool QgsOgrProvider::doInitialActionsForEdition()
>
> {
>
> if ( !mValid )
>
> return false;
>
> if ( !mWriteAccess && mWriteAccessPossible && mDynamicWriteAccess )
>
> {
>
> QgsDebugMsg( "Enter update mode implictly" );
>
> if ( !enterUpdateMode() )
>
> return false;
>
> }
>
> return true;
>
> }
>
> So probably a mImplicitUpdateMode flag should be set above near the 
> QgsDebugMsg(), and the check to decide whether we can defer 
> syncToDisk() would be ( !mImplicitUpdateMode && mUpdateModeStackDepth > 0)
>
Hm but will that flag never be cleared again once set? Since AFAICT a 
there is no leaveUpdateMode matching the enterUpdateMode called by 
doInitialActionsForEdition.

As I understand, the approach to do changes with stable ids would be to 
first enterUpdateMode, then perform the changes, then leaveUpdateMode, 
at which point the changes are synced and the dataset repacked. With the 
mImplicitUpdateMode flag, if anyone worked directly at provider level 
before you come along, deferring syncToDisk would never happen since the 
mImplicitUpdateMode was set and remains set.

Sandro
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-developer/attachments/20170920/dc9edc29/attachment.html>


More information about the QGIS-Developer mailing list