]> git.openstreetmap.org Git - nominatim.git/blob - nominatim/db/utils.py
use psql for executing sql files
[nominatim.git] / nominatim / db / utils.py
1 """
2 Helper functions for handling DB accesses.
3 """
4 import subprocess
5 import logging
6
7 from .connection import get_pg_env
8 from ..errors import UsageError
9
10 LOG = logging.getLogger()
11
12 def execute_file(dsn, fname, ignore_errors=False):
13     """ Read an SQL file and run its contents against the given database
14         using psql.
15     """
16     cmd = ['psql']
17     if not ignore_errors:
18         cmd.extend(('-v', 'ON_ERROR_STOP=1'))
19     proc = subprocess.Popen(cmd, env=get_pg_env(dsn), stdin=subprocess.PIPE)
20
21     if not LOG.isEnabledFor(logging.INFO):
22         proc.stdin.write('set client_min_messages to WARNING;'.encode('utf-8'))
23
24     with fname.open('rb') as fdesc:
25         chunk = fdesc.read(2048)
26         while chunk and proc.poll() is None:
27             proc.stdin.write(chunk)
28             chunk = fdesc.read(2048)
29
30     proc.stdin.close()
31
32     ret = proc.wait()
33     print(ret, chunk)
34     if ret != 0 or chunk:
35         raise UsageError("Failed to execute SQL file.")