Added check to see if hstore is loaded

This commit is contained in:
Robbe Haesendonck
2023-09-25 12:39:38 +02:00
committed by Sarah Hoffmann
parent e7b8e1a2c2
commit e8b866aa88
3 changed files with 14 additions and 20 deletions

View File

@@ -174,22 +174,13 @@ class Connection(psycopg2.extensions.connection):
return (int(version_parts[0]), int(version_parts[1])) 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 def extension_loaded(self, extension_name: str) -> bool:
tuple of (major, minor). Assumes that the hstore extension """ Return True if the hstore extension is loaded in the database.
has been installed already.
""" """
with self.cursor() as cur: with self.cursor() as cur:
version = cur.scalar( cur.execute('SELECT extname FROM pg_extension WHERE extname = %s', (extension_name))
'SELECT extversion FROM pg_extension WHERE extname = %s', return cur.rowcount > 0
('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]): class ConnectionContext(ContextManager[Connection]):

View File

@@ -24,8 +24,7 @@ from nominatim.db.sql_preprocessor import SQLPreprocessor
from nominatim.tools.exec_utils import run_osm2pgsql from nominatim.tools.exec_utils import run_osm2pgsql
from nominatim.errors import UsageError from nominatim.errors import UsageError
from nominatim.version import POSTGRESQL_REQUIRED_VERSION, \ from nominatim.version import POSTGRESQL_REQUIRED_VERSION, \
POSTGIS_REQUIRED_VERSION, \ POSTGIS_REQUIRED_VERSION
HSTORE_REQUIRED_VERSION
LOG = logging.getLogger() LOG = logging.getLogger()
@@ -40,6 +39,13 @@ def _require_version(module: str, actual: Tuple[int, int], expected: Tuple[int,
raise UsageError(f'{module} is too old.') raise UsageError(f'{module} is too old.')
def _require_loaded(extension_name: str, conn: Connection):
""" Check that the given extension is loaded. """
if not conn.extension_loaded(extension_name):
LOG.fatal('Required module %s is not loaded.', extension_name)
raise UsageError(f'{extension_name} is not loaded.')
def check_existing_database_plugins(dsn: str): def check_existing_database_plugins(dsn: str):
""" Check that the database has the required plugins installed.""" """ Check that the database has the required plugins installed."""
with connect(dsn) as conn: with connect(dsn) as conn:
@@ -49,9 +55,7 @@ def check_existing_database_plugins(dsn: str):
_require_version('PostGIS', _require_version('PostGIS',
conn.postgis_version_tuple(), conn.postgis_version_tuple(),
POSTGIS_REQUIRED_VERSION) POSTGIS_REQUIRED_VERSION)
_require_version('hstore', _require_loaded('hstore', conn)
conn.hstore_version_tuple(),
HSTORE_REQUIRED_VERSION)
def setup_database_skeleton(dsn: str, rouser: Optional[str] = None) -> None: def setup_database_skeleton(dsn: str, rouser: Optional[str] = None) -> None:

View File

@@ -38,7 +38,6 @@ NOMINATIM_VERSION = NominatimVersion(4, 3, 0, 0)
POSTGRESQL_REQUIRED_VERSION = (9, 6) POSTGRESQL_REQUIRED_VERSION = (9, 6)
POSTGIS_REQUIRED_VERSION = (2, 2) POSTGIS_REQUIRED_VERSION = (2, 2)
HSTORE_REQUIRED_VERSION = (1, 3)
# Cmake sets a variable @GIT_HASH@ by executing 'git --log'. It is not run # Cmake sets a variable @GIT_HASH@ by executing 'git --log'. It is not run
# on every execution of 'make'. # on every execution of 'make'.