Skip to content

Commit

Permalink
[OGR] Pass AUTO_REPACK=OFF when opening datasets for non-implicit upd…
Browse files Browse the repository at this point in the history
…ate modes
  • Loading branch information
manisandro committed Oct 4, 2017
1 parent 3e45f99 commit 4e2e360
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 18 deletions.
6 changes: 3 additions & 3 deletions src/providers/ogr/qgsogrdataitems.cpp
Expand Up @@ -54,7 +54,7 @@ QgsOgrLayerItem::QgsOgrLayerItem( QgsDataItem *parent,

OGRRegisterAll();
GDALDriverH hDriver;
GDALDatasetH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( mPath.toUtf8().constData(), true, &hDriver );
GDALDatasetH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( mPath.toUtf8().constData(), true, false, &hDriver );

if ( hDataSource )
{
Expand Down Expand Up @@ -408,7 +408,7 @@ QVector<QgsDataItem *> QgsOgrDataCollectionItem::createChildren()
QVector<QgsDataItem *> children;

GDALDriverH hDriver;
GDALDatasetH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( mPath.toUtf8().constData(), false, &hDriver );
GDALDatasetH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( mPath.toUtf8().constData(), false, false, &hDriver );
if ( !hDataSource )
return children;
int numLayers = GDALDatasetGetLayerCount( hDataSource );
Expand Down Expand Up @@ -639,7 +639,7 @@ QGISEXTERN QgsDataItem *dataItem( QString path, QgsDataItem *parentItem )
// do not print errors, but write to debug
CPLPushErrorHandler( CPLQuietErrorHandler );
CPLErrorReset();
OGRDataSourceH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( path.toUtf8().constData(), false, &hDriver );
OGRDataSourceH hDataSource = QgsOgrProviderUtils::GDALOpenWrapper( path.toUtf8().constData(), false, false, &hDriver );
CPLPopErrorHandler();

if ( ! hDataSource )
Expand Down
27 changes: 15 additions & 12 deletions src/providers/ogr/qgsogrprovider.cpp
Expand Up @@ -171,7 +171,7 @@ void QgsOgrProvider::repack()
GDALClose( mGDALDataset );
ogrLayer = ogrOrigLayer = nullptr;
mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), true, nullptr );
mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), true, false, nullptr );
if ( mGDALDataset )
{
if ( mLayerName.isNull() )
Expand Down Expand Up @@ -1963,10 +1963,8 @@ bool QgsOgrProvider::doInitialActionsForEdition()
if ( mUpdateModeStackDepth == 0 )
{
QgsDebugMsg( "Enter update mode implictly" );
if ( !enterUpdateMode() )
if ( !_enterUpdateMode( true ) )
return false;
// For implicitly entered updateMode, don't defer repacking
mDeferRepack = false;
}

return true;
Expand Down Expand Up @@ -3169,7 +3167,7 @@ void QgsOgrProvider::forceReload()
QgsOgrConnPool::instance()->invalidateConnections( dataSourceUri() );
}

GDALDatasetH QgsOgrProviderUtils::GDALOpenWrapper( const char *pszPath, bool bUpdate, GDALDriverH *phDriver )
GDALDatasetH QgsOgrProviderUtils::GDALOpenWrapper( const char *pszPath, bool bUpdate, bool bDisableReapck, GDALDriverH *phDriver )
{
CPLErrorReset();

Expand All @@ -3196,6 +3194,10 @@ GDALDatasetH QgsOgrProviderUtils::GDALOpenWrapper( const char *pszPath, bool bUp
papszOpenOptions = CSLSetNameValue( papszOpenOptions, "FORCE_SRS_DETECTION", "YES" );
}
}
if ( bDisableReapck )
{
papszOpenOptions = CSLSetNameValue( papszOpenOptions, "AUTO_REPACK", "OFF" );
}

const int nOpenFlags = GDAL_OF_VECTOR | ( bUpdate ? GDAL_OF_UPDATE : 0 );
GDALDatasetH hDS = GDALOpenEx( pszPath, nOpenFlags, nullptr, papszOpenOptions, nullptr );
Expand Down Expand Up @@ -3643,7 +3645,7 @@ void QgsOgrProvider::open( OpenMode mode )
// on network shares
CPLSetThreadLocalConfigOption( "OGR_SQLITE_JOURNAL", "WAL" );
}
mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), true, &mGDALDriver );
mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), true, mode == OpenModeForceUpdateRepackOff, &mGDALDriver );
CPLSetThreadLocalConfigOption( "OGR_SQLITE_JOURNAL", nullptr );
}

