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.
+
+ def extension_loaded(self, extension_name: str) -> bool:
+ """ Return True if the hstore extension is loaded in the database.
"""
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]))
+ cur.execute('SELECT extname FROM pg_extension WHERE extname = %s', (extension_name))
+ return cur.rowcount > 0
class ConnectionContext(ContextManager[Connection]):
from nominatim.tools.exec_utils import run_osm2pgsql
from nominatim.errors import UsageError
from nominatim.version import POSTGRESQL_REQUIRED_VERSION, \
- POSTGIS_REQUIRED_VERSION, \
- HSTORE_REQUIRED_VERSION
+ POSTGIS_REQUIRED_VERSION
LOG = logging.getLogger()
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):
""" Check that the database has the required plugins installed."""
with connect(dsn) as conn:
_require_version('PostGIS',
conn.postgis_version_tuple(),
POSTGIS_REQUIRED_VERSION)
- _require_version('hstore',
- conn.hstore_version_tuple(),
- HSTORE_REQUIRED_VERSION)
+ _require_loaded('hstore', conn)
def setup_database_skeleton(dsn: str, rouser: Optional[str] = None) -> None:
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'.