+ datafile = data_path / 'secondary_importance.sql.gz'
+ if not datafile.exists():
+ return 1
+
+ with connect(dsn) as conn:
+ postgis_version = conn.postgis_version_tuple()
+ if postgis_version[0] < 3:
+ LOG.error('PostGIS version is too old for using OSM raster data.')
+ return 2
+
+ execute_file(dsn, datafile, ignore_errors=ignore_errors)
+
+ return 0
+
+def recompute_importance(conn: Connection) -> None:
+ """ Recompute wikipedia links and importance for all entries in placex.
+ This is a long-running operations that must not be executed in
+ parallel with updates.
+ """
+ with conn.cursor() as cur:
+ cur.execute('ALTER TABLE placex DISABLE TRIGGER ALL')
+ cur.execute("""
+ UPDATE placex SET (wikipedia, importance) =
+ (SELECT wikipedia, importance
+ FROM compute_importance(extratags, country_code, rank_search, centroid))
+ """)
+ cur.execute("""
+ UPDATE placex s SET wikipedia = d.wikipedia, importance = d.importance
+ FROM placex d
+ WHERE s.place_id = d.linked_place_id and d.wikipedia is not null
+ and (s.wikipedia is null or s.importance < d.importance);
+ """)
+
+ cur.execute('ALTER TABLE placex ENABLE TRIGGER ALL')
+ conn.commit()
+
+
+def _quote_php_variable(var_type: Type[Any], config: Configuration,
+ conf_name: str) -> str:
+ if var_type == bool:
+ return 'true' if config.get_bool(conf_name) else 'false'
+
+ if var_type == int:
+ return cast(str, getattr(config, conf_name))
+
+ if not getattr(config, conf_name):
+ return 'false'
+
+ if var_type == Path:
+ value = str(config.get_path(conf_name) or '')
+ else:
+ value = getattr(config, conf_name)
+
+ quoted = value.replace("'", "\\'")
+ return f"'{quoted}'"
+
+
+def setup_website(basedir: Path, config: Configuration, conn: Connection) -> None:
+ """ Create the website script stubs.
+ """
+ if not basedir.exists():
+ LOG.info('Creating website directory.')
+ basedir.mkdir()
+
+ assert config.project_dir is not None
+ template = dedent(f"""\
+ <?php
+
+ @define('CONST_Debug', $_GET['debug'] ?? false);
+ @define('CONST_LibDir', '{config.lib_dir.php}');
+ @define('CONST_TokenizerDir', '{config.project_dir / 'tokenizer'}');
+ @define('CONST_NominatimVersion', '{NOMINATIM_VERSION!s}');
+
+ """)
+
+ for php_name, conf_name, var_type in PHP_CONST_DEFS:
+ varout = _quote_php_variable(var_type, config, conf_name)
+
+ template += f"@define('CONST_{php_name}', {varout});\n"
+
+ template += f"\nrequire_once('{config.lib_dir.php}/website/{{}}');\n"
+
+ search_name_table_exists = bool(conn and conn.table_exists('search_name'))
+
+ for script in WEBSITE_SCRIPTS:
+ if not search_name_table_exists and script == 'search.php':
+ (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: str, osm_id: int, conn: Connection,
+ recursive: bool = True) -> None:
+ """ 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))