Expand All @@ -3662,7 +3664,7 @@ void QgsOgrProvider::open( OpenMode mode )
}

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

if ( mGDALDataset )
Expand Down Expand Up @@ -3741,7 +3743,7 @@ void QgsOgrProvider::open( OpenMode mode )
}
#endif

mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), false, &mGDALDriver );
mGDALDataset = QgsOgrProviderUtils::GDALOpenWrapper( mFilePath.toUtf8().constData(), false, false, &mGDALDriver );

mWriteAccess = false;

Expand Down Expand Up @@ -3813,7 +3815,7 @@ void QgsOgrProvider::reloadData()
pushError( tr( "Cannot reopen datasource %1" ).arg( dataSourceUri() ) );
}

bool QgsOgrProvider::enterUpdateMode()
bool QgsOgrProvider::_enterUpdateMode( bool implicit )
{
if ( !mWriteAccessPossible )
{
Expand All @@ -3829,7 +3831,7 @@ bool QgsOgrProvider::enterUpdateMode()
Q_ASSERT( mDynamicWriteAccess );
QgsDebugMsg( QString( "Reopening %1 in update mode" ).arg( dataSourceUri() ) );
close();
open( OpenModeForceUpdate );
open( implicit ? OpenModeForceUpdate : OpenModeForceUpdateRepackOff );
if ( !mGDALDataset || !mWriteAccess )
{
QgsMessageLog::logMessage( tr( "Cannot reopen datasource %1 in update mode" ).arg( dataSourceUri() ), tr( "OGR" ) );
Expand All @@ -3838,7 +3840,8 @@ bool QgsOgrProvider::enterUpdateMode()
}
}
++mUpdateModeStackDepth;
mDeferRepack = true;
// For implicitly entered updateMode, don't defer repacking
mDeferRepack = !implicit;
return true;
}

Expand Down Expand Up @@ -3911,7 +3914,7 @@ GDALDatasetH LoadDataSourceAndLayer( const QString &uri,
subsetString,
ogrGeometryType );

GDALDatasetH hDS = QgsOgrProviderUtils::GDALOpenWrapper( filePath.toUtf8().constData(), true, nullptr );
GDALDatasetH hDS = QgsOgrProviderUtils::GDALOpenWrapper( filePath.toUtf8().constData(), true, false, nullptr );
if ( !hDS )
{
QgsDebugMsg( "Connection to database failed.." );
Expand Down
7 changes: 5 additions & 2 deletions src/providers/ogr/qgsogrprovider.h
Expand Up @@ -89,7 +89,7 @@ class QgsOgrProvider : public QgsVectorDataProvider
virtual bool createAttributeIndex( int field ) override;
virtual QgsVectorDataProvider::Capabilities capabilities() const override;
virtual void setEncoding( const QString &e ) override;
virtual bool enterUpdateMode() override;
virtual bool enterUpdateMode() override { return _enterUpdateMode(); }
virtual bool leaveUpdateMode() override;
virtual bool isSaveAndLoadStyleToDatabaseSupported() const override;
QString fileVectorFilters() const override;
Expand Down Expand Up @@ -158,11 +158,14 @@ class QgsOgrProvider : public QgsVectorDataProvider
OpenModeSameAsCurrent,
OpenModeForceReadOnly,
OpenModeForceUpdate,
OpenModeForceUpdateRepackOff
};

void open( OpenMode mode );
void close();

bool _enterUpdateMode( bool implicit = false );

private:
unsigned char *getGeometryPointer( OGRFeatureH fet );
QString ogrWkbGeometryTypeName( OGRwkbGeometryType type ) const;
Expand Down Expand Up @@ -273,7 +276,7 @@ class QgsOgrProviderUtils
*/
static QString quotedValue( const QVariant &value );

static GDALDatasetH GDALOpenWrapper( const char *pszPath, bool bUpdate, GDALDriverH *phDriver );
static GDALDatasetH GDALOpenWrapper( const char *pszPath, bool bUpdate, bool bDisableReapck, GDALDriverH *phDriver );
static void GDALCloseWrapper( GDALDatasetH mhDS );
};

Expand Down
1 change: 0 additions & 1 deletion tests/src/python/test_provider_shapefile.py
Expand Up @@ -435,7 +435,6 @@ def testDeleteGeometry(self):
fet = next(vl.getFeatures())
self.assertFalse(fet.hasGeometry())

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

Expand Down

0 comments on commit 4e2e360

Please sign in to comment.