diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/iso19111/factory.cpp | 237 | ||||
| -rw-r--r-- | src/sqlite3_utils.cpp | 17 |
2 files changed, 133 insertions, 121 deletions
diff --git a/src/iso19111/factory.cpp b/src/iso19111/factory.cpp index c938ff8b..16554b2a 100644 --- a/src/iso19111/factory.cpp +++ b/src/iso19111/factory.cpp @@ -5434,25 +5434,6 @@ std::string AuthorityFactory::getOfficialNameFromAlias( // --------------------------------------------------------------------------- -//! @cond Doxygen_Suppress - -static void addToListString(std::string &out, const char *in) { - if (!out.empty()) { - out += ','; - } - out += in; -} - -static void addToListStringWithOR(std::string &out, const std::string &in) { - if (!out.empty()) { - out += " OR "; - } - out += in; -} -//! @endcond - -// --------------------------------------------------------------------------- - /** \brief Return a list of objects by their name * * @param searchedName Searched name. Must be at least 2 character long. @@ -5485,155 +5466,169 @@ AuthorityFactory::createObjectsFromName( } std::string sql( - "SELECT table_name, auth_name, code, name, deprecated, is_alias FROM (" - "SELECT table_name, auth_name, code, name, deprecated, 0 as is_alias " - "FROM object_view WHERE "); - if (deprecated) { - sql += "deprecated = 1 AND "; - } - ListOfParams params; - if (!approximateMatch) { - sql += "name LIKE ? AND "; - params.push_back(searchedNameWithoutDeprecated); - } - if (d->hasAuthorityRestriction()) { - sql += "auth_name = ? AND "; - params.emplace_back(d->authority()); - } + "SELECT table_name, auth_name, code, name, deprecated, is_alias " + "FROM ("); - const auto getTableNameConstraint = [&allowedObjectTypes]( - const std::string &colName) { + const auto getTableAndTypeConstraints = [&allowedObjectTypes]() { + typedef std::pair<std::string, std::string> TableType; + std::list<TableType> res; if (allowedObjectTypes.empty()) { - return colName + " IN (" - "'prime_meridian','ellipsoid','geodetic_datum'," - "'vertical_datum','geodetic_crs','projected_crs'," - "'vertical_crs','compound_crs','conversion'," - "'helmert_transformation','grid_transformation'," - "'other_transformation','concatenated_operation'" - ")"; + for (const auto &tableName : + {"prime_meridian", "ellipsoid", "geodetic_datum", + "vertical_datum", "geodetic_crs", "projected_crs", + "vertical_crs", "compound_crs", "conversion", + "helmert_transformation", "grid_transformation", + "other_transformation", "concatenated_operation"}) { + res.emplace_back(TableType(tableName, std::string())); + } } else { - std::string tableNameList; - std::string otherConditions; for (const auto type : allowedObjectTypes) { switch (type) { case ObjectType::PRIME_MERIDIAN: - addToListString(tableNameList, "'prime_meridian'"); + res.emplace_back( + TableType("prime_meridian", std::string())); break; case ObjectType::ELLIPSOID: - addToListString(tableNameList, "'ellipsoid'"); + res.emplace_back(TableType("ellipsoid", std::string())); break; case ObjectType::DATUM: - addToListString(tableNameList, - "'geodetic_datum','vertical_datum'"); + res.emplace_back( + TableType("geodetic_datum", std::string())); + res.emplace_back( + TableType("vertical_datum", std::string())); break; case ObjectType::GEODETIC_REFERENCE_FRAME: - addToListString(tableNameList, "'geodetic_datum'"); + res.emplace_back( + TableType("geodetic_datum", std::string())); break; case ObjectType::VERTICAL_REFERENCE_FRAME: - addToListString(tableNameList, "'vertical_datum'"); + res.emplace_back( + TableType("vertical_datum", std::string())); break; case ObjectType::CRS: - addToListString(tableNameList, - "'geodetic_crs','projected_crs'," - "'vertical_crs','compound_crs'"); + res.emplace_back(TableType("geodetic_crs", std::string())); + res.emplace_back(TableType("projected_crs", std::string())); + res.emplace_back(TableType("vertical_crs", std::string())); + res.emplace_back(TableType("compound_crs", std::string())); break; case ObjectType::GEODETIC_CRS: - addToListString(tableNameList, "'geodetic_crs'"); + res.emplace_back(TableType("geodetic_crs", std::string())); break; case ObjectType::GEOCENTRIC_CRS: - addToListStringWithOR( - otherConditions, - "(" + colName + " = " GEOCENTRIC_SINGLE_QUOTED " AND " - "type = " GEOCENTRIC_SINGLE_QUOTED ")"); + res.emplace_back(TableType("geodetic_crs", GEOCENTRIC)); break; case ObjectType::GEOGRAPHIC_CRS: - addToListStringWithOR(otherConditions, - "(" + colName + - " = 'geodetic_crs' AND " - "type IN (" GEOG_2D_SINGLE_QUOTED - "," GEOG_3D_SINGLE_QUOTED "))"); + res.emplace_back(TableType("geodetic_crs", GEOG_2D)); + res.emplace_back(TableType("geodetic_crs", GEOG_3D)); break; case ObjectType::GEOGRAPHIC_2D_CRS: - addToListStringWithOR( - otherConditions, - "(" + colName + " = 'geodetic_crs' AND " - "type = " GEOG_2D_SINGLE_QUOTED ")"); + res.emplace_back(TableType("geodetic_crs", GEOG_2D)); break; case ObjectType::GEOGRAPHIC_3D_CRS: - addToListStringWithOR( - otherConditions, - "(" + colName + " = 'geodetic_crs' AND " - "type = " GEOG_3D_SINGLE_QUOTED ")"); + res.emplace_back(TableType("geodetic_crs", GEOG_3D)); break; case ObjectType::PROJECTED_CRS: - addToListString(tableNameList, "'projected_crs'"); + res.emplace_back(TableType("projected_crs", std::string())); break; case ObjectType::VERTICAL_CRS: - addToListString(tableNameList, "'vertical_crs'"); + res.emplace_back(TableType("vertical_crs", std::string())); break; case ObjectType::COMPOUND_CRS: - addToListString(tableNameList, "'compound_crs'"); + res.emplace_back(TableType("compound_crs", std::string())); break; case ObjectType::COORDINATE_OPERATION: - addToListString( - tableNameList, - "'conversion','helmert_transformation'," - "'grid_transformation','other_transformation'," - "'concatenated_operation'"); + res.emplace_back(TableType("conversion", std::string())); + res.emplace_back( + TableType("helmert_transformation", std::string())); + res.emplace_back( + TableType("grid_transformation", std::string())); + res.emplace_back( + TableType("other_transformation", std::string())); + res.emplace_back( + TableType("concatenated_operation", std::string())); break; case ObjectType::CONVERSION: - addToListString(tableNameList, "'conversion'"); + res.emplace_back(TableType("conversion", std::string())); break; case ObjectType::TRANSFORMATION: - addToListString( - tableNameList, - "'helmert_transformation'," - "'grid_transformation','other_transformation'"); + res.emplace_back( + TableType("helmert_transformation", std::string())); + res.emplace_back( + TableType("grid_transformation", std::string())); + res.emplace_back( + TableType("other_transformation", std::string())); break; case ObjectType::CONCATENATED_OPERATION: - addToListString(tableNameList, "'concatenated_operation'"); + res.emplace_back( + TableType("concatenated_operation", std::string())); break; } } - std::string l_sql; - if (!tableNameList.empty()) { - l_sql = "((" + colName + " IN ("; - l_sql += tableNameList; - l_sql += "))"; - if (!otherConditions.empty()) { - l_sql += " OR "; - l_sql += otherConditions; - } - l_sql += ')'; - } else if (!otherConditions.empty()) { - l_sql = "("; - l_sql += otherConditions; - l_sql += ')'; - } - return l_sql; } + return res; }; - sql += getTableNameConstraint("table_name"); - - sql += " UNION SELECT ov.table_name AS table_name, " - "ov.auth_name AS auth_name, " - "ov.code AS code, a.alt_name AS name, " - "ov.deprecated AS deprecated, 1 as is_alias FROM object_view ov " - "JOIN alias_name a ON ov.table_name = a.table_name AND " - "ov.auth_name = a.auth_name AND ov.code = a.code WHERE "; - if (deprecated) { - sql += "ov.deprecated = 1 AND "; - } - if (!approximateMatch) { - sql += "a.alt_name LIKE ? AND "; - params.push_back(searchedNameWithoutDeprecated); - } - if (d->hasAuthorityRestriction()) { - sql += "ov.auth_name = ? AND "; - params.emplace_back(d->authority()); + const auto listTableNameType = getTableAndTypeConstraints(); + bool first = true; + ListOfParams params; + for (const auto &tableNameTypePair : listTableNameType) { + if (!first) { + sql += " UNION "; + } + first = false; + sql += "SELECT '"; + sql += tableNameTypePair.first; + sql += "' AS table_name, auth_name, code, name, deprecated, " + "0 AS is_alias FROM "; + sql += tableNameTypePair.first; + sql += " WHERE 1 = 1 "; + if (!tableNameTypePair.second.empty()) { + sql += "AND type = '"; + sql += tableNameTypePair.second; + sql += "' "; + } + if (deprecated) { + sql += "AND deprecated = 1 "; + } + if (!approximateMatch) { + sql += "AND name LIKE ? "; + params.push_back(searchedNameWithoutDeprecated); + } + if (d->hasAuthorityRestriction()) { + sql += "AND auth_name = ? "; + params.emplace_back(d->authority()); + } + + sql += " UNION SELECT '"; + sql += tableNameTypePair.first; + sql += "' AS table_name, " + "ov.auth_name AS auth_name, " + "ov.code AS code, a.alt_name AS name, " + "ov.deprecated AS deprecated, 1 as is_alias FROM "; + sql += tableNameTypePair.first; + sql += " ov " + "JOIN alias_name a ON " + "ov.auth_name = a.auth_name AND ov.code = a.code WHERE " + "a.table_name = '"; + sql += tableNameTypePair.first; + sql += "' "; + if (!tableNameTypePair.second.empty()) { + sql += "AND ov.type = '"; + sql += tableNameTypePair.second; + sql += "' "; + } + if (deprecated) { + sql += "AND ov.deprecated = 1 "; + } + if (!approximateMatch) { + sql += "AND a.alt_name LIKE ? "; + params.push_back(searchedNameWithoutDeprecated); + } + if (d->hasAuthorityRestriction()) { + sql += "AND ov.auth_name = ? "; + params.emplace_back(d->authority()); + } } - sql += getTableNameConstraint("ov.table_name"); sql += ") ORDER BY deprecated, is_alias, length(name), name"; if (limitResultCount > 0 && diff --git a/src/sqlite3_utils.cpp b/src/sqlite3_utils.cpp index 7006674f..84bbb2ce 100644 --- a/src/sqlite3_utils.cpp +++ b/src/sqlite3_utils.cpp @@ -133,8 +133,25 @@ static int VFSCustomAccess(sqlite3_vfs *vfs, const char *zName, int flags, // --------------------------------------------------------------------------- +// SQLite3 logging infrastructure +static void projSqlite3LogCallback(void *, int iErrCode, const char *zMsg) { + fprintf(stderr, "SQLite3 message: (code %d) %s\n", iErrCode, zMsg); +} + std::unique_ptr<SQLite3VFS> SQLite3VFS::create(bool fakeSync, bool fakeLock, bool skipStatJournalAndWAL) { + + // Install SQLite3 logger if PROJ_LOG_SQLITE3 env var is defined + struct InstallSqliteLogger { + InstallSqliteLogger() { + if (getenv("PROJ_LOG_SQLITE3") != nullptr) { + sqlite3_config(SQLITE_CONFIG_LOG, projSqlite3LogCallback, + nullptr); + } + } + }; + static InstallSqliteLogger installSqliteLogger; + // Call to sqlite3_initialize() is normally not needed, except for // people building SQLite3 with -DSQLITE_OMIT_AUTOINIT sqlite3_initialize(); |
