X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/1bee151fe3ccfd21df1d809392d6eb52ce7925cb..5c4c98d17eb78732a36481284342c670394dc92b:/nominatim/tools/check_database.py diff --git a/nominatim/tools/check_database.py b/nominatim/tools/check_database.py index 7372a49f..8ffd93fe 100644 --- a/nominatim/tools/check_database.py +++ b/nominatim/tools/check_database.py @@ -13,8 +13,11 @@ from textwrap import dedent from nominatim.config import Configuration from nominatim.db.connection import connect, Connection +from nominatim.db import properties from nominatim.errors import UsageError from nominatim.tokenizer import factory as tokenizer_factory +from nominatim.tools import freeze +from nominatim.version import NOMINATIM_VERSION, parse_version CHECKLIST = [] @@ -114,16 +117,17 @@ def _get_indexes(conn: Connection) -> List[str]: indexes.extend(('idx_placex_housenumber', 'idx_osmline_parent_osm_id_with_hnr')) if conn.table_exists('place'): - indexes.extend(('idx_placex_pendingsector', - 'idx_location_area_country_place_id', - 'idx_place_osm_unique')) + indexes.extend(('idx_location_area_country_place_id', + 'idx_place_osm_unique', + 'idx_placex_rank_address_sector', + 'idx_placex_rank_boundaries_sector')) return indexes # CHECK FUNCTIONS # -# Functions are exectured in the order they appear here. +# Functions are executed in the order they appear here. @_check(hint="""\ {error} @@ -144,11 +148,52 @@ def check_connection(conn: Any, config: Configuration) -> CheckResult: return CheckState.OK +@_check(hint="""\ + Database version ({db_version}) doesn't match Nominatim version ({nom_version}) + + Hints: + * Are you connecting to the correct database? + + {instruction} + + Check the Migration chapter of the Administration Guide. + + Project directory: {config.project_dir} + Current setting of NOMINATIM_DATABASE_DSN: {config.DATABASE_DSN} + """) +def check_database_version(conn: Connection, config: Configuration) -> CheckResult: + """ Checking database_version matches Nominatim software version + """ + + if conn.table_exists('nominatim_properties'): + db_version_str = properties.get_property(conn, 'database_version') + else: + db_version_str = None + + if db_version_str is not None: + db_version = parse_version(db_version_str) + + if db_version == NOMINATIM_VERSION: + return CheckState.OK + + instruction = ( + 'Run migrations: nominatim admin --migrate' + if db_version < NOMINATIM_VERSION + else 'You need to upgrade the Nominatim software.' + ) + else: + instruction = '' + + return CheckState.FATAL, dict(db_version=db_version_str, + nom_version=NOMINATIM_VERSION, + instruction=instruction, + config=config) + @_check(hint="""\ placex table not found Hints: - * Are you connecting to the right database? + * Are you connecting to the correct database? * Did the import process finish without errors? Project directory: {config.project_dir} @@ -199,7 +244,7 @@ def check_tokenizer(_: Connection, config: Configuration) -> CheckResult: def check_existance_wikipedia(conn: Connection, _: Configuration) -> CheckResult: """ Checking for wikipedia/wikidata data """ - if not conn.table_exists('search_name'): + if not conn.table_exists('search_name') or not conn.table_exists('place'): return CheckState.NOT_APPLICABLE with conn.cursor() as cur: @@ -222,6 +267,12 @@ def check_indexing(conn: Connection, _: Configuration) -> CheckResult: if cnt == 0: return CheckState.OK + if freeze.is_frozen(conn): + index_cmd="""\ + Database is marked frozen, it cannot be updated. + Low counts of unindexed places are fine.""" + return CheckState.WARN, dict(count=cnt, index_cmd=index_cmd) + if conn.index_exists('idx_placex_rank_search'): # Likely just an interrupted update. index_cmd = 'nominatim index' @@ -268,7 +319,7 @@ def check_database_index_valid(conn: Connection, _: Configuration) -> CheckResul WHERE pg_index.indisvalid = false AND pg_index.indexrelid = pg_class.oid""") - broken = list(cur) + broken = [c[0] for c in cur] if broken: return CheckState.FAIL, dict(indexes='\n '.join(broken))