@@ -171,7 +171,7 @@ void QgsOgrProvider::repack()
171
171
GDALClose( mGDALDataset );
172
172
ogrLayer = ogrOrigLayer = nullptr;
173
173
174
- mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), true, nullptr );
174
+ mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), true, false, nullptr );
175
175
if ( mGDALDataset )
176
176
{
177
177
if ( mLayerName.isNull() )
@@ -1963,10 +1963,8 @@ bool QgsOgrProvider::doInitialActionsForEdition()
1963
1963
if ( mUpdateModeStackDepth == 0 )
1964
1964
{
1965
1965
QgsDebugMsg ( " Enter update mode implictly" );
1966
- if ( !enterUpdateMode ( ) )
1966
+ if ( !_enterUpdateMode ( true ) )
1967
1967
return false ;
1968
- // For implicitly entered updateMode, don't defer repacking
1969
- mDeferRepack = false ;
1970
1968
}
1971
1969
1972
1970
return true ;
@@ -3169,7 +3167,7 @@ void QgsOgrProvider::forceReload()
3169
3167
QgsOgrConnPool::instance ()->invalidateConnections ( dataSourceUri () );
3170
3168
}
3171
3169
3172
- GDALDatasetH QgsOgrProviderUtils::GDALOpenWrapper ( const char *pszPath, bool bUpdate, GDALDriverH *phDriver )
3170
+ GDALDatasetH QgsOgrProviderUtils::GDALOpenWrapper ( const char *pszPath, bool bUpdate, bool bDisableReapck, GDALDriverH *phDriver )
3173
3171
{
3174
3172
CPLErrorReset ();
3175
3173
@@ -3196,6 +3194,10 @@ GDALDatasetH QgsOgrProviderUtils::GDALOpenWrapper( const char *pszPath, bool bUp
3196
3194
papszOpenOptions = CSLSetNameValue ( papszOpenOptions, " FORCE_SRS_DETECTION" , " YES" );
3197
3195
}
3198
3196
}
3197
+ if ( bDisableReapck )
3198
+ {
3199
+ papszOpenOptions = CSLSetNameValue ( papszOpenOptions, " AUTO_REPACK" , " OFF" );
3200
+ }
3199
3201
3200
3202
const int nOpenFlags = GDAL_OF_VECTOR | ( bUpdate ? GDAL_OF_UPDATE : 0 );
3201
3203
GDALDatasetH hDS = GDALOpenEx ( pszPath, nOpenFlags, nullptr , papszOpenOptions, nullptr );
@@ -3407,13 +3409,16 @@ bool QgsOgrProvider::syncToDisc()
3407
3409
pushError ( tr ( " OGR error syncing to disk: %1" ).arg ( CPLGetLastErrorMsg () ) );
3408
3410
}
3409
3411
3412
+ // Repack is done automatically on OGR_L_SyncToDisk with gdal-2.2.0+
3413
+ #if !defined(GDAL_VERSION_NUM) || GDAL_VERSION_NUM < 2020000
3410
3414
if ( !mDeferRepack )
3411
3415
{
3412
3416
if ( mShapefileMayBeCorrupted )
3413
3417
repack ();
3414
3418
3415
3419
mShapefileMayBeCorrupted = false ;
3416
3420
}
3421
+ #endif
3417
3422
3418
3423
QgsOgrConnPool::instance ()->ref ( dataSourceUri () );
3419
3424
if ( shapeIndex )
@@ -3643,7 +3648,7 @@ void QgsOgrProvider::open( OpenMode mode )
3643
3648
// on network shares
3644
3649
CPLSetThreadLocalConfigOption ( " OGR_SQLITE_JOURNAL" , " WAL" );
3645
3650
}
3646
- mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper ( mFilePath .toUtf8 ().constData (), true , &mGDALDriver );
3651
+ mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper ( mFilePath .toUtf8 ().constData (), true , mode == OpenModeForceUpdateRepackOff, &mGDALDriver );
3647
3652
CPLSetThreadLocalConfigOption ( " OGR_SQLITE_JOURNAL" , nullptr );
3648
3653
}
3649
3654
@@ -3662,7 +3667,7 @@ void QgsOgrProvider::open( OpenMode mode )
3662
3667
}
3663
3668
3664
3669
// try to open read-only
3665
- mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper ( mFilePath .toUtf8 ().constData (), false , &mGDALDriver );
3670
+ mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper ( mFilePath .toUtf8 ().constData (), false , false , &mGDALDriver );
3666
3671
}
3667
3672
3668
3673
if ( mGDALDataset )
@@ -3741,7 +3746,7 @@ void QgsOgrProvider::open( OpenMode mode )
3741
3746
}
3742
3747
#endif
3743
3748
3744
- mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper ( mFilePath .toUtf8 ().constData (), false , &mGDALDriver );
3749
+ mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper ( mFilePath .toUtf8 ().constData (), false , false , &mGDALDriver );
3745
3750
3746
3751
mWriteAccess = false ;
3747
3752
@@ -3813,7 +3818,7 @@ void QgsOgrProvider::reloadData()
3813
3818
pushError ( tr ( " Cannot reopen datasource %1" ).arg ( dataSourceUri () ) );
3814
3819
}
3815
3820
3816
- bool QgsOgrProvider::enterUpdateMode ( )
3821
+ bool QgsOgrProvider::_enterUpdateMode ( bool implicit )
3817
3822
{
3818
3823
if ( !mWriteAccessPossible )
3819
3824
{
@@ -3829,7 +3834,7 @@ bool QgsOgrProvider::enterUpdateMode()
3829
3834
Q_ASSERT ( mDynamicWriteAccess );
3830
3835
QgsDebugMsg ( QString ( " Reopening %1 in update mode" ).arg ( dataSourceUri () ) );
3831
3836
close ();
3832
- open ( OpenModeForceUpdate );
3837
+ open ( implicit ? OpenModeForceUpdate : OpenModeForceUpdateRepackOff );
3833
3838
if ( !mGDALDataset || !mWriteAccess )
3834
3839
{
3835
3840
QgsMessageLog::logMessage ( tr ( " Cannot reopen datasource %1 in update mode" ).arg ( dataSourceUri () ), tr ( " OGR" ) );
@@ -3838,7 +3843,8 @@ bool QgsOgrProvider::enterUpdateMode()
3838
3843
}
3839
3844
}
3840
3845
++mUpdateModeStackDepth ;
3841
- mDeferRepack = true ;
3846
+ // For implicitly entered updateMode, don't defer repacking
3847
+ mDeferRepack = !implicit;
3842
3848
return true ;
3843
3849
}
3844
3850
@@ -3911,7 +3917,7 @@ GDALDatasetH LoadDataSourceAndLayer( const QString &uri,
3911
3917
subsetString,
3912
3918
ogrGeometryType );
3913
3919
3914
- GDALDatasetH hDS = QgsOgrProviderUtils::GDALOpenWrapper ( filePath.toUtf8 ().constData (), true , nullptr );
3920
+ GDALDatasetH hDS = QgsOgrProviderUtils::GDALOpenWrapper ( filePath.toUtf8 ().constData (), true , false , nullptr );
3915
3921
if ( !hDS )
3916
3922
{
3917
3923
QgsDebugMsg ( " Connection to database failed.." );
0 commit comments