Skip to content

Commit a725dae

Browse files
authored
Merge pull request #5288 from manisandro/defer_repack_v2
[OGR] Pass AUTO_REPACK=OFF when opening datasets for non-implicit update modes
2 parents 1e60213 + 7eb2475 commit a725dae

File tree

4 files changed

+26
-18
lines changed

4 files changed

+26
-18
lines changed

src/providers/ogr/qgsogrdataitems.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ QgsOgrLayerItem::QgsOgrLayerItem( QgsDataItem *parent,
5454

5555
OGRRegisterAll();
5656
GDALDriverH hDriver;
57-
GDALDatasetH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( mPath.toUtf8().constData(), true, &hDriver );
57+
GDALDatasetH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( mPath.toUtf8().constData(), true, false, &hDriver );
5858

5959
if ( hDataSource )
6060
{
@@ -408,7 +408,7 @@ QVector<QgsDataItem *> QgsOgrDataCollectionItem::createChildren()
408408
QVector<QgsDataItem *> children;
409409

410410
GDALDriverH hDriver;
411-
GDALDatasetH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( mPath.toUtf8().constData(), false, &hDriver );
411+
GDALDatasetH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( mPath.toUtf8().constData(), false, false, &hDriver );
412412
if ( !hDataSource )
413413
return children;
414414
int numLayers = GDALDatasetGetLayerCount( hDataSource );
@@ -639,7 +639,7 @@ QGISEXTERN QgsDataItem *dataItem( QString path, QgsDataItem *parentItem )
639639
// do not print errors, but write to debug
640640
CPLPushErrorHandler( CPLQuietErrorHandler );
641641
CPLErrorReset();
642-
OGRDataSourceH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( path.toUtf8().constData(), false, &hDriver );
642+
OGRDataSourceH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( path.toUtf8().constData(), false, false, &hDriver );
643643
CPLPopErrorHandler();
644644

645645
if ( ! hDataSource )

src/providers/ogr/qgsogrprovider.cpp

+18-12
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ void QgsOgrProvider::repack()
171171
GDALClose( mGDALDataset );
172172
ogrLayer = ogrOrigLayer = nullptr;
173173
174-
mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), true, nullptr );
174+
mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), true, false, nullptr );
175175
if ( mGDALDataset )
176176
{
177177
if ( mLayerName.isNull() )
@@ -1963,10 +1963,8 @@ bool QgsOgrProvider::doInitialActionsForEdition()
19631963
if ( mUpdateModeStackDepth == 0 )
19641964
{
19651965
QgsDebugMsg( "Enter update mode implictly" );
1966-
if ( !enterUpdateMode() )
1966+
if ( !_enterUpdateMode( true ) )
19671967
return false;
1968-
// For implicitly entered updateMode, don't defer repacking
1969-
mDeferRepack = false;
19701968
}
19711969

19721970
return true;
@@ -3169,7 +3167,7 @@ void QgsOgrProvider::forceReload()
31693167
QgsOgrConnPool::instance()->invalidateConnections( dataSourceUri() );
31703168
}
31713169

3172-
GDALDatasetH QgsOgrProviderUtils::GDALOpenWrapper( const char *pszPath, bool bUpdate, GDALDriverH *phDriver )
3170+
GDALDatasetH QgsOgrProviderUtils::GDALOpenWrapper( const char *pszPath, bool bUpdate, bool bDisableReapck, GDALDriverH *phDriver )
31733171
{
31743172
CPLErrorReset();
31753173

@@ -3196,6 +3194,10 @@ GDALDatasetH QgsOgrProviderUtils::GDALOpenWrapper( const char *pszPath, bool bUp
31963194
papszOpenOptions = CSLSetNameValue( papszOpenOptions, "FORCE_SRS_DETECTION", "YES" );
31973195
}
31983196
}
3197+
if ( bDisableReapck )
3198+
{
3199+
papszOpenOptions = CSLSetNameValue( papszOpenOptions, "AUTO_REPACK", "OFF" );
3200+
}
31993201

32003202
const int nOpenFlags = GDAL_OF_VECTOR | ( bUpdate ? GDAL_OF_UPDATE : 0 );
32013203
GDALDatasetH hDS = GDALOpenEx( pszPath, nOpenFlags, nullptr, papszOpenOptions, nullptr );
@@ -3407,13 +3409,16 @@ bool QgsOgrProvider::syncToDisc()
34073409
pushError( tr( "OGR error syncing to disk: %1" ).arg( CPLGetLastErrorMsg() ) );
34083410
}
34093411

3412+
// Repack is done automatically on OGR_L_SyncToDisk with gdal-2.2.0+
3413+
#if !defined(GDAL_VERSION_NUM) || GDAL_VERSION_NUM < 2020000
34103414
if ( !mDeferRepack )
34113415
{
34123416
if ( mShapefileMayBeCorrupted )
34133417
repack();
34143418

34153419
mShapefileMayBeCorrupted = false;
34163420
}
3421+
#endif
34173422

34183423
QgsOgrConnPool::instance()->ref( dataSourceUri() );
34193424
if ( shapeIndex )
@@ -3643,7 +3648,7 @@ void QgsOgrProvider::open( OpenMode mode )
36433648
// on network shares
36443649
CPLSetThreadLocalConfigOption( "OGR_SQLITE_JOURNAL", "WAL" );
36453650
}
3646-
mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), true, &mGDALDriver );
3651+
mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), true, mode == OpenModeForceUpdateRepackOff, &mGDALDriver );
36473652
CPLSetThreadLocalConfigOption( "OGR_SQLITE_JOURNAL", nullptr );
36483653
}
36493654

