Skip to content

Commit

Permalink
GPKG: hopefully unbreak VS2017 builds
Browse files Browse the repository at this point in the history
  • Loading branch information
rouault committed Jan 29, 2024
1 parent 37651a9 commit ec69b46
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 52 deletions.
73 changes: 35 additions & 38 deletions ogr/ogrsf_frmts/gpkg/ogr_geopackage.h
Original file line number Diff line number Diff line change
Expand Up @@ -414,44 +414,6 @@ class GDALGeoPackageDataset final : public OGRSQLiteBaseDataSource,

GDALDataset *GetRasterLayerDataset(const char *pszLayerName);

//! Instance of that class temporarily disable foreign key checks
class TemporaryForeignKeyCheckDisabler
{
public:
explicit TemporaryForeignKeyCheckDisabler(GDALGeoPackageDataset *poDS)
: m_poDS(poDS),
m_nPragmaForeignKeysOldValue(SQLGetInteger(
m_poDS->GetDB(), "PRAGMA foreign_keys", nullptr))
{
if (m_nPragmaForeignKeysOldValue)
{
CPL_IGNORE_RET_VAL(
SQLCommand(m_poDS->GetDB(), "PRAGMA foreign_keys = 0"));
}
}

~TemporaryForeignKeyCheckDisabler()
{
if (m_nPragmaForeignKeysOldValue)
{
CPL_IGNORE_RET_VAL(
SQLCommand(m_poDS->GetDB(), "PRAGMA foreign_keys = 1"));
}
}

private:
CPL_DISALLOW_COPY_ASSIGN(TemporaryForeignKeyCheckDisabler)

GDALGeoPackageDataset *m_poDS = nullptr;
int m_nPragmaForeignKeysOldValue = 0;
};

//! Return an object that, while alive, temporarily disables foreign key checks
TemporaryForeignKeyCheckDisabler GetTemporaryForeignKeyCheckDisabler()
{
return TemporaryForeignKeyCheckDisabler(this);
}

protected:
virtual CPLErr IRasterIO(GDALRWFlag, int, int, int, int, void *, int, int,
GDALDataType, int, int *, GSpacing, GSpacing,
Expand Down Expand Up @@ -503,6 +465,41 @@ class GDALGeoPackageDataset final : public OGRSQLiteBaseDataSource,
bool HasGDALAspatialExtension();
};

/************************************************************************/
/* GPKGTemporaryForeignKeyCheckDisabler */
/************************************************************************/

//! Instance of that class temporarily disable foreign key checks
class GPKGTemporaryForeignKeyCheckDisabler
{
public:
explicit GPKGTemporaryForeignKeyCheckDisabler(GDALGeoPackageDataset *poDS)
: m_poDS(poDS), m_nPragmaForeignKeysOldValue(SQLGetInteger(
m_poDS->GetDB(), "PRAGMA foreign_keys", nullptr))
{
if (m_nPragmaForeignKeysOldValue)
{
CPL_IGNORE_RET_VAL(
SQLCommand(m_poDS->GetDB(), "PRAGMA foreign_keys = 0"));
}
}

~GPKGTemporaryForeignKeyCheckDisabler()
{
if (m_nPragmaForeignKeysOldValue)
{
CPL_IGNORE_RET_VAL(
SQLCommand(m_poDS->GetDB(), "PRAGMA foreign_keys = 1"));
}
}

private:
CPL_DISALLOW_COPY_ASSIGN(GPKGTemporaryForeignKeyCheckDisabler)

GDALGeoPackageDataset *m_poDS = nullptr;
int m_nPragmaForeignKeysOldValue = 0;
};

