Skip to content

Commit 59ed19f

Browse files
committed
[OGR] Defer repacking while in explicit updateMode
1 parent 54ea029 commit 59ed19f

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

src/providers/ogr/qgsogrprovider.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,7 @@ QgsOgrProvider::QgsOgrProvider( QString const &uri )
428428
, mDynamicWriteAccess( false )
429429
, mShapefileMayBeCorrupted( false )
430430
, mUpdateModeStackDepth( 0 )
431+
, mDeferRepack( false )
431432
, mCapabilities( 0 )
432433
{
433434
QgsApplication::registerOgrDrivers();
@@ -1971,11 +1972,14 @@ bool QgsOgrProvider::doInitialActionsForEdition()
19711972
if ( !mValid )
19721973
return false;
19731974

1974-
if ( !mWriteAccess && mWriteAccessPossible && mDynamicWriteAccess )
1975+
// If mUpdateModeStackDepth > 0, it means that an updateMode is already active and that we have write access
1976+
if ( mUpdateModeStackDepth == 0 )
19751977
{
19761978
QgsDebugMsg( "Enter update mode implictly" );
19771979
if ( !enterUpdateMode() )
19781980
return false;
1981+
// For implicitly entered updateMode, don't defer repacking
1982+
mDeferRepack = false;
19791983
}
19801984

19811985
return true;
@@ -3416,10 +3420,13 @@ bool QgsOgrProvider::syncToDisc()
34163420
pushError( tr( "OGR error syncing to disk: %1" ).arg( CPLGetLastErrorMsg() ) );
34173421
}
34183422

3419-
if ( mShapefileMayBeCorrupted )
3420-
repack();
3423+
if ( !mDeferRepack )
3424+
{
3425+
if ( mShapefileMayBeCorrupted )
3426+
repack();
34213427

3422-
mShapefileMayBeCorrupted = false;
3428+
mShapefileMayBeCorrupted = false;
3429+
}
34233430

34243431
QgsOgrConnPool::instance()->ref( dataSourceUri() );
34253432
if ( shapeIndex )
@@ -3844,6 +3851,7 @@ bool QgsOgrProvider::enterUpdateMode()
38443851
}
38453852
}
38463853
++mUpdateModeStackDepth;
3854+
mDeferRepack = true;
38473855
return true;
38483856
}
38493857

@@ -3860,6 +3868,15 @@ bool QgsOgrProvider::leaveUpdateMode()
38603868
mUpdateModeStackDepth = 0;
38613869
return false;
38623870
}
3871+
if ( mDeferRepack && mUpdateModeStackDepth == 0 )
3872+
{
3873+
// Only repack once update mode is inactive
3874+
if ( mShapefileMayBeCorrupted )
3875+
repack();
3876+
3877+
mShapefileMayBeCorrupted = false;
3878+
mDeferRepack = false;
3879+
}
38633880
if ( !mDynamicWriteAccess )
38643881
{
38653882
return true;

src/providers/ogr/qgsogrprovider.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,8 @@ class QgsOgrProvider : public QgsVectorDataProvider
252252

253253
int mUpdateModeStackDepth;
254254

255+
bool mDeferRepack;
256+
255257
void computeCapabilities();
256258

257259
QgsVectorDataProvider::Capabilities mCapabilities;

tests/src/python/test_provider_shapefile.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,23 @@ def testDeleteShapes(self):
459459
# Test the content of the shapefile while it is still opened
460460
ds = osgeo.ogr.Open(datasource)
461461
# Test repacking has been done
462-
self.assertTrue(ds.GetLayer(0).GetFeatureCount(), feature_count - 1)
462+
self.assertTrue(ds.GetLayer(0).GetFeatureCount() == feature_count - 1)
463+
ds = None
464+
465+
# Delete another feature while in update mode
466+
self.assertTrue(2 == 2)
467+
vl.dataProvider().enterUpdateMode()
468+
vl.dataProvider().deleteFeatures([0])
469+
470+
# Test that repacking has not been done (since in update mode)
471+
ds = osgeo.ogr.Open(datasource)
472+
self.assertTrue(ds.GetLayer(0).GetFeatureCount() == feature_count - 1)
473+
ds = None
474+
475+
# Test that repacking was performed when leaving updateMode
476+
vl.dataProvider().leaveUpdateMode()
477+
ds = osgeo.ogr.Open(datasource)
478+
self.assertTrue(ds.GetLayer(0).GetFeatureCount() == feature_count - 2)
463479
ds = None
464480

465481
vl = None

0 commit comments

Comments
 (0)