@@ -3662,7 +3667,7 @@ void QgsOgrProvider::open( OpenMode mode )
36623667
}
36633668

36643669
// try to open read-only
3665-
mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), false, &mGDALDriver );
3670+
mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), false, false, &mGDALDriver );
36663671
}
36673672

36683673
if ( mGDALDataset )
@@ -3741,7 +3746,7 @@ void QgsOgrProvider::open( OpenMode mode )
37413746
}
37423747
#endif
37433748

3744-
mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), false, &mGDALDriver );
3749+
mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), false, false, &mGDALDriver );
37453750

37463751
mWriteAccess = false;
37473752

@@ -3813,7 +3818,7 @@ void QgsOgrProvider::reloadData()
38133818
pushError( tr( "Cannot reopen datasource %1" ).arg( dataSourceUri() ) );
38143819
}
38153820

3816-
bool QgsOgrProvider::enterUpdateMode()
3821+
bool QgsOgrProvider::_enterUpdateMode( bool implicit )
38173822
{
38183823
if ( !mWriteAccessPossible )
38193824
{
@@ -3829,7 +3834,7 @@ bool QgsOgrProvider::enterUpdateMode()
38293834
Q_ASSERT( mDynamicWriteAccess );
38303835
QgsDebugMsg( QString( "Reopening %1 in update mode" ).arg( dataSourceUri() ) );
38313836
close();
3832-
open( OpenModeForceUpdate );
3837+
open( implicit ? OpenModeForceUpdate : OpenModeForceUpdateRepackOff );
38333838
if ( !mGDALDataset || !mWriteAccess )
38343839
{
38353840
QgsMessageLog::logMessage( tr( "Cannot reopen datasource %1 in update mode" ).arg( dataSourceUri() ), tr( "OGR" ) );
@@ -3838,7 +3843,8 @@ bool QgsOgrProvider::enterUpdateMode()
38383843
}
38393844
}
38403845
++mUpdateModeStackDepth;
3841-
mDeferRepack = true;
3846+
// For implicitly entered updateMode, don't defer repacking
3847+
mDeferRepack = !implicit;
38423848
return true;
38433849
}
38443850

@@ -3911,7 +3917,7 @@ GDALDatasetH LoadDataSourceAndLayer( const QString &uri,
39113917
subsetString,
39123918
ogrGeometryType );
39133919

3914-
GDALDatasetH hDS = QgsOgrProviderUtils::GDALOpenWrapper( filePath.toUtf8().constData(), true, nullptr );
3920+
GDALDatasetH hDS = QgsOgrProviderUtils::GDALOpenWrapper( filePath.toUtf8().constData(), true, false, nullptr );
39153921
if ( !hDS )
39163922
{
39173923
QgsDebugMsg( "Connection to database failed.." );

src/providers/ogr/qgsogrprovider.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class QgsOgrProvider : public QgsVectorDataProvider
8989
virtual bool createAttributeIndex( int field ) override;
9090
virtual QgsVectorDataProvider::Capabilities capabilities() const override;
9191
virtual void setEncoding( const QString &e ) override;
92-
virtual bool enterUpdateMode() override;
92+
virtual bool enterUpdateMode() override { return _enterUpdateMode(); }
9393
virtual bool leaveUpdateMode() override;
9494
virtual bool isSaveAndLoadStyleToDatabaseSupported() const override;
9595
QString fileVectorFilters() const override;
@@ -158,11 +158,14 @@ class QgsOgrProvider : public QgsVectorDataProvider
158158
OpenModeSameAsCurrent,
159159
OpenModeForceReadOnly,
160160
OpenModeForceUpdate,
161+
OpenModeForceUpdateRepackOff
161162
};
162163

163164
void open( OpenMode mode );
164165
void close();
165166

167+
bool _enterUpdateMode( bool implicit = false );
168+
166169
private:
167170
unsigned char *getGeometryPointer( OGRFeatureH fet );
168171
QString ogrWkbGeometryTypeName( OGRwkbGeometryType type ) const;
@@ -273,7 +276,7 @@ class QgsOgrProviderUtils
273276
*/
274277
static QString quotedValue( const QVariant &value );
275278

276-
static GDALDatasetH GDALOpenWrapper( const char *pszPath, bool bUpdate, GDALDriverH *phDriver );
279+
static GDALDatasetH GDALOpenWrapper( const char *pszPath, bool bUpdate, bool bDisableReapck, GDALDriverH *phDriver );
277280
static void GDALCloseWrapper( GDALDatasetH mhDS );
278281
};
279282

tests/src/python/test_provider_shapefile.py

-1
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,6 @@ def testDeleteGeometry(self):
435435
fet = next(vl.getFeatures())
436436
self.assertFalse(fet.hasGeometry())
437437

438-
@unittest.skipIf(os.environ.get('TRAVIS', '') == 'true', 'Fails with GDAL 2.2')
439438
def testDeleteShapes(self):
440439
''' Test fix for #11007 '''
441440

0 commit comments

Comments
 (0)