+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
"""
Functions for bringing auxiliary data in the database up-to-date.
"""
import logging
from textwrap import dedent
+from pathlib import Path
from psycopg2 import sql as pysql
LOG = logging.getLogger()
+OSM_TYPE = {'N': 'node', 'W': 'way', 'R': 'relation'}
def _add_address_level_rows_from_entry(rows, entry):
""" Converts a single entry from the JSON format for address rank
('Database_DSN', 'DATABASE_DSN', str),
('Default_Language', 'DEFAULT_LANGUAGE', str),
('Log_DB', 'LOG_DB', bool),
- ('Log_File', 'LOG_FILE', str),
+ ('Log_File', 'LOG_FILE', Path),
('NoAccessControl', 'CORS_NOACCESSCONTROL', bool),
('Places_Max_ID_count', 'LOOKUP_MAX_COUNT', int),
('PolygonOutput_MaximumTypes', 'POLYGON_OUTPUT_MAX_TYPES', int),
if not getattr(config, conf_name):
return 'false'
- quoted = getattr(config, conf_name).replace("'", "\\'")
+ if var_type == Path:
+ value = str(config.get_path(conf_name))
+ else:
+ value = getattr(config, conf_name)
+
+ quoted = value.replace("'", "\\'")
return f"'{quoted}'"
(basedir / script).write_text(template.format('reverse-only-search.php'), 'utf-8')
else:
(basedir / script).write_text(template.format(script), 'utf-8')
+
+
+def invalidate_osm_object(osm_type, osm_id, conn, recursive=True):
+ """ Mark the given OSM object for reindexing. When 'recursive' is set
+ to True (the default), then all dependent objects are marked for
+ reindexing as well.
+
+ 'osm_type' must be on of 'N' (node), 'W' (way) or 'R' (relation).
+ If the given object does not exist, then nothing happens.
+ """
+ assert osm_type in ('N', 'R', 'W')
+
+ LOG.warning("Invalidating OSM %s %s%s.",
+ OSM_TYPE[osm_type], osm_id,
+ ' and its dependent places' if recursive else '')
+
+ with conn.cursor() as cur:
+ if recursive:
+ sql = """SELECT place_force_update(place_id)
+ FROM placex WHERE osm_type = %s and osm_id = %s"""
+ else:
+ sql = """UPDATE placex SET indexed_status = 2
+ WHERE osm_type = %s and osm_id = %s"""
+
+ cur.execute(sql, (osm_type, osm_id))