From d4018f2e3b7a4b71fa67676bbc65d1d1adcfdd78 Mon Sep 17 00:00:00 2001 From: Robbe Haesendonck Date: Thu, 21 Sep 2023 12:20:46 +0200 Subject: [PATCH] Added check for hstore extension --- nominatim/db/connection.py | 18 ++++++++++++++++++ nominatim/tools/database_import.py | 5 ++++- nominatim/version.py | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/nominatim/db/connection.py b/nominatim/db/connection.py index fce897bc..12fc22d4 100644 --- a/nominatim/db/connection.py +++ b/nominatim/db/connection.py @@ -174,6 +174,24 @@ class Connection(psycopg2.extensions.connection): return (int(version_parts[0]), int(version_parts[1])) + def hstore_version_tuple(self) -> Tuple[int, int]: + """ Return the hstore version installed in the database as a + tuple of (major, minor). Assumes that the hstore extension + has been installed already. + """ + with self.cursor() as cur: + version = cur.scalar( + 'SELECT extversion FROM pg_extension WHERE extname = %s', + ('hstore') + ) + + version_parts = version.split('.') + if len(version_parts) < 2: + raise UsageError(f"Error fetching hstore version. Bad format: {version}") + + return (int(version_parts[0]), int(version_parts[1])) + + class ConnectionContext(ContextManager[Connection]): """ Context manager of the connection that also provides direct access to the underlying connection. diff --git a/nominatim/tools/database_import.py b/nominatim/tools/database_import.py index dbbb196e..82bdd5ed 100644 --- a/nominatim/tools/database_import.py +++ b/nominatim/tools/database_import.py @@ -23,7 +23,7 @@ from nominatim.db.async_connection import DBConnection from nominatim.db.sql_preprocessor import SQLPreprocessor from nominatim.tools.exec_utils import run_osm2pgsql from nominatim.errors import UsageError -from nominatim.version import POSTGRESQL_REQUIRED_VERSION, POSTGIS_REQUIRED_VERSION +from nominatim.version import POSTGRESQL_REQUIRED_VERSION, POSTGIS_REQUIRED_VERSION, HSTORE_REQUIRED_VERSION LOG = logging.getLogger() @@ -47,6 +47,9 @@ def check_existing_database_plugins(dsn: str): _require_version('PostGIS', conn.postgis_version_tuple(), POSTGIS_REQUIRED_VERSION) + _require_version('hstore', + conn.hstore_version_tuple(), + HSTORE_REQUIRED_VERSION) def setup_database_skeleton(dsn: str, rouser: Optional[str] = None) -> None: diff --git a/nominatim/version.py b/nominatim/version.py index 95420b34..aef85300 100644 --- a/nominatim/version.py +++ b/nominatim/version.py @@ -38,6 +38,7 @@ NOMINATIM_VERSION = NominatimVersion(4, 3, 0, 0) POSTGRESQL_REQUIRED_VERSION = (9, 6) POSTGIS_REQUIRED_VERSION = (2, 2) +HSTORE_REQUIRED_VERSION = (1, 3) # Cmake sets a variable @GIT_HASH@ by executing 'git --log'. It is not run # on every execution of 'make'. -- 2.39.5