]> git.openstreetmap.org Git - nominatim.git/blob - nominatim/clicmd/transition.py
f4df992c060e2bf760577dfe86d070cbf3891728
[nominatim.git] / nominatim / clicmd / transition.py
1 """
2 Implementation of the 'transition' subcommand.
3
4 This subcommand provides standins for functions that were available
5 through the PHP scripts but are now no longer directly accessible.
6 This module will be removed as soon as the transition phase is over.
7 """
8 import logging
9 from pathlib import Path
10
11 from nominatim.db.connection import connect
12 from nominatim.db import status
13 from nominatim.errors import UsageError
14
15 # Do not repeat documentation of subcommand classes.
16 # pylint: disable=C0111
17 # Using non-top-level imports to avoid eventually unused imports.
18 # pylint: disable=E0012,C0415
19
20 LOG = logging.getLogger()
21
22 class AdminTransition:
23     """\
24     Internal functions for code transition. Do not use.
25     """
26
27     @staticmethod
28     def add_args(parser):
29         group = parser.add_argument_group('Sub-functions')
30         group.add_argument('--create-db', action='store_true',
31                            help='Create nominatim db')
32         group.add_argument('--setup-db', action='store_true',
33                            help='Build a blank nominatim db')
34         group.add_argument('--import-data', action='store_true',
35                            help='Import a osm file')
36         group.add_argument('--load-data', action='store_true',
37                            help='Copy data to live tables from import table')
38         group.add_argument('--create-tables', action='store_true',
39                            help='Create main tables')
40         group.add_argument('--create-partition-tables', action='store_true',
41                            help='Create required partition tables')
42         group.add_argument('--index', action='store_true',
43                            help='Index the data')
44         group.add_argument('--create-search-indices', action='store_true',
45                            help='Create additional indices required for search and update')
46         group.add_argument('--create-country-names', action='store_true',
47                            help='Create search index for default country names.')
48         group = parser.add_argument_group('Options')
49         group.add_argument('--no-partitions', action='store_true',
50                            help='Do not partition search indices')
51         group.add_argument('--osm-file', metavar='FILE',
52                            help='File to import')
53         group.add_argument('--drop', action='store_true',
54                            help='Drop tables needed for updates, making the database readonly')
55         group.add_argument('--osm2pgsql-cache', metavar='SIZE', type=int,
56                            help='Size of cache to be used by osm2pgsql (in MB)')
57         group.add_argument('--no-analyse', action='store_true',
58                            help='Do not perform analyse operations during index')
59         group.add_argument('--ignore-errors', action='store_true',
60                            help="Ignore certain erros on import.")
61         group.add_argument('--reverse-only', action='store_true',
62                            help='Do not create search tables and indexes')
63         group.add_argument('--tiger-data', metavar='FILE',
64                            help='File to import')
65
66     @staticmethod
67     def run(args): # pylint: disable=too-many-statements
68         from ..tools import database_import, tiger_data
69         from ..tools import refresh
70
71         if args.create_db:
72             LOG.warning('Create DB')
73             database_import.create_db(args.config.get_libpq_dsn())
74
75         if args.setup_db:
76             LOG.warning('Setup DB')
77
78             with connect(args.config.get_libpq_dsn()) as conn:
79                 database_import.setup_extensions(conn)
80                 database_import.install_module(args.module_dir, args.project_dir,
81                                                args.config.DATABASE_MODULE_PATH,
82                                                conn=conn)
83
84             database_import.import_base_data(args.config.get_libpq_dsn(),
85                                              args.data_dir, args.no_partitions)
86
87         if args.import_data:
88             LOG.warning('Import data')
89             if not args.osm_file:
90                 raise UsageError('Missing required --osm-file argument')
91             database_import.import_osm_data(Path(args.osm_file),
92                                             args.osm2pgsql_options(0, 1),
93                                             drop=args.drop,
94                                             ignore_errors=args.ignore_errors)
95
96         if args.create_tables:
97             LOG.warning('Create Tables')
98             with connect(args.config.get_libpq_dsn()) as conn:
99                 database_import.create_tables(conn, args.config, args.sqllib_dir, args.reverse_only)
100                 refresh.load_address_levels_from_file(conn, Path(args.config.ADDRESS_LEVEL_CONFIG))
101                 refresh.create_functions(conn, args.config, args.sqllib_dir,
102                                          enable_diff_updates=False)
103                 database_import.create_table_triggers(conn, args.config, args.sqllib_dir)
104
105         if args.create_partition_tables:
106             LOG.warning('Create Partition Tables')
107             with connect(args.config.get_libpq_dsn()) as conn:
108                 database_import.create_partition_tables(conn, args.config, args.sqllib_dir)
109
110         if args.load_data:
111             LOG.warning('Load data')
112             with connect(args.config.get_libpq_dsn()) as conn:
113                 database_import.truncate_data_tables(conn, args.config.MAX_WORD_FREQUENCY)
114             database_import.load_data(args.config.get_libpq_dsn(),
115                                       args.data_dir,
116                                       args.threads or 1)
117
118             with connect(args.config.get_libpq_dsn()) as conn:
119                 try:
120                     status.set_status(conn, status.compute_database_date(conn))
121                 except Exception as exc: # pylint: disable=broad-except
122                     LOG.error('Cannot determine date of database: %s', exc)
123
124         if args.index:
125             LOG.warning('Indexing')
126             from ..indexer.indexer import Indexer
127             indexer = Indexer(args.config.get_libpq_dsn(), args.threads or 1)
128             indexer.index_full()
129
130         if args.create_search_indices:
131             LOG.warning('Create Search indices')
132             with connect(args.config.get_libpq_dsn()) as conn:
133                 database_import.create_search_indices(conn, args.config, args.sqllib_dir, args.drop)
134
135         if args.tiger_data:
136             LOG.warning('Tiger data')
137             tiger_data.add_tiger_data(args.config.get_libpq_dsn(),
138                                       args.tiger_data,
139                                       args.threads or 1,
140                                       args.config,
141                                       args.sqllib_dir)
142
143         if args.create_country_names:
144             LOG.warning('Create search index for default country names.')
145             with connect(args.config.get_libpq_dsn()) as conn:
146                 database_import.create_country_names(conn, args.config)