2 Implementation of the 'transition' subcommand.
 
   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.
 
   9 from pathlib import Path
 
  11 from ..db.connection import connect
 
  12 from ..db import status
 
  13 from ..errors import UsageError
 
  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
 
  20 LOG = logging.getLogger()
 
  22 class AdminTransition:
 
  24     Internal functions for code transition. Do not use.
 
  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')
 
  67     def run(args): # pylint: disable=too-many-statements
 
  68         from ..tools import database_import, tiger_data
 
  69         from ..tools import refresh
 
  72             LOG.warning('Create DB')
 
  73             database_import.create_db(args.config.get_libpq_dsn())
 
  76             LOG.warning('Setup DB')
 
  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,
 
  84             database_import.import_base_data(args.config.get_libpq_dsn(),
 
  85                                              args.data_dir, args.no_partitions)
 
  88             LOG.warning('Import data')
 
  90                 raise UsageError('Missing required --osm-file argument')
 
  91             database_import.import_osm_data(Path(args.osm_file),
 
  92                                             args.osm2pgsql_options(0, 1),
 
  94                                             ignore_errors=args.ignore_errors)
 
  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)
 
 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)
 
 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(),
 
 118             with connect(args.config.get_libpq_dsn()) as conn:
 
 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)
 
 125             LOG.warning('Indexing')
 
 126             from ..indexer.indexer import Indexer
 
 127             indexer = Indexer(args.config.get_libpq_dsn(), args.threads or 1)
 
 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)
 
 136             LOG.warning('Tiger data')
 
 137             tiger_data.add_tiger_data(args.config.get_libpq_dsn(),
 
 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)