]> git.openstreetmap.org Git - nominatim.git/blob - nominatim/tools/tiger_data.py
Linting fixes
[nominatim.git] / nominatim / tools / tiger_data.py
1 """
2 Functions for setting up and importing a new Nominatim database.
3 """
4 import logging
5 import os
6 import tarfile
7 import selectors
8
9 from ..db.connection import connect
10 from ..db.async_connection import DBConnection
11 from ..db.sql_preprocessor import SQLPreprocessor
12
13 # pylint: disable=R0912
14 # pylint: disable=R0914,R0915,W0702
15
16 LOG = logging.getLogger()
17
18
19 def add_tiger_data(dsn, data_dir, threads, config, sqllib_dir):
20     """ Import tiger data from directory or tar file
21     """
22     # Handling directory or tarball file.
23     is_tarfile = False
24     if data_dir.endswith('.tar.gz'):
25         is_tarfile = True
26         tar = tarfile.open(data_dir)
27         sql_files = [i for i in tar.getmembers() if i.name.endswith('.sql')]
28         LOG.warning("Found %d SQL files in tarfile with path %s", len(sql_files), data_dir)
29         if not sql_files:
30             LOG.warning("Tiger data import selected but no files in tarfile's path %s", data_dir)
31             return
32     else:
33         files = os.listdir(data_dir)
34         sql_files = [i for i in files if i.endswith('.sql')]
35         LOG.warning("Found %d SQL files in path %s", len(sql_files), data_dir)
36         if not sql_files:
37             LOG.warning("Tiger data import selected but no files found in path %s", data_dir)
38             return
39
40     with connect(dsn) as conn:
41         sql = SQLPreprocessor(conn, config, sqllib_dir)
42         sql.run_sql_file(conn, 'tiger_import_start.sql')
43
44     # Reading sql_files and then for each file line handling
45     # sql_query in <threads - 1> chunks.
46     sel = selectors.DefaultSelector()
47     place_threads = max(1, threads - 1)
48     for sql_file in sql_files:
49         if not is_tarfile:
50             file_path = os.path.join(data_dir, sql_file)
51             file = open(file_path)
52         else:
53             file = tar.extractfile(sql_file)
54         lines = 0
55         end_of_file = False
56         total_used_threads = place_threads
57         while True:
58             if end_of_file:
59                 break
60             for imod in range(place_threads):
61                 conn = DBConnection(dsn)
62                 conn.connect()
63
64                 sql_query = file.readline()
65                 lines += 1
66
67                 if not sql_query:
68                     end_of_file = True
69                     total_used_threads = imod
70                     break
71
72                 conn.perform(sql_query)
73                 sel.register(conn, selectors.EVENT_READ, conn)
74
75                 if lines == 1000:
76                     print('. ', end='', flush=True)
77                     lines = 0
78
79             todo = min(place_threads, total_used_threads)
80             while todo > 0:
81                 for key, _ in sel.select(1):
82                     try:
83                         conn = key.data
84                         sel.unregister(conn)
85                         conn.wait()
86                         conn.close()
87                         todo -= 1
88                     except:
89                         todo -= 1
90
91     if is_tarfile:
92         tar.close()
93     print('\n')
94     LOG.warning("Creating indexes on Tiger data")
95     with connect(dsn) as conn:
96         sql = SQLPreprocessor(conn, config, sqllib_dir)
97         sql.run_sql_file(conn, 'tiger_import_finish.sql')
98