make sure psql always finishes

If an execption is raised by other means, we still have to close
the stdin pipe to psql to make sure that it exits and releases its
connection to the database.
This commit is contained in:
Sarah Hoffmann
2021-02-27 10:24:40 +01:00
parent afabbeb546
commit b46adbad22

View File

@@ -35,24 +35,25 @@ def execute_file(dsn, fname, ignore_errors=False, pre_code=None, post_code=None)
cmd.append('--quiet') cmd.append('--quiet')
proc = subprocess.Popen(cmd, env=get_pg_env(dsn), stdin=subprocess.PIPE) proc = subprocess.Popen(cmd, env=get_pg_env(dsn), stdin=subprocess.PIPE)
if not LOG.isEnabledFor(logging.INFO): try:
proc.stdin.write('set client_min_messages to WARNING;'.encode('utf-8')) if not LOG.isEnabledFor(logging.INFO):
proc.stdin.write('set client_min_messages to WARNING;'.encode('utf-8'))
if pre_code: if pre_code:
proc.stdin.write((pre_code + ';').encode('utf-8')) proc.stdin.write((pre_code + ';').encode('utf-8'))
if fname.suffix == '.gz': if fname.suffix == '.gz':
with gzip.open(str(fname), 'rb') as fdesc: with gzip.open(str(fname), 'rb') as fdesc:
remain = _pipe_to_proc(proc, fdesc) remain = _pipe_to_proc(proc, fdesc)
else: else:
with fname.open('rb') as fdesc: with fname.open('rb') as fdesc:
remain = _pipe_to_proc(proc, fdesc) remain = _pipe_to_proc(proc, fdesc)
if remain == 0 and post_code: if remain == 0 and post_code:
proc.stdin.write((';' + post_code).encode('utf-8')) proc.stdin.write((';' + post_code).encode('utf-8'))
finally:
proc.stdin.close()
ret = proc.wait()
proc.stdin.close()
ret = proc.wait()
if ret != 0 or remain > 0: if ret != 0 or remain > 0:
raise UsageError("Failed to execute SQL file.") raise UsageError("Failed to execute SQL file.")