]> git.openstreetmap.org Git - nominatim.git/blob - src/nominatim_db/tools/exec_utils.py
osm2pgsq: do not use deprecated tablespace options
[nominatim.git] / src / nominatim_db / tools / exec_utils.py
1 # SPDX-License-Identifier: GPL-3.0-or-later
2 #
3 # This file is part of Nominatim. (https://nominatim.org)
4 #
5 # Copyright (C) 2024 by the Nominatim developer community.
6 # For a full list of authors see the git log.
7 """
8 Helper functions for executing external programs.
9 """
10 from typing import Any, Mapping, List
11 import logging
12 import os
13 import subprocess
14 import shutil
15
16 from ..typing import StrPath
17 from ..db.connection import get_pg_env
18
19 LOG = logging.getLogger()
20
21 def run_php_server(server_address: str, base_dir: StrPath) -> None:
22     """ Run the built-in server from the given directory.
23     """
24     subprocess.run(['/usr/bin/env', 'php', '-S', server_address],
25                    cwd=str(base_dir), check=True)
26
27
28 def run_osm2pgsql(options: Mapping[str, Any]) -> None:
29     """ Run osm2pgsql with the given options.
30     """
31     env = get_pg_env(options['dsn'])
32
33     cmd = [_find_osm2pgsql_cmd(options['osm2pgsql']),
34            '--append' if options['append'] else '--create',
35            '--slim',
36            '--log-progress', 'true',
37            '--number-processes', '1' if options['append'] else str(options['threads']),
38            '--cache', str(options['osm2pgsql_cache']),
39            '--style', str(options['osm2pgsql_style'])
40           ]
41
42     if str(options['osm2pgsql_style']).endswith('.lua'):
43         env['LUA_PATH'] = ';'.join((str(options['osm2pgsql_style_path'] / '?.lua'),
44                                     os.environ.get('LUAPATH', ';')))
45         cmd.extend(('--output', 'flex'))
46
47         for flavour in ('data', 'index'):
48             if options['tablespaces'][f"main_{flavour}"]:
49                 env[f"NOMINATIM_TABLESPACE_PLACE_{flavour.upper()}"] = \
50                     options['tablespaces'][f"main_{flavour}"]
51     else:
52         cmd.extend(('--output', 'gazetteer', '--hstore', '--latlon'))
53         cmd.extend(_mk_tablespace_options('main', options))
54
55
56     if options['flatnode_file']:
57         cmd.extend(('--flat-nodes', options['flatnode_file']))
58
59     cmd.extend(_mk_tablespace_options('slim', options))
60
61     if options.get('disable_jit', False):
62         env['PGOPTIONS'] = '-c jit=off -c max_parallel_workers_per_gather=0'
63
64     if 'import_data' in options:
65         cmd.extend(('-r', 'xml', '-'))
66     elif isinstance(options['import_file'], list):
67         for fname in options['import_file']:
68             cmd.append(str(fname))
69     else:
70         cmd.append(str(options['import_file']))
71
72     subprocess.run(cmd, cwd=options.get('cwd', '.'),
73                    input=options.get('import_data'),
74                    env=env, check=True)
75
76
77 def _mk_tablespace_options(ttype: str, options: Mapping[str, Any]) -> List[str]:
78     cmds: List[str] = []
79     for flavour in ('data', 'index'):
80         if options['tablespaces'][f"{ttype}_{flavour}"]:
81             cmds.extend((f"--tablespace-{ttype}-{flavour}",
82                          options['tablespaces'][f"{ttype}_{flavour}"]))
83
84     return cmds
85
86
87 def _find_osm2pgsql_cmd(cmdline: str) -> str:
88     if cmdline is not None:
89         return cmdline
90
91     in_path = shutil.which('osm2pgsql')
92     if in_path is None:
93         raise RuntimeError('osm2pgsql executable not found. Please install osm2pgsql first.')
94
95     return str(in_path)