/************************************************************************/
/* GDALGeoPackageRasterBand */
/************************************************************************/
Expand Down
16 changes: 8 additions & 8 deletions ogr/ogrsf_frmts/gpkg/ogrgeopackagedatasource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -380,8 +380,8 @@ bool GDALGeoPackageDataset::ConvertGpkgSpatialRefSysToExtensionWkt2(
return false;

// Temporary remove foreign key checks
const auto oTemporaryForeignKeyCheckDisabler(
GetTemporaryForeignKeyCheckDisabler());
const GPKGTemporaryForeignKeyCheckDisabler
oGPKGTemporaryForeignKeyCheckDisabler(this);

bool bRet = SoftStartTransaction() == OGRERR_NONE;

Expand Down Expand Up @@ -6756,8 +6756,8 @@ int GDALGeoPackageDataset::FindLayerIndex(const char *pszLayerName)
OGRErr GDALGeoPackageDataset::DeleteLayerCommon(const char *pszLayerName)
{
// Temporary remove foreign key checks
const auto oTemporaryForeignKeyCheckDisabler(
GetTemporaryForeignKeyCheckDisabler());
const GPKGTemporaryForeignKeyCheckDisabler
oGPKGTemporaryForeignKeyCheckDisabler(this);

char *pszSQL = sqlite3_mprintf(
"DELETE FROM gpkg_contents WHERE lower(table_name) = lower('%q')",
Expand Down Expand Up @@ -6889,8 +6889,8 @@ OGRErr GDALGeoPackageDataset::DeleteLayer(int iLayer)
CPLDebug("GPKG", "DeleteLayer(%s)", osLayerName.c_str());

// Temporary remove foreign key checks
const auto oTemporaryForeignKeyCheckDisabler(
GetTemporaryForeignKeyCheckDisabler());
const GPKGTemporaryForeignKeyCheckDisabler
oGPKGTemporaryForeignKeyCheckDisabler(this);

OGRErr eErr = SoftStartTransaction();

Expand Down Expand Up @@ -6959,8 +6959,8 @@ OGRErr GDALGeoPackageDataset::DeleteLayer(int iLayer)
OGRErr GDALGeoPackageDataset::DeleteRasterLayer(const char *pszLayerName)
{
// Temporary remove foreign key checks
const auto oTemporaryForeignKeyCheckDisabler(
GetTemporaryForeignKeyCheckDisabler());
const GPKGTemporaryForeignKeyCheckDisabler
oGPKGTemporaryForeignKeyCheckDisabler(this);

OGRErr eErr = SoftStartTransaction();

Expand Down
12 changes: 6 additions & 6 deletions ogr/ogrsf_frmts/gpkg/ogrgeopackagetablelayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5168,8 +5168,8 @@ OGRErr OGRGeoPackageTableLayer::Rename(const char *pszDstTableName)
}

// Temporary remove foreign key checks
const auto oTemporaryForeignKeyCheckDisabler(
m_poDS->GetTemporaryForeignKeyCheckDisabler());
const GPKGTemporaryForeignKeyCheckDisabler
oGPKGTemporaryForeignKeyCheckDisabler(m_poDS);

if (m_poDS->SoftStartTransaction() != OGRERR_NONE)
{
Expand Down Expand Up @@ -6208,8 +6208,8 @@ OGRErr OGRGeoPackageTableLayer::DeleteField(int iFieldToDelete)
m_poDS->ResetReadingAllLayers();

// Temporary remove foreign key checks
const auto oTemporaryForeignKeyCheckDisabler(
m_poDS->GetTemporaryForeignKeyCheckDisabler());
const GPKGTemporaryForeignKeyCheckDisabler
oGPKGTemporaryForeignKeyCheckDisabler(m_poDS);

if (m_poDS->SoftStartTransaction() != OGRERR_NONE)
{
Expand Down Expand Up @@ -7140,8 +7140,8 @@ OGRErr OGRGeoPackageTableLayer::AlterGeomFieldDefn(
!poOldSRS->IsSame(poNewSRS.get(), apszOptions)))
{
// Temporary remove foreign key checks
const auto oTemporaryForeignKeyCheckDisabler(
m_poDS->GetTemporaryForeignKeyCheckDisabler());
const GPKGTemporaryForeignKeyCheckDisabler
oGPKGTemporaryForeignKeyCheckDisabler(m_poDS);

if (m_poDS->SoftStartTransaction() != OGRERR_NONE)
return OGRERR_FAILURE;
Expand Down

0 comments on commit ec69b46

Please sign in to comment.