Unified logging system for command-line programs

This unifies the various ad hoc logging (message printing, error
printing) systems used throughout the command-line programs.

Features:

- Program name is automatically prefixed.

- Message string does not end with newline.  This removes a common
  source of inconsistencies and omissions.

- Additionally, a final newline is automatically stripped, simplifying
  use of PQerrorMessage() etc., another common source of mistakes.

- I converted error message strings to use %m where possible.

- As a result of the above several points, more translatable message
  strings can be shared between different components and between
  frontends and backend, without gratuitous punctuation or whitespace
  differences.

- There is support for setting a "log level".  This is not meant to be
  user-facing, but can be used internally to implement debug or
  verbose modes.

- Lazy argument evaluation, so no significant overhead if logging at
  some level is disabled.

- Some color in the messages, similar to gcc and clang.  Set
  PG_COLOR=auto to try it out.  Some colors are predefined, but can be
  customized by setting PG_COLORS.

- Common files (common/, fe_utils/, etc.) can handle logging much more
  simply by just using one API without worrying too much about the
  context of the calling program, requiring callbacks, or having to
  pass "progname" around everywhere.

- Some programs called setvbuf() to make sure that stderr is
  unbuffered, even on Windows.  But not all programs did that.  This
  is now done centrally.

Soft goals:

- Reduces vertical space use and visual complexity of error reporting
  in the source code.

- Encourages more deliberate classification of messages.  For example,
  in some cases it wasn't clear without analyzing the surrounding code
  whether a message was meant as an error or just an info.

- Concepts and terms are vaguely aligned with popular logging
  frameworks such as log4j and Python logging.

This is all just about printing stuff out.  Nothing affects program
flow (e.g., fatal exits).  The uses are just too varied to do that.
Some existing code had wrappers that do some kind of print-and-exit,
and I adapted those.

I tried to keep the output mostly the same, but there is a lot of
historical baggage to unwind and special cases to consider, and I
might not always have succeeded.  One significant change is that
pg_rewind used to write all error messages to stdout.  That is now
changed to stderr.

Reviewed-by: Donald Dong <xdong@csumb.edu>
Reviewed-by: Arthur Zakirov <a.zakirov@postgrespro.ru>
Discussion: https://www.postgresql.org/message-id/flat/6a609b43-4f57-7348-6480-bd022f924310@2ndquadrant.com
This commit is contained in:
Peter Eisentraut 2019-04-01 14:24:37 +02:00
parent b4cc19ab01
commit cc8d415117
132 changed files with 2555 additions and 2686 deletions

View File

@ -274,6 +274,17 @@ PostgreSQL documentation
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
<para> <para>

View File

@ -322,6 +322,17 @@ PostgreSQL documentation
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
<para> <para>

View File

@ -400,6 +400,17 @@ PostgreSQL documentation
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
<para> <para>

View File

@ -228,6 +228,17 @@ PostgreSQL documentation
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
<para> <para>

View File

@ -220,6 +220,17 @@ PostgreSQL documentation
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
<para> <para>

View File

@ -461,6 +461,17 @@ PostgreSQL documentation
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><envar>TZ</envar></term> <term><envar>TZ</envar></term>

View File

@ -687,6 +687,12 @@ PostgreSQL documentation
(see <xref linkend="libpq-envars"/>). (see <xref linkend="libpq-envars"/>).
</para> </para>
<para>
The environment variable <envar>PG_COLOR</envar> specifies whether to use
color in diagnostics messages. Possible values are
<literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</refsect1> </refsect1>
<refsect1> <refsect1>

View File

@ -173,6 +173,17 @@ PostgreSQL documentation
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
</refsect1> </refsect1>

View File

@ -68,6 +68,17 @@ PostgreSQL documentation
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
</refsect1> </refsect1>
</refentry> </refentry>

View File

@ -1224,6 +1224,17 @@ PostgreSQL documentation
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
<para> <para>

View File

@ -695,6 +695,17 @@ PostgreSQL documentation
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
<para> <para>

View File

@ -164,6 +164,13 @@ PostgreSQL documentation
also uses the environment variables supported by <application>libpq</application> also uses the environment variables supported by <application>libpq</application>
(see <xref linkend="libpq-envars"/>). (see <xref linkend="libpq-envars"/>).
</para> </para>
<para>
The environment variable <envar>PG_COLOR</envar> specifies whether to use
color in diagnostics messages. Possible values are
<literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</refsect1> </refsect1>
<refsect1 id="app-pg-isready-notes"> <refsect1 id="app-pg-isready-notes">

View File

@ -408,6 +408,12 @@ PostgreSQL documentation
(see <xref linkend="libpq-envars"/>). (see <xref linkend="libpq-envars"/>).
</para> </para>
<para>
The environment variable <envar>PG_COLOR</envar> specifies whether to use
color in diagnostics messages. Possible values are
<literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</refsect1> </refsect1>
<refsect1> <refsect1>

View File

@ -397,6 +397,13 @@ PostgreSQL documentation
uses the environment variables supported by <application>libpq</application> uses the environment variables supported by <application>libpq</application>
(see <xref linkend="libpq-envars"/>). (see <xref linkend="libpq-envars"/>).
</para> </para>
<para>
The environment variable <envar>PG_COLOR</envar> specifies whether to use
color in diagnostics messages. Possible values are
<literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</refsect1> </refsect1>
<refsect1> <refsect1>

View File

@ -320,6 +320,23 @@ PostgreSQL documentation
</variablelist> </variablelist>
</refsect1> </refsect1>
<refsect1>
<title>Environment</title>
<variablelist>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1> <refsect1>
<title>Notes</title> <title>Notes</title>

View File

@ -822,6 +822,17 @@
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
<para> <para>

View File

@ -234,6 +234,13 @@ PostgreSQL documentation
<application>pg_rewind</application> also uses the environment variables <application>pg_rewind</application> also uses the environment variables
supported by <application>libpq</application> (see <xref linkend="libpq-envars"/>). supported by <application>libpq</application> (see <xref linkend="libpq-envars"/>).
</para> </para>
<para>
The environment variable <envar>PG_COLOR</envar> specifies whether to use
color in diagnostics messages. Possible values are
<literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</refsect1> </refsect1>
<refsect1> <refsect1>

View File

@ -206,6 +206,32 @@ PostgreSQL documentation
</para> </para>
</refsect1> </refsect1>
<refsect1>
<title>Environment</title>
<variablelist>
<varlistentry>
<term><envar>PGDATA</envar></term>
<listitem>
<para>
Data directory; see also the <option>-p</option> option.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1> <refsect1>
<title>Notes</title> <title>Notes</title>
<para> <para>

View File

@ -4333,6 +4333,17 @@ $endif
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><envar>PSQL_EDITOR</envar></term> <term><envar>PSQL_EDITOR</envar></term>
<term><envar>EDITOR</envar></term> <term><envar>EDITOR</envar></term>

View File

@ -352,6 +352,17 @@ PostgreSQL documentation
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
<para> <para>

View File

@ -451,6 +451,17 @@ PostgreSQL documentation
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><envar>PG_COLOR</envar></term>
<listitem>
<para>
Specifies whether to use color in diagnostics messages. Possible values
are <literal>always</literal>, <literal>auto</literal>,
<literal>never</literal>.
</para>
</listitem>
</varlistentry>
</variablelist> </variablelist>
<para> <para>

View File

@ -4761,7 +4761,7 @@ ReadControlFile(void)
void void
UpdateControlFile(void) UpdateControlFile(void)
{ {
update_controlfile(DataDir, NULL, ControlFile, true); update_controlfile(DataDir, ControlFile, true);
} }
/* /*

View File

@ -54,7 +54,7 @@ pg_control_system(PG_FUNCTION_ARGS)
tupdesc = BlessTupleDesc(tupdesc); tupdesc = BlessTupleDesc(tupdesc);
/* read the control file */ /* read the control file */
ControlFile = get_controlfile(DataDir, NULL, &crc_ok); ControlFile = get_controlfile(DataDir, &crc_ok);
if (!crc_ok) if (!crc_ok)
ereport(ERROR, ereport(ERROR,
(errmsg("calculated CRC checksum does not match value stored in file"))); (errmsg("calculated CRC checksum does not match value stored in file")));
@ -132,7 +132,7 @@ pg_control_checkpoint(PG_FUNCTION_ARGS)
tupdesc = BlessTupleDesc(tupdesc); tupdesc = BlessTupleDesc(tupdesc);
/* Read the control file. */ /* Read the control file. */
ControlFile = get_controlfile(DataDir, NULL, &crc_ok); ControlFile = get_controlfile(DataDir, &crc_ok);
if (!crc_ok) if (!crc_ok)
ereport(ERROR, ereport(ERROR,
(errmsg("calculated CRC checksum does not match value stored in file"))); (errmsg("calculated CRC checksum does not match value stored in file")));
@ -236,7 +236,7 @@ pg_control_recovery(PG_FUNCTION_ARGS)
tupdesc = BlessTupleDesc(tupdesc); tupdesc = BlessTupleDesc(tupdesc);
/* read the control file */ /* read the control file */
ControlFile = get_controlfile(DataDir, NULL, &crc_ok); ControlFile = get_controlfile(DataDir, &crc_ok);
if (!crc_ok) if (!crc_ok)
ereport(ERROR, ereport(ERROR,
(errmsg("calculated CRC checksum does not match value stored in file"))); (errmsg("calculated CRC checksum does not match value stored in file")));
@ -303,7 +303,7 @@ pg_control_init(PG_FUNCTION_ARGS)
tupdesc = BlessTupleDesc(tupdesc); tupdesc = BlessTupleDesc(tupdesc);
/* read the control file */ /* read the control file */
ControlFile = get_controlfile(DataDir, NULL, &crc_ok); ControlFile = get_controlfile(DataDir, &crc_ok);
if (!crc_ok) if (!crc_ok)
ereport(ERROR, ereport(ERROR,
(errmsg("calculated CRC checksum does not match value stored in file"))); (errmsg("calculated CRC checksum does not match value stored in file")));

View File

@ -67,6 +67,7 @@
#include "common/file_utils.h" #include "common/file_utils.h"
#include "common/restricted_token.h" #include "common/restricted_token.h"
#include "common/username.h" #include "common/username.h"
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h" #include "fe_utils/string_utils.h"
#include "getaddrinfo.h" #include "getaddrinfo.h"
#include "getopt_long.h" #include "getopt_long.h"
@ -184,7 +185,7 @@ static const char *default_timezone = NULL;
"# allows any local user to connect as any PostgreSQL user, including\n" \ "# allows any local user to connect as any PostgreSQL user, including\n" \
"# the database superuser. If you do not trust all your local users,\n" \ "# the database superuser. If you do not trust all your local users,\n" \
"# use another authentication method.\n" "# use another authentication method.\n"
static char *authwarning = NULL; static bool authwarning = false;
/* /*
* Centralized knowledge of switches to pass to backend * Centralized knowledge of switches to pass to backend
@ -335,7 +336,7 @@ escape_quotes(const char *src)
if (!result) if (!result)
{ {
fprintf(stderr, _("%s: out of memory\n"), progname); pg_log_error("out of memory");
exit(1); exit(1);
} }
return result; return result;
@ -491,8 +492,7 @@ readfile(const char *path)
if ((infile = fopen(path, "r")) == NULL) if ((infile = fopen(path, "r")) == NULL)
{ {
fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), pg_log_error("could not open file \"%s\" for reading: %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
@ -547,24 +547,21 @@ writefile(char *path, char **lines)
if ((out_file = fopen(path, "w")) == NULL) if ((out_file = fopen(path, "w")) == NULL)
{ {
fprintf(stderr, _("%s: could not open file \"%s\" for writing: %s\n"), pg_log_error("could not open file \"%s\" for writing: %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
for (line = lines; *line != NULL; line++) for (line = lines; *line != NULL; line++)
{ {
if (fputs(*line, out_file) < 0) if (fputs(*line, out_file) < 0)
{ {
fprintf(stderr, _("%s: could not write file \"%s\": %s\n"), pg_log_error("could not write file \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
free(*line); free(*line);
} }
if (fclose(out_file)) if (fclose(out_file))
{ {
fprintf(stderr, _("%s: could not write file \"%s\": %s\n"), pg_log_error("could not write file \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
} }
@ -582,8 +579,7 @@ popen_check(const char *command, const char *mode)
errno = 0; errno = 0;
cmdfd = popen(command, mode); cmdfd = popen(command, mode);
if (cmdfd == NULL) if (cmdfd == NULL)
fprintf(stderr, _("%s: could not execute command \"%s\": %s\n"), pg_log_error("could not execute command \"%s\": %m", command);
progname, command, strerror(errno));
return cmdfd; return cmdfd;
} }
@ -601,52 +597,41 @@ cleanup_directories_atexit(void)
{ {
if (made_new_pgdata) if (made_new_pgdata)
{ {
fprintf(stderr, _("%s: removing data directory \"%s\"\n"), pg_log_info("removing data directory \"%s\"", pg_data);
progname, pg_data);
if (!rmtree(pg_data, true)) if (!rmtree(pg_data, true))
fprintf(stderr, _("%s: failed to remove data directory\n"), pg_log_error("failed to remove data directory");
progname);
} }
else if (found_existing_pgdata) else if (found_existing_pgdata)
{ {
fprintf(stderr, pg_log_info("removing contents of data directory \"%s\"",
_("%s: removing contents of data directory \"%s\"\n"), pg_data);
progname, pg_data);
if (!rmtree(pg_data, false)) if (!rmtree(pg_data, false))
fprintf(stderr, _("%s: failed to remove contents of data directory\n"), pg_log_error("failed to remove contents of data directory");
progname);
} }
if (made_new_xlogdir) if (made_new_xlogdir)
{ {
fprintf(stderr, _("%s: removing WAL directory \"%s\"\n"), pg_log_info("removing WAL directory \"%s\"", xlog_dir);
progname, xlog_dir);
if (!rmtree(xlog_dir, true)) if (!rmtree(xlog_dir, true))
fprintf(stderr, _("%s: failed to remove WAL directory\n"), pg_log_error("failed to remove WAL directory");
progname);
} }
else if (found_existing_xlogdir) else if (found_existing_xlogdir)
{ {
fprintf(stderr, pg_log_info("removing contents of WAL directory \"%s\"", xlog_dir);
_("%s: removing contents of WAL directory \"%s\"\n"),
progname, xlog_dir);
if (!rmtree(xlog_dir, false)) if (!rmtree(xlog_dir, false))
fprintf(stderr, _("%s: failed to remove contents of WAL directory\n"), pg_log_error("failed to remove contents of WAL directory");
progname);
} }
/* otherwise died during startup, do nothing! */ /* otherwise died during startup, do nothing! */
} }
else else
{ {
if (made_new_pgdata || found_existing_pgdata) if (made_new_pgdata || found_existing_pgdata)
fprintf(stderr, pg_log_info("data directory \"%s\" not removed at user's request",
_("%s: data directory \"%s\" not removed at user's request\n"), pg_data);
progname, pg_data);
if (made_new_xlogdir || found_existing_xlogdir) if (made_new_xlogdir || found_existing_xlogdir)
fprintf(stderr, pg_log_info("WAL directory \"%s\" not removed at user's request",
_("%s: WAL directory \"%s\" not removed at user's request\n"), xlog_dir);
progname, xlog_dir);
} }
} }
@ -663,12 +648,10 @@ get_id(void)
#ifndef WIN32 #ifndef WIN32
if (geteuid() == 0) /* 0 is root's uid */ if (geteuid() == 0) /* 0 is root's uid */
{ {
pg_log_error("cannot be run as root");
fprintf(stderr, fprintf(stderr,
_("%s: cannot be run as root\n" _("Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n"
"Please log in (using, e.g., \"su\") as the " "own the server process.\n"));
"(unprivileged) user that will\n"
"own the server process.\n"),
progname);
exit(1); exit(1);
} }
#endif #endif
@ -700,8 +683,8 @@ get_encoding_id(const char *encoding_name)
if ((enc = pg_valid_server_encoding(encoding_name)) >= 0) if ((enc = pg_valid_server_encoding(encoding_name)) >= 0)
return enc; return enc;
} }
fprintf(stderr, _("%s: \"%s\" is not a valid server encoding name\n"), pg_log_error("\"%s\" is not a valid server encoding name",
progname, encoding_name ? encoding_name : "(null)"); encoding_name ? encoding_name : "(null)");
exit(1); exit(1);
} }
@ -831,17 +814,14 @@ check_input(char *path)
{ {
if (errno == ENOENT) if (errno == ENOENT)
{ {
fprintf(stderr, pg_log_error("file \"%s\" does not exist", path);
_("%s: file \"%s\" does not exist\n"), progname, path);
fprintf(stderr, fprintf(stderr,
_("This might mean you have a corrupted installation or identified\n" _("This might mean you have a corrupted installation or identified\n"
"the wrong directory with the invocation option -L.\n")); "the wrong directory with the invocation option -L.\n"));
} }
else else
{ {
fprintf(stderr, pg_log_error("could not access file \"%s\": %m", path);
_("%s: could not access file \"%s\": %s\n"), progname, path,
strerror(errno));
fprintf(stderr, fprintf(stderr,
_("This might mean you have a corrupted installation or identified\n" _("This might mean you have a corrupted installation or identified\n"
"the wrong directory with the invocation option -L.\n")); "the wrong directory with the invocation option -L.\n"));
@ -850,8 +830,7 @@ check_input(char *path)
} }
if (!S_ISREG(statbuf.st_mode)) if (!S_ISREG(statbuf.st_mode))
{ {
fprintf(stderr, pg_log_error("file \"%s\" is not a regular file", path);
_("%s: file \"%s\" is not a regular file\n"), progname, path);
fprintf(stderr, fprintf(stderr,
_("This might mean you have a corrupted installation or identified\n" _("This might mean you have a corrupted installation or identified\n"
"the wrong directory with the invocation option -L.\n")); "the wrong directory with the invocation option -L.\n"));
@ -876,15 +855,13 @@ write_version_file(const char *extrapath)
if ((version_file = fopen(path, PG_BINARY_W)) == NULL) if ((version_file = fopen(path, PG_BINARY_W)) == NULL)
{ {
fprintf(stderr, _("%s: could not open file \"%s\" for writing: %s\n"), pg_log_error("could not open file \"%s\" for writing: %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
if (fprintf(version_file, "%s\n", PG_MAJORVERSION) < 0 || if (fprintf(version_file, "%s\n", PG_MAJORVERSION) < 0 ||
fclose(version_file)) fclose(version_file))
{ {
fprintf(stderr, _("%s: could not write file \"%s\": %s\n"), pg_log_error("could not write file \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
free(path); free(path);
@ -904,14 +881,12 @@ set_null_conf(void)
conf_file = fopen(path, PG_BINARY_W); conf_file = fopen(path, PG_BINARY_W);
if (conf_file == NULL) if (conf_file == NULL)
{ {
fprintf(stderr, _("%s: could not open file \"%s\" for writing: %s\n"), pg_log_error("could not open file \"%s\" for writing: %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
if (fclose(conf_file)) if (fclose(conf_file))
{ {
fprintf(stderr, _("%s: could not write file \"%s\": %s\n"), pg_log_error("could not write file \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
free(path); free(path);
@ -1261,8 +1236,7 @@ setup_config(void)
writefile(path, conflines); writefile(path, conflines);
if (chmod(path, pg_file_create_mode) != 0) if (chmod(path, pg_file_create_mode) != 0)
{ {
fprintf(stderr, _("%s: could not change permissions of \"%s\": %s\n"), pg_log_error("could not change permissions of \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
@ -1281,8 +1255,7 @@ setup_config(void)
writefile(path, autoconflines); writefile(path, autoconflines);
if (chmod(path, pg_file_create_mode) != 0) if (chmod(path, pg_file_create_mode) != 0)
{ {
fprintf(stderr, _("%s: could not change permissions of \"%s\": %s\n"), pg_log_error("could not change permissions of \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
@ -1368,8 +1341,7 @@ setup_config(void)
writefile(path, conflines); writefile(path, conflines);
if (chmod(path, pg_file_create_mode) != 0) if (chmod(path, pg_file_create_mode) != 0)
{ {
fprintf(stderr, _("%s: could not change permissions of \"%s\": %s\n"), pg_log_error("could not change permissions of \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
@ -1384,8 +1356,7 @@ setup_config(void)
writefile(path, conflines); writefile(path, conflines);
if (chmod(path, pg_file_create_mode) != 0) if (chmod(path, pg_file_create_mode) != 0)
{ {
fprintf(stderr, _("%s: could not change permissions of \"%s\": %s\n"), pg_log_error("could not change permissions of \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
@ -1419,11 +1390,11 @@ bootstrap_template1(void)
if (strcmp(headerline, *bki_lines) != 0) if (strcmp(headerline, *bki_lines) != 0)
{ {
pg_log_error("input file \"%s\" does not belong to PostgreSQL %s",
bki_file, PG_VERSION);
fprintf(stderr, fprintf(stderr,
_("%s: input file \"%s\" does not belong to PostgreSQL %s\n" _("Check your installation or specify the correct path "
"Check your installation or specify the correct path " "using the option -L.\n"));
"using the option -L.\n"),
progname, bki_file, PG_VERSION);
exit(1); exit(1);
} }
@ -1560,18 +1531,18 @@ get_su_pwd(void)
if (!pwf) if (!pwf)
{ {
fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), pg_log_error("could not open file \"%s\" for reading: %m",
progname, pwfilename, strerror(errno)); pwfilename);
exit(1); exit(1);
} }
if (!fgets(pwd1, sizeof(pwd1), pwf)) if (!fgets(pwd1, sizeof(pwd1), pwf))
{ {
if (ferror(pwf)) if (ferror(pwf))
fprintf(stderr, _("%s: could not read password from file \"%s\": %s\n"), pg_log_error("could not read password from file \"%s\": %m",
progname, pwfilename, strerror(errno)); pwfilename);
else else
fprintf(stderr, _("%s: password file \"%s\" is empty\n"), pg_log_error("password file \"%s\" is empty",
progname, pwfilename); pwfilename);
exit(1); exit(1);
} }
fclose(pwf); fclose(pwf);
@ -2237,8 +2208,7 @@ check_locale_name(int category, const char *locale, char **canonname)
save = setlocale(category, NULL); save = setlocale(category, NULL);
if (!save) if (!save)
{ {
fprintf(stderr, _("%s: setlocale() failed\n"), pg_log_error("setlocale() failed");
progname);
exit(1); exit(1);
} }
@ -2259,8 +2229,7 @@ check_locale_name(int category, const char *locale, char **canonname)
/* restore old value. */ /* restore old value. */
if (!setlocale(category, save)) if (!setlocale(category, save))
{ {
fprintf(stderr, _("%s: failed to restore old locale \"%s\"\n"), pg_log_error("failed to restore old locale \"%s\"", save);
progname, save);
exit(1); exit(1);
} }
free(save); free(save);
@ -2269,8 +2238,7 @@ check_locale_name(int category, const char *locale, char **canonname)
if (res == NULL) if (res == NULL)
{ {
if (*locale) if (*locale)
fprintf(stderr, _("%s: invalid locale name \"%s\"\n"), pg_log_error("invalid locale name \"%s\"", locale);
progname, locale);
else else
{ {
/* /*
@ -2281,8 +2249,7 @@ check_locale_name(int category, const char *locale, char **canonname)
* setlocale's behavior is implementation-specific, it's hard to * setlocale's behavior is implementation-specific, it's hard to
* be sure what it didn't like. Print a safe generic message. * be sure what it didn't like. Print a safe generic message.
*/ */
fprintf(stderr, _("%s: invalid locale settings; check LANG and LC_* environment variables\n"), pg_log_error("invalid locale settings; check LANG and LC_* environment variables");
progname);
} }
exit(1); exit(1);
} }
@ -2309,7 +2276,7 @@ check_locale_encoding(const char *locale, int user_enc)
#endif #endif
user_enc == PG_SQL_ASCII)) user_enc == PG_SQL_ASCII))
{ {
fprintf(stderr, _("%s: encoding mismatch\n"), progname); pg_log_error("encoding mismatch");
fprintf(stderr, fprintf(stderr,
_("The encoding you selected (%s) and the encoding that the\n" _("The encoding you selected (%s) and the encoding that the\n"
"selected locale uses (%s) do not match. This would lead to\n" "selected locale uses (%s) do not match. This would lead to\n"
@ -2427,9 +2394,7 @@ check_authmethod_unspecified(const char **authmethod)
{ {
if (*authmethod == NULL) if (*authmethod == NULL)
{ {
authwarning = _("\nWARNING: enabling \"trust\" authentication for local connections\n" authwarning = true;
"You can change this by editing pg_hba.conf or using the option -A, or\n"
"--auth-local and --auth-host, the next time you run initdb.\n");
*authmethod = "trust"; *authmethod = "trust";
} }
} }
@ -2449,8 +2414,8 @@ check_authmethod_valid(const char *authmethod, const char *const *valid_methods,
return; return;
} }
fprintf(stderr, _("%s: invalid authentication method \"%s\" for \"%s\" connections\n"), pg_log_error("invalid authentication method \"%s\" for \"%s\" connections",
progname, authmethod, conntype); authmethod, conntype);
exit(1); exit(1);
} }
@ -2465,7 +2430,7 @@ check_need_password(const char *authmethodlocal, const char *authmethodhost)
strcmp(authmethodhost, "scram-sha-256") == 0) && strcmp(authmethodhost, "scram-sha-256") == 0) &&
!(pwprompt || pwfilename)) !(pwprompt || pwfilename))
{ {
fprintf(stderr, _("%s: must specify a password for the superuser to enable %s authentication\n"), progname, pg_log_error("must specify a password for the superuser to enable %s authentication",
(strcmp(authmethodlocal, "md5") == 0 || (strcmp(authmethodlocal, "md5") == 0 ||
strcmp(authmethodlocal, "password") == 0 || strcmp(authmethodlocal, "password") == 0 ||
strcmp(authmethodlocal, "scram-sha-256") == 0) strcmp(authmethodlocal, "scram-sha-256") == 0)
@ -2492,12 +2457,11 @@ setup_pgdata(void)
} }
else else
{ {
pg_log_error("no data directory specified");
fprintf(stderr, fprintf(stderr,
_("%s: no data directory specified\n" _("You must identify the directory where the data for this database system\n"
"You must identify the directory where the data for this database system\n"
"will reside. Do this with either the invocation option -D or the\n" "will reside. Do this with either the invocation option -D or the\n"
"environment variable PGDATA.\n"), "environment variable PGDATA.\n"));
progname);
exit(1); exit(1);
} }
} }
@ -2530,18 +2494,15 @@ setup_bin_paths(const char *argv0)
strlcpy(full_path, progname, sizeof(full_path)); strlcpy(full_path, progname, sizeof(full_path));
if (ret == -1) if (ret == -1)
fprintf(stderr, pg_log_error("The program \"postgres\" is needed by %s but was not found in the\n"
_("The program \"postgres\" is needed by %s " "same directory as \"%s\".\n"
"but was not found in the\n" "Check your installation.",
"same directory as \"%s\".\n" full_path, progname);
"Check your installation.\n"),
progname, full_path);
else else
fprintf(stderr, pg_log_error("The program \"postgres\" was found by \"%s\"\n"
_("The program \"postgres\" was found by \"%s\"\n" "but was not the same version as %s.\n"
"but was not the same version as %s.\n" "Check your installation.",
"Check your installation.\n"), full_path, progname);
full_path, progname);
exit(1); exit(1);
} }
@ -2557,7 +2518,7 @@ setup_bin_paths(const char *argv0)
} }
else if (!is_absolute_path(share_path)) else if (!is_absolute_path(share_path))
{ {
fprintf(stderr, _("%s: input file location must be an absolute path\n"), progname); pg_log_error("input file location must be an absolute path");
exit(1); exit(1);
} }
@ -2601,8 +2562,8 @@ setup_locale_encoding(void)
if (ctype_enc == -1) if (ctype_enc == -1)
{ {
/* Couldn't recognize the locale's codeset */ /* Couldn't recognize the locale's codeset */
fprintf(stderr, _("%s: could not find suitable encoding for locale \"%s\"\n"), pg_log_error("could not find suitable encoding for locale \"%s\"",
progname, lc_ctype); lc_ctype);
fprintf(stderr, _("Rerun %s with the -E option.\n"), progname); fprintf(stderr, _("Rerun %s with the -E option.\n"), progname);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
@ -2622,9 +2583,8 @@ setup_locale_encoding(void)
pg_encoding_to_char(ctype_enc), pg_encoding_to_char(ctype_enc),
pg_encoding_to_char(encodingid)); pg_encoding_to_char(encodingid));
#else #else
fprintf(stderr, pg_log_error("locale \"%s\" requires unsupported encoding \"%s\"",
_("%s: locale \"%s\" requires unsupported encoding \"%s\"\n"), lc_ctype, pg_encoding_to_char(ctype_enc));
progname, lc_ctype, pg_encoding_to_char(ctype_enc));
fprintf(stderr, fprintf(stderr,
_("Encoding \"%s\" is not allowed as a server-side encoding.\n" _("Encoding \"%s\" is not allowed as a server-side encoding.\n"
"Rerun %s with a different locale selection.\n"), "Rerun %s with a different locale selection.\n"),
@ -2774,8 +2734,7 @@ create_data_directory(void)
if (pg_mkdir_p(pg_data, pg_dir_create_mode) != 0) if (pg_mkdir_p(pg_data, pg_dir_create_mode) != 0)
{ {
fprintf(stderr, _("%s: could not create directory \"%s\": %s\n"), pg_log_error("could not create directory \"%s\": %m", pg_data);
progname, pg_data, strerror(errno));
exit(1); exit(1);
} }
else else
@ -2792,8 +2751,8 @@ create_data_directory(void)
if (chmod(pg_data, pg_dir_create_mode) != 0) if (chmod(pg_data, pg_dir_create_mode) != 0)
{ {
fprintf(stderr, _("%s: could not change permissions of directory \"%s\": %s\n"), pg_log_error("could not change permissions of directory \"%s\": %m",
progname, pg_data, strerror(errno)); pg_data);
exit(1); exit(1);
} }
else else
@ -2806,9 +2765,7 @@ create_data_directory(void)
case 3: case 3:
case 4: case 4:
/* Present and not empty */ /* Present and not empty */
fprintf(stderr, pg_log_error("directory \"%s\" exists but is not empty", pg_data);
_("%s: directory \"%s\" exists but is not empty\n"),
progname, pg_data);
if (ret != 4) if (ret != 4)
warn_on_mount_point(ret); warn_on_mount_point(ret);
else else
@ -2821,8 +2778,7 @@ create_data_directory(void)
default: default:
/* Trouble accessing directory */ /* Trouble accessing directory */
fprintf(stderr, _("%s: could not access directory \"%s\": %s\n"), pg_log_error("could not access directory \"%s\": %m", pg_data);
progname, pg_data, strerror(errno));
exit(1); exit(1);
} }
} }
@ -2845,7 +2801,7 @@ create_xlog_or_symlink(void)
canonicalize_path(xlog_dir); canonicalize_path(xlog_dir);
if (!is_absolute_path(xlog_dir)) if (!is_absolute_path(xlog_dir))
{ {
fprintf(stderr, _("%s: WAL directory location must be an absolute path\n"), progname); pg_log_error("WAL directory location must be an absolute path");
exit(1); exit(1);
} }
@ -2860,8 +2816,8 @@ create_xlog_or_symlink(void)
if (pg_mkdir_p(xlog_dir, pg_dir_create_mode) != 0) if (pg_mkdir_p(xlog_dir, pg_dir_create_mode) != 0)
{ {
fprintf(stderr, _("%s: could not create directory \"%s\": %s\n"), pg_log_error("could not create directory \"%s\": %m",
progname, xlog_dir, strerror(errno)); xlog_dir);
exit(1); exit(1);
} }
else else
@ -2878,8 +2834,8 @@ create_xlog_or_symlink(void)
if (chmod(xlog_dir, pg_dir_create_mode) != 0) if (chmod(xlog_dir, pg_dir_create_mode) != 0)
{ {
fprintf(stderr, _("%s: could not change permissions of directory \"%s\": %s\n"), pg_log_error("could not change permissions of directory \"%s\": %m",
progname, xlog_dir, strerror(errno)); xlog_dir);
exit(1); exit(1);
} }
else else
@ -2892,9 +2848,7 @@ create_xlog_or_symlink(void)
case 3: case 3:
case 4: case 4:
/* Present and not empty */ /* Present and not empty */
fprintf(stderr, pg_log_error("directory \"%s\" exists but is not empty", xlog_dir);
_("%s: directory \"%s\" exists but is not empty\n"),
progname, xlog_dir);
if (ret != 4) if (ret != 4)
warn_on_mount_point(ret); warn_on_mount_point(ret);
else else
@ -2906,20 +2860,19 @@ create_xlog_or_symlink(void)
default: default:
/* Trouble accessing directory */ /* Trouble accessing directory */
fprintf(stderr, _("%s: could not access directory \"%s\": %s\n"), pg_log_error("could not access directory \"%s\": %m", xlog_dir);
progname, xlog_dir, strerror(errno));
exit(1); exit(1);
} }
#ifdef HAVE_SYMLINK #ifdef HAVE_SYMLINK
if (symlink(xlog_dir, subdirloc) != 0) if (symlink(xlog_dir, subdirloc) != 0)
{ {
fprintf(stderr, _("%s: could not create symbolic link \"%s\": %s\n"), pg_log_error("could not create symbolic link \"%s\": %m",
progname, subdirloc, strerror(errno)); subdirloc);
exit(1); exit(1);
} }
#else #else
fprintf(stderr, _("%s: symlinks are not supported on this platform\n"), progname); pg_log_error("symlinks are not supported on this platform");
exit(1); exit(1);
#endif #endif
} }
@ -2928,8 +2881,8 @@ create_xlog_or_symlink(void)
/* Without -X option, just make the subdirectory normally */ /* Without -X option, just make the subdirectory normally */
if (mkdir(subdirloc, pg_dir_create_mode) < 0) if (mkdir(subdirloc, pg_dir_create_mode) < 0)
{ {
fprintf(stderr, _("%s: could not create directory \"%s\": %s\n"), pg_log_error("could not create directory \"%s\": %m",
progname, subdirloc, strerror(errno)); subdirloc);
exit(1); exit(1);
} }
} }
@ -2990,8 +2943,7 @@ initialize_data_directory(void)
*/ */
if (mkdir(path, pg_dir_create_mode) < 0) if (mkdir(path, pg_dir_create_mode) < 0)
{ {
fprintf(stderr, _("%s: could not create directory \"%s\": %s\n"), pg_log_error("could not create directory \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
@ -3115,14 +3067,14 @@ main(int argc, char *argv[])
char pg_ctl_path[MAXPGPATH]; char pg_ctl_path[MAXPGPATH];
/* /*
* Ensure that buffering behavior of stdout and stderr matches what it is * Ensure that buffering behavior of stdout matches what it is
* in interactive usage (at least on most platforms). This prevents * in interactive usage (at least on most platforms). This prevents
* unexpected output ordering when, eg, output is redirected to a file. * unexpected output ordering when, eg, output is redirected to a file.
* POSIX says we must do this before any other usage of these files. * POSIX says we must do this before any other usage of these files.
*/ */
setvbuf(stdout, NULL, PG_IOLBF, 0); setvbuf(stdout, NULL, PG_IOLBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
pg_logging_init(argv[0]);
progname = get_progname(argv[0]); progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("initdb")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("initdb"));
@ -3260,8 +3212,8 @@ main(int argc, char *argv[])
if (optind < argc) if (optind < argc)
{ {
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), pg_log_error("too many command-line arguments (first is \"%s\")",
progname, argv[optind]); argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -3277,21 +3229,20 @@ main(int argc, char *argv[])
/* must check that directory is readable */ /* must check that directory is readable */
if (pg_check_dir(pg_data) <= 0) if (pg_check_dir(pg_data) <= 0)
{ {
fprintf(stderr, _("%s: could not access directory \"%s\": %s\n"), pg_log_error("could not access directory \"%s\": %m", pg_data);
progname, pg_data, strerror(errno));
exit(1); exit(1);
} }
fputs(_("syncing data to disk ... "), stdout); fputs(_("syncing data to disk ... "), stdout);
fflush(stdout); fflush(stdout);
fsync_pgdata(pg_data, progname, PG_VERSION_NUM); fsync_pgdata(pg_data, PG_VERSION_NUM);
check_ok(); check_ok();
return 0; return 0;
} }
if (pwprompt && pwfilename) if (pwprompt && pwfilename)
{ {
fprintf(stderr, _("%s: password prompt and password file cannot be specified together\n"), progname); pg_log_error("password prompt and password file cannot be specified together");
exit(1); exit(1);
} }
@ -3316,21 +3267,17 @@ main(int argc, char *argv[])
/* verify that wal segment size is valid */ /* verify that wal segment size is valid */
if (endptr == str_wal_segment_size_mb || *endptr != '\0') if (endptr == str_wal_segment_size_mb || *endptr != '\0')
{ {
fprintf(stderr, pg_log_error("argument of --wal-segsize must be a number");
_("%s: argument of --wal-segsize must be a number\n"),
progname);
exit(1); exit(1);
} }
if (!IsValidWalSegSize(wal_segment_size_mb * 1024 * 1024)) if (!IsValidWalSegSize(wal_segment_size_mb * 1024 * 1024))
{ {
fprintf(stderr, pg_log_error("argument of --wal-segsize must be a power of 2 between 1 and 1024");
_("%s: argument of --wal-segsize must be a power of 2 between 1 and 1024\n"),
progname);
exit(1); exit(1);
} }
} }
get_restricted_token(progname); get_restricted_token();
setup_pgdata(); setup_pgdata();
@ -3342,7 +3289,7 @@ main(int argc, char *argv[])
if (strncmp(username, "pg_", 3) == 0) if (strncmp(username, "pg_", 3) == 0)
{ {
fprintf(stderr, _("%s: superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"\n"), progname, username); pg_log_error("superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"", username);
exit(1); exit(1);
} }
@ -3377,14 +3324,19 @@ main(int argc, char *argv[])
{ {
fputs(_("syncing data to disk ... "), stdout); fputs(_("syncing data to disk ... "), stdout);
fflush(stdout); fflush(stdout);
fsync_pgdata(pg_data, progname, PG_VERSION_NUM); fsync_pgdata(pg_data, PG_VERSION_NUM);
check_ok(); check_ok();
} }
else else
printf(_("\nSync to disk skipped.\nThe data directory might become corrupt if the operating system crashes.\n")); printf(_("\nSync to disk skipped.\nThe data directory might become corrupt if the operating system crashes.\n"));
if (authwarning != NULL) if (authwarning)
fprintf(stderr, "%s", authwarning); {
printf("\n");
pg_log_warning("enabling \"trust\" authentication for local connections");
fprintf(stderr, _("You can change this by editing pg_hba.conf or using the option -A, or\n"
"--auth-local and --auth-host, the next time you run initdb.\n"));
}
/* /*
* Build up a shell command to tell the user how to start the server * Build up a shell command to tell the user how to start the server

View File

@ -1,5 +1,6 @@
# src/bin/initdb/nls.mk # src/bin/initdb/nls.mk
CATALOG_NAME = initdb CATALOG_NAME = initdb
AVAIL_LANGUAGES = cs de es fr he it ja ko pl pt_BR ru sv tr vi zh_CN AVAIL_LANGUAGES = cs de es fr he it ja ko pl pt_BR ru sv tr vi zh_CN
GETTEXT_FILES = findtimezone.c initdb.c ../../common/exec.c ../../common/fe_memutils.c ../../common/file_utils.c ../../common/pgfnames.c ../../common/restricted_token.c ../../common/rmtree.c ../../common/username.c ../../common/wait_error.c ../../port/dirmod.c GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) findtimezone.c initdb.c ../../common/exec.c ../../common/fe_memutils.c ../../common/file_utils.c ../../common/pgfnames.c ../../common/restricted_token.c ../../common/rmtree.c ../../common/username.c ../../common/wait_error.c ../../port/dirmod.c
GETTEXT_TRIGGERS = simple_prompt GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt
GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)

View File

@ -7,11 +7,13 @@ subdir = src/bin/pg_archivecleanup
top_builddir = ../../.. top_builddir = ../../..
include $(top_builddir)/src/Makefile.global include $(top_builddir)/src/Makefile.global
LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils
OBJS = pg_archivecleanup.o $(WIN32RES) OBJS = pg_archivecleanup.o $(WIN32RES)
all: pg_archivecleanup all: pg_archivecleanup
pg_archivecleanup: $(OBJS) | submake-libpgport pg_archivecleanup: $(OBJS) | submake-libpgport submake-libpgfeutils
$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
install: all installdirs install: all installdirs

View File

@ -1,4 +1,6 @@
# src/bin/pg_archivecleanup/nls.mk # src/bin/pg_archivecleanup/nls.mk
CATALOG_NAME = pg_archivecleanup CATALOG_NAME = pg_archivecleanup
AVAIL_LANGUAGES =de es fr ja ko pl ru sv tr vi AVAIL_LANGUAGES =de es fr ja ko pl ru sv tr vi
GETTEXT_FILES = pg_archivecleanup.c GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_archivecleanup.c
GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS)
GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)

View File

@ -17,18 +17,18 @@
#include "pg_getopt.h" #include "pg_getopt.h"
#include "fe_utils/logging.h"
#include "access/xlog_internal.h" #include "access/xlog_internal.h"
const char *progname; const char *progname;
/* Options and defaults */ /* Options and defaults */
bool debug = false; /* are we debugging? */
bool dryrun = false; /* are we performing a dry-run operation? */ bool dryrun = false; /* are we performing a dry-run operation? */
char *additional_ext = NULL; /* Extension to remove from filenames */ char *additional_ext = NULL; /* Extension to remove from filenames */
char *archiveLocation; /* where to find the archive? */ char *archiveLocation; /* where to find the archive? */
char *restartWALFileName; /* the file from which we can restart restore */ char *restartWALFileName; /* the file from which we can restart restore */
char WALFilePath[MAXPGPATH * 2]; /* the file path including archive */
char exclusiveCleanupFileName[MAXFNAMELEN]; /* the oldest file we want char exclusiveCleanupFileName[MAXFNAMELEN]; /* the oldest file we want
* to remain in archive */ * to remain in archive */
@ -65,8 +65,8 @@ Initialize(void)
if (stat(archiveLocation, &stat_buf) != 0 || if (stat(archiveLocation, &stat_buf) != 0 ||
!S_ISDIR(stat_buf.st_mode)) !S_ISDIR(stat_buf.st_mode))
{ {
fprintf(stderr, _("%s: archive location \"%s\" does not exist\n"), pg_log_error("archive location \"%s\" does not exist",
progname, archiveLocation); archiveLocation);
exit(2); exit(2);
} }
} }
@ -123,6 +123,8 @@ CleanupPriorWALFiles(void)
if ((IsXLogFileName(walfile) || IsPartialXLogFileName(walfile)) && if ((IsXLogFileName(walfile) || IsPartialXLogFileName(walfile)) &&
strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0) strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0)
{ {
char WALFilePath[MAXPGPATH * 2]; /* the file path including archive */
/* /*
* Use the original file name again now, including any * Use the original file name again now, including any
* extension that might have been chopped off before testing * extension that might have been chopped off before testing
@ -139,37 +141,32 @@ CleanupPriorWALFiles(void)
* user can pipe the output into some other program. * user can pipe the output into some other program.
*/ */
printf("%s\n", WALFilePath); printf("%s\n", WALFilePath);
if (debug) pg_log_debug("file \"%s\" would be removed", WALFilePath);
fprintf(stderr,
_("%s: file \"%s\" would be removed\n"),
progname, WALFilePath);
continue; continue;
} }
if (debug) pg_log_debug("removing file \"%s\"", WALFilePath);
fprintf(stderr, _("%s: removing file \"%s\"\n"),
progname, WALFilePath);
rc = unlink(WALFilePath); rc = unlink(WALFilePath);
if (rc != 0) if (rc != 0)
{ {
fprintf(stderr, _("%s: ERROR: could not remove file \"%s\": %s\n"), pg_log_error("could not remove file \"%s\": %m",
progname, WALFilePath, strerror(errno)); WALFilePath);
break; break;
} }
} }
} }
if (errno) if (errno)
fprintf(stderr, _("%s: could not read archive location \"%s\": %s\n"), pg_log_error("could not read archive location \"%s\": %m",
progname, archiveLocation, strerror(errno)); archiveLocation);
if (closedir(xldir)) if (closedir(xldir))
fprintf(stderr, _("%s: could not close archive location \"%s\": %s\n"), pg_log_error("could not close archive location \"%s\": %m",
progname, archiveLocation, strerror(errno)); archiveLocation);
} }
else else
fprintf(stderr, _("%s: could not open archive location \"%s\": %s\n"), pg_log_error("could not open archive location \"%s\": %m",
progname, archiveLocation, strerror(errno)); archiveLocation);
} }
/* /*
@ -241,7 +238,7 @@ SetWALFileNameForCleanup(void)
if (!fnameOK) if (!fnameOK)
{ {
fprintf(stderr, _("%s: invalid file name argument\n"), progname); pg_log_error("invalid file name argument");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(2); exit(2);
} }
@ -282,6 +279,7 @@ main(int argc, char **argv)
{ {
int c; int c;
pg_logging_init(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_archivecleanup")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_archivecleanup"));
progname = get_progname(argv[0]); progname = get_progname(argv[0]);
@ -304,7 +302,7 @@ main(int argc, char **argv)
switch (c) switch (c)
{ {
case 'd': /* Debug mode */ case 'd': /* Debug mode */
debug = true; pg_logging_set_level(PG_LOG_DEBUG);
break; break;
case 'n': /* Dry-Run mode */ case 'n': /* Dry-Run mode */
dryrun = true; dryrun = true;
@ -334,7 +332,7 @@ main(int argc, char **argv)
} }
else else
{ {
fprintf(stderr, _("%s: must specify archive location\n"), progname); pg_log_error("must specify archive location");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(2); exit(2);
} }
@ -346,14 +344,14 @@ main(int argc, char **argv)
} }
else else
{ {
fprintf(stderr, _("%s: must specify oldest kept WAL file\n"), progname); pg_log_error("must specify oldest kept WAL file");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(2); exit(2);
} }
if (optind < argc) if (optind < argc)
{ {
fprintf(stderr, _("%s: too many command-line arguments\n"), progname); pg_log_error("too many command-line arguments");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(2); exit(2);
} }
@ -368,13 +366,8 @@ main(int argc, char **argv)
*/ */
SetWALFileNameForCleanup(); SetWALFileNameForCleanup();
if (debug) pg_log_debug("keeping WAL file \"%s/%s\" and later",
{
snprintf(WALFilePath, MAXPGPATH, "%s/%s",
archiveLocation, exclusiveCleanupFileName); archiveLocation, exclusiveCleanupFileName);
fprintf(stderr, _("%s: keeping WAL file \"%s\" and later\n"),
progname, WALFilePath);
}
/* /*
* Remove WAL files older than cut-off * Remove WAL files older than cut-off

View File

@ -1,5 +1,6 @@
# src/bin/pg_basebackup/nls.mk # src/bin/pg_basebackup/nls.mk
CATALOG_NAME = pg_basebackup CATALOG_NAME = pg_basebackup
AVAIL_LANGUAGES = de es fr he it ja ko pl pt_BR ru sv tr vi zh_CN AVAIL_LANGUAGES = de es fr he it ja ko pl pt_BR ru sv tr vi zh_CN
GETTEXT_FILES = pg_basebackup.c pg_receivewal.c pg_recvlogical.c receivelog.c streamutil.c walmethods.c ../../common/fe_memutils.c ../../common/file_utils.c GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_basebackup.c pg_receivewal.c pg_recvlogical.c receivelog.c streamutil.c walmethods.c ../../common/fe_memutils.c ../../common/file_utils.c
GETTEXT_TRIGGERS = simple_prompt tar_set_error GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt tar_set_error
GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)

File diff suppressed because it is too large Load Diff

View File

@ -20,6 +20,7 @@
#include <unistd.h> #include <unistd.h>
#include "common/file_perm.h" #include "common/file_perm.h"
#include "fe_utils/logging.h"
#include "libpq-fe.h" #include "libpq-fe.h"
#include "access/xlog_internal.h" #include "access/xlog_internal.h"
#include "getopt_long.h" #include "getopt_long.h"
@ -114,16 +115,16 @@ stop_streaming(XLogRecPtr xlogpos, uint32 timeline, bool segment_finished)
/* we assume that we get called once at the end of each segment */ /* we assume that we get called once at the end of each segment */
if (verbose && segment_finished) if (verbose && segment_finished)
fprintf(stderr, _("%s: finished segment at %X/%X (timeline %u)\n"), pg_log_info("finished segment at %X/%X (timeline %u)",
progname, (uint32) (xlogpos >> 32), (uint32) xlogpos, (uint32) (xlogpos >> 32), (uint32) xlogpos,
timeline); timeline);
if (!XLogRecPtrIsInvalid(endpos) && endpos < xlogpos) if (!XLogRecPtrIsInvalid(endpos) && endpos < xlogpos)
{ {
if (verbose) if (verbose)
fprintf(stderr, _("%s: stopped log streaming at %X/%X (timeline %u)\n"), pg_log_info("stopped log streaming at %X/%X (timeline %u)",
progname, (uint32) (xlogpos >> 32), (uint32) xlogpos, (uint32) (xlogpos >> 32), (uint32) xlogpos,
timeline); timeline);
time_to_stop = true; time_to_stop = true;
return true; return true;
} }
@ -137,9 +138,9 @@ stop_streaming(XLogRecPtr xlogpos, uint32 timeline, bool segment_finished)
* timeline, but it's close enough for reporting purposes. * timeline, but it's close enough for reporting purposes.
*/ */
if (verbose && prevtimeline != 0 && prevtimeline != timeline) if (verbose && prevtimeline != 0 && prevtimeline != timeline)
fprintf(stderr, _("%s: switched to timeline %u at %X/%X\n"), pg_log_info("switched to timeline %u at %X/%X",
progname, timeline, timeline,
(uint32) (prevpos >> 32), (uint32) prevpos); (uint32) (prevpos >> 32), (uint32) prevpos);
prevtimeline = timeline; prevtimeline = timeline;
prevpos = xlogpos; prevpos = xlogpos;
@ -147,8 +148,7 @@ stop_streaming(XLogRecPtr xlogpos, uint32 timeline, bool segment_finished)
if (time_to_stop) if (time_to_stop)
{ {
if (verbose) if (verbose)
fprintf(stderr, _("%s: received interrupt signal, exiting\n"), pg_log_info("received interrupt signal, exiting");
progname);
return true; return true;
} }
return false; return false;
@ -167,8 +167,7 @@ get_destination_dir(char *dest_folder)
dir = opendir(dest_folder); dir = opendir(dest_folder);
if (dir == NULL) if (dir == NULL)
{ {
fprintf(stderr, _("%s: could not open directory \"%s\": %s\n"), pg_log_error("could not open directory \"%s\": %m", basedir);
progname, basedir, strerror(errno));
exit(1); exit(1);
} }
@ -185,8 +184,7 @@ close_destination_dir(DIR *dest_dir, char *dest_folder)
Assert(dest_dir != NULL && dest_folder != NULL); Assert(dest_dir != NULL && dest_folder != NULL);
if (closedir(dest_dir)) if (closedir(dest_dir))
{ {
fprintf(stderr, _("%s: could not close directory \"%s\": %s\n"), pg_log_error("could not close directory \"%s\": %m", dest_folder);
progname, dest_folder, strerror(errno));
exit(1); exit(1);
} }
} }
@ -266,16 +264,14 @@ FindStreamingStart(uint32 *tli)
snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name); snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name);
if (stat(fullpath, &statbuf) != 0) if (stat(fullpath, &statbuf) != 0)
{ {
fprintf(stderr, _("%s: could not stat file \"%s\": %s\n"), pg_log_error("could not stat file \"%s\": %m", fullpath);
progname, fullpath, strerror(errno));
exit(1); exit(1);
} }
if (statbuf.st_size != WalSegSz) if (statbuf.st_size != WalSegSz)
{ {
fprintf(stderr, pg_log_warning("segment file \"%s\" has incorrect size %d, skipping",
_("%s: segment file \"%s\" has incorrect size %d, skipping\n"), dirent->d_name, (int) statbuf.st_size);
progname, dirent->d_name, (int) statbuf.st_size);
continue; continue;
} }
} }
@ -292,25 +288,25 @@ FindStreamingStart(uint32 *tli)
fd = open(fullpath, O_RDONLY | PG_BINARY, 0); fd = open(fullpath, O_RDONLY | PG_BINARY, 0);
if (fd < 0) if (fd < 0)
{ {
fprintf(stderr, _("%s: could not open compressed file \"%s\": %s\n"), pg_log_error("could not open compressed file \"%s\": %m",
progname, fullpath, strerror(errno)); fullpath);
exit(1); exit(1);
} }
if (lseek(fd, (off_t) (-4), SEEK_END) < 0) if (lseek(fd, (off_t) (-4), SEEK_END) < 0)
{ {
fprintf(stderr, _("%s: could not seek in compressed file \"%s\": %s\n"), pg_log_error("could not seek in compressed file \"%s\": %m",
progname, fullpath, strerror(errno)); fullpath);
exit(1); exit(1);
} }
r = read(fd, (char *) buf, sizeof(buf)); r = read(fd, (char *) buf, sizeof(buf));
if (r != sizeof(buf)) if (r != sizeof(buf))
{ {
if (r < 0) if (r < 0)
fprintf(stderr, _("%s: could not read compressed file \"%s\": %s\n"), pg_log_error("could not read compressed file \"%s\": %m",
progname, fullpath, strerror(errno)); fullpath);
else else
fprintf(stderr, _("%s: could not read compressed file \"%s\": read %d of %zu\n"), pg_log_error("could not read compressed file \"%s\": read %d of %zu",
progname, fullpath, r, sizeof(buf)); fullpath, r, sizeof(buf));
exit(1); exit(1);
} }
@ -320,9 +316,8 @@ FindStreamingStart(uint32 *tli)
if (bytes_out != WalSegSz) if (bytes_out != WalSegSz)
{ {
fprintf(stderr, pg_log_warning("compressed segment file \"%s\" has incorrect uncompressed size %d, skipping",
_("%s: compressed segment file \"%s\" has incorrect uncompressed size %d, skipping\n"), dirent->d_name, bytes_out);
progname, dirent->d_name, bytes_out);
continue; continue;
} }
} }
@ -340,8 +335,7 @@ FindStreamingStart(uint32 *tli)
if (errno) if (errno)
{ {
fprintf(stderr, _("%s: could not read directory \"%s\": %s\n"), pg_log_error("could not read directory \"%s\": %m", basedir);
progname, basedir, strerror(errno));
exit(1); exit(1);
} }
@ -426,10 +420,9 @@ StreamLog(void)
* Start the replication * Start the replication
*/ */
if (verbose) if (verbose)
fprintf(stderr, pg_log_info("starting log streaming at %X/%X (timeline %u)",
_("%s: starting log streaming at %X/%X (timeline %u)\n"), (uint32) (stream.startpos >> 32), (uint32) stream.startpos,
progname, (uint32) (stream.startpos >> 32), (uint32) stream.startpos, stream.timeline);
stream.timeline);
stream.stream_stop = stop_streaming; stream.stream_stop = stop_streaming;
stream.stop_socket = PGINVALID_SOCKET; stream.stop_socket = PGINVALID_SOCKET;
@ -446,9 +439,7 @@ StreamLog(void)
if (!stream.walmethod->finish()) if (!stream.walmethod->finish())
{ {
fprintf(stderr, pg_log_info("could not finish writing WAL files: %m");
_("%s: could not finish writing WAL files: %s\n"),
progname, strerror(errno));
return; return;
} }
@ -508,6 +499,7 @@ main(int argc, char **argv)
uint32 hi, uint32 hi,
lo; lo;
pg_logging_init(argv[0]);
progname = get_progname(argv[0]); progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_basebackup")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_basebackup"));
@ -543,8 +535,7 @@ main(int argc, char **argv)
case 'p': case 'p':
if (atoi(optarg) <= 0) if (atoi(optarg) <= 0)
{ {
fprintf(stderr, _("%s: invalid port number \"%s\"\n"), pg_log_error("invalid port number \"%s\"", optarg);
progname, optarg);
exit(1); exit(1);
} }
dbport = pg_strdup(optarg); dbport = pg_strdup(optarg);
@ -562,8 +553,7 @@ main(int argc, char **argv)
standby_message_timeout = atoi(optarg) * 1000; standby_message_timeout = atoi(optarg) * 1000;
if (standby_message_timeout < 0) if (standby_message_timeout < 0)
{ {
fprintf(stderr, _("%s: invalid status interval \"%s\"\n"), pg_log_error("invalid status interval \"%s\"", optarg);
progname, optarg);
exit(1); exit(1);
} }
break; break;
@ -573,9 +563,7 @@ main(int argc, char **argv)
case 'E': case 'E':
if (sscanf(optarg, "%X/%X", &hi, &lo) != 2) if (sscanf(optarg, "%X/%X", &hi, &lo) != 2)
{ {
fprintf(stderr, pg_log_error("could not parse end position \"%s\"", optarg);
_("%s: could not parse end position \"%s\"\n"),
progname, optarg);
exit(1); exit(1);
} }
endpos = ((uint64) hi) << 32 | lo; endpos = ((uint64) hi) << 32 | lo;
@ -590,8 +578,7 @@ main(int argc, char **argv)
compresslevel = atoi(optarg); compresslevel = atoi(optarg);
if (compresslevel < 0 || compresslevel > 9) if (compresslevel < 0 || compresslevel > 9)
{ {
fprintf(stderr, _("%s: invalid compression level \"%s\"\n"), pg_log_error("invalid compression level \"%s\"", optarg);
progname, optarg);
exit(1); exit(1);
} }
break; break;
@ -627,9 +614,8 @@ main(int argc, char **argv)
*/ */
if (optind < argc) if (optind < argc)
{ {
fprintf(stderr, pg_log_error("too many command-line arguments (first is \"%s\")",
_("%s: too many command-line arguments (first is \"%s\")\n"), argv[optind]);
progname, argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -637,7 +623,7 @@ main(int argc, char **argv)
if (do_drop_slot && do_create_slot) if (do_drop_slot && do_create_slot)
{ {
fprintf(stderr, _("%s: cannot use --create-slot together with --drop-slot\n"), progname); pg_log_error("cannot use --create-slot together with --drop-slot");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -646,7 +632,7 @@ main(int argc, char **argv)
if (replication_slot == NULL && (do_drop_slot || do_create_slot)) if (replication_slot == NULL && (do_drop_slot || do_create_slot))
{ {
/* translator: second %s is an option name */ /* translator: second %s is an option name */
fprintf(stderr, _("%s: %s needs a slot to be specified using --slot\n"), progname, pg_log_error("%s needs a slot to be specified using --slot",
do_drop_slot ? "--drop-slot" : "--create-slot"); do_drop_slot ? "--drop-slot" : "--create-slot");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
@ -655,7 +641,7 @@ main(int argc, char **argv)
if (synchronous && !do_sync) if (synchronous && !do_sync)
{ {
fprintf(stderr, _("%s: cannot use --synchronous together with --no-sync\n"), progname); pg_log_error("cannot use --synchronous together with --no-sync");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -666,7 +652,7 @@ main(int argc, char **argv)
*/ */
if (basedir == NULL && !do_drop_slot && !do_create_slot) if (basedir == NULL && !do_drop_slot && !do_create_slot)
{ {
fprintf(stderr, _("%s: no target directory specified\n"), progname); pg_log_error("no target directory specified");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -675,9 +661,7 @@ main(int argc, char **argv)
#ifndef HAVE_LIBZ #ifndef HAVE_LIBZ
if (compresslevel != 0) if (compresslevel != 0)
{ {
fprintf(stderr, pg_log_error("this build does not support compression");
_("%s: this build does not support compression\n"),
progname);
exit(1); exit(1);
} }
#endif #endif
@ -733,9 +717,8 @@ main(int argc, char **argv)
*/ */
if (db_name) if (db_name)
{ {
fprintf(stderr, pg_log_error("replication connection using slot \"%s\" is unexpectedly database specific",
_("%s: replication connection using slot \"%s\" is unexpectedly database specific\n"), replication_slot);
progname, replication_slot);
exit(1); exit(1);
} }
@ -745,9 +728,7 @@ main(int argc, char **argv)
if (do_drop_slot) if (do_drop_slot)
{ {
if (verbose) if (verbose)
fprintf(stderr, pg_log_info("dropping replication slot \"%s\"", replication_slot);
_("%s: dropping replication slot \"%s\"\n"),
progname, replication_slot);
if (!DropReplicationSlot(conn, replication_slot)) if (!DropReplicationSlot(conn, replication_slot))
exit(1); exit(1);
@ -758,9 +739,7 @@ main(int argc, char **argv)
if (do_create_slot) if (do_create_slot)
{ {
if (verbose) if (verbose)
fprintf(stderr, pg_log_info("creating replication slot \"%s\"", replication_slot);
_("%s: creating replication slot \"%s\"\n"),
progname, replication_slot);
if (!CreateReplicationSlot(conn, replication_slot, NULL, false, true, false, if (!CreateReplicationSlot(conn, replication_slot, NULL, false, true, false,
slot_exists_ok)) slot_exists_ok))
@ -786,15 +765,14 @@ main(int argc, char **argv)
} }
else if (noloop) else if (noloop)
{ {
fprintf(stderr, _("%s: disconnected\n"), progname); pg_log_error("disconnected");
exit(1); exit(1);
} }
else else
{ {
fprintf(stderr,
/* translator: check source for value for %d */ /* translator: check source for value for %d */
_("%s: disconnected; waiting %d seconds to try again\n"), pg_log_info("disconnected; waiting %d seconds to try again",
progname, RECONNECT_SLEEP_TIME); RECONNECT_SLEEP_TIME);
pg_usleep(RECONNECT_SLEEP_TIME * 1000000); pg_usleep(RECONNECT_SLEEP_TIME * 1000000);
} }
} }

View File

@ -25,6 +25,7 @@
#include "access/xlog_internal.h" #include "access/xlog_internal.h"
#include "common/file_perm.h" #include "common/file_perm.h"
#include "common/fe_memutils.h" #include "common/fe_memutils.h"
#include "fe_utils/logging.h"
#include "getopt_long.h" #include "getopt_long.h"
#include "libpq-fe.h" #include "libpq-fe.h"
#include "libpq/pqsignal.h" #include "libpq/pqsignal.h"
@ -131,9 +132,7 @@ sendFeedback(PGconn *conn, TimestampTz now, bool force, bool replyRequested)
return true; return true;
if (verbose) if (verbose)
fprintf(stderr, pg_log_info("confirming write up to %X/%X, flush to %X/%X (slot %s)",
_("%s: confirming write up to %X/%X, flush to %X/%X (slot %s)\n"),
progname,
(uint32) (output_written_lsn >> 32), (uint32) output_written_lsn, (uint32) (output_written_lsn >> 32), (uint32) output_written_lsn,
(uint32) (output_fsync_lsn >> 32), (uint32) output_fsync_lsn, (uint32) (output_fsync_lsn >> 32), (uint32) output_fsync_lsn,
replication_slot); replication_slot);
@ -157,8 +156,8 @@ sendFeedback(PGconn *conn, TimestampTz now, bool force, bool replyRequested)
if (PQputCopyData(conn, replybuf, len) <= 0 || PQflush(conn)) if (PQputCopyData(conn, replybuf, len) <= 0 || PQflush(conn))
{ {
fprintf(stderr, _("%s: could not send feedback packet: %s"), pg_log_error("could not send feedback packet: %s",
progname, PQerrorMessage(conn)); PQerrorMessage(conn));
return false; return false;
} }
@ -193,9 +192,7 @@ OutputFsync(TimestampTz now)
if (fsync(outfd) != 0) if (fsync(outfd) != 0)
{ {
fprintf(stderr, pg_log_error("could not fsync file \"%s\": %m", outfile);
_("%s: could not fsync file \"%s\": %s\n"),
progname, outfile, strerror(errno));
return false; return false;
} }
@ -232,10 +229,9 @@ StreamLogicalLog(void)
* Start the replication * Start the replication
*/ */
if (verbose) if (verbose)
fprintf(stderr, pg_log_info("starting log streaming at %X/%X (slot %s)",
_("%s: starting log streaming at %X/%X (slot %s)\n"), (uint32) (startpos >> 32), (uint32) startpos,
progname, (uint32) (startpos >> 32), (uint32) startpos, replication_slot);
replication_slot);
/* Initiate the replication stream at specified location */ /* Initiate the replication stream at specified location */
appendPQExpBuffer(query, "START_REPLICATION SLOT \"%s\" LOGICAL %X/%X", appendPQExpBuffer(query, "START_REPLICATION SLOT \"%s\" LOGICAL %X/%X",
@ -265,8 +261,8 @@ StreamLogicalLog(void)
res = PQexec(conn, query->data); res = PQexec(conn, query->data);
if (PQresultStatus(res) != PGRES_COPY_BOTH) if (PQresultStatus(res) != PGRES_COPY_BOTH)
{ {
fprintf(stderr, _("%s: could not send replication command \"%s\": %s"), pg_log_error("could not send replication command \"%s\": %s",
progname, query->data, PQresultErrorMessage(res)); query->data, PQresultErrorMessage(res));
PQclear(res); PQclear(res);
goto error; goto error;
} }
@ -274,9 +270,7 @@ StreamLogicalLog(void)
resetPQExpBuffer(query); resetPQExpBuffer(query);
if (verbose) if (verbose)
fprintf(stderr, pg_log_info("streaming initiated");
_("%s: streaming initiated\n"),
progname);
while (!time_to_abort) while (!time_to_abort)
{ {
@ -340,16 +334,12 @@ StreamLogicalLog(void)
S_IRUSR | S_IWUSR); S_IRUSR | S_IWUSR);
if (outfd == -1) if (outfd == -1)
{ {
fprintf(stderr, pg_log_error("could not open log file \"%s\": %m", outfile);
_("%s: could not open log file \"%s\": %s\n"),
progname, outfile, strerror(errno));
goto error; goto error;
} }
if (fstat(outfd, &statbuf) != 0) if (fstat(outfd, &statbuf) != 0)
fprintf(stderr, pg_log_error("could not stat file \"%s\": %m", outfile);
_("%s: could not stat file \"%s\": %s\n"),
progname, outfile, strerror(errno));
output_isfile = S_ISREG(statbuf.st_mode) && !isatty(outfd); output_isfile = S_ISREG(statbuf.st_mode) && !isatty(outfd);
} }
@ -370,9 +360,7 @@ StreamLogicalLog(void)
if (PQsocket(conn) < 0) if (PQsocket(conn) < 0)
{ {
fprintf(stderr, pg_log_error("invalid socket: %s", PQerrorMessage(conn));
_("%s: invalid socket: %s"),
progname, PQerrorMessage(conn));
goto error; goto error;
} }
@ -425,17 +413,15 @@ StreamLogicalLog(void)
} }
else if (r < 0) else if (r < 0)
{ {
fprintf(stderr, _("%s: select() failed: %s\n"), pg_log_error("select() failed: %m");
progname, strerror(errno));
goto error; goto error;
} }
/* Else there is actually data on the socket */ /* Else there is actually data on the socket */
if (PQconsumeInput(conn) == 0) if (PQconsumeInput(conn) == 0)
{ {
fprintf(stderr, pg_log_error("could not receive data from WAL stream: %s",
_("%s: could not receive data from WAL stream: %s"), PQerrorMessage(conn));
progname, PQerrorMessage(conn));
goto error; goto error;
} }
continue; continue;
@ -448,8 +434,8 @@ StreamLogicalLog(void)
/* Failure while reading the copy stream */ /* Failure while reading the copy stream */
if (r == -2) if (r == -2)
{ {
fprintf(stderr, _("%s: could not read COPY data: %s"), pg_log_error("could not read COPY data: %s",
progname, PQerrorMessage(conn)); PQerrorMessage(conn));
goto error; goto error;
} }
@ -476,8 +462,7 @@ StreamLogicalLog(void)
if (r < pos + 1) if (r < pos + 1)
{ {
fprintf(stderr, _("%s: streaming header too small: %d\n"), pg_log_error("streaming header too small: %d", r);
progname, r);
goto error; goto error;
} }
replyRequested = copybuf[pos]; replyRequested = copybuf[pos];
@ -512,8 +497,8 @@ StreamLogicalLog(void)
} }
else if (copybuf[0] != 'w') else if (copybuf[0] != 'w')
{ {
fprintf(stderr, _("%s: unrecognized streaming header: \"%c\"\n"), pg_log_error("unrecognized streaming header: \"%c\"",
progname, copybuf[0]); copybuf[0]);
goto error; goto error;
} }
@ -528,8 +513,7 @@ StreamLogicalLog(void)
hdr_len += 8; /* sendTime */ hdr_len += 8; /* sendTime */
if (r < hdr_len + 1) if (r < hdr_len + 1)
{ {
fprintf(stderr, _("%s: streaming header too small: %d\n"), pg_log_error("streaming header too small: %d", r);
progname, r);
goto error; goto error;
} }
@ -567,10 +551,8 @@ StreamLogicalLog(void)
if (ret < 0) if (ret < 0)
{ {
fprintf(stderr, pg_log_error("could not write %u bytes to log file \"%s\": %m",
_("%s: could not write %u bytes to log file \"%s\": %s\n"), bytes_left, outfile);
progname, bytes_left, outfile,
strerror(errno));
goto error; goto error;
} }
@ -581,10 +563,8 @@ StreamLogicalLog(void)
if (write(outfd, "\n", 1) != 1) if (write(outfd, "\n", 1) != 1)
{ {
fprintf(stderr, pg_log_error("could not write %u bytes to log file \"%s\": %m",
_("%s: could not write %u bytes to log file \"%s\": %s\n"), 1, outfile);
progname, 1, outfile,
strerror(errno));
goto error; goto error;
} }
@ -611,9 +591,8 @@ StreamLogicalLog(void)
} }
else if (PQresultStatus(res) != PGRES_COMMAND_OK) else if (PQresultStatus(res) != PGRES_COMMAND_OK)
{ {
fprintf(stderr, pg_log_error("unexpected termination of replication stream: %s",
_("%s: unexpected termination of replication stream: %s"), PQresultErrorMessage(res));
progname, PQresultErrorMessage(res));
goto error; goto error;
} }
PQclear(res); PQclear(res);
@ -626,8 +605,7 @@ StreamLogicalLog(void)
OutputFsync(t); OutputFsync(t);
if (close(outfd) != 0) if (close(outfd) != 0)
fprintf(stderr, _("%s: could not close file \"%s\": %s\n"), pg_log_error("could not close file \"%s\": %m", outfile);
progname, outfile, strerror(errno));
} }
outfd = -1; outfd = -1;
error: error:
@ -705,6 +683,7 @@ main(int argc, char **argv)
lo; lo;
char *db_name; char *db_name;
pg_logging_init(argv[0]);
progname = get_progname(argv[0]); progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_basebackup")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_basebackup"));
@ -736,8 +715,7 @@ main(int argc, char **argv)
fsync_interval = atoi(optarg) * 1000; fsync_interval = atoi(optarg) * 1000;
if (fsync_interval < 0) if (fsync_interval < 0)
{ {
fprintf(stderr, _("%s: invalid fsync interval \"%s\"\n"), pg_log_error("invalid fsync interval \"%s\"", optarg);
progname, optarg);
exit(1); exit(1);
} }
break; break;
@ -757,8 +735,7 @@ main(int argc, char **argv)
case 'p': case 'p':
if (atoi(optarg) <= 0) if (atoi(optarg) <= 0)
{ {
fprintf(stderr, _("%s: invalid port number \"%s\"\n"), pg_log_error("invalid port number \"%s\"", optarg);
progname, optarg);
exit(1); exit(1);
} }
dbport = pg_strdup(optarg); dbport = pg_strdup(optarg);
@ -776,9 +753,7 @@ main(int argc, char **argv)
case 'I': case 'I':
if (sscanf(optarg, "%X/%X", &hi, &lo) != 2) if (sscanf(optarg, "%X/%X", &hi, &lo) != 2)
{ {
fprintf(stderr, pg_log_error("could not parse start position \"%s\"", optarg);
_("%s: could not parse start position \"%s\"\n"),
progname, optarg);
exit(1); exit(1);
} }
startpos = ((uint64) hi) << 32 | lo; startpos = ((uint64) hi) << 32 | lo;
@ -786,9 +761,7 @@ main(int argc, char **argv)
case 'E': case 'E':
if (sscanf(optarg, "%X/%X", &hi, &lo) != 2) if (sscanf(optarg, "%X/%X", &hi, &lo) != 2)
{ {
fprintf(stderr, pg_log_error("could not parse end position \"%s\"", optarg);
_("%s: could not parse end position \"%s\"\n"),
progname, optarg);
exit(1); exit(1);
} }
endpos = ((uint64) hi) << 32 | lo; endpos = ((uint64) hi) << 32 | lo;
@ -820,8 +793,7 @@ main(int argc, char **argv)
standby_message_timeout = atoi(optarg) * 1000; standby_message_timeout = atoi(optarg) * 1000;
if (standby_message_timeout < 0) if (standby_message_timeout < 0)
{ {
fprintf(stderr, _("%s: invalid status interval \"%s\"\n"), pg_log_error("invalid status interval \"%s\"", optarg);
progname, optarg);
exit(1); exit(1);
} }
break; break;
@ -858,9 +830,8 @@ main(int argc, char **argv)
*/ */
if (optind < argc) if (optind < argc)
{ {
fprintf(stderr, pg_log_error("too many command-line arguments (first is \"%s\")",
_("%s: too many command-line arguments (first is \"%s\")\n"), argv[optind]);
progname, argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -871,7 +842,7 @@ main(int argc, char **argv)
*/ */
if (replication_slot == NULL) if (replication_slot == NULL)
{ {
fprintf(stderr, _("%s: no slot specified\n"), progname); pg_log_error("no slot specified");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -879,7 +850,7 @@ main(int argc, char **argv)
if (do_start_slot && outfile == NULL) if (do_start_slot && outfile == NULL)
{ {
fprintf(stderr, _("%s: no target file specified\n"), progname); pg_log_error("no target file specified");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -887,7 +858,7 @@ main(int argc, char **argv)
if (!do_drop_slot && dbname == NULL) if (!do_drop_slot && dbname == NULL)
{ {
fprintf(stderr, _("%s: no database specified\n"), progname); pg_log_error("no database specified");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -895,7 +866,7 @@ main(int argc, char **argv)
if (!do_drop_slot && !do_create_slot && !do_start_slot) if (!do_drop_slot && !do_create_slot && !do_start_slot)
{ {
fprintf(stderr, _("%s: at least one action needs to be specified\n"), progname); pg_log_error("at least one action needs to be specified");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -903,7 +874,7 @@ main(int argc, char **argv)
if (do_drop_slot && (do_create_slot || do_start_slot)) if (do_drop_slot && (do_create_slot || do_start_slot))
{ {
fprintf(stderr, _("%s: cannot use --create-slot or --start together with --drop-slot\n"), progname); pg_log_error("cannot use --create-slot or --start together with --drop-slot");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -911,7 +882,7 @@ main(int argc, char **argv)
if (startpos != InvalidXLogRecPtr && (do_create_slot || do_drop_slot)) if (startpos != InvalidXLogRecPtr && (do_create_slot || do_drop_slot))
{ {
fprintf(stderr, _("%s: cannot use --create-slot or --drop-slot together with --startpos\n"), progname); pg_log_error("cannot use --create-slot or --drop-slot together with --startpos");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -919,9 +890,7 @@ main(int argc, char **argv)
if (endpos != InvalidXLogRecPtr && !do_start_slot) if (endpos != InvalidXLogRecPtr && !do_start_slot)
{ {
fprintf(stderr, pg_log_error("--endpos may only be specified with --start");
_("%s: --endpos may only be specified with --start\n"),
progname);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -952,9 +921,7 @@ main(int argc, char **argv)
if (db_name == NULL) if (db_name == NULL)
{ {
fprintf(stderr, pg_log_error("could not establish database-specific replication connection");
_("%s: could not establish database-specific replication connection\n"),
progname);
exit(1); exit(1);
} }
@ -972,9 +939,7 @@ main(int argc, char **argv)
if (do_drop_slot) if (do_drop_slot)
{ {
if (verbose) if (verbose)
fprintf(stderr, pg_log_info("dropping replication slot \"%s\"", replication_slot);
_("%s: dropping replication slot \"%s\"\n"),
progname, replication_slot);
if (!DropReplicationSlot(conn, replication_slot)) if (!DropReplicationSlot(conn, replication_slot))
exit(1); exit(1);
@ -984,9 +949,7 @@ main(int argc, char **argv)
if (do_create_slot) if (do_create_slot)
{ {
if (verbose) if (verbose)
fprintf(stderr, pg_log_info("creating replication slot \"%s\"", replication_slot);
_("%s: creating replication slot \"%s\"\n"),
progname, replication_slot);
if (!CreateReplicationSlot(conn, replication_slot, plugin, false, if (!CreateReplicationSlot(conn, replication_slot, plugin, false,
false, false, slot_exists_ok)) false, false, slot_exists_ok))
@ -1011,15 +974,14 @@ main(int argc, char **argv)
} }
else if (noloop) else if (noloop)
{ {
fprintf(stderr, _("%s: disconnected\n"), progname); pg_log_error("disconnected");
exit(1); exit(1);
} }
else else
{ {
fprintf(stderr,
/* translator: check source for value for %d */ /* translator: check source for value for %d */
_("%s: disconnected; waiting %d seconds to try again\n"), pg_log_info("disconnected; waiting %d seconds to try again",
progname, RECONNECT_SLEEP_TIME); RECONNECT_SLEEP_TIME);
pg_usleep(RECONNECT_SLEEP_TIME * 1000000); pg_usleep(RECONNECT_SLEEP_TIME * 1000000);
} }
} }
@ -1058,12 +1020,11 @@ prepareToTerminate(PGconn *conn, XLogRecPtr endpos, bool keepalive, XLogRecPtr l
if (verbose) if (verbose)
{ {
if (keepalive) if (keepalive)
fprintf(stderr, "%s: endpos %X/%X reached by keepalive\n", pg_log_info("endpos %X/%X reached by keepalive",
progname,
(uint32) (endpos >> 32), (uint32) endpos); (uint32) (endpos >> 32), (uint32) endpos);
else else
fprintf(stderr, "%s: endpos %X/%X reached by record at %X/%X\n", pg_log_info("endpos %X/%X reached by record at %X/%X",
progname, (uint32) (endpos >> 32), (uint32) (endpos), (uint32) (endpos >> 32), (uint32) (endpos),
(uint32) (lsn >> 32), (uint32) lsn); (uint32) (lsn >> 32), (uint32) lsn);
} }

View File

@ -27,6 +27,7 @@
#include "libpq-fe.h" #include "libpq-fe.h"
#include "access/xlog_internal.h" #include "access/xlog_internal.h"
#include "common/file_utils.h" #include "common/file_utils.h"
#include "fe_utils/logging.h"
/* fd and filename for currently open WAL file */ /* fd and filename for currently open WAL file */
@ -68,8 +69,8 @@ mark_file_as_archived(StreamCtl *stream, const char *fname)
f = stream->walmethod->open_for_write(tmppath, NULL, 0); f = stream->walmethod->open_for_write(tmppath, NULL, 0);
if (f == NULL) if (f == NULL)
{ {
fprintf(stderr, _("%s: could not create archive status file \"%s\": %s\n"), pg_log_error("could not create archive status file \"%s\": %s",
progname, tmppath, stream->walmethod->getlasterror()); tmppath, stream->walmethod->getlasterror());
return false; return false;
} }
@ -115,9 +116,8 @@ open_walfile(StreamCtl *stream, XLogRecPtr startpoint)
size = stream->walmethod->get_file_size(fn); size = stream->walmethod->get_file_size(fn);
if (size < 0) if (size < 0)
{ {
fprintf(stderr, pg_log_error("could not get size of write-ahead log file \"%s\": %s",
_("%s: could not get size of write-ahead log file \"%s\": %s\n"), fn, stream->walmethod->getlasterror());
progname, fn, stream->walmethod->getlasterror());
return false; return false;
} }
if (size == WalSegSz) if (size == WalSegSz)
@ -126,18 +126,16 @@ open_walfile(StreamCtl *stream, XLogRecPtr startpoint)
f = stream->walmethod->open_for_write(current_walfile_name, stream->partial_suffix, 0); f = stream->walmethod->open_for_write(current_walfile_name, stream->partial_suffix, 0);
if (f == NULL) if (f == NULL)
{ {
fprintf(stderr, pg_log_error("could not open existing write-ahead log file \"%s\": %s",
_("%s: could not open existing write-ahead log file \"%s\": %s\n"), fn, stream->walmethod->getlasterror());
progname, fn, stream->walmethod->getlasterror());
return false; return false;
} }
/* fsync file in case of a previous crash */ /* fsync file in case of a previous crash */
if (stream->walmethod->sync(f) != 0) if (stream->walmethod->sync(f) != 0)
{ {
fprintf(stderr, pg_log_error("could not fsync existing write-ahead log file \"%s\": %s",
_("%s: could not fsync existing write-ahead log file \"%s\": %s\n"), fn, stream->walmethod->getlasterror());
progname, fn, stream->walmethod->getlasterror());
stream->walmethod->close(f, CLOSE_UNLINK); stream->walmethod->close(f, CLOSE_UNLINK);
return false; return false;
} }
@ -150,11 +148,10 @@ open_walfile(StreamCtl *stream, XLogRecPtr startpoint)
/* if write didn't set errno, assume problem is no disk space */ /* if write didn't set errno, assume problem is no disk space */
if (errno == 0) if (errno == 0)
errno = ENOSPC; errno = ENOSPC;
fprintf(stderr, pg_log_error(ngettext("write-ahead log file \"%s\" has %d byte, should be 0 or %d",
ngettext("%s: write-ahead log file \"%s\" has %d byte, should be 0 or %d\n", "write-ahead log file \"%s\" has %d bytes, should be 0 or %d",
"%s: write-ahead log file \"%s\" has %d bytes, should be 0 or %d\n", size),
size), fn, (int) size, WalSegSz);
progname, fn, (int) size, WalSegSz);
return false; return false;
} }
/* File existed and was empty, so fall through and open */ /* File existed and was empty, so fall through and open */
@ -166,9 +163,8 @@ open_walfile(StreamCtl *stream, XLogRecPtr startpoint)
stream->partial_suffix, WalSegSz); stream->partial_suffix, WalSegSz);
if (f == NULL) if (f == NULL)
{ {
fprintf(stderr, pg_log_error("could not open write-ahead log file \"%s\": %s",
_("%s: could not open write-ahead log file \"%s\": %s\n"), fn, stream->walmethod->getlasterror());
progname, fn, stream->walmethod->getlasterror());
return false; return false;
} }
@ -193,9 +189,8 @@ close_walfile(StreamCtl *stream, XLogRecPtr pos)
currpos = stream->walmethod->get_current_pos(walfile); currpos = stream->walmethod->get_current_pos(walfile);
if (currpos == -1) if (currpos == -1)
{ {
fprintf(stderr, pg_log_error("could not determine seek position in file \"%s\": %s",
_("%s: could not determine seek position in file \"%s\": %s\n"), current_walfile_name, stream->walmethod->getlasterror());
progname, current_walfile_name, stream->walmethod->getlasterror());
stream->walmethod->close(walfile, CLOSE_UNLINK); stream->walmethod->close(walfile, CLOSE_UNLINK);
walfile = NULL; walfile = NULL;
@ -208,9 +203,8 @@ close_walfile(StreamCtl *stream, XLogRecPtr pos)
r = stream->walmethod->close(walfile, CLOSE_NORMAL); r = stream->walmethod->close(walfile, CLOSE_NORMAL);
else else
{ {
fprintf(stderr, pg_log_info("not renaming \"%s%s\", segment is not complete",
_("%s: not renaming \"%s%s\", segment is not complete\n"), current_walfile_name, stream->partial_suffix);
progname, current_walfile_name, stream->partial_suffix);
r = stream->walmethod->close(walfile, CLOSE_NO_RENAME); r = stream->walmethod->close(walfile, CLOSE_NO_RENAME);
} }
} }
@ -221,8 +215,8 @@ close_walfile(StreamCtl *stream, XLogRecPtr pos)
if (r != 0) if (r != 0)
{ {
fprintf(stderr, _("%s: could not close file \"%s\": %s\n"), pg_log_error("could not close file \"%s\": %s",
progname, current_walfile_name, stream->walmethod->getlasterror()); current_walfile_name, stream->walmethod->getlasterror());
return false; return false;
} }
@ -278,23 +272,23 @@ writeTimeLineHistoryFile(StreamCtl *stream, char *filename, char *content)
TLHistoryFileName(histfname, stream->timeline); TLHistoryFileName(histfname, stream->timeline);
if (strcmp(histfname, filename) != 0) if (strcmp(histfname, filename) != 0)
{ {
fprintf(stderr, _("%s: server reported unexpected history file name for timeline %u: %s\n"), pg_log_error("server reported unexpected history file name for timeline %u: %s",
progname, stream->timeline, filename); stream->timeline, filename);
return false; return false;
} }
f = stream->walmethod->open_for_write(histfname, ".tmp", 0); f = stream->walmethod->open_for_write(histfname, ".tmp", 0);
if (f == NULL) if (f == NULL)
{ {
fprintf(stderr, _("%s: could not create timeline history file \"%s\": %s\n"), pg_log_error("could not create timeline history file \"%s\": %s",
progname, histfname, stream->walmethod->getlasterror()); histfname, stream->walmethod->getlasterror());
return false; return false;
} }
if ((int) stream->walmethod->write(f, content, size) != size) if ((int) stream->walmethod->write(f, content, size) != size)
{ {
fprintf(stderr, _("%s: could not write timeline history file \"%s\": %s\n"), pg_log_error("could not write timeline history file \"%s\": %s",
progname, histfname, stream->walmethod->getlasterror()); histfname, stream->walmethod->getlasterror());
/* /*
* If we fail to make the file, delete it to release disk space * If we fail to make the file, delete it to release disk space
@ -306,8 +300,8 @@ writeTimeLineHistoryFile(StreamCtl *stream, char *filename, char *content)
if (stream->walmethod->close(f, CLOSE_NORMAL) != 0) if (stream->walmethod->close(f, CLOSE_NORMAL) != 0)
{ {
fprintf(stderr, _("%s: could not close file \"%s\": %s\n"), pg_log_error("could not close file \"%s\": %s",
progname, histfname, stream->walmethod->getlasterror()); histfname, stream->walmethod->getlasterror());
return false; return false;
} }
@ -349,8 +343,8 @@ sendFeedback(PGconn *conn, XLogRecPtr blockpos, TimestampTz now, bool replyReque
if (PQputCopyData(conn, replybuf, len) <= 0 || PQflush(conn)) if (PQputCopyData(conn, replybuf, len) <= 0 || PQflush(conn))
{ {
fprintf(stderr, _("%s: could not send feedback packet: %s"), pg_log_error("could not send feedback packet: %s",
progname, PQerrorMessage(conn)); PQerrorMessage(conn));
return false; return false;
} }
@ -383,8 +377,7 @@ CheckServerVersionForStreaming(PGconn *conn)
{ {
const char *serverver = PQparameterStatus(conn, "server_version"); const char *serverver = PQparameterStatus(conn, "server_version");
fprintf(stderr, _("%s: incompatible server version %s; client does not support streaming from server versions older than %s\n"), pg_log_error("incompatible server version %s; client does not support streaming from server versions older than %s",
progname,
serverver ? serverver : "'unknown'", serverver ? serverver : "'unknown'",
"9.3"); "9.3");
return false; return false;
@ -393,8 +386,7 @@ CheckServerVersionForStreaming(PGconn *conn)
{ {
const char *serverver = PQparameterStatus(conn, "server_version"); const char *serverver = PQparameterStatus(conn, "server_version");
fprintf(stderr, _("%s: incompatible server version %s; client does not support streaming from server versions newer than %s\n"), pg_log_error("incompatible server version %s; client does not support streaming from server versions newer than %s",
progname,
serverver ? serverver : "'unknown'", serverver ? serverver : "'unknown'",
PG_VERSION); PG_VERSION);
return false; return false;
@ -489,33 +481,28 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
res = PQexec(conn, "IDENTIFY_SYSTEM"); res = PQexec(conn, "IDENTIFY_SYSTEM");
if (PQresultStatus(res) != PGRES_TUPLES_OK) if (PQresultStatus(res) != PGRES_TUPLES_OK)
{ {
fprintf(stderr, pg_log_error("could not send replication command \"%s\": %s",
_("%s: could not send replication command \"%s\": %s"), "IDENTIFY_SYSTEM", PQerrorMessage(conn));
progname, "IDENTIFY_SYSTEM", PQerrorMessage(conn));
PQclear(res); PQclear(res);
return false; return false;
} }
if (PQntuples(res) != 1 || PQnfields(res) < 3) if (PQntuples(res) != 1 || PQnfields(res) < 3)
{ {
fprintf(stderr, pg_log_error("could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields",
_("%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"), PQntuples(res), PQnfields(res), 1, 3);
progname, PQntuples(res), PQnfields(res), 1, 3);
PQclear(res); PQclear(res);
return false; return false;
} }
if (strcmp(stream->sysidentifier, PQgetvalue(res, 0, 0)) != 0) if (strcmp(stream->sysidentifier, PQgetvalue(res, 0, 0)) != 0)
{ {
fprintf(stderr, pg_log_error("system identifier does not match between base backup and streaming connection");
_("%s: system identifier does not match between base backup and streaming connection\n"),
progname);
PQclear(res); PQclear(res);
return false; return false;
} }
if (stream->timeline > atoi(PQgetvalue(res, 0, 1))) if (stream->timeline > atoi(PQgetvalue(res, 0, 1)))
{ {
fprintf(stderr, pg_log_error("starting timeline %u is not present in the server",
_("%s: starting timeline %u is not present in the server\n"), stream->timeline);
progname, stream->timeline);
PQclear(res); PQclear(res);
return false; return false;
} }
@ -543,8 +530,8 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
if (PQresultStatus(res) != PGRES_TUPLES_OK) if (PQresultStatus(res) != PGRES_TUPLES_OK)
{ {
/* FIXME: we might send it ok, but get an error */ /* FIXME: we might send it ok, but get an error */
fprintf(stderr, _("%s: could not send replication command \"%s\": %s"), pg_log_error("could not send replication command \"%s\": %s",
progname, "TIMELINE_HISTORY", PQresultErrorMessage(res)); "TIMELINE_HISTORY", PQresultErrorMessage(res));
PQclear(res); PQclear(res);
return false; return false;
} }
@ -555,9 +542,8 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
*/ */
if (PQnfields(res) != 2 || PQntuples(res) != 1) if (PQnfields(res) != 2 || PQntuples(res) != 1)
{ {
fprintf(stderr, pg_log_warning("unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields",
_("%s: unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields\n"), PQntuples(res), PQnfields(res), 1, 2);
progname, PQntuples(res), PQnfields(res), 1, 2);
} }
/* Write the history file to disk */ /* Write the history file to disk */
@ -583,8 +569,8 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
res = PQexec(conn, query); res = PQexec(conn, query);
if (PQresultStatus(res) != PGRES_COPY_BOTH) if (PQresultStatus(res) != PGRES_COPY_BOTH)
{ {
fprintf(stderr, _("%s: could not send replication command \"%s\": %s"), pg_log_error("could not send replication command \"%s\": %s",
progname, "START_REPLICATION", PQresultErrorMessage(res)); "START_REPLICATION", PQresultErrorMessage(res));
PQclear(res); PQclear(res);
return false; return false;
} }
@ -627,16 +613,13 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
/* Sanity check the values the server gave us */ /* Sanity check the values the server gave us */
if (newtimeline <= stream->timeline) if (newtimeline <= stream->timeline)
{ {
fprintf(stderr, pg_log_error("server reported unexpected next timeline %u, following timeline %u",
_("%s: server reported unexpected next timeline %u, following timeline %u\n"), newtimeline, stream->timeline);
progname, newtimeline, stream->timeline);
goto error; goto error;
} }
if (stream->startpos > stoppos) if (stream->startpos > stoppos)
{ {
fprintf(stderr, pg_log_error("server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X",
_("%s: server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X\n"),
progname,
stream->timeline, (uint32) (stoppos >> 32), (uint32) stoppos, stream->timeline, (uint32) (stoppos >> 32), (uint32) stoppos,
newtimeline, (uint32) (stream->startpos >> 32), (uint32) stream->startpos); newtimeline, (uint32) (stream->startpos >> 32), (uint32) stream->startpos);
goto error; goto error;
@ -646,9 +629,8 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
res = PQgetResult(conn); res = PQgetResult(conn);
if (PQresultStatus(res) != PGRES_COMMAND_OK) if (PQresultStatus(res) != PGRES_COMMAND_OK)
{ {
fprintf(stderr, pg_log_error("unexpected termination of replication stream: %s",
_("%s: unexpected termination of replication stream: %s"), PQresultErrorMessage(res));
progname, PQresultErrorMessage(res));
PQclear(res); PQclear(res);
goto error; goto error;
} }
@ -677,17 +659,15 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
return true; return true;
else else
{ {
fprintf(stderr, _("%s: replication stream was terminated before stop point\n"), pg_log_error("replication stream was terminated before stop point");
progname);
goto error; goto error;
} }
} }
else else
{ {
/* Server returned an error. */ /* Server returned an error. */
fprintf(stderr, pg_log_error("unexpected termination of replication stream: %s",
_("%s: unexpected termination of replication stream: %s"), PQresultErrorMessage(res));
progname, PQresultErrorMessage(res));
PQclear(res); PQclear(res);
goto error; goto error;
} }
@ -695,8 +675,8 @@ ReceiveXlogStream(PGconn *conn, StreamCtl *stream)
error: error:
if (walfile != NULL && stream->walmethod->close(walfile, CLOSE_NO_RENAME) != 0) if (walfile != NULL && stream->walmethod->close(walfile, CLOSE_NO_RENAME) != 0)
fprintf(stderr, _("%s: could not close file \"%s\": %s\n"), pg_log_error("could not close file \"%s\": %s",
progname, current_walfile_name, stream->walmethod->getlasterror()); current_walfile_name, stream->walmethod->getlasterror());
walfile = NULL; walfile = NULL;
return false; return false;
} }
@ -725,9 +705,8 @@ ReadEndOfStreamingResult(PGresult *res, XLogRecPtr *startpos, uint32 *timeline)
*/ */
if (PQnfields(res) < 2 || PQntuples(res) != 1) if (PQnfields(res) < 2 || PQntuples(res) != 1)
{ {
fprintf(stderr, pg_log_error("unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields",
_("%s: unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields\n"), PQntuples(res), PQnfields(res), 1, 2);
progname, PQntuples(res), PQnfields(res), 1, 2);
return false; return false;
} }
@ -735,9 +714,8 @@ ReadEndOfStreamingResult(PGresult *res, XLogRecPtr *startpos, uint32 *timeline)
if (sscanf(PQgetvalue(res, 0, 1), "%X/%X", &startpos_xlogid, if (sscanf(PQgetvalue(res, 0, 1), "%X/%X", &startpos_xlogid,
&startpos_xrecoff) != 2) &startpos_xrecoff) != 2)
{ {
fprintf(stderr, pg_log_error("could not parse next timeline's starting point \"%s\"",
_("%s: could not parse next timeline's starting point \"%s\"\n"), PQgetvalue(res, 0, 1));
progname, PQgetvalue(res, 0, 1));
return false; return false;
} }
*startpos = ((uint64) startpos_xlogid << 32) | startpos_xrecoff; *startpos = ((uint64) startpos_xlogid << 32) | startpos_xrecoff;
@ -785,8 +763,8 @@ HandleCopyStream(PGconn *conn, StreamCtl *stream,
{ {
if (stream->walmethod->sync(walfile) != 0) if (stream->walmethod->sync(walfile) != 0)
{ {
fprintf(stderr, _("%s: could not fsync file \"%s\": %s\n"), pg_log_error("could not fsync file \"%s\": %s",
progname, current_walfile_name, stream->walmethod->getlasterror()); current_walfile_name, stream->walmethod->getlasterror());
goto error; goto error;
} }
lastFlushPosition = blockpos; lastFlushPosition = blockpos;
@ -855,8 +833,8 @@ HandleCopyStream(PGconn *conn, StreamCtl *stream,
} }
else else
{ {
fprintf(stderr, _("%s: unrecognized streaming header: \"%c\"\n"), pg_log_error("unrecognized streaming header: \"%c\"",
progname, copybuf[0]); copybuf[0]);
goto error; goto error;
} }
@ -895,8 +873,7 @@ CopyStreamPoll(PGconn *conn, long timeout_ms, pgsocket stop_socket)
connsocket = PQsocket(conn); connsocket = PQsocket(conn);
if (connsocket < 0) if (connsocket < 0)
{ {
fprintf(stderr, _("%s: invalid socket: %s"), progname, pg_log_error("invalid socket: %s", PQerrorMessage(conn));
PQerrorMessage(conn));
return -1; return -1;
} }
@ -924,8 +901,7 @@ CopyStreamPoll(PGconn *conn, long timeout_ms, pgsocket stop_socket)
{ {
if (errno == EINTR) if (errno == EINTR)
return 0; /* Got a signal, so not an error */ return 0; /* Got a signal, so not an error */
fprintf(stderr, _("%s: select() failed: %s\n"), pg_log_error("select() failed: %m");
progname, strerror(errno));
return -1; return -1;
} }
if (ret > 0 && FD_ISSET(connsocket, &input_mask)) if (ret > 0 && FD_ISSET(connsocket, &input_mask))
@ -975,9 +951,8 @@ CopyStreamReceive(PGconn *conn, long timeout, pgsocket stop_socket,
/* Now there is actually data on the socket */ /* Now there is actually data on the socket */
if (PQconsumeInput(conn) == 0) if (PQconsumeInput(conn) == 0)
{ {
fprintf(stderr, pg_log_error("could not receive data from WAL stream: %s",
_("%s: could not receive data from WAL stream: %s"), PQerrorMessage(conn));
progname, PQerrorMessage(conn));
return -1; return -1;
} }
@ -990,8 +965,7 @@ CopyStreamReceive(PGconn *conn, long timeout, pgsocket stop_socket,
return -2; return -2;
if (rawlen == -2) if (rawlen == -2)
{ {
fprintf(stderr, _("%s: could not read COPY data: %s"), pg_log_error("could not read COPY data: %s", PQerrorMessage(conn));
progname, PQerrorMessage(conn));
return -1; return -1;
} }
@ -1021,8 +995,7 @@ ProcessKeepaliveMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
if (len < pos + 1) if (len < pos + 1)
{ {
fprintf(stderr, _("%s: streaming header too small: %d\n"), pg_log_error("streaming header too small: %d", len);
progname, len);
return false; return false;
} }
replyRequested = copybuf[pos]; replyRequested = copybuf[pos];
@ -1042,8 +1015,8 @@ ProcessKeepaliveMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
*/ */
if (stream->walmethod->sync(walfile) != 0) if (stream->walmethod->sync(walfile) != 0)
{ {
fprintf(stderr, _("%s: could not fsync file \"%s\": %s\n"), pg_log_error("could not fsync file \"%s\": %s",
progname, current_walfile_name, stream->walmethod->getlasterror()); current_walfile_name, stream->walmethod->getlasterror());
return false; return false;
} }
lastFlushPosition = blockpos; lastFlushPosition = blockpos;
@ -1088,8 +1061,7 @@ ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
hdr_len += 8; /* sendTime */ hdr_len += 8; /* sendTime */
if (len < hdr_len) if (len < hdr_len)
{ {
fprintf(stderr, _("%s: streaming header too small: %d\n"), pg_log_error("streaming header too small: %d", len);
progname, len);
return false; return false;
} }
*blockpos = fe_recvint64(&copybuf[1]); *blockpos = fe_recvint64(&copybuf[1]);
@ -1106,9 +1078,8 @@ ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
/* No file open yet */ /* No file open yet */
if (xlogoff != 0) if (xlogoff != 0)
{ {
fprintf(stderr, pg_log_error("received write-ahead log record for offset %u with no file open",
_("%s: received write-ahead log record for offset %u with no file open\n"), xlogoff);
progname, xlogoff);
return false; return false;
} }
} }
@ -1117,9 +1088,8 @@ ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
/* More data in existing segment */ /* More data in existing segment */
if (stream->walmethod->get_current_pos(walfile) != xlogoff) if (stream->walmethod->get_current_pos(walfile) != xlogoff)
{ {
fprintf(stderr, pg_log_error("got WAL data offset %08x, expected %08x",
_("%s: got WAL data offset %08x, expected %08x\n"), xlogoff, (int) stream->walmethod->get_current_pos(walfile));
progname, xlogoff, (int) stream->walmethod->get_current_pos(walfile));
return false; return false;
} }
} }
@ -1152,10 +1122,9 @@ ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
if (stream->walmethod->write(walfile, copybuf + hdr_len + bytes_written, if (stream->walmethod->write(walfile, copybuf + hdr_len + bytes_written,
bytes_to_write) != bytes_to_write) bytes_to_write) != bytes_to_write)
{ {
fprintf(stderr, pg_log_error("could not write %u bytes to WAL file \"%s\": %s",
_("%s: could not write %u bytes to WAL file \"%s\": %s\n"), bytes_to_write, current_walfile_name,
progname, bytes_to_write, current_walfile_name, stream->walmethod->getlasterror());
stream->walmethod->getlasterror());
return false; return false;
} }
@ -1178,8 +1147,8 @@ ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
{ {
if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn)) if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn))
{ {
fprintf(stderr, _("%s: could not send copy-end packet: %s"), pg_log_error("could not send copy-end packet: %s",
progname, PQerrorMessage(conn)); PQerrorMessage(conn));
return false; return false;
} }
still_sending = false; still_sending = false;
@ -1218,9 +1187,8 @@ HandleEndOfCopyStream(PGconn *conn, StreamCtl *stream, char *copybuf,
{ {
if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn)) if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn))
{ {
fprintf(stderr, pg_log_error("could not send copy-end packet: %s",
_("%s: could not send copy-end packet: %s"), PQerrorMessage(conn));
progname, PQerrorMessage(conn));
PQclear(res); PQclear(res);
return NULL; return NULL;
} }
@ -1250,8 +1218,8 @@ CheckCopyStreamStop(PGconn *conn, StreamCtl *stream, XLogRecPtr blockpos,
} }
if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn)) if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn))
{ {
fprintf(stderr, _("%s: could not send copy-end packet: %s"), pg_log_error("could not send copy-end packet: %s",
progname, PQerrorMessage(conn)); PQerrorMessage(conn));
return false; return false;
} }
still_sending = false; still_sending = false;

View File

@ -26,6 +26,7 @@
#include "common/file_perm.h" #include "common/file_perm.h"
#include "datatype/timestamp.h" #include "datatype/timestamp.h"
#include "fe_utils/connect.h" #include "fe_utils/connect.h"
#include "fe_utils/logging.h"
#include "port/pg_bswap.h" #include "port/pg_bswap.h"
#include "pqexpbuffer.h" #include "pqexpbuffer.h"
@ -90,7 +91,7 @@ GetConnection(void)
conn_opts = PQconninfoParse(connection_string, &err_msg); conn_opts = PQconninfoParse(connection_string, &err_msg);
if (conn_opts == NULL) if (conn_opts == NULL)
{ {
fprintf(stderr, "%s: %s", progname, err_msg); pg_log_error("%s", err_msg);
exit(1); exit(1);
} }
@ -183,8 +184,7 @@ GetConnection(void)
*/ */
if (!tmpconn) if (!tmpconn)
{ {
fprintf(stderr, _("%s: could not connect to server\n"), pg_log_error("could not connect to server");
progname);
exit(1); exit(1);
} }
@ -201,8 +201,8 @@ GetConnection(void)
if (PQstatus(tmpconn) != CONNECTION_OK) if (PQstatus(tmpconn) != CONNECTION_OK)
{ {
fprintf(stderr, _("%s: could not connect to server: %s"), pg_log_error("could not connect to server: %s",
progname, PQerrorMessage(tmpconn)); PQerrorMessage(tmpconn));
PQfinish(tmpconn); PQfinish(tmpconn);
free(values); free(values);
free(keywords); free(keywords);
@ -230,8 +230,8 @@ GetConnection(void)
res = PQexec(tmpconn, ALWAYS_SECURE_SEARCH_PATH_SQL); res = PQexec(tmpconn, ALWAYS_SECURE_SEARCH_PATH_SQL);
if (PQresultStatus(res) != PGRES_TUPLES_OK) if (PQresultStatus(res) != PGRES_TUPLES_OK)
{ {
fprintf(stderr, _("%s: could not clear search_path: %s"), pg_log_error("could not clear search_path: %s",
progname, PQerrorMessage(tmpconn)); PQerrorMessage(tmpconn));
PQclear(res); PQclear(res);
PQfinish(tmpconn); PQfinish(tmpconn);
exit(1); exit(1);
@ -246,18 +246,14 @@ GetConnection(void)
tmpparam = PQparameterStatus(tmpconn, "integer_datetimes"); tmpparam = PQparameterStatus(tmpconn, "integer_datetimes");
if (!tmpparam) if (!tmpparam)
{ {
fprintf(stderr, pg_log_error("could not determine server setting for integer_datetimes");
_("%s: could not determine server setting for integer_datetimes\n"),
progname);
PQfinish(tmpconn); PQfinish(tmpconn);
exit(1); exit(1);
} }
if (strcmp(tmpparam, "on") != 0) if (strcmp(tmpparam, "on") != 0)
{ {
fprintf(stderr, pg_log_error("integer_datetimes compile flag does not match server");
_("%s: integer_datetimes compile flag does not match server\n"),
progname);
PQfinish(tmpconn); PQfinish(tmpconn);
exit(1); exit(1);
} }
@ -300,17 +296,16 @@ RetrieveWalSegSize(PGconn *conn)
res = PQexec(conn, "SHOW wal_segment_size"); res = PQexec(conn, "SHOW wal_segment_size");
if (PQresultStatus(res) != PGRES_TUPLES_OK) if (PQresultStatus(res) != PGRES_TUPLES_OK)
{ {
fprintf(stderr, _("%s: could not send replication command \"%s\": %s"), pg_log_error("could not send replication command \"%s\": %s",
progname, "SHOW wal_segment_size", PQerrorMessage(conn)); "SHOW wal_segment_size", PQerrorMessage(conn));
PQclear(res); PQclear(res);
return false; return false;
} }
if (PQntuples(res) != 1 || PQnfields(res) < 1) if (PQntuples(res) != 1 || PQnfields(res) < 1)
{ {
fprintf(stderr, pg_log_error("could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields",
_("%s: could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields\n"), PQntuples(res), PQnfields(res), 1, 1);
progname, PQntuples(res), PQnfields(res), 1, 1);
PQclear(res); PQclear(res);
return false; return false;
@ -319,8 +314,7 @@ RetrieveWalSegSize(PGconn *conn)
/* fetch xlog value and unit from the result */ /* fetch xlog value and unit from the result */
if (sscanf(PQgetvalue(res, 0, 0), "%d%s", &xlog_val, xlog_unit) != 2) if (sscanf(PQgetvalue(res, 0, 0), "%d%s", &xlog_val, xlog_unit) != 2)
{ {
fprintf(stderr, _("%s: WAL segment size could not be parsed\n"), pg_log_error("WAL segment size could not be parsed");
progname);
return false; return false;
} }
@ -335,11 +329,10 @@ RetrieveWalSegSize(PGconn *conn)
if (!IsValidWalSegSize(WalSegSz)) if (!IsValidWalSegSize(WalSegSz))
{ {
fprintf(stderr, pg_log_error(ngettext("WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte",
ngettext("%s: WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte\n", "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes",
"%s: WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes\n", WalSegSz),
WalSegSz), WalSegSz);
progname, WalSegSz);
return false; return false;
} }
@ -374,17 +367,16 @@ RetrieveDataDirCreatePerm(PGconn *conn)
res = PQexec(conn, "SHOW data_directory_mode"); res = PQexec(conn, "SHOW data_directory_mode");
if (PQresultStatus(res) != PGRES_TUPLES_OK) if (PQresultStatus(res) != PGRES_TUPLES_OK)
{ {
fprintf(stderr, _("%s: could not send replication command \"%s\": %s"), pg_log_error("could not send replication command \"%s\": %s",
progname, "SHOW data_directory_mode", PQerrorMessage(conn)); "SHOW data_directory_mode", PQerrorMessage(conn));
PQclear(res); PQclear(res);
return false; return false;
} }
if (PQntuples(res) != 1 || PQnfields(res) < 1) if (PQntuples(res) != 1 || PQnfields(res) < 1)
{ {
fprintf(stderr, pg_log_error("could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields",
_("%s: could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields\n"), PQntuples(res), PQnfields(res), 1, 1);
progname, PQntuples(res), PQnfields(res), 1, 1);
PQclear(res); PQclear(res);
return false; return false;
@ -392,8 +384,8 @@ RetrieveDataDirCreatePerm(PGconn *conn)
if (sscanf(PQgetvalue(res, 0, 0), "%o", &data_directory_mode) != 1) if (sscanf(PQgetvalue(res, 0, 0), "%o", &data_directory_mode) != 1)
{ {
fprintf(stderr, _("%s: group access flag could not be parsed: %s\n"), pg_log_error("group access flag could not be parsed: %s",
progname, PQgetvalue(res, 0, 0)); PQgetvalue(res, 0, 0));
PQclear(res); PQclear(res);
return false; return false;
@ -427,17 +419,16 @@ RunIdentifySystem(PGconn *conn, char **sysid, TimeLineID *starttli,
res = PQexec(conn, "IDENTIFY_SYSTEM"); res = PQexec(conn, "IDENTIFY_SYSTEM");
if (PQresultStatus(res) != PGRES_TUPLES_OK) if (PQresultStatus(res) != PGRES_TUPLES_OK)
{ {
fprintf(stderr, _("%s: could not send replication command \"%s\": %s"), pg_log_error("could not send replication command \"%s\": %s",
progname, "IDENTIFY_SYSTEM", PQerrorMessage(conn)); "IDENTIFY_SYSTEM", PQerrorMessage(conn));
PQclear(res); PQclear(res);
return false; return false;
} }
if (PQntuples(res) != 1 || PQnfields(res) < 3) if (PQntuples(res) != 1 || PQnfields(res) < 3)
{ {
fprintf(stderr, pg_log_error("could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields",
_("%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"), PQntuples(res), PQnfields(res), 1, 3);
progname, PQntuples(res), PQnfields(res), 1, 3);
PQclear(res); PQclear(res);
return false; return false;
@ -456,9 +447,8 @@ RunIdentifySystem(PGconn *conn, char **sysid, TimeLineID *starttli,
{ {
if (sscanf(PQgetvalue(res, 0, 2), "%X/%X", &hi, &lo) != 2) if (sscanf(PQgetvalue(res, 0, 2), "%X/%X", &hi, &lo) != 2)
{ {
fprintf(stderr, pg_log_error("could not parse write-ahead log location \"%s\"",
_("%s: could not parse write-ahead log location \"%s\"\n"), PQgetvalue(res, 0, 2));
progname, PQgetvalue(res, 0, 2));
PQclear(res); PQclear(res);
return false; return false;
@ -474,9 +464,8 @@ RunIdentifySystem(PGconn *conn, char **sysid, TimeLineID *starttli,
{ {
if (PQnfields(res) < 4) if (PQnfields(res) < 4)
{ {
fprintf(stderr, pg_log_error("could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields",
_("%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n"), PQntuples(res), PQnfields(res), 1, 4);
progname, PQntuples(res), PQnfields(res), 1, 4);
PQclear(res); PQclear(res);
return false; return false;
@ -541,8 +530,8 @@ CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin,
} }
else else
{ {
fprintf(stderr, _("%s: could not send replication command \"%s\": %s"), pg_log_error("could not send replication command \"%s\": %s",
progname, query->data, PQerrorMessage(conn)); query->data, PQerrorMessage(conn));
destroyPQExpBuffer(query); destroyPQExpBuffer(query);
PQclear(res); PQclear(res);
@ -552,10 +541,9 @@ CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin,
if (PQntuples(res) != 1 || PQnfields(res) != 4) if (PQntuples(res) != 1 || PQnfields(res) != 4)
{ {
fprintf(stderr, pg_log_error("could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields",
_("%s: could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields\n"), slot_name,
progname, slot_name, PQntuples(res), PQnfields(res), 1, 4);
PQntuples(res), PQnfields(res), 1, 4);
destroyPQExpBuffer(query); destroyPQExpBuffer(query);
PQclear(res); PQclear(res);
@ -587,8 +575,8 @@ DropReplicationSlot(PGconn *conn, const char *slot_name)
res = PQexec(conn, query->data); res = PQexec(conn, query->data);
if (PQresultStatus(res) != PGRES_COMMAND_OK) if (PQresultStatus(res) != PGRES_COMMAND_OK)
{ {
fprintf(stderr, _("%s: could not send replication command \"%s\": %s"), pg_log_error("could not send replication command \"%s\": %s",
progname, query->data, PQerrorMessage(conn)); query->data, PQerrorMessage(conn));
destroyPQExpBuffer(query); destroyPQExpBuffer(query);
PQclear(res); PQclear(res);
@ -597,10 +585,9 @@ DropReplicationSlot(PGconn *conn, const char *slot_name)
if (PQntuples(res) != 0 || PQnfields(res) != 0) if (PQntuples(res) != 0 || PQnfields(res) != 0)
{ {
fprintf(stderr, pg_log_error("could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields",
_("%s: could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields\n"), slot_name,
progname, slot_name, PQntuples(res), PQnfields(res), 0, 0);
PQntuples(res), PQnfields(res), 0, 0);
destroyPQExpBuffer(query); destroyPQExpBuffer(query);
PQclear(res); PQclear(res);

View File

@ -155,8 +155,8 @@ dir_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_
*/ */
if (dir_data->sync) if (dir_data->sync)
{ {
if (fsync_fname(tmppath, false, progname) != 0 || if (fsync_fname(tmppath, false) != 0 ||
fsync_parent_path(tmppath, progname) != 0) fsync_parent_path(tmppath) != 0)
{ {
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
if (dir_data->compression > 0) if (dir_data->compression > 0)
@ -244,7 +244,7 @@ dir_close(Walfile f, WalCloseMethod method)
snprintf(tmppath2, sizeof(tmppath2), "%s/%s%s", snprintf(tmppath2, sizeof(tmppath2), "%s/%s%s",
dir_data->basedir, df->pathname, dir_data->basedir, df->pathname,
dir_data->compression > 0 ? ".gz" : ""); dir_data->compression > 0 ? ".gz" : "");
r = durable_rename(tmppath, tmppath2, progname); r = durable_rename(tmppath, tmppath2);
} }
else if (method == CLOSE_UNLINK) else if (method == CLOSE_UNLINK)
{ {
@ -264,9 +264,9 @@ dir_close(Walfile f, WalCloseMethod method)
*/ */
if (dir_data->sync) if (dir_data->sync)
{ {
r = fsync_fname(df->fullpath, false, progname); r = fsync_fname(df->fullpath, false);
if (r == 0) if (r == 0)
r = fsync_parent_path(df->fullpath, progname); r = fsync_parent_path(df->fullpath);
} }
} }
} }
@ -339,7 +339,7 @@ dir_finish(void)
* Files are fsynced when they are closed, but we need to fsync the * Files are fsynced when they are closed, but we need to fsync the
* directory entry here as well. * directory entry here as well.
*/ */
if (fsync_fname(dir_data->basedir, true, progname) != 0) if (fsync_fname(dir_data->basedir, true) != 0)
return false; return false;
} }
return true; return true;
@ -970,9 +970,9 @@ tar_finish(void)
if (tar_data->sync) if (tar_data->sync)
{ {
if (fsync_fname(tar_data->tarfilename, false, progname) != 0) if (fsync_fname(tar_data->tarfilename, false) != 0)
return false; return false;
if (fsync_parent_path(tar_data->tarfilename, progname) != 0) if (fsync_parent_path(tar_data->tarfilename) != 0)
return false; return false;
} }

View File

@ -15,11 +15,13 @@ subdir = src/bin/pg_checksums
top_builddir = ../../.. top_builddir = ../../..
include $(top_builddir)/src/Makefile.global include $(top_builddir)/src/Makefile.global
LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils
OBJS= pg_checksums.o $(WIN32RES) OBJS= pg_checksums.o $(WIN32RES)
all: pg_checksums all: pg_checksums
pg_checksums: $(OBJS) | submake-libpgport pg_checksums: $(OBJS) | submake-libpgport submake-libpgfeutils
$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
install: all installdirs install: all installdirs

View File

@ -1,4 +1,6 @@
# src/bin/pg_checksums/nls.mk # src/bin/pg_checksums/nls.mk
CATALOG_NAME = pg_checksums CATALOG_NAME = pg_checksums
AVAIL_LANGUAGES = AVAIL_LANGUAGES =
GETTEXT_FILES = pg_checksums.c GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_checksums.c
GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS)
GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)

View File

@ -22,6 +22,7 @@
#include "common/controldata_utils.h" #include "common/controldata_utils.h"
#include "common/file_perm.h" #include "common/file_perm.h"
#include "common/file_utils.h" #include "common/file_utils.h"
#include "fe_utils/logging.h"
#include "getopt_long.h" #include "getopt_long.h"
#include "pg_getopt.h" #include "pg_getopt.h"
#include "storage/bufpage.h" #include "storage/bufpage.h"
@ -126,8 +127,7 @@ scan_file(const char *fn, BlockNumber segmentno)
if (f < 0) if (f < 0)
{ {
fprintf(stderr, _("%s: could not open file \"%s\": %s\n"), pg_log_error("could not open file \"%s\": %m", fn);
progname, fn, strerror(errno));
exit(1); exit(1);
} }
@ -142,8 +142,8 @@ scan_file(const char *fn, BlockNumber segmentno)
break; break;
if (r != BLCKSZ) if (r != BLCKSZ)
{ {
fprintf(stderr, _("%s: could not read block %u in file \"%s\": read %d of %d\n"), pg_log_error("could not read block %u in file \"%s\": read %d of %d",
progname, blockno, fn, r, BLCKSZ); blockno, fn, r, BLCKSZ);
exit(1); exit(1);
} }
blocks++; blocks++;
@ -158,8 +158,8 @@ scan_file(const char *fn, BlockNumber segmentno)
if (csum != header->pd_checksum) if (csum != header->pd_checksum)
{ {
if (ControlFile->data_checksum_version == PG_DATA_CHECKSUM_VERSION) if (ControlFile->data_checksum_version == PG_DATA_CHECKSUM_VERSION)
fprintf(stderr, _("%s: checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X\n"), pg_log_error("checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X",
progname, fn, blockno, csum, header->pd_checksum); fn, blockno, csum, header->pd_checksum);
badblocks++; badblocks++;
} }
} }
@ -171,15 +171,15 @@ scan_file(const char *fn, BlockNumber segmentno)
/* Seek back to beginning of block */ /* Seek back to beginning of block */
if (lseek(f, -BLCKSZ, SEEK_CUR) < 0) if (lseek(f, -BLCKSZ, SEEK_CUR) < 0)
{ {
fprintf(stderr, _("%s: seek failed for block %d in file \"%s\": %s\n"), progname, blockno, fn, strerror(errno)); pg_log_error("seek failed for block %d in file \"%s\": %m", blockno, fn);
exit(1); exit(1);
} }
/* Write block with checksum */ /* Write block with checksum */
if (write(f, buf.data, BLCKSZ) != BLCKSZ) if (write(f, buf.data, BLCKSZ) != BLCKSZ)
{ {
fprintf(stderr, _("%s: could not update checksum of block %d in file \"%s\": %s\n"), pg_log_error("could not update checksum of block %d in file \"%s\": %m",
progname, blockno, fn, strerror(errno)); blockno, fn);
exit(1); exit(1);
} }
} }
@ -188,11 +188,9 @@ scan_file(const char *fn, BlockNumber segmentno)
if (verbose) if (verbose)
{ {
if (mode == PG_MODE_CHECK) if (mode == PG_MODE_CHECK)
fprintf(stderr, pg_log_info("checksums verified in file \"%s\"", fn);
_("%s: checksums verified in file \"%s\"\n"), progname, fn);
if (mode == PG_MODE_ENABLE) if (mode == PG_MODE_ENABLE)
fprintf(stderr, pg_log_info("checksums enabled in file \"%s\"", fn);
_("%s: checksums enabled in file \"%s\"\n"), progname, fn);
} }
close(f); close(f);
@ -209,8 +207,7 @@ scan_directory(const char *basedir, const char *subdir)
dir = opendir(path); dir = opendir(path);
if (!dir) if (!dir)
{ {
fprintf(stderr, _("%s: could not open directory \"%s\": %s\n"), pg_log_error("could not open directory \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
while ((de = readdir(dir)) != NULL) while ((de = readdir(dir)) != NULL)
@ -237,8 +234,7 @@ scan_directory(const char *basedir, const char *subdir)
snprintf(fn, sizeof(fn), "%s/%s", path, de->d_name); snprintf(fn, sizeof(fn), "%s/%s", path, de->d_name);
if (lstat(fn, &st) < 0) if (lstat(fn, &st) < 0)
{ {
fprintf(stderr, _("%s: could not stat file \"%s\": %s\n"), pg_log_error("could not stat file \"%s\": %m", fn);
progname, fn, strerror(errno));
exit(1); exit(1);
} }
if (S_ISREG(st.st_mode)) if (S_ISREG(st.st_mode))
@ -265,8 +261,8 @@ scan_directory(const char *basedir, const char *subdir)
segmentno = atoi(segmentpath); segmentno = atoi(segmentpath);
if (segmentno == 0) if (segmentno == 0)
{ {
fprintf(stderr, _("%s: invalid segment number %d in file name \"%s\"\n"), pg_log_error("invalid segment number %d in file name \"%s\"",
progname, segmentno, fn); segmentno, fn);
exit(1); exit(1);
} }
} }
@ -309,8 +305,8 @@ main(int argc, char *argv[])
int option_index; int option_index;
bool crc_ok; bool crc_ok;
pg_logging_init(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_checksums")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_checksums"));
progname = get_progname(argv[0]); progname = get_progname(argv[0]);
if (argc > 1) if (argc > 1)
@ -352,7 +348,7 @@ main(int argc, char *argv[])
case 'r': case 'r':
if (atoi(optarg) == 0) if (atoi(optarg) == 0)
{ {
fprintf(stderr, _("%s: invalid relfilenode specification, must be numeric: %s\n"), progname, optarg); pg_log_error("invalid relfilenode specification, must be numeric: %s", optarg);
exit(1); exit(1);
} }
only_relfilenode = pstrdup(optarg); only_relfilenode = pstrdup(optarg);
@ -373,7 +369,7 @@ main(int argc, char *argv[])
/* If no DataDir was specified, and none could be found, error out */ /* If no DataDir was specified, and none could be found, error out */
if (DataDir == NULL) if (DataDir == NULL)
{ {
fprintf(stderr, _("%s: no data directory specified\n"), progname); pg_log_error("no data directory specified");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
@ -382,8 +378,8 @@ main(int argc, char *argv[])
/* Complain if any arguments remain */ /* Complain if any arguments remain */
if (optind < argc) if (optind < argc)
{ {
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), pg_log_error("too many command-line arguments (first is \"%s\")",
progname, argv[optind]); argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -392,31 +388,29 @@ main(int argc, char *argv[])
/* Relfilenode checking only works in --check mode */ /* Relfilenode checking only works in --check mode */
if (mode != PG_MODE_CHECK && only_relfilenode) if (mode != PG_MODE_CHECK && only_relfilenode)
{ {
fprintf(stderr, _("%s: relfilenode option only possible with --check\n"), progname); pg_log_error("relfilenode option only possible with --check");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
} }
/* Check if cluster is running */ /* Check if cluster is running */
ControlFile = get_controlfile(DataDir, progname, &crc_ok); ControlFile = get_controlfile(DataDir, &crc_ok);
if (!crc_ok) if (!crc_ok)
{ {
fprintf(stderr, _("%s: pg_control CRC value is incorrect\n"), progname); pg_log_error("pg_control CRC value is incorrect");
exit(1); exit(1);
} }
if (ControlFile->pg_control_version != PG_CONTROL_VERSION) if (ControlFile->pg_control_version != PG_CONTROL_VERSION)
{ {
fprintf(stderr, _("%s: cluster is not compatible with this version of pg_checksums\n"), pg_log_error("cluster is not compatible with this version of pg_checksums");
progname);
exit(1); exit(1);
} }
if (ControlFile->blcksz != BLCKSZ) if (ControlFile->blcksz != BLCKSZ)
{ {
fprintf(stderr, _("%s: database cluster is not compatible.\n"), pg_log_error("database cluster is not compatible");
progname);
fprintf(stderr, _("The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.\n"), fprintf(stderr, _("The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.\n"),
ControlFile->blcksz, BLCKSZ); ControlFile->blcksz, BLCKSZ);
exit(1); exit(1);
@ -425,28 +419,28 @@ main(int argc, char *argv[])
if (ControlFile->state != DB_SHUTDOWNED && if (ControlFile->state != DB_SHUTDOWNED &&
ControlFile->state != DB_SHUTDOWNED_IN_RECOVERY) ControlFile->state != DB_SHUTDOWNED_IN_RECOVERY)
{ {
fprintf(stderr, _("%s: cluster must be shut down\n"), progname); pg_log_error("cluster must be shut down");
exit(1); exit(1);
} }
if (ControlFile->data_checksum_version == 0 && if (ControlFile->data_checksum_version == 0 &&
mode == PG_MODE_CHECK) mode == PG_MODE_CHECK)
{ {
fprintf(stderr, _("%s: data checksums are not enabled in cluster\n"), progname); pg_log_error("data checksums are not enabled in cluster");
exit(1); exit(1);
} }
if (ControlFile->data_checksum_version == 0 && if (ControlFile->data_checksum_version == 0 &&
mode == PG_MODE_DISABLE) mode == PG_MODE_DISABLE)
{ {
fprintf(stderr, _("%s: data checksums are already disabled in cluster\n"), progname); pg_log_error("data checksums are already disabled in cluster");
exit(1); exit(1);
} }
if (ControlFile->data_checksum_version > 0 && if (ControlFile->data_checksum_version > 0 &&
mode == PG_MODE_ENABLE) mode == PG_MODE_ENABLE)
{ {
fprintf(stderr, _("%s: data checksums are already enabled in cluster\n"), progname); pg_log_error("data checksums are already enabled in cluster");
exit(1); exit(1);
} }
@ -482,12 +476,12 @@ main(int argc, char *argv[])
if (do_sync) if (do_sync)
{ {
printf(_("Syncing data directory\n")); pg_log_info("syncing data directory");
fsync_pgdata(DataDir, progname, PG_VERSION_NUM); fsync_pgdata(DataDir, PG_VERSION_NUM);
} }
printf(_("Updating control file\n")); pg_log_info("updating control file");
update_controlfile(DataDir, progname, ControlFile, do_sync); update_controlfile(DataDir, ControlFile, do_sync);
if (verbose) if (verbose)
printf(_("Data checksum version: %d\n"), ControlFile->data_checksum_version); printf(_("Data checksum version: %d\n"), ControlFile->data_checksum_version);

View File

@ -15,11 +15,13 @@ subdir = src/bin/pg_controldata
top_builddir = ../../.. top_builddir = ../../..
include $(top_builddir)/src/Makefile.global include $(top_builddir)/src/Makefile.global
LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils
OBJS= pg_controldata.o $(WIN32RES) OBJS= pg_controldata.o $(WIN32RES)
all: pg_controldata all: pg_controldata
pg_controldata: $(OBJS) | submake-libpgport pg_controldata: $(OBJS) | submake-libpgport submake-libpgfeutils
$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
install: all installdirs install: all installdirs

View File

@ -25,6 +25,7 @@
#include "access/xlog_internal.h" #include "access/xlog_internal.h"
#include "catalog/pg_control.h" #include "catalog/pg_control.h"
#include "common/controldata_utils.h" #include "common/controldata_utils.h"
#include "fe_utils/logging.h"
#include "pg_getopt.h" #include "pg_getopt.h"
#include "getopt_long.h" #include "getopt_long.h"
@ -107,8 +108,8 @@ main(int argc, char *argv[])
int i; int i;
int WalSegSz; int WalSegSz;
pg_logging_init(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_controldata")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_controldata"));
progname = get_progname(argv[0]); progname = get_progname(argv[0]);
if (argc > 1) if (argc > 1)
@ -150,8 +151,8 @@ main(int argc, char *argv[])
/* Complain if any arguments remain */ /* Complain if any arguments remain */
if (optind < argc) if (optind < argc)
{ {
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), pg_log_error("too many command-line arguments (first is \"%s\")",
progname, argv[optind]); argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -159,13 +160,13 @@ main(int argc, char *argv[])
if (DataDir == NULL) if (DataDir == NULL)
{ {
fprintf(stderr, _("%s: no data directory specified\n"), progname); pg_log_error("no data directory specified");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
/* get a copy of the control file */ /* get a copy of the control file */
ControlFile = get_controlfile(DataDir, progname, &crc_ok); ControlFile = get_controlfile(DataDir, &crc_ok);
if (!crc_ok) if (!crc_ok)
printf(_("WARNING: Calculated CRC checksum does not match value stored in file.\n" printf(_("WARNING: Calculated CRC checksum does not match value stored in file.\n"
"Either the file is corrupt, or it has a different layout than this program\n" "Either the file is corrupt, or it has a different layout than this program\n"

View File

@ -16,6 +16,8 @@ subdir = src/bin/pg_ctl
top_builddir = ../../.. top_builddir = ../../..
include $(top_builddir)/src/Makefile.global include $(top_builddir)/src/Makefile.global
LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils
# On Windows, we need to link with libpq, just for use of pqexpbuffer; # On Windows, we need to link with libpq, just for use of pqexpbuffer;
# but let's not pull that in on platforms where we don't need it. # but let's not pull that in on platforms where we don't need it.
ifeq ($(PORTNAME), win32) ifeq ($(PORTNAME), win32)
@ -28,7 +30,7 @@ OBJS= pg_ctl.o $(WIN32RES)
all: pg_ctl all: pg_ctl
pg_ctl: $(OBJS) | submake-libpgport $(SUBMAKE_LIBPQ) pg_ctl: $(OBJS) | submake-libpgport submake-libpgfeutils $(SUBMAKE_LIBPQ)
$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
install: all installdirs install: all installdirs

View File

@ -26,6 +26,7 @@
#include "catalog/pg_control.h" #include "catalog/pg_control.h"
#include "common/controldata_utils.h" #include "common/controldata_utils.h"
#include "common/file_perm.h" #include "common/file_perm.h"
#include "fe_utils/logging.h"
#include "getopt_long.h" #include "getopt_long.h"
#include "utils/pidfile.h" #include "utils/pidfile.h"
@ -2231,7 +2232,7 @@ get_control_dbstate(void)
{ {
DBState ret; DBState ret;
bool crc_ok; bool crc_ok;
ControlFileData *control_file_data = get_controlfile(pg_data, progname, &crc_ok); ControlFileData *control_file_data = get_controlfile(pg_data, &crc_ok);
if (!crc_ok) if (!crc_ok)
{ {
@ -2268,10 +2269,7 @@ main(int argc, char **argv)
int c; int c;
pgpid_t killproc = 0; pgpid_t killproc = 0;
#ifdef WIN32 pg_logging_init(argv[0]);
setvbuf(stderr, NULL, _IONBF, 0);
#endif
progname = get_progname(argv[0]); progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_ctl")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_ctl"));
start_time = time(NULL); start_time = time(NULL);

View File

@ -22,6 +22,7 @@
#include <ctype.h> #include <ctype.h>
#include "catalog/pg_class_d.h" #include "catalog/pg_class_d.h"
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h" #include "fe_utils/string_utils.h"
@ -120,17 +121,14 @@ getSchemaData(Archive *fout, int *numTablesPtr)
* extension membership needs to be consultable during decisions about * extension membership needs to be consultable during decisions about
* whether other objects are to be dumped. * whether other objects are to be dumped.
*/ */
if (g_verbose) pg_log_info("reading extensions");
write_msg(NULL, "reading extensions\n");
extinfo = getExtensions(fout, &numExtensions); extinfo = getExtensions(fout, &numExtensions);
extinfoindex = buildIndexArray(extinfo, numExtensions, sizeof(ExtensionInfo)); extinfoindex = buildIndexArray(extinfo, numExtensions, sizeof(ExtensionInfo));
if (g_verbose) pg_log_info("identifying extension members");
write_msg(NULL, "identifying extension members\n");
getExtensionMembership(fout, extinfo, numExtensions); getExtensionMembership(fout, extinfo, numExtensions);
if (g_verbose) pg_log_info("reading schemas");
write_msg(NULL, "reading schemas\n");
nspinfo = getNamespaces(fout, &numNamespaces); nspinfo = getNamespaces(fout, &numNamespaces);
nspinfoindex = buildIndexArray(nspinfo, numNamespaces, sizeof(NamespaceInfo)); nspinfoindex = buildIndexArray(nspinfo, numNamespaces, sizeof(NamespaceInfo));
@ -140,160 +138,124 @@ getSchemaData(Archive *fout, int *numTablesPtr)
* However, we have to do getNamespaces first because the tables get * However, we have to do getNamespaces first because the tables get
* linked to their containing namespaces during getTables. * linked to their containing namespaces during getTables.
*/ */
if (g_verbose) pg_log_info("reading user-defined tables");
write_msg(NULL, "reading user-defined tables\n");
tblinfo = getTables(fout, &numTables); tblinfo = getTables(fout, &numTables);
tblinfoindex = buildIndexArray(tblinfo, numTables, sizeof(TableInfo)); tblinfoindex = buildIndexArray(tblinfo, numTables, sizeof(TableInfo));
/* Do this after we've built tblinfoindex */ /* Do this after we've built tblinfoindex */
getOwnedSeqs(fout, tblinfo, numTables); getOwnedSeqs(fout, tblinfo, numTables);
if (g_verbose) pg_log_info("reading user-defined functions");
write_msg(NULL, "reading user-defined functions\n");
funinfo = getFuncs(fout, &numFuncs); funinfo = getFuncs(fout, &numFuncs);
funinfoindex = buildIndexArray(funinfo, numFuncs, sizeof(FuncInfo)); funinfoindex = buildIndexArray(funinfo, numFuncs, sizeof(FuncInfo));
/* this must be after getTables and getFuncs */ /* this must be after getTables and getFuncs */
if (g_verbose) pg_log_info("reading user-defined types");
write_msg(NULL, "reading user-defined types\n");
typinfo = getTypes(fout, &numTypes); typinfo = getTypes(fout, &numTypes);
typinfoindex = buildIndexArray(typinfo, numTypes, sizeof(TypeInfo)); typinfoindex = buildIndexArray(typinfo, numTypes, sizeof(TypeInfo));
/* this must be after getFuncs, too */ /* this must be after getFuncs, too */
if (g_verbose) pg_log_info("reading procedural languages");
write_msg(NULL, "reading procedural languages\n");
getProcLangs(fout, &numProcLangs); getProcLangs(fout, &numProcLangs);
if (g_verbose) pg_log_info("reading user-defined aggregate functions");
write_msg(NULL, "reading user-defined aggregate functions\n");
getAggregates(fout, &numAggregates); getAggregates(fout, &numAggregates);
if (g_verbose) pg_log_info("reading user-defined operators");
write_msg(NULL, "reading user-defined operators\n");
oprinfo = getOperators(fout, &numOperators); oprinfo = getOperators(fout, &numOperators);
oprinfoindex = buildIndexArray(oprinfo, numOperators, sizeof(OprInfo)); oprinfoindex = buildIndexArray(oprinfo, numOperators, sizeof(OprInfo));
if (g_verbose) pg_log_info("reading user-defined access methods");
write_msg(NULL, "reading user-defined access methods\n");
getAccessMethods(fout, &numAccessMethods); getAccessMethods(fout, &numAccessMethods);
if (g_verbose) pg_log_info("reading user-defined operator classes");
write_msg(NULL, "reading user-defined operator classes\n");
getOpclasses(fout, &numOpclasses); getOpclasses(fout, &numOpclasses);
if (g_verbose) pg_log_info("reading user-defined operator families");
write_msg(NULL, "reading user-defined operator families\n");
getOpfamilies(fout, &numOpfamilies); getOpfamilies(fout, &numOpfamilies);
if (g_verbose) pg_log_info("reading user-defined text search parsers");
write_msg(NULL, "reading user-defined text search parsers\n");
getTSParsers(fout, &numTSParsers); getTSParsers(fout, &numTSParsers);
if (g_verbose) pg_log_info("reading user-defined text search templates");
write_msg(NULL, "reading user-defined text search templates\n");
getTSTemplates(fout, &numTSTemplates); getTSTemplates(fout, &numTSTemplates);
if (g_verbose) pg_log_info("reading user-defined text search dictionaries");
write_msg(NULL, "reading user-defined text search dictionaries\n");
getTSDictionaries(fout, &numTSDicts); getTSDictionaries(fout, &numTSDicts);
if (g_verbose) pg_log_info("reading user-defined text search configurations");
write_msg(NULL, "reading user-defined text search configurations\n");
getTSConfigurations(fout, &numTSConfigs); getTSConfigurations(fout, &numTSConfigs);
if (g_verbose) pg_log_info("reading user-defined foreign-data wrappers");
write_msg(NULL, "reading user-defined foreign-data wrappers\n");
getForeignDataWrappers(fout, &numForeignDataWrappers); getForeignDataWrappers(fout, &numForeignDataWrappers);
if (g_verbose) pg_log_info("reading user-defined foreign servers");
write_msg(NULL, "reading user-defined foreign servers\n");
getForeignServers(fout, &numForeignServers); getForeignServers(fout, &numForeignServers);
if (g_verbose) pg_log_info("reading default privileges");
write_msg(NULL, "reading default privileges\n");
getDefaultACLs(fout, &numDefaultACLs); getDefaultACLs(fout, &numDefaultACLs);
if (g_verbose) pg_log_info("reading user-defined collations");
write_msg(NULL, "reading user-defined collations\n");
collinfo = getCollations(fout, &numCollations); collinfo = getCollations(fout, &numCollations);
collinfoindex = buildIndexArray(collinfo, numCollations, sizeof(CollInfo)); collinfoindex = buildIndexArray(collinfo, numCollations, sizeof(CollInfo));
if (g_verbose) pg_log_info("reading user-defined conversions");
write_msg(NULL, "reading user-defined conversions\n");
getConversions(fout, &numConversions); getConversions(fout, &numConversions);
if (g_verbose) pg_log_info("reading type casts");
write_msg(NULL, "reading type casts\n");
getCasts(fout, &numCasts); getCasts(fout, &numCasts);
if (g_verbose) pg_log_info("reading transforms");
write_msg(NULL, "reading transforms\n");
getTransforms(fout, &numTransforms); getTransforms(fout, &numTransforms);
if (g_verbose) pg_log_info("reading table inheritance information");
write_msg(NULL, "reading table inheritance information\n");
inhinfo = getInherits(fout, &numInherits); inhinfo = getInherits(fout, &numInherits);
if (g_verbose) pg_log_info("reading event triggers");
write_msg(NULL, "reading event triggers\n");
getEventTriggers(fout, &numEventTriggers); getEventTriggers(fout, &numEventTriggers);
/* Identify extension configuration tables that should be dumped */ /* Identify extension configuration tables that should be dumped */
if (g_verbose) pg_log_info("finding extension tables");
write_msg(NULL, "finding extension tables\n");
processExtensionTables(fout, extinfo, numExtensions); processExtensionTables(fout, extinfo, numExtensions);
/* Link tables to parents, mark parents of target tables interesting */ /* Link tables to parents, mark parents of target tables interesting */
if (g_verbose) pg_log_info("finding inheritance relationships");
write_msg(NULL, "finding inheritance relationships\n");
flagInhTables(fout, tblinfo, numTables, inhinfo, numInherits); flagInhTables(fout, tblinfo, numTables, inhinfo, numInherits);
if (g_verbose) pg_log_info("reading column info for interesting tables");
write_msg(NULL, "reading column info for interesting tables\n");
getTableAttrs(fout, tblinfo, numTables); getTableAttrs(fout, tblinfo, numTables);
if (g_verbose) pg_log_info("flagging inherited columns in subtables");
write_msg(NULL, "flagging inherited columns in subtables\n");
flagInhAttrs(fout->dopt, tblinfo, numTables); flagInhAttrs(fout->dopt, tblinfo, numTables);
if (g_verbose) pg_log_info("reading indexes");
write_msg(NULL, "reading indexes\n");
getIndexes(fout, tblinfo, numTables); getIndexes(fout, tblinfo, numTables);
if (g_verbose) pg_log_info("flagging indexes in partitioned tables");
write_msg(NULL, "flagging indexes in partitioned tables\n");
flagInhIndexes(fout, tblinfo, numTables); flagInhIndexes(fout, tblinfo, numTables);
if (g_verbose) pg_log_info("reading extended statistics");
write_msg(NULL, "reading extended statistics\n");
getExtendedStatistics(fout); getExtendedStatistics(fout);
if (g_verbose) pg_log_info("reading constraints");
write_msg(NULL, "reading constraints\n");
getConstraints(fout, tblinfo, numTables); getConstraints(fout, tblinfo, numTables);
if (g_verbose) pg_log_info("reading triggers");
write_msg(NULL, "reading triggers\n");
getTriggers(fout, tblinfo, numTables); getTriggers(fout, tblinfo, numTables);
if (g_verbose) pg_log_info("reading rewrite rules");
write_msg(NULL, "reading rewrite rules\n");
getRules(fout, &numRules); getRules(fout, &numRules);
if (g_verbose) pg_log_info("reading policies");
write_msg(NULL, "reading policies\n");
getPolicies(fout, tblinfo, numTables); getPolicies(fout, tblinfo, numTables);
if (g_verbose) pg_log_info("reading publications");
write_msg(NULL, "reading publications\n");
getPublications(fout); getPublications(fout);
if (g_verbose) pg_log_info("reading publication membership");
write_msg(NULL, "reading publication membership\n");
getPublicationTables(fout, tblinfo, numTables); getPublicationTables(fout, tblinfo, numTables);
if (g_verbose) pg_log_info("reading subscriptions");
write_msg(NULL, "reading subscriptions\n");
getSubscriptions(fout); getSubscriptions(fout);
*numTablesPtr = numTables; *numTablesPtr = numTables;
@ -1059,7 +1021,7 @@ findParentsByOid(TableInfo *self,
parent = findTableByOid(inhinfo[i].inhparent); parent = findTableByOid(inhinfo[i].inhparent);
if (parent == NULL) if (parent == NULL)
{ {
write_msg(NULL, "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found\n", pg_log_error("failed sanity check, parent OID %u of table \"%s\" (OID %u) not found",
inhinfo[i].inhparent, inhinfo[i].inhparent,
self->dobj.name, self->dobj.name,
oid); oid);
@ -1101,7 +1063,7 @@ parseOidArray(const char *str, Oid *array, int arraysize)
{ {
if (argNum >= arraysize) if (argNum >= arraysize)
{ {
write_msg(NULL, "could not parse numeric array \"%s\": too many numbers\n", str); pg_log_error("could not parse numeric array \"%s\": too many numbers", str);
exit_nicely(1); exit_nicely(1);
} }
temp[j] = '\0'; temp[j] = '\0';
@ -1116,7 +1078,7 @@ parseOidArray(const char *str, Oid *array, int arraysize)
if (!(isdigit((unsigned char) s) || s == '-') || if (!(isdigit((unsigned char) s) || s == '-') ||
j >= sizeof(temp) - 1) j >= sizeof(temp) - 1)
{ {
write_msg(NULL, "could not parse numeric array \"%s\": invalid character in number\n", str); pg_log_error("could not parse numeric array \"%s\": invalid character in number", str);
exit_nicely(1); exit_nicely(1);
} }
temp[j++] = s; temp[j++] = s;

View File

@ -74,9 +74,6 @@ struct CompressorState
#endif #endif
}; };
/* translator: this is a module name */
static const char *modulename = gettext_noop("compress_io");
static void ParseCompressionOption(int compression, CompressionAlgorithm *alg, static void ParseCompressionOption(int compression, CompressionAlgorithm *alg,
int *level); int *level);
@ -111,8 +108,7 @@ ParseCompressionOption(int compression, CompressionAlgorithm *alg, int *level)
*alg = COMPR_ALG_NONE; *alg = COMPR_ALG_NONE;
else else
{ {
exit_horribly(modulename, "invalid compression code: %d\n", fatal("invalid compression code: %d", compression);
compression);
*alg = COMPR_ALG_NONE; /* keep compiler quiet */ *alg = COMPR_ALG_NONE; /* keep compiler quiet */
} }
@ -135,7 +131,7 @@ AllocateCompressor(int compression, WriteFunc writeF)
#ifndef HAVE_LIBZ #ifndef HAVE_LIBZ
if (alg == COMPR_ALG_LIBZ) if (alg == COMPR_ALG_LIBZ)
exit_horribly(modulename, "not built with zlib support\n"); fatal("not built with zlib support");
#endif #endif
cs = (CompressorState *) pg_malloc0(sizeof(CompressorState)); cs = (CompressorState *) pg_malloc0(sizeof(CompressorState));
@ -171,7 +167,7 @@ ReadDataFromArchive(ArchiveHandle *AH, int compression, ReadFunc readF)
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
ReadDataFromArchiveZlib(AH, readF); ReadDataFromArchiveZlib(AH, readF);
#else #else
exit_horribly(modulename, "not built with zlib support\n"); fatal("not built with zlib support");
#endif #endif
} }
} }
@ -189,7 +185,7 @@ WriteDataToArchive(ArchiveHandle *AH, CompressorState *cs,
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
WriteDataToArchiveZlib(AH, cs, data, dLen); WriteDataToArchiveZlib(AH, cs, data, dLen);
#else #else
exit_horribly(modulename, "not built with zlib support\n"); fatal("not built with zlib support");
#endif #endif
break; break;
case COMPR_ALG_NONE: case COMPR_ALG_NONE:
@ -238,8 +234,7 @@ InitCompressorZlib(CompressorState *cs, int level)
cs->zlibOutSize = ZLIB_OUT_SIZE; cs->zlibOutSize = ZLIB_OUT_SIZE;
if (deflateInit(zp, level) != Z_OK) if (deflateInit(zp, level) != Z_OK)
exit_horribly(modulename, fatal("could not initialize compression library: %s",
"could not initialize compression library: %s\n",
zp->msg); zp->msg);
/* Just be paranoid - maybe End is called after Start, with no Write */ /* Just be paranoid - maybe End is called after Start, with no Write */
@ -259,8 +254,7 @@ EndCompressorZlib(ArchiveHandle *AH, CompressorState *cs)
DeflateCompressorZlib(AH, cs, true); DeflateCompressorZlib(AH, cs, true);
if (deflateEnd(zp) != Z_OK) if (deflateEnd(zp) != Z_OK)
exit_horribly(modulename, fatal("could not close compression stream: %s", zp->msg);
"could not close compression stream: %s\n", zp->msg);
free(cs->zlibOut); free(cs->zlibOut);
free(cs->zp); free(cs->zp);
@ -277,8 +271,7 @@ DeflateCompressorZlib(ArchiveHandle *AH, CompressorState *cs, bool flush)
{ {
res = deflate(zp, flush ? Z_FINISH : Z_NO_FLUSH); res = deflate(zp, flush ? Z_FINISH : Z_NO_FLUSH);
if (res == Z_STREAM_ERROR) if (res == Z_STREAM_ERROR)
exit_horribly(modulename, fatal("could not compress data: %s", zp->msg);
"could not compress data: %s\n", zp->msg);
if ((flush && (zp->avail_out < cs->zlibOutSize)) if ((flush && (zp->avail_out < cs->zlibOutSize))
|| (zp->avail_out == 0) || (zp->avail_out == 0)
|| (zp->avail_in != 0) || (zp->avail_in != 0)
@ -340,8 +333,7 @@ ReadDataFromArchiveZlib(ArchiveHandle *AH, ReadFunc readF)
out = pg_malloc(ZLIB_OUT_SIZE + 1); out = pg_malloc(ZLIB_OUT_SIZE + 1);
if (inflateInit(zp) != Z_OK) if (inflateInit(zp) != Z_OK)
exit_horribly(modulename, fatal("could not initialize compression library: %s",
"could not initialize compression library: %s\n",
zp->msg); zp->msg);
/* no minimal chunk size for zlib */ /* no minimal chunk size for zlib */
@ -357,8 +349,7 @@ ReadDataFromArchiveZlib(ArchiveHandle *AH, ReadFunc readF)
res = inflate(zp, 0); res = inflate(zp, 0);
if (res != Z_OK && res != Z_STREAM_END) if (res != Z_OK && res != Z_STREAM_END)
exit_horribly(modulename, fatal("could not uncompress data: %s", zp->msg);
"could not uncompress data: %s\n", zp->msg);
out[ZLIB_OUT_SIZE - zp->avail_out] = '\0'; out[ZLIB_OUT_SIZE - zp->avail_out] = '\0';
ahwrite(out, 1, ZLIB_OUT_SIZE - zp->avail_out, AH); ahwrite(out, 1, ZLIB_OUT_SIZE - zp->avail_out, AH);
@ -373,16 +364,14 @@ ReadDataFromArchiveZlib(ArchiveHandle *AH, ReadFunc readF)
zp->avail_out = ZLIB_OUT_SIZE; zp->avail_out = ZLIB_OUT_SIZE;
res = inflate(zp, 0); res = inflate(zp, 0);
if (res != Z_OK && res != Z_STREAM_END) if (res != Z_OK && res != Z_STREAM_END)
exit_horribly(modulename, fatal("could not uncompress data: %s", zp->msg);
"could not uncompress data: %s\n", zp->msg);
out[ZLIB_OUT_SIZE - zp->avail_out] = '\0'; out[ZLIB_OUT_SIZE - zp->avail_out] = '\0';
ahwrite(out, 1, ZLIB_OUT_SIZE - zp->avail_out, AH); ahwrite(out, 1, ZLIB_OUT_SIZE - zp->avail_out, AH);
} }
if (inflateEnd(zp) != Z_OK) if (inflateEnd(zp) != Z_OK)
exit_horribly(modulename, fatal("could not close compression library: %s", zp->msg);
"could not close compression library: %s\n", zp->msg);
free(buf); free(buf);
free(out); free(out);
@ -516,7 +505,7 @@ cfopen_write(const char *path, const char *mode, int compression)
fp = cfopen(fname, mode, compression); fp = cfopen(fname, mode, compression);
free_keep_errno(fname); free_keep_errno(fname);
#else #else
exit_horribly(modulename, "not built with zlib support\n"); fatal("not built with zlib support");
fp = NULL; /* keep compiler quiet */ fp = NULL; /* keep compiler quiet */
#endif #endif
} }
@ -559,7 +548,7 @@ cfopen(const char *path, const char *mode, int compression)
fp = NULL; fp = NULL;
} }
#else #else
exit_horribly(modulename, "not built with zlib support\n"); fatal("not built with zlib support");
#endif #endif
} }
else else
@ -596,8 +585,7 @@ cfread(void *ptr, int size, cfp *fp)
int errnum; int errnum;
const char *errmsg = gzerror(fp->compressedfp, &errnum); const char *errmsg = gzerror(fp->compressedfp, &errnum);
exit_horribly(modulename, fatal("could not read from input file: %s",
"could not read from input file: %s\n",
errnum == Z_ERRNO ? strerror(errno) : errmsg); errnum == Z_ERRNO ? strerror(errno) : errmsg);
} }
} }
@ -634,11 +622,9 @@ cfgetc(cfp *fp)
if (ret == EOF) if (ret == EOF)
{ {
if (!gzeof(fp->compressedfp)) if (!gzeof(fp->compressedfp))
exit_horribly(modulename, fatal("could not read from input file: %s", strerror(errno));
"could not read from input file: %s\n", strerror(errno));
else else
exit_horribly(modulename, fatal("could not read from input file: end of file");
"could not read from input file: end of file\n");
} }
} }
else else

View File

@ -1,7 +1,8 @@
# src/bin/pg_dump/nls.mk # src/bin/pg_dump/nls.mk
CATALOG_NAME = pg_dump CATALOG_NAME = pg_dump
AVAIL_LANGUAGES = cs de es fr he it ja ko pl pt_BR ru sv tr zh_CN AVAIL_LANGUAGES = cs de es fr he it ja ko pl pt_BR ru sv tr zh_CN
GETTEXT_FILES = pg_backup_archiver.c pg_backup_db.c pg_backup_custom.c \ GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
pg_backup_archiver.c pg_backup_db.c pg_backup_custom.c \
pg_backup_null.c pg_backup_tar.c \ pg_backup_null.c pg_backup_tar.c \
pg_backup_directory.c dumputils.c compress_io.c \ pg_backup_directory.c dumputils.c compress_io.c \
pg_dump.c common.c pg_dump_sort.c \ pg_dump.c common.c pg_dump_sort.c \
@ -9,10 +10,9 @@ GETTEXT_FILES = pg_backup_archiver.c pg_backup_db.c pg_backup_custom.c \
parallel.c parallel.h pg_backup_utils.c pg_backup_utils.h \ parallel.c parallel.h pg_backup_utils.c pg_backup_utils.h \
../../common/exec.c ../../common/fe_memutils.c \ ../../common/exec.c ../../common/fe_memutils.c \
../../common/wait_error.c ../../common/wait_error.c
GETTEXT_TRIGGERS = write_msg:2 exit_horribly:2 simple_prompt \ GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \
ExecuteSqlCommand:3 ahlog:3 warn_or_exit_horribly:3 fatal simple_prompt \
GETTEXT_FLAGS = \ ExecuteSqlCommand:3 warn_or_exit_horribly:3
write_msg:2:c-format \ GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
exit_horribly:2:c-format \ fatal:1:c-format \
ahlog:3:c-format \ warn_or_exit_horribly:2:c-format
warn_or_exit_horribly:3:c-format

View File

@ -197,8 +197,6 @@ bool parallel_init_done = false;
DWORD mainThreadId; DWORD mainThreadId;
#endif /* WIN32 */ #endif /* WIN32 */
static const char *modulename = gettext_noop("parallel archiver");
/* Local function prototypes */ /* Local function prototypes */
static ParallelSlot *GetMyPSlot(ParallelState *pstate); static ParallelSlot *GetMyPSlot(ParallelState *pstate);
static void archive_close_connection(int code, void *arg); static void archive_close_connection(int code, void *arg);
@ -262,7 +260,7 @@ init_parallel_dump_utils(void)
err = WSAStartup(MAKEWORD(2, 2), &wsaData); err = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (err != 0) if (err != 0)
{ {
fprintf(stderr, _("%s: WSAStartup failed: %d\n"), progname, err); pg_log_error("WSAStartup failed: %d", err);
exit_nicely(1); exit_nicely(1);
} }
/* ... and arrange to shut it down at exit */ /* ... and arrange to shut it down at exit */
@ -404,8 +402,8 @@ archive_close_connection(int code, void *arg)
* Forcibly shut down any remaining workers, waiting for them to finish. * Forcibly shut down any remaining workers, waiting for them to finish.
* *
* Note that we don't expect to come here during normal exit (the workers * Note that we don't expect to come here during normal exit (the workers
* should be long gone, and the ParallelState too). We're only here in an * should be long gone, and the ParallelState too). We're only here in a
* exit_horribly() situation, so intervening to cancel active commands is * fatal() situation, so intervening to cancel active commands is
* appropriate. * appropriate.
*/ */
static void static void
@ -697,7 +695,7 @@ consoleHandler(DWORD dwCtrlType)
/* /*
* Report we're quitting, using nothing more complicated than * Report we're quitting, using nothing more complicated than
* write(2). (We might be able to get away with using write_msg() * write(2). (We might be able to get away with using pg_log_*()
* here, but since we terminated other threads uncleanly above, it * here, but since we terminated other threads uncleanly above, it
* seems better to assume as little as possible.) * seems better to assume as little as possible.)
*/ */
@ -967,9 +965,7 @@ ParallelBackupStart(ArchiveHandle *AH)
/* Create communication pipes for this worker */ /* Create communication pipes for this worker */
if (pgpipe(pipeMW) < 0 || pgpipe(pipeWM) < 0) if (pgpipe(pipeMW) < 0 || pgpipe(pipeWM) < 0)
exit_horribly(modulename, fatal("could not create communication channels: %m");
"could not create communication channels: %s\n",
strerror(errno));
pstate->te[i] = NULL; /* just for safety */ pstate->te[i] = NULL; /* just for safety */
@ -1032,9 +1028,7 @@ ParallelBackupStart(ArchiveHandle *AH)
else if (pid < 0) else if (pid < 0)
{ {
/* fork failed */ /* fork failed */
exit_horribly(modulename, fatal("could not create worker process: %m");
"could not create worker process: %s\n",
strerror(errno));
} }
/* In Master after successful fork */ /* In Master after successful fork */
@ -1163,8 +1157,7 @@ parseWorkerCommand(ArchiveHandle *AH, TocEntry **te, T_Action *act,
Assert(*te != NULL); Assert(*te != NULL);
} }
else else
exit_horribly(modulename, fatal("unrecognized command received from master: \"%s\"",
"unrecognized command received from master: \"%s\"\n",
msg); msg);
} }
@ -1207,8 +1200,7 @@ parseWorkerResponse(ArchiveHandle *AH, TocEntry *te,
AH->public.n_errors += n_errors; AH->public.n_errors += n_errors;
} }
else else
exit_horribly(modulename, fatal("invalid message received from worker: \"%s\"",
"invalid message received from worker: \"%s\"\n",
msg); msg);
return status; return status;
@ -1340,11 +1332,10 @@ lockTableForWorker(ArchiveHandle *AH, TocEntry *te)
res = PQexec(AH->connection, query->data); res = PQexec(AH->connection, query->data);
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
exit_horribly(modulename, fatal("could not obtain lock on relation \"%s\"\n"
"could not obtain lock on relation \"%s\"\n" "This usually means that someone requested an ACCESS EXCLUSIVE lock "
"This usually means that someone requested an ACCESS EXCLUSIVE lock " "on the table after the pg_dump parent process had gotten the "
"on the table after the pg_dump parent process had gotten the " "initial ACCESS SHARE lock on the table.", qualId);
"initial ACCESS SHARE lock on the table.\n", qualId);
PQclear(res); PQclear(res);
destroyPQExpBuffer(query); destroyPQExpBuffer(query);
@ -1430,7 +1421,7 @@ ListenToWorkers(ArchiveHandle *AH, ParallelState *pstate, bool do_wait)
{ {
/* If do_wait is true, we must have detected EOF on some socket */ /* If do_wait is true, we must have detected EOF on some socket */
if (do_wait) if (do_wait)
exit_horribly(modulename, "a worker process died unexpectedly\n"); fatal("a worker process died unexpectedly");
return false; return false;
} }
@ -1447,8 +1438,7 @@ ListenToWorkers(ArchiveHandle *AH, ParallelState *pstate, bool do_wait)
pstate->te[worker] = NULL; pstate->te[worker] = NULL;
} }
else else
exit_horribly(modulename, fatal("invalid message received from worker: \"%s\"",
"invalid message received from worker: \"%s\"\n",
msg); msg);
/* Free the string returned from getMessageFromWorker */ /* Free the string returned from getMessageFromWorker */
@ -1553,9 +1543,7 @@ sendMessageToMaster(int pipefd[2], const char *str)
int len = strlen(str) + 1; int len = strlen(str) + 1;
if (pipewrite(pipefd[PIPE_WRITE], str, len) != len) if (pipewrite(pipefd[PIPE_WRITE], str, len) != len)
exit_horribly(modulename, fatal("could not write to the communication channel: %m");
"could not write to the communication channel: %s\n",
strerror(errno));
} }
/* /*
@ -1632,7 +1620,7 @@ getMessageFromWorker(ParallelState *pstate, bool do_wait, int *worker)
} }
if (i < 0) if (i < 0)
exit_horribly(modulename, "select() failed: %s\n", strerror(errno)); fatal("select() failed: %m");
for (i = 0; i < pstate->numWorkers; i++) for (i = 0; i < pstate->numWorkers; i++)
{ {
@ -1671,9 +1659,7 @@ sendMessageToWorker(ParallelState *pstate, int worker, const char *str)
if (pipewrite(pstate->parallelSlot[worker].pipeWrite, str, len) != len) if (pipewrite(pstate->parallelSlot[worker].pipeWrite, str, len) != len)
{ {
exit_horribly(modulename, fatal("could not write to the communication channel: %m");
"could not write to the communication channel: %s\n",
strerror(errno));
} }
} }
@ -1757,7 +1743,7 @@ pgpipe(int handles[2])
*/ */
if ((s = socket(AF_INET, SOCK_STREAM, 0)) == PGINVALID_SOCKET) if ((s = socket(AF_INET, SOCK_STREAM, 0)) == PGINVALID_SOCKET)
{ {
write_msg(modulename, "pgpipe: could not create socket: error code %d\n", pg_log_error("pgpipe: could not create socket: error code %d",
WSAGetLastError()); WSAGetLastError());
return -1; return -1;
} }
@ -1768,21 +1754,21 @@ pgpipe(int handles[2])
serv_addr.sin_addr.s_addr = pg_hton32(INADDR_LOOPBACK); serv_addr.sin_addr.s_addr = pg_hton32(INADDR_LOOPBACK);
if (bind(s, (SOCKADDR *) &serv_addr, len) == SOCKET_ERROR) if (bind(s, (SOCKADDR *) &serv_addr, len) == SOCKET_ERROR)
{ {
write_msg(modulename, "pgpipe: could not bind: error code %d\n", pg_log_error("pgpipe: could not bind: error code %d",
WSAGetLastError()); WSAGetLastError());
closesocket(s); closesocket(s);
return -1; return -1;
} }
if (listen(s, 1) == SOCKET_ERROR) if (listen(s, 1) == SOCKET_ERROR)
{ {
write_msg(modulename, "pgpipe: could not listen: error code %d\n", pg_log_error("pgpipe: could not listen: error code %d",
WSAGetLastError()); WSAGetLastError());
closesocket(s); closesocket(s);
return -1; return -1;
} }
if (getsockname(s, (SOCKADDR *) &serv_addr, &len) == SOCKET_ERROR) if (getsockname(s, (SOCKADDR *) &serv_addr, &len) == SOCKET_ERROR)
{ {
write_msg(modulename, "pgpipe: getsockname() failed: error code %d\n", pg_log_error("pgpipe: getsockname() failed: error code %d",
WSAGetLastError()); WSAGetLastError());
closesocket(s); closesocket(s);
return -1; return -1;
@ -1793,7 +1779,7 @@ pgpipe(int handles[2])
*/ */
if ((tmp_sock = socket(AF_INET, SOCK_STREAM, 0)) == PGINVALID_SOCKET) if ((tmp_sock = socket(AF_INET, SOCK_STREAM, 0)) == PGINVALID_SOCKET)
{ {
write_msg(modulename, "pgpipe: could not create second socket: error code %d\n", pg_log_error("pgpipe: could not create second socket: error code %d",
WSAGetLastError()); WSAGetLastError());
closesocket(s); closesocket(s);
return -1; return -1;
@ -1802,7 +1788,7 @@ pgpipe(int handles[2])
if (connect(handles[1], (SOCKADDR *) &serv_addr, len) == SOCKET_ERROR) if (connect(handles[1], (SOCKADDR *) &serv_addr, len) == SOCKET_ERROR)
{ {
write_msg(modulename, "pgpipe: could not connect socket: error code %d\n", pg_log_error("pgpipe: could not connect socket: error code %d",
WSAGetLastError()); WSAGetLastError());
closesocket(handles[1]); closesocket(handles[1]);
handles[1] = -1; handles[1] = -1;
@ -1811,7 +1797,7 @@ pgpipe(int handles[2])
} }
if ((tmp_sock = accept(s, (SOCKADDR *) &serv_addr, &len)) == PGINVALID_SOCKET) if ((tmp_sock = accept(s, (SOCKADDR *) &serv_addr, &len)) == PGINVALID_SOCKET)
{ {
write_msg(modulename, "pgpipe: could not accept connection: error code %d\n", pg_log_error("pgpipe: could not accept connection: error code %d",
WSAGetLastError()); WSAGetLastError());
closesocket(handles[1]); closesocket(handles[1]);
handles[1] = -1; handles[1] = -1;

View File

@ -35,6 +35,7 @@
#include "pg_backup_db.h" #include "pg_backup_db.h"
#include "pg_backup_utils.h" #include "pg_backup_utils.h"
#include "dumputils.h" #include "dumputils.h"
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h" #include "fe_utils/string_utils.h"
#include "libpq/libpq-fs.h" #include "libpq/libpq-fs.h"
@ -67,9 +68,6 @@ typedef struct _parallelReadyList
bool sorted; /* are valid entries currently sorted? */ bool sorted; /* are valid entries currently sorted? */
} ParallelReadyList; } ParallelReadyList;
/* translator: this is a module name */
static const char *modulename = gettext_noop("archiver");
static ArchiveHandle *_allocAH(const char *FileSpec, const ArchiveFormat fmt, static ArchiveHandle *_allocAH(const char *FileSpec, const ArchiveFormat fmt,
const int compression, bool dosync, ArchiveMode mode, const int compression, bool dosync, ArchiveMode mode,
@ -272,8 +270,7 @@ CloseArchive(Archive *AHX)
res = fclose(AH->OF); res = fclose(AH->OF);
if (res != 0) if (res != 0)
exit_horribly(modulename, "could not close output file: %s\n", fatal("could not close output file: %m");
strerror(errno));
} }
/* Public */ /* Public */
@ -317,19 +314,17 @@ ProcessArchiveRestoreOptions(Archive *AHX)
break; break;
case SECTION_PRE_DATA: case SECTION_PRE_DATA:
if (curSection != SECTION_PRE_DATA) if (curSection != SECTION_PRE_DATA)
write_msg(modulename, pg_log_warning("archive items not in correct section order");
"WARNING: archive items not in correct section order\n");
break; break;
case SECTION_DATA: case SECTION_DATA:
if (curSection == SECTION_POST_DATA) if (curSection == SECTION_POST_DATA)
write_msg(modulename, pg_log_warning("archive items not in correct section order");
"WARNING: archive items not in correct section order\n");
break; break;
case SECTION_POST_DATA: case SECTION_POST_DATA:
/* ok no matter which section we were in */ /* ok no matter which section we were in */
break; break;
default: default:
exit_horribly(modulename, "unexpected section code %d\n", fatal("unexpected section code %d",
(int) te->section); (int) te->section);
break; break;
} }
@ -366,11 +361,11 @@ RestoreArchive(Archive *AHX)
{ {
/* We haven't got round to making this work for all archive formats */ /* We haven't got round to making this work for all archive formats */
if (AH->ClonePtr == NULL || AH->ReopenPtr == NULL) if (AH->ClonePtr == NULL || AH->ReopenPtr == NULL)
exit_horribly(modulename, "parallel restore is not supported with this archive file format\n"); fatal("parallel restore is not supported with this archive file format");
/* Doesn't work if the archive represents dependencies as OIDs */ /* Doesn't work if the archive represents dependencies as OIDs */
if (AH->version < K_VERS_1_8) if (AH->version < K_VERS_1_8)
exit_horribly(modulename, "parallel restore is not supported with archives made by pre-8.0 pg_dump\n"); fatal("parallel restore is not supported with archives made by pre-8.0 pg_dump");
/* /*
* It's also not gonna work if we can't reopen the input file, so * It's also not gonna work if we can't reopen the input file, so
@ -388,7 +383,7 @@ RestoreArchive(Archive *AHX)
for (te = AH->toc->next; te != AH->toc; te = te->next) for (te = AH->toc->next; te != AH->toc; te = te->next)
{ {
if (te->hadDumper && (te->reqs & REQ_DATA) != 0) if (te->hadDumper && (te->reqs & REQ_DATA) != 0)
exit_horribly(modulename, "cannot restore from compressed archive (compression not supported in this installation)\n"); fatal("cannot restore from compressed archive (compression not supported in this installation)");
} }
} }
#endif #endif
@ -405,9 +400,9 @@ RestoreArchive(Archive *AHX)
*/ */
if (ropt->useDB) if (ropt->useDB)
{ {
ahlog(AH, 1, "connecting to database for restore\n"); pg_log_info("connecting to database for restore");
if (AH->version < K_VERS_1_3) if (AH->version < K_VERS_1_3)
exit_horribly(modulename, "direct database connections are not supported in pre-1.3 archives\n"); fatal("direct database connections are not supported in pre-1.3 archives");
/* /*
* We don't want to guess at whether the dump will successfully * We don't want to guess at whether the dump will successfully
@ -452,7 +447,7 @@ RestoreArchive(Archive *AHX)
if (impliedDataOnly) if (impliedDataOnly)
{ {
ropt->dataOnly = impliedDataOnly; ropt->dataOnly = impliedDataOnly;
ahlog(AH, 1, "implied data-only restore\n"); pg_log_info("implied data-only restore");
} }
} }
@ -518,7 +513,7 @@ RestoreArchive(Archive *AHX)
/* Otherwise, drop anything that's selected and has a dropStmt */ /* Otherwise, drop anything that's selected and has a dropStmt */
if (((te->reqs & (REQ_SCHEMA | REQ_DATA)) != 0) && te->dropStmt) if (((te->reqs & (REQ_SCHEMA | REQ_DATA)) != 0) && te->dropStmt)
{ {
ahlog(AH, 1, "dropping %s %s\n", te->desc, te->tag); pg_log_info("dropping %s %s", te->desc, te->tag);
/* Select owner and schema as necessary */ /* Select owner and schema as necessary */
_becomeOwner(AH, te); _becomeOwner(AH, te);
_selectOutputSchema(AH, te->namespace); _selectOutputSchema(AH, te->namespace);
@ -613,8 +608,7 @@ RestoreArchive(Archive *AHX)
else else
{ {
/* complain and emit unmodified command */ /* complain and emit unmodified command */
write_msg(modulename, pg_log_warning("could not find where to insert IF EXISTS in statement \"%s\"",
"WARNING: could not find where to insert IF EXISTS in statement \"%s\"\n",
dropStmtOrig); dropStmtOrig);
appendPQExpBufferStr(ftStmt, dropStmt); appendPQExpBufferStr(ftStmt, dropStmt);
} }
@ -770,9 +764,9 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
if (!ropt->suppressDumpWarnings && strcmp(te->desc, "WARNING") == 0) if (!ropt->suppressDumpWarnings && strcmp(te->desc, "WARNING") == 0)
{ {
if (!ropt->dataOnly && te->defn != NULL && strlen(te->defn) != 0) if (!ropt->dataOnly && te->defn != NULL && strlen(te->defn) != 0)
write_msg(modulename, "warning from original dump file: %s\n", te->defn); pg_log_warning("warning from original dump file: %s", te->defn);
else if (te->copyStmt != NULL && strlen(te->copyStmt) != 0) else if (te->copyStmt != NULL && strlen(te->copyStmt) != 0)
write_msg(modulename, "warning from original dump file: %s\n", te->copyStmt); pg_log_warning("warning from original dump file: %s", te->copyStmt);
} }
/* Work out what, if anything, we want from this entry */ /* Work out what, if anything, we want from this entry */
@ -787,10 +781,11 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
{ {
/* Show namespace in log message if available */ /* Show namespace in log message if available */
if (te->namespace) if (te->namespace)
ahlog(AH, 1, "creating %s \"%s.%s\"\n", pg_log_info("creating %s \"%s.%s\"",
te->desc, te->namespace, te->tag); te->desc, te->namespace, te->tag);
else else
ahlog(AH, 1, "creating %s \"%s\"\n", te->desc, te->tag); pg_log_info("creating %s \"%s\"",
te->desc, te->tag);
_printTocEntry(AH, te, false); _printTocEntry(AH, te, false);
defnDumped = true; defnDumped = true;
@ -846,7 +841,7 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
appendConnStrVal(&connstr, te->tag); appendConnStrVal(&connstr, te->tag);
/* Abandon struct, but keep its buffer until process exit. */ /* Abandon struct, but keep its buffer until process exit. */
ahlog(AH, 1, "connecting to new database \"%s\"\n", te->tag); pg_log_info("connecting to new database \"%s\"", te->tag);
_reconnectToDB(AH, te->tag); _reconnectToDB(AH, te->tag);
ropt->dbname = connstr.data; ropt->dbname = connstr.data;
} }
@ -874,7 +869,7 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
if (strcmp(te->desc, "BLOBS") == 0 || if (strcmp(te->desc, "BLOBS") == 0 ||
strcmp(te->desc, "BLOB COMMENTS") == 0) strcmp(te->desc, "BLOB COMMENTS") == 0)
{ {
ahlog(AH, 1, "processing %s\n", te->desc); pg_log_info("processing %s", te->desc);
_selectOutputSchema(AH, "pg_catalog"); _selectOutputSchema(AH, "pg_catalog");
@ -894,7 +889,7 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
_becomeOwner(AH, te); _becomeOwner(AH, te);
_selectOutputSchema(AH, te->namespace); _selectOutputSchema(AH, te->namespace);
ahlog(AH, 1, "processing data for table \"%s.%s\"\n", pg_log_info("processing data for table \"%s.%s\"",
te->namespace, te->tag); te->namespace, te->tag);
/* /*
@ -956,7 +951,7 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
else if (!defnDumped) else if (!defnDumped)
{ {
/* If we haven't already dumped the defn part, do so now */ /* If we haven't already dumped the defn part, do so now */
ahlog(AH, 1, "executing %s %s\n", te->desc, te->tag); pg_log_info("executing %s %s", te->desc, te->tag);
_printTocEntry(AH, te, false); _printTocEntry(AH, te, false);
} }
} }
@ -995,7 +990,7 @@ _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te)
if (!ropt->dataOnly || !ropt->disable_triggers) if (!ropt->dataOnly || !ropt->disable_triggers)
return; return;
ahlog(AH, 1, "disabling triggers for %s\n", te->tag); pg_log_info("disabling triggers for %s", te->tag);
/* /*
* Become superuser if possible, since they are the only ones who can * Become superuser if possible, since they are the only ones who can
@ -1021,7 +1016,7 @@ _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te)
if (!ropt->dataOnly || !ropt->disable_triggers) if (!ropt->dataOnly || !ropt->disable_triggers)
return; return;
ahlog(AH, 1, "enabling triggers for %s\n", te->tag); pg_log_info("enabling triggers for %s", te->tag);
/* /*
* Become superuser if possible, since they are the only ones who can * Become superuser if possible, since they are the only ones who can
@ -1049,7 +1044,7 @@ WriteData(Archive *AHX, const void *data, size_t dLen)
ArchiveHandle *AH = (ArchiveHandle *) AHX; ArchiveHandle *AH = (ArchiveHandle *) AHX;
if (!AH->currToc) if (!AH->currToc)
exit_horribly(modulename, "internal error -- WriteData cannot be called outside the context of a DataDumper routine\n"); fatal("internal error -- WriteData cannot be called outside the context of a DataDumper routine");
AH->WriteDataPtr(AH, data, dLen); AH->WriteDataPtr(AH, data, dLen);
@ -1234,7 +1229,7 @@ StartBlob(Archive *AHX, Oid oid)
ArchiveHandle *AH = (ArchiveHandle *) AHX; ArchiveHandle *AH = (ArchiveHandle *) AHX;
if (!AH->StartBlobPtr) if (!AH->StartBlobPtr)
exit_horribly(modulename, "large-object output not supported in chosen format\n"); fatal("large-object output not supported in chosen format");
AH->StartBlobPtr(AH, AH->currToc, oid); AH->StartBlobPtr(AH, AH->currToc, oid);
@ -1292,8 +1287,8 @@ EndRestoreBlobs(ArchiveHandle *AH)
ahprintf(AH, "COMMIT;\n\n"); ahprintf(AH, "COMMIT;\n\n");
} }
ahlog(AH, 1, ngettext("restored %d large object\n", pg_log_info(ngettext("restored %d large object",
"restored %d large objects\n", "restored %d large objects",
AH->blobCount), AH->blobCount),
AH->blobCount); AH->blobCount);
} }
@ -1313,7 +1308,7 @@ StartRestoreBlob(ArchiveHandle *AH, Oid oid, bool drop)
/* Initialize the LO Buffer */ /* Initialize the LO Buffer */
AH->lo_buf_used = 0; AH->lo_buf_used = 0;
ahlog(AH, 1, "restoring large object with OID %u\n", oid); pg_log_info("restoring large object with OID %u", oid);
/* With an old archive we must do drop and create logic here */ /* With an old archive we must do drop and create logic here */
if (old_blob_style && drop) if (old_blob_style && drop)
@ -1325,12 +1320,12 @@ StartRestoreBlob(ArchiveHandle *AH, Oid oid, bool drop)
{ {
loOid = lo_create(AH->connection, oid); loOid = lo_create(AH->connection, oid);
if (loOid == 0 || loOid != oid) if (loOid == 0 || loOid != oid)
exit_horribly(modulename, "could not create large object %u: %s", fatal("could not create large object %u: %s",
oid, PQerrorMessage(AH->connection)); oid, PQerrorMessage(AH->connection));
} }
AH->loFd = lo_open(AH->connection, oid, INV_WRITE); AH->loFd = lo_open(AH->connection, oid, INV_WRITE);
if (AH->loFd == -1) if (AH->loFd == -1)
exit_horribly(modulename, "could not open large object %u: %s", fatal("could not open large object %u: %s",
oid, PQerrorMessage(AH->connection)); oid, PQerrorMessage(AH->connection));
} }
else else
@ -1387,8 +1382,7 @@ SortTocFromFile(Archive *AHX)
/* Setup the file */ /* Setup the file */
fh = fopen(ropt->tocFile, PG_BINARY_R); fh = fopen(ropt->tocFile, PG_BINARY_R);
if (!fh) if (!fh)
exit_horribly(modulename, "could not open TOC file \"%s\": %s\n", fatal("could not open TOC file \"%s\": %m", ropt->tocFile);
ropt->tocFile, strerror(errno));
incomplete_line = false; incomplete_line = false;
while (fgets(buf, sizeof(buf), fh) != NULL) while (fgets(buf, sizeof(buf), fh) != NULL)
@ -1428,14 +1422,14 @@ SortTocFromFile(Archive *AHX)
if (endptr == buf || id <= 0 || id > AH->maxDumpId || if (endptr == buf || id <= 0 || id > AH->maxDumpId ||
ropt->idWanted[id - 1]) ropt->idWanted[id - 1])
{ {
write_msg(modulename, "WARNING: line ignored: %s\n", buf); pg_log_warning("line ignored: %s", buf);
continue; continue;
} }
/* Find TOC entry */ /* Find TOC entry */
te = getTocEntryByDumpId(AH, id); te = getTocEntryByDumpId(AH, id);
if (!te) if (!te)
exit_horribly(modulename, "could not find entry for ID %d\n", fatal("could not find entry for ID %d",
id); id);
/* Mark it wanted */ /* Mark it wanted */
@ -1456,8 +1450,7 @@ SortTocFromFile(Archive *AHX)
} }
if (fclose(fh) != 0) if (fclose(fh) != 0)
exit_horribly(modulename, "could not close TOC file: %s\n", fatal("could not close TOC file: %m");
strerror(errno));
} }
/********************** /**********************
@ -1567,11 +1560,9 @@ SetOutput(ArchiveHandle *AH, const char *filename, int compression)
if (!AH->OF) if (!AH->OF)
{ {
if (filename) if (filename)
exit_horribly(modulename, "could not open output file \"%s\": %s\n", fatal("could not open output file \"%s\": %m", filename);
filename, strerror(errno));
else else
exit_horribly(modulename, "could not open output file: %s\n", fatal("could not open output file: %m");
strerror(errno));
} }
} }
@ -1597,8 +1588,7 @@ RestoreOutput(ArchiveHandle *AH, OutputContext savedContext)
res = fclose(AH->OF); res = fclose(AH->OF);
if (res != 0) if (res != 0)
exit_horribly(modulename, "could not close output file: %s\n", fatal("could not close output file: %m");
strerror(errno));
AH->gzOut = savedContext.gzOut; AH->gzOut = savedContext.gzOut;
AH->OF = savedContext.OF; AH->OF = savedContext.OF;
@ -1643,19 +1633,6 @@ ahprintf(ArchiveHandle *AH, const char *fmt,...)
return (int) cnt; return (int) cnt;
} }
void
ahlog(ArchiveHandle *AH, int level, const char *fmt,...)
{
va_list ap;
if (AH->debugLevel < level && (!AH->public.verbose || level > 1))
return;
va_start(ap, fmt);
vwrite_msg(NULL, fmt, ap);
va_end(ap);
}
/* /*
* Single place for logic which says 'We are restoring to a direct DB connection'. * Single place for logic which says 'We are restoring to a direct DB connection'.
*/ */
@ -1678,13 +1655,12 @@ dump_lo_buf(ArchiveHandle *AH)
size_t res; size_t res;
res = lo_write(AH->connection, AH->loFd, AH->lo_buf, AH->lo_buf_used); res = lo_write(AH->connection, AH->loFd, AH->lo_buf, AH->lo_buf_used);
ahlog(AH, 5, ngettext("wrote %lu byte of large object data (result = %lu)\n", pg_log_debug(ngettext("wrote %lu byte of large object data (result = %lu)",
"wrote %lu bytes of large object data (result = %lu)\n", "wrote %lu bytes of large object data (result = %lu)",
AH->lo_buf_used), AH->lo_buf_used),
(unsigned long) AH->lo_buf_used, (unsigned long) res); (unsigned long) AH->lo_buf_used, (unsigned long) res);
if (res != AH->lo_buf_used) if (res != AH->lo_buf_used)
exit_horribly(modulename, fatal("could not write to large object (result: %lu, expected: %lu)",
"could not write to large object (result: %lu, expected: %lu)\n",
(unsigned long) res, (unsigned long) AH->lo_buf_used); (unsigned long) res, (unsigned long) AH->lo_buf_used);
} }
else else
@ -1763,8 +1739,7 @@ ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH)
/* on some error, we may decide to go on... */ /* on some error, we may decide to go on... */
void void
warn_or_exit_horribly(ArchiveHandle *AH, warn_or_exit_horribly(ArchiveHandle *AH, const char *fmt,...)
const char *modulename, const char *fmt,...)
{ {
va_list ap; va_list ap;
@ -1777,22 +1752,22 @@ warn_or_exit_horribly(ArchiveHandle *AH,
case STAGE_INITIALIZING: case STAGE_INITIALIZING:
if (AH->stage != AH->lastErrorStage) if (AH->stage != AH->lastErrorStage)
write_msg(modulename, "Error while INITIALIZING:\n"); pg_log_generic(PG_LOG_INFO, "while INITIALIZING:");
break; break;
case STAGE_PROCESSING: case STAGE_PROCESSING:
if (AH->stage != AH->lastErrorStage) if (AH->stage != AH->lastErrorStage)
write_msg(modulename, "Error while PROCESSING TOC:\n"); pg_log_generic(PG_LOG_INFO, "while PROCESSING TOC:");
break; break;
case STAGE_FINALIZING: case STAGE_FINALIZING:
if (AH->stage != AH->lastErrorStage) if (AH->stage != AH->lastErrorStage)
write_msg(modulename, "Error while FINALIZING:\n"); pg_log_generic(PG_LOG_INFO, "while FINALIZING:");
break; break;
} }
if (AH->currentTE != NULL && AH->currentTE != AH->lastErrorTE) if (AH->currentTE != NULL && AH->currentTE != AH->lastErrorTE)
{ {
write_msg(modulename, "Error from TOC entry %d; %u %u %s %s %s\n", pg_log_generic(PG_LOG_INFO, "from TOC entry %d; %u %u %s %s %s",
AH->currentTE->dumpId, AH->currentTE->dumpId,
AH->currentTE->catalogId.tableoid, AH->currentTE->catalogId.tableoid,
AH->currentTE->catalogId.oid, AH->currentTE->catalogId.oid,
@ -1804,7 +1779,7 @@ warn_or_exit_horribly(ArchiveHandle *AH,
AH->lastErrorTE = AH->currentTE; AH->lastErrorTE = AH->currentTE;
va_start(ap, fmt); va_start(ap, fmt);
vwrite_msg(modulename, fmt, ap); pg_log_generic_v(PG_LOG_ERROR, fmt, ap);
va_end(ap); va_end(ap);
if (AH->public.exit_on_error) if (AH->public.exit_on_error)
@ -1868,7 +1843,7 @@ buildTocEntryArrays(ArchiveHandle *AH)
{ {
/* this check is purely paranoia, maxDumpId should be correct */ /* this check is purely paranoia, maxDumpId should be correct */
if (te->dumpId <= 0 || te->dumpId > maxDumpId) if (te->dumpId <= 0 || te->dumpId > maxDumpId)
exit_horribly(modulename, "bad dumpId\n"); fatal("bad dumpId");
/* tocsByDumpId indexes all TOCs by their dump ID */ /* tocsByDumpId indexes all TOCs by their dump ID */
AH->tocsByDumpId[te->dumpId] = te; AH->tocsByDumpId[te->dumpId] = te;
@ -1889,7 +1864,7 @@ buildTocEntryArrays(ArchiveHandle *AH)
* item's dump ID, so there should be a place for it in the array. * item's dump ID, so there should be a place for it in the array.
*/ */
if (tableId <= 0 || tableId > maxDumpId) if (tableId <= 0 || tableId > maxDumpId)
exit_horribly(modulename, "bad table dumpId for TABLE DATA item\n"); fatal("bad table dumpId for TABLE DATA item");
AH->tableDataId[tableId] = te->dumpId; AH->tableDataId[tableId] = te->dumpId;
} }
@ -1981,7 +1956,7 @@ ReadOffset(ArchiveHandle *AH, pgoff_t * o)
break; break;
default: default:
exit_horribly(modulename, "unexpected data offset flag %d\n", offsetFlg); fatal("unexpected data offset flag %d", offsetFlg);
} }
/* /*
@ -1994,7 +1969,7 @@ ReadOffset(ArchiveHandle *AH, pgoff_t * o)
else else
{ {
if (AH->ReadBytePtr(AH) != 0) if (AH->ReadBytePtr(AH) != 0)
exit_horribly(modulename, "file offset in dump file is too large\n"); fatal("file offset in dump file is too large");
} }
} }
@ -2106,9 +2081,7 @@ _discoverArchiveFormat(ArchiveHandle *AH)
size_t cnt; size_t cnt;
int wantClose = 0; int wantClose = 0;
#if 0 pg_log_debug("attempting to ascertain archive format");
write_msg(modulename, "attempting to ascertain archive format\n");
#endif
if (AH->lookahead) if (AH->lookahead)
free(AH->lookahead); free(AH->lookahead);
@ -2133,7 +2106,7 @@ _discoverArchiveFormat(ArchiveHandle *AH)
char buf[MAXPGPATH]; char buf[MAXPGPATH];
if (snprintf(buf, MAXPGPATH, "%s/toc.dat", AH->fSpec) >= MAXPGPATH) if (snprintf(buf, MAXPGPATH, "%s/toc.dat", AH->fSpec) >= MAXPGPATH)
exit_horribly(modulename, "directory name too long: \"%s\"\n", fatal("directory name too long: \"%s\"",
AH->fSpec); AH->fSpec);
if (stat(buf, &st) == 0 && S_ISREG(st.st_mode)) if (stat(buf, &st) == 0 && S_ISREG(st.st_mode))
{ {
@ -2143,7 +2116,7 @@ _discoverArchiveFormat(ArchiveHandle *AH)
#ifdef HAVE_LIBZ #ifdef HAVE_LIBZ
if (snprintf(buf, MAXPGPATH, "%s/toc.dat.gz", AH->fSpec) >= MAXPGPATH) if (snprintf(buf, MAXPGPATH, "%s/toc.dat.gz", AH->fSpec) >= MAXPGPATH)
exit_horribly(modulename, "directory name too long: \"%s\"\n", fatal("directory name too long: \"%s\"",
AH->fSpec); AH->fSpec);
if (stat(buf, &st) == 0 && S_ISREG(st.st_mode)) if (stat(buf, &st) == 0 && S_ISREG(st.st_mode))
{ {
@ -2151,7 +2124,7 @@ _discoverArchiveFormat(ArchiveHandle *AH)
return AH->format; return AH->format;
} }
#endif #endif
exit_horribly(modulename, "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)\n", fatal("directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)",
AH->fSpec); AH->fSpec);
fh = NULL; /* keep compiler quiet */ fh = NULL; /* keep compiler quiet */
} }
@ -2159,24 +2132,22 @@ _discoverArchiveFormat(ArchiveHandle *AH)
{ {
fh = fopen(AH->fSpec, PG_BINARY_R); fh = fopen(AH->fSpec, PG_BINARY_R);
if (!fh) if (!fh)
exit_horribly(modulename, "could not open input file \"%s\": %s\n", fatal("could not open input file \"%s\": %m", AH->fSpec);
AH->fSpec, strerror(errno));
} }
} }
else else
{ {
fh = stdin; fh = stdin;
if (!fh) if (!fh)
exit_horribly(modulename, "could not open input file: %s\n", fatal("could not open input file: %m");
strerror(errno));
} }
if ((cnt = fread(sig, 1, 5, fh)) != 5) if ((cnt = fread(sig, 1, 5, fh)) != 5)
{ {
if (ferror(fh)) if (ferror(fh))
exit_horribly(modulename, "could not read input file: %s\n", strerror(errno)); fatal("could not read input file: %m");
else else
exit_horribly(modulename, "input file is too short (read %lu, expected 5)\n", fatal("input file is too short (read %lu, expected 5)",
(unsigned long) cnt); (unsigned long) cnt);
} }
@ -2261,19 +2232,19 @@ _discoverArchiveFormat(ArchiveHandle *AH)
* looks like it's probably a text format dump. so suggest they * looks like it's probably a text format dump. so suggest they
* try psql * try psql
*/ */
exit_horribly(modulename, "input file appears to be a text format dump. Please use psql.\n"); fatal("input file appears to be a text format dump. Please use psql.");
} }
if (AH->lookaheadLen != 512) if (AH->lookaheadLen != 512)
{ {
if (feof(fh)) if (feof(fh))
exit_horribly(modulename, "input file does not appear to be a valid archive (too short?)\n"); fatal("input file does not appear to be a valid archive (too short?)");
else else
READ_ERROR_EXIT(fh); READ_ERROR_EXIT(fh);
} }
if (!isValidTarHeader(AH->lookahead)) if (!isValidTarHeader(AH->lookahead))
exit_horribly(modulename, "input file does not appear to be a valid archive\n"); fatal("input file does not appear to be a valid archive");
AH->format = archTar; AH->format = archTar;
} }
@ -2293,8 +2264,7 @@ _discoverArchiveFormat(ArchiveHandle *AH)
/* Close the file */ /* Close the file */
if (wantClose) if (wantClose)
if (fclose(fh) != 0) if (fclose(fh) != 0)
exit_horribly(modulename, "could not close input file: %s\n", fatal("could not close input file: %m");
strerror(errno));
return AH->format; return AH->format;
} }
@ -2310,14 +2280,10 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt,
{ {
ArchiveHandle *AH; ArchiveHandle *AH;
#if 0 pg_log_debug("allocating AH for %s, format %d", FileSpec, fmt);
write_msg(modulename, "allocating AH for %s, format %d\n", FileSpec, fmt);
#endif
AH = (ArchiveHandle *) pg_malloc0(sizeof(ArchiveHandle)); AH = (ArchiveHandle *) pg_malloc0(sizeof(ArchiveHandle));
/* AH->debugLevel = 100; */
AH->version = K_VERS_SELF; AH->version = K_VERS_SELF;
/* initialize for backwards compatible string processing */ /* initialize for backwards compatible string processing */
@ -2412,7 +2378,7 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt,
break; break;
default: default:
exit_horribly(modulename, "unrecognized file format \"%d\"\n", fmt); fatal("unrecognized file format \"%d\"", fmt);
} }
return AH; return AH;
@ -2494,11 +2460,11 @@ mark_dump_job_done(ArchiveHandle *AH,
int status, int status,
void *callback_data) void *callback_data)
{ {
ahlog(AH, 1, "finished item %d %s %s\n", pg_log_info("finished item %d %s %s",
te->dumpId, te->desc, te->tag); te->dumpId, te->desc, te->tag);
if (status != 0) if (status != 0)
exit_horribly(modulename, "worker process failed: exit code %d\n", fatal("worker process failed: exit code %d",
status); status);
} }
@ -2618,8 +2584,7 @@ ReadToc(ArchiveHandle *AH)
/* Sanity check */ /* Sanity check */
if (te->dumpId <= 0) if (te->dumpId <= 0)
exit_horribly(modulename, fatal("entry ID %d out of range -- perhaps a corrupt TOC",
"entry ID %d out of range -- perhaps a corrupt TOC\n",
te->dumpId); te->dumpId);
te->hadDumper = ReadInt(AH); te->hadDumper = ReadInt(AH);
@ -2686,8 +2651,7 @@ ReadToc(ArchiveHandle *AH)
te->owner = ReadStr(AH); te->owner = ReadStr(AH);
if (AH->version < K_VERS_1_9 || strcmp(ReadStr(AH), "true") == 0) if (AH->version < K_VERS_1_9 || strcmp(ReadStr(AH), "true") == 0)
write_msg(modulename, pg_log_warning("restoring tables WITH OIDS is not supported anymore");
"WARNING: restoring tables WITH OIDS is not supported anymore\n");
/* Read TOC entry dependencies */ /* Read TOC entry dependencies */
if (AH->version >= K_VERS_1_5) if (AH->version >= K_VERS_1_5)
@ -2733,7 +2697,7 @@ ReadToc(ArchiveHandle *AH)
if (AH->ReadExtraTocPtr) if (AH->ReadExtraTocPtr)
AH->ReadExtraTocPtr(AH, te); AH->ReadExtraTocPtr(AH, te);
ahlog(AH, 3, "read TOC entry %d (ID %d) for %s %s\n", pg_log_debug("read TOC entry %d (ID %d) for %s %s",
i, te->dumpId, te->desc, te->tag); i, te->dumpId, te->desc, te->tag);
/* link completed entry into TOC circular list */ /* link completed entry into TOC circular list */
@ -2769,12 +2733,12 @@ processEncodingEntry(ArchiveHandle *AH, TocEntry *te)
*ptr2 = '\0'; *ptr2 = '\0';
encoding = pg_char_to_encoding(ptr1); encoding = pg_char_to_encoding(ptr1);
if (encoding < 0) if (encoding < 0)
exit_horribly(modulename, "unrecognized encoding \"%s\"\n", fatal("unrecognized encoding \"%s\"",
ptr1); ptr1);
AH->public.encoding = encoding; AH->public.encoding = encoding;
} }
else else
exit_horribly(modulename, "invalid ENCODING item: %s\n", fatal("invalid ENCODING item: %s",
te->defn); te->defn);
free(defn); free(defn);
@ -2792,7 +2756,7 @@ processStdStringsEntry(ArchiveHandle *AH, TocEntry *te)
else if (ptr1 && strncmp(ptr1, "'off'", 5) == 0) else if (ptr1 && strncmp(ptr1, "'off'", 5) == 0)
AH->public.std_strings = false; AH->public.std_strings = false;
else else
exit_horribly(modulename, "invalid STDSTRINGS item: %s\n", fatal("invalid STDSTRINGS item: %s",
te->defn); te->defn);
} }
@ -2817,35 +2781,35 @@ StrictNamesCheck(RestoreOptions *ropt)
{ {
missing_name = simple_string_list_not_touched(&ropt->schemaNames); missing_name = simple_string_list_not_touched(&ropt->schemaNames);
if (missing_name != NULL) if (missing_name != NULL)
exit_horribly(modulename, "schema \"%s\" not found\n", missing_name); fatal("schema \"%s\" not found", missing_name);
} }
if (ropt->tableNames.head != NULL) if (ropt->tableNames.head != NULL)
{ {
missing_name = simple_string_list_not_touched(&ropt->tableNames); missing_name = simple_string_list_not_touched(&ropt->tableNames);
if (missing_name != NULL) if (missing_name != NULL)
exit_horribly(modulename, "table \"%s\" not found\n", missing_name); fatal("table \"%s\" not found", missing_name);
} }
if (ropt->indexNames.head != NULL) if (ropt->indexNames.head != NULL)
{ {
missing_name = simple_string_list_not_touched(&ropt->indexNames); missing_name = simple_string_list_not_touched(&ropt->indexNames);
if (missing_name != NULL) if (missing_name != NULL)
exit_horribly(modulename, "index \"%s\" not found\n", missing_name); fatal("index \"%s\" not found", missing_name);
} }
if (ropt->functionNames.head != NULL) if (ropt->functionNames.head != NULL)
{ {
missing_name = simple_string_list_not_touched(&ropt->functionNames); missing_name = simple_string_list_not_touched(&ropt->functionNames);
if (missing_name != NULL) if (missing_name != NULL)
exit_horribly(modulename, "function \"%s\" not found\n", missing_name); fatal("function \"%s\" not found", missing_name);
} }
if (ropt->triggerNames.head != NULL) if (ropt->triggerNames.head != NULL)
{ {
missing_name = simple_string_list_not_touched(&ropt->triggerNames); missing_name = simple_string_list_not_touched(&ropt->triggerNames);
if (missing_name != NULL) if (missing_name != NULL)
exit_horribly(modulename, "trigger \"%s\" not found\n", missing_name); fatal("trigger \"%s\" not found", missing_name);
} }
} }
@ -3224,7 +3188,7 @@ _doSetSessionAuth(ArchiveHandle *AH, const char *user)
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
/* NOT warn_or_exit_horribly... use -O instead to skip this. */ /* NOT warn_or_exit_horribly... use -O instead to skip this. */
exit_horribly(modulename, "could not set session user to \"%s\": %s", fatal("could not set session user to \"%s\": %s",
user, PQerrorMessage(AH->connection)); user, PQerrorMessage(AH->connection));
PQclear(res); PQclear(res);
@ -3362,7 +3326,7 @@ _selectOutputSchema(ArchiveHandle *AH, const char *schemaName)
res = PQexec(AH->connection, qry->data); res = PQexec(AH->connection, qry->data);
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
warn_or_exit_horribly(AH, modulename, warn_or_exit_horribly(AH,
"could not set search_path to \"%s\": %s", "could not set search_path to \"%s\": %s",
schemaName, PQerrorMessage(AH->connection)); schemaName, PQerrorMessage(AH->connection));
@ -3424,7 +3388,7 @@ _selectTablespace(ArchiveHandle *AH, const char *tablespace)
res = PQexec(AH->connection, qry->data); res = PQexec(AH->connection, qry->data);
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
warn_or_exit_horribly(AH, modulename, warn_or_exit_horribly(AH,
"could not set default_tablespace to %s: %s", "could not set default_tablespace to %s: %s",
fmtId(want), PQerrorMessage(AH->connection)); fmtId(want), PQerrorMessage(AH->connection));
@ -3468,7 +3432,7 @@ _selectTableAccessMethod(ArchiveHandle *AH, const char *tableam)
res = PQexec(AH->connection, cmd->data); res = PQexec(AH->connection, cmd->data);
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
warn_or_exit_horribly(AH, modulename, warn_or_exit_horribly(AH,
"could not set default_table_access_method: %s", "could not set default_table_access_method: %s",
PQerrorMessage(AH->connection)); PQerrorMessage(AH->connection));
@ -3561,7 +3525,7 @@ _getObjectDescription(PQExpBuffer buf, TocEntry *te, ArchiveHandle *AH)
return; return;
} }
write_msg(modulename, "WARNING: don't know how to set owner for object type \"%s\"\n", pg_log_warning("don't know how to set owner for object type \"%s\"",
type); type);
} }
@ -3718,7 +3682,7 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData)
} }
else else
{ {
write_msg(modulename, "WARNING: don't know how to set owner for object type \"%s\"\n", pg_log_warning("don't know how to set owner for object type \"%s\"",
te->desc); te->desc);
} }
} }
@ -3822,7 +3786,7 @@ ReadHead(ArchiveHandle *AH)
AH->ReadBufPtr(AH, tmpMag, 5); AH->ReadBufPtr(AH, tmpMag, 5);
if (strncmp(tmpMag, "PGDMP", 5) != 0) if (strncmp(tmpMag, "PGDMP", 5) != 0)
exit_horribly(modulename, "did not find magic string in file header\n"); fatal("did not find magic string in file header");
vmaj = AH->ReadBytePtr(AH); vmaj = AH->ReadBytePtr(AH);
vmin = AH->ReadBytePtr(AH); vmin = AH->ReadBytePtr(AH);
@ -3835,16 +3799,16 @@ ReadHead(ArchiveHandle *AH)
AH->version = MAKE_ARCHIVE_VERSION(vmaj, vmin, vrev); AH->version = MAKE_ARCHIVE_VERSION(vmaj, vmin, vrev);
if (AH->version < K_VERS_1_0 || AH->version > K_VERS_MAX) if (AH->version < K_VERS_1_0 || AH->version > K_VERS_MAX)
exit_horribly(modulename, "unsupported version (%d.%d) in file header\n", fatal("unsupported version (%d.%d) in file header",
vmaj, vmin); vmaj, vmin);
AH->intSize = AH->ReadBytePtr(AH); AH->intSize = AH->ReadBytePtr(AH);
if (AH->intSize > 32) if (AH->intSize > 32)
exit_horribly(modulename, "sanity check on integer size (%lu) failed\n", fatal("sanity check on integer size (%lu) failed",
(unsigned long) AH->intSize); (unsigned long) AH->intSize);
if (AH->intSize > sizeof(int)) if (AH->intSize > sizeof(int))
write_msg(modulename, "WARNING: archive was made on a machine with larger integers, some operations might fail\n"); pg_log_warning("archive was made on a machine with larger integers, some operations might fail");
if (AH->version >= K_VERS_1_7) if (AH->version >= K_VERS_1_7)
AH->offSize = AH->ReadBytePtr(AH); AH->offSize = AH->ReadBytePtr(AH);
@ -3854,7 +3818,7 @@ ReadHead(ArchiveHandle *AH)
fmt = AH->ReadBytePtr(AH); fmt = AH->ReadBytePtr(AH);
if (AH->format != fmt) if (AH->format != fmt)
exit_horribly(modulename, "expected format (%d) differs from format found in file (%d)\n", fatal("expected format (%d) differs from format found in file (%d)",
AH->format, fmt); AH->format, fmt);
} }
@ -3870,7 +3834,7 @@ ReadHead(ArchiveHandle *AH)
#ifndef HAVE_LIBZ #ifndef HAVE_LIBZ
if (AH->compression != 0) if (AH->compression != 0)
write_msg(modulename, "WARNING: archive is compressed, but this installation does not support compression -- no data will be available\n"); pg_log_warning("archive is compressed, but this installation does not support compression -- no data will be available");
#endif #endif
if (AH->version >= K_VERS_1_4) if (AH->version >= K_VERS_1_4)
@ -3888,7 +3852,7 @@ ReadHead(ArchiveHandle *AH)
AH->createDate = mktime(&crtm); AH->createDate = mktime(&crtm);
if (AH->createDate == (time_t) -1) if (AH->createDate == (time_t) -1)
write_msg(modulename, "WARNING: invalid creation date in header\n"); pg_log_warning("invalid creation date in header");
} }
if (AH->version >= K_VERS_1_10) if (AH->version >= K_VERS_1_10)
@ -3961,7 +3925,7 @@ restore_toc_entries_prefork(ArchiveHandle *AH, TocEntry *pending_list)
bool skipped_some; bool skipped_some;
TocEntry *next_work_item; TocEntry *next_work_item;
ahlog(AH, 2, "entering restore_toc_entries_prefork\n"); pg_log_debug("entering restore_toc_entries_prefork");
/* Adjust dependency information */ /* Adjust dependency information */
fix_dependencies(AH); fix_dependencies(AH);
@ -4025,7 +3989,7 @@ restore_toc_entries_prefork(ArchiveHandle *AH, TocEntry *pending_list)
if (do_now) if (do_now)
{ {
/* OK, restore the item and update its dependencies */ /* OK, restore the item and update its dependencies */
ahlog(AH, 1, "processing item %d %s %s\n", pg_log_info("processing item %d %s %s",
next_work_item->dumpId, next_work_item->dumpId,
next_work_item->desc, next_work_item->tag); next_work_item->desc, next_work_item->tag);
@ -4081,7 +4045,7 @@ restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate,
ParallelReadyList ready_list; ParallelReadyList ready_list;
TocEntry *next_work_item; TocEntry *next_work_item;
ahlog(AH, 2, "entering restore_toc_entries_parallel\n"); pg_log_debug("entering restore_toc_entries_parallel");
/* Set up ready_list with enough room for all known TocEntrys */ /* Set up ready_list with enough room for all known TocEntrys */
ready_list_init(&ready_list, AH->tocCount); ready_list_init(&ready_list, AH->tocCount);
@ -4104,7 +4068,7 @@ restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate,
* left to be done. Note invariant: at top of loop, there should always * left to be done. Note invariant: at top of loop, there should always
* be at least one worker available to dispatch a job to. * be at least one worker available to dispatch a job to.
*/ */
ahlog(AH, 1, "entering main parallel loop\n"); pg_log_info("entering main parallel loop");
for (;;) for (;;)
{ {
@ -4115,7 +4079,7 @@ restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate,
/* If not to be restored, don't waste time launching a worker */ /* If not to be restored, don't waste time launching a worker */
if ((next_work_item->reqs & (REQ_SCHEMA | REQ_DATA)) == 0) if ((next_work_item->reqs & (REQ_SCHEMA | REQ_DATA)) == 0)
{ {
ahlog(AH, 1, "skipping item %d %s %s\n", pg_log_info("skipping item %d %s %s",
next_work_item->dumpId, next_work_item->dumpId,
next_work_item->desc, next_work_item->tag); next_work_item->desc, next_work_item->tag);
/* Update its dependencies as though we'd completed it */ /* Update its dependencies as though we'd completed it */
@ -4124,7 +4088,7 @@ restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate,
continue; continue;
} }
ahlog(AH, 1, "launching item %d %s %s\n", pg_log_info("launching item %d %s %s",
next_work_item->dumpId, next_work_item->dumpId,
next_work_item->desc, next_work_item->tag); next_work_item->desc, next_work_item->tag);
@ -4178,7 +4142,7 @@ restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate,
ready_list_free(&ready_list); ready_list_free(&ready_list);
ahlog(AH, 1, "finished main parallel loop\n"); pg_log_info("finished main parallel loop");
} }
/* /*
@ -4196,7 +4160,7 @@ restore_toc_entries_postfork(ArchiveHandle *AH, TocEntry *pending_list)
RestoreOptions *ropt = AH->public.ropt; RestoreOptions *ropt = AH->public.ropt;
TocEntry *te; TocEntry *te;
ahlog(AH, 2, "entering restore_toc_entries_postfork\n"); pg_log_debug("entering restore_toc_entries_postfork");
/* /*
* Now reconnect the single parent connection. * Now reconnect the single parent connection.
@ -4216,7 +4180,7 @@ restore_toc_entries_postfork(ArchiveHandle *AH, TocEntry *pending_list)
*/ */
for (te = pending_list->pending_next; te != pending_list; te = te->pending_next) for (te = pending_list->pending_next; te != pending_list; te = te->pending_next)
{ {
ahlog(AH, 1, "processing missed item %d %s %s\n", pg_log_info("processing missed item %d %s %s",
te->dumpId, te->desc, te->tag); te->dumpId, te->desc, te->tag);
(void) restore_toc_entry(AH, te, false); (void) restore_toc_entry(AH, te, false);
} }
@ -4458,7 +4422,7 @@ pop_next_work_item(ArchiveHandle *AH, ParallelReadyList *ready_list,
return te; return te;
} }
ahlog(AH, 2, "no item ready\n"); pg_log_debug("no item ready");
return NULL; return NULL;
} }
@ -4502,7 +4466,7 @@ mark_restore_job_done(ArchiveHandle *AH,
{ {
ParallelReadyList *ready_list = (ParallelReadyList *) callback_data; ParallelReadyList *ready_list = (ParallelReadyList *) callback_data;
ahlog(AH, 1, "finished item %d %s %s\n", pg_log_info("finished item %d %s %s",
te->dumpId, te->desc, te->tag); te->dumpId, te->desc, te->tag);
if (status == WORKER_CREATE_DONE) if (status == WORKER_CREATE_DONE)
@ -4515,7 +4479,7 @@ mark_restore_job_done(ArchiveHandle *AH,
else if (status == WORKER_IGNORED_ERRORS) else if (status == WORKER_IGNORED_ERRORS)
AH->public.n_errors++; AH->public.n_errors++;
else if (status != 0) else if (status != 0)
exit_horribly(modulename, "worker process failed: exit code %d\n", fatal("worker process failed: exit code %d",
status); status);
reduce_dependencies(AH, te, ready_list); reduce_dependencies(AH, te, ready_list);
@ -4687,7 +4651,7 @@ repoint_table_dependencies(ArchiveHandle *AH)
te->dependencies[i] = tabledataid; te->dependencies[i] = tabledataid;
te->dataLength = Max(te->dataLength, tabledatate->dataLength); te->dataLength = Max(te->dataLength, tabledatate->dataLength);
ahlog(AH, 2, "transferring dependency %d -> %d to %d\n", pg_log_debug("transferring dependency %d -> %d to %d",
te->dumpId, olddep, tabledataid); te->dumpId, olddep, tabledataid);
} }
} }
@ -4769,7 +4733,7 @@ reduce_dependencies(ArchiveHandle *AH, TocEntry *te,
{ {
int i; int i;
ahlog(AH, 2, "reducing dependencies for %d\n", te->dumpId); pg_log_debug("reducing dependencies for %d", te->dumpId);
for (i = 0; i < te->nRevDeps; i++) for (i = 0; i < te->nRevDeps; i++)
{ {
@ -4821,7 +4785,7 @@ mark_create_done(ArchiveHandle *AH, TocEntry *te)
static void static void
inhibit_data_for_failed_table(ArchiveHandle *AH, TocEntry *te) inhibit_data_for_failed_table(ArchiveHandle *AH, TocEntry *te)
{ {
ahlog(AH, 1, "table \"%s\" could not be created, will not restore its data\n", pg_log_info("table \"%s\" could not be created, will not restore its data",
te->tag); te->tag);
if (AH->tableDataId[te->dumpId] != 0) if (AH->tableDataId[te->dumpId] != 0)

View File

@ -132,17 +132,14 @@ struct ParallelState;
#define READ_ERROR_EXIT(fd) \ #define READ_ERROR_EXIT(fd) \
do { \ do { \
if (feof(fd)) \ if (feof(fd)) \
exit_horribly(modulename, \ fatal("could not read from input file: end of file"); \
"could not read from input file: end of file\n"); \
else \ else \
exit_horribly(modulename, \ fatal("could not read from input file: %m"); \
"could not read from input file: %s\n", strerror(errno)); \
} while (0) } while (0)
#define WRITE_ERROR_EXIT \ #define WRITE_ERROR_EXIT \
do { \ do { \
exit_horribly(modulename, "could not write to output file: %s\n", \ fatal("could not write to output file: %m"); \
strerror(errno)); \
} while (0) } while (0)
typedef enum T_Action typedef enum T_Action
@ -252,8 +249,6 @@ struct _archiveHandle
char *archiveDumpVersion; /* When reading an archive, the version of char *archiveDumpVersion; /* When reading an archive, the version of
* the dumper */ * the dumper */
int debugLevel; /* Used for logging (currently only by
* --verbose) */
size_t intSize; /* Size of an integer in the archive */ size_t intSize; /* Size of an integer in the archive */
size_t offSize; /* Size of a file offset in the archive - size_t offSize; /* Size of a file offset in the archive -
* Added V1.7 */ * Added V1.7 */
@ -411,7 +406,7 @@ struct _tocEntry
extern int parallel_restore(ArchiveHandle *AH, TocEntry *te); extern int parallel_restore(ArchiveHandle *AH, TocEntry *te);
extern void on_exit_close_archive(Archive *AHX); extern void on_exit_close_archive(Archive *AHX);
extern void warn_or_exit_horribly(ArchiveHandle *AH, const char *modulename, const char *fmt,...) pg_attribute_printf(3, 4); extern void warn_or_exit_horribly(ArchiveHandle *AH, const char *fmt,...) pg_attribute_printf(2, 3);
/* Options for ArchiveEntry */ /* Options for ArchiveEntry */
typedef struct _archiveOpts typedef struct _archiveOpts
@ -487,6 +482,4 @@ extern void DropBlobIfExists(ArchiveHandle *AH, Oid oid);
void ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH); void ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH);
int ahprintf(ArchiveHandle *AH, const char *fmt,...) pg_attribute_printf(2, 3); int ahprintf(ArchiveHandle *AH, const char *fmt,...) pg_attribute_printf(2, 3);
void ahlog(ArchiveHandle *AH, int level, const char *fmt,...) pg_attribute_printf(3, 4);
#endif #endif

View File

@ -29,6 +29,7 @@
#include "parallel.h" #include "parallel.h"
#include "pg_backup_utils.h" #include "pg_backup_utils.h"
#include "common/file_utils.h" #include "common/file_utils.h"
#include "fe_utils/logging.h"
/*-------- /*--------
* Routines in the format interface * Routines in the format interface
@ -91,10 +92,6 @@ static pgoff_t _getFilePos(ArchiveHandle *AH, lclContext *ctx);
static void _CustomWriteFunc(ArchiveHandle *AH, const char *buf, size_t len); static void _CustomWriteFunc(ArchiveHandle *AH, const char *buf, size_t len);
static size_t _CustomReadFunc(ArchiveHandle *AH, char **buf, size_t *buflen); static size_t _CustomReadFunc(ArchiveHandle *AH, char **buf, size_t *buflen);
/* translator: this is a module name */
static const char *modulename = gettext_noop("custom archiver");
/* /*
* Init routine required by ALL formats. This is a global routine * Init routine required by ALL formats. This is a global routine
@ -159,15 +156,13 @@ InitArchiveFmt_Custom(ArchiveHandle *AH)
{ {
AH->FH = fopen(AH->fSpec, PG_BINARY_W); AH->FH = fopen(AH->fSpec, PG_BINARY_W);
if (!AH->FH) if (!AH->FH)
exit_horribly(modulename, "could not open output file \"%s\": %s\n", fatal("could not open output file \"%s\": %m", AH->fSpec);
AH->fSpec, strerror(errno));
} }
else else
{ {
AH->FH = stdout; AH->FH = stdout;
if (!AH->FH) if (!AH->FH)
exit_horribly(modulename, "could not open output file: %s\n", fatal("could not open output file: %m");
strerror(errno));
} }
ctx->hasSeek = checkSeek(AH->FH); ctx->hasSeek = checkSeek(AH->FH);
@ -178,15 +173,13 @@ InitArchiveFmt_Custom(ArchiveHandle *AH)
{ {
AH->FH = fopen(AH->fSpec, PG_BINARY_R); AH->FH = fopen(AH->fSpec, PG_BINARY_R);
if (!AH->FH) if (!AH->FH)
exit_horribly(modulename, "could not open input file \"%s\": %s\n", fatal("could not open input file \"%s\": %m", AH->fSpec);
AH->fSpec, strerror(errno));
} }
else else
{ {
AH->FH = stdin; AH->FH = stdin;
if (!AH->FH) if (!AH->FH)
exit_horribly(modulename, "could not open input file: %s\n", fatal("could not open input file: %m");
strerror(errno));
} }
ctx->hasSeek = checkSeek(AH->FH); ctx->hasSeek = checkSeek(AH->FH);
@ -381,7 +374,7 @@ _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
lclContext *ctx = (lclContext *) AH->formatData; lclContext *ctx = (lclContext *) AH->formatData;
if (oid == 0) if (oid == 0)
exit_horribly(modulename, "invalid OID for large object\n"); fatal("invalid OID for large object");
WriteInt(AH, oid); WriteInt(AH, oid);
@ -451,8 +444,7 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te)
break; break;
default: /* Always have a default */ default: /* Always have a default */
exit_horribly(modulename, fatal("unrecognized data block type (%d) while searching archive",
"unrecognized data block type (%d) while searching archive\n",
blkType); blkType);
break; break;
} }
@ -463,8 +455,7 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te)
{ {
/* We can just seek to the place we need to be. */ /* We can just seek to the place we need to be. */
if (fseeko(AH->FH, tctx->dataPos, SEEK_SET) != 0) if (fseeko(AH->FH, tctx->dataPos, SEEK_SET) != 0)
exit_horribly(modulename, "error during file seek: %s\n", fatal("error during file seek: %m");
strerror(errno));
_readBlockHeader(AH, &blkType, &id); _readBlockHeader(AH, &blkType, &id);
} }
@ -473,24 +464,24 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te)
if (blkType == EOF) if (blkType == EOF)
{ {
if (tctx->dataState == K_OFFSET_POS_NOT_SET) if (tctx->dataState == K_OFFSET_POS_NOT_SET)
exit_horribly(modulename, "could not find block ID %d in archive -- " fatal("could not find block ID %d in archive -- "
"possibly due to out-of-order restore request, " "possibly due to out-of-order restore request, "
"which cannot be handled due to lack of data offsets in archive\n", "which cannot be handled due to lack of data offsets in archive",
te->dumpId); te->dumpId);
else if (!ctx->hasSeek) else if (!ctx->hasSeek)
exit_horribly(modulename, "could not find block ID %d in archive -- " fatal("could not find block ID %d in archive -- "
"possibly due to out-of-order restore request, " "possibly due to out-of-order restore request, "
"which cannot be handled due to non-seekable input file\n", "which cannot be handled due to non-seekable input file",
te->dumpId); te->dumpId);
else /* huh, the dataPos led us to EOF? */ else /* huh, the dataPos led us to EOF? */
exit_horribly(modulename, "could not find block ID %d in archive -- " fatal("could not find block ID %d in archive -- "
"possibly corrupt archive\n", "possibly corrupt archive",
te->dumpId); te->dumpId);
} }
/* Are we sane? */ /* Are we sane? */
if (id != te->dumpId) if (id != te->dumpId)
exit_horribly(modulename, "found unexpected block ID (%d) when reading data -- expected %d\n", fatal("found unexpected block ID (%d) when reading data -- expected %d",
id, te->dumpId); id, te->dumpId);
switch (blkType) switch (blkType)
@ -504,7 +495,7 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te)
break; break;
default: /* Always have a default */ default: /* Always have a default */
exit_horribly(modulename, "unrecognized data block type %d while restoring archive\n", fatal("unrecognized data block type %d while restoring archive",
blkType); blkType);
break; break;
} }
@ -584,11 +575,9 @@ _skipData(ArchiveHandle *AH)
if ((cnt = fread(buf, 1, blkLen, AH->FH)) != blkLen) if ((cnt = fread(buf, 1, blkLen, AH->FH)) != blkLen)
{ {
if (feof(AH->FH)) if (feof(AH->FH))
exit_horribly(modulename, fatal("could not read from input file: end of file");
"could not read from input file: end of file\n");
else else
exit_horribly(modulename, fatal("could not read from input file: %m");
"could not read from input file: %s\n", strerror(errno));
} }
ctx->filePos += blkLen; ctx->filePos += blkLen;
@ -706,8 +695,7 @@ _CloseArchive(ArchiveHandle *AH)
/* Remember TOC's seek position for use below */ /* Remember TOC's seek position for use below */
tpos = ftello(AH->FH); tpos = ftello(AH->FH);
if (tpos < 0 && ctx->hasSeek) if (tpos < 0 && ctx->hasSeek)
exit_horribly(modulename, "could not determine seek position in archive file: %s\n", fatal("could not determine seek position in archive file: %m");
strerror(errno));
WriteToc(AH); WriteToc(AH);
ctx->dataStart = _getFilePos(AH, ctx); ctx->dataStart = _getFilePos(AH, ctx);
WriteDataChunks(AH, NULL); WriteDataChunks(AH, NULL);
@ -724,11 +712,11 @@ _CloseArchive(ArchiveHandle *AH)
} }
if (fclose(AH->FH) != 0) if (fclose(AH->FH) != 0)
exit_horribly(modulename, "could not close archive file: %s\n", strerror(errno)); fatal("could not close archive file: %m");
/* Sync the output file if one is defined */ /* Sync the output file if one is defined */
if (AH->dosync && AH->mode == archModeWrite && AH->fSpec) if (AH->dosync && AH->mode == archModeWrite && AH->fSpec)
(void) fsync_fname(AH->fSpec, false, progname); (void) fsync_fname(AH->fSpec, false);
AH->FH = NULL; AH->FH = NULL;
} }
@ -747,36 +735,32 @@ _ReopenArchive(ArchiveHandle *AH)
pgoff_t tpos; pgoff_t tpos;
if (AH->mode == archModeWrite) if (AH->mode == archModeWrite)
exit_horribly(modulename, "can only reopen input archives\n"); fatal("can only reopen input archives");
/* /*
* These two cases are user-facing errors since they represent unsupported * These two cases are user-facing errors since they represent unsupported
* (but not invalid) use-cases. Word the error messages appropriately. * (but not invalid) use-cases. Word the error messages appropriately.
*/ */
if (AH->fSpec == NULL || strcmp(AH->fSpec, "") == 0) if (AH->fSpec == NULL || strcmp(AH->fSpec, "") == 0)
exit_horribly(modulename, "parallel restore from standard input is not supported\n"); fatal("parallel restore from standard input is not supported");
if (!ctx->hasSeek) if (!ctx->hasSeek)
exit_horribly(modulename, "parallel restore from non-seekable file is not supported\n"); fatal("parallel restore from non-seekable file is not supported");
tpos = ftello(AH->FH); tpos = ftello(AH->FH);
if (tpos < 0) if (tpos < 0)
exit_horribly(modulename, "could not determine seek position in archive file: %s\n", fatal("could not determine seek position in archive file: %m");
strerror(errno));
#ifndef WIN32 #ifndef WIN32
if (fclose(AH->FH) != 0) if (fclose(AH->FH) != 0)
exit_horribly(modulename, "could not close archive file: %s\n", fatal("could not close archive file: %m");
strerror(errno));
#endif #endif
AH->FH = fopen(AH->fSpec, PG_BINARY_R); AH->FH = fopen(AH->fSpec, PG_BINARY_R);
if (!AH->FH) if (!AH->FH)
exit_horribly(modulename, "could not open input file \"%s\": %s\n", fatal("could not open input file \"%s\": %m", AH->fSpec);
AH->fSpec, strerror(errno));
if (fseeko(AH->FH, tpos, SEEK_SET) != 0) if (fseeko(AH->FH, tpos, SEEK_SET) != 0)
exit_horribly(modulename, "could not set seek position in archive file: %s\n", fatal("could not set seek position in archive file: %m");
strerror(errno));
} }
/* /*
@ -831,8 +815,7 @@ _PrepParallelRestore(ArchiveHandle *AH)
pgoff_t endpos; pgoff_t endpos;
if (fseeko(AH->FH, 0, SEEK_END) != 0) if (fseeko(AH->FH, 0, SEEK_END) != 0)
exit_horribly(modulename, "error during file seek: %s\n", fatal("error during file seek: %m");
strerror(errno));
endpos = ftello(AH->FH); endpos = ftello(AH->FH);
if (endpos > prev_tctx->dataPos) if (endpos > prev_tctx->dataPos)
prev_te->dataLength = endpos - prev_tctx->dataPos; prev_te->dataLength = endpos - prev_tctx->dataPos;
@ -853,7 +836,7 @@ _Clone(ArchiveHandle *AH)
/* sanity check, shouldn't happen */ /* sanity check, shouldn't happen */
if (ctx->cs != NULL) if (ctx->cs != NULL)
exit_horribly(modulename, "compressor active\n"); fatal("compressor active");
/* /*
* Note: we do not make a local lo_buf because we expect at most one BLOBS * Note: we do not make a local lo_buf because we expect at most one BLOBS
@ -905,11 +888,10 @@ _getFilePos(ArchiveHandle *AH, lclContext *ctx)
*/ */
pos = ftello(AH->FH); pos = ftello(AH->FH);
if (pos < 0) if (pos < 0)
exit_horribly(modulename, "could not determine seek position in archive file: %s\n", fatal("could not determine seek position in archive file: %m");
strerror(errno));
if (pos != ctx->filePos) if (pos != ctx->filePos)
write_msg(modulename, "WARNING: ftell mismatch with expected position -- ftell used\n"); pg_log_warning("ftell mismatch with expected position -- ftell used");
} }
else else
pos = ctx->filePos; pos = ctx->filePos;
@ -928,7 +910,7 @@ _readBlockHeader(ArchiveHandle *AH, int *type, int *id)
int byt; int byt;
/* /*
* Note: if we are at EOF with a pre-1.3 input file, we'll exit_horribly * Note: if we are at EOF with a pre-1.3 input file, we'll fatal()
* inside ReadInt rather than returning EOF. It doesn't seem worth * inside ReadInt rather than returning EOF. It doesn't seem worth
* jumping through hoops to deal with that case better, because no such * jumping through hoops to deal with that case better, because no such
* files are likely to exist in the wild: only some 7.1 development * files are likely to exist in the wild: only some 7.1 development

View File

@ -13,6 +13,7 @@
#include "dumputils.h" #include "dumputils.h"
#include "fe_utils/connect.h" #include "fe_utils/connect.h"
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h" #include "fe_utils/string_utils.h"
#include "parallel.h" #include "parallel.h"
#include "pg_backup_archiver.h" #include "pg_backup_archiver.h"
@ -26,9 +27,6 @@
#endif #endif
/* translator: this is a module name */
static const char *modulename = gettext_noop("archiver (db)");
static void _check_database_version(ArchiveHandle *AH); static void _check_database_version(ArchiveHandle *AH);
static PGconn *_connectDB(ArchiveHandle *AH, const char *newdbname, const char *newUser); static PGconn *_connectDB(ArchiveHandle *AH, const char *newdbname, const char *newUser);
static void notice_processor(void *arg, const char *message); static void notice_processor(void *arg, const char *message);
@ -43,7 +41,7 @@ _check_database_version(ArchiveHandle *AH)
remoteversion_str = PQparameterStatus(AH->connection, "server_version"); remoteversion_str = PQparameterStatus(AH->connection, "server_version");
remoteversion = PQserverVersion(AH->connection); remoteversion = PQserverVersion(AH->connection);
if (remoteversion == 0 || !remoteversion_str) if (remoteversion == 0 || !remoteversion_str)
exit_horribly(modulename, "could not get server_version from libpq\n"); fatal("could not get server_version from libpq");
AH->public.remoteVersionStr = pg_strdup(remoteversion_str); AH->public.remoteVersionStr = pg_strdup(remoteversion_str);
AH->public.remoteVersion = remoteversion; AH->public.remoteVersion = remoteversion;
@ -54,9 +52,9 @@ _check_database_version(ArchiveHandle *AH)
&& (remoteversion < AH->public.minRemoteVersion || && (remoteversion < AH->public.minRemoteVersion ||
remoteversion > AH->public.maxRemoteVersion)) remoteversion > AH->public.maxRemoteVersion))
{ {
write_msg(NULL, "server version: %s; %s version: %s\n", pg_log_error("server version: %s; %s version: %s",
remoteversion_str, progname, PG_VERSION); remoteversion_str, progname, PG_VERSION);
exit_horribly(NULL, "aborting because of server version mismatch\n"); fatal("aborting because of server version mismatch");
} }
/* /*
@ -139,7 +137,7 @@ _connectDB(ArchiveHandle *AH, const char *reqdb, const char *requser)
else else
newuser = requser; newuser = requser;
ahlog(AH, 1, "connecting to database \"%s\" as user \"%s\"\n", pg_log_info("connecting to database \"%s\" as user \"%s\"",
newdb, newuser); newdb, newuser);
password = AH->savedPassword; password = AH->savedPassword;
@ -178,12 +176,12 @@ _connectDB(ArchiveHandle *AH, const char *reqdb, const char *requser)
newConn = PQconnectdbParams(keywords, values, true); newConn = PQconnectdbParams(keywords, values, true);
if (!newConn) if (!newConn)
exit_horribly(modulename, "failed to reconnect to database\n"); fatal("failed to reconnect to database");
if (PQstatus(newConn) == CONNECTION_BAD) if (PQstatus(newConn) == CONNECTION_BAD)
{ {
if (!PQconnectionNeedsPassword(newConn)) if (!PQconnectionNeedsPassword(newConn))
exit_horribly(modulename, "could not reconnect to database: %s", fatal("could not reconnect to database: %s",
PQerrorMessage(newConn)); PQerrorMessage(newConn));
PQfinish(newConn); PQfinish(newConn);
@ -199,7 +197,7 @@ _connectDB(ArchiveHandle *AH, const char *reqdb, const char *requser)
password = passbuf; password = passbuf;
} }
else else
exit_horribly(modulename, "connection needs password\n"); fatal("connection needs password");
new_pass = true; new_pass = true;
} }
@ -250,7 +248,7 @@ ConnectDatabase(Archive *AHX,
bool new_pass; bool new_pass;
if (AH->connection) if (AH->connection)
exit_horribly(modulename, "already connected to a database\n"); fatal("already connected to a database");
password = AH->savedPassword; password = AH->savedPassword;
@ -289,7 +287,7 @@ ConnectDatabase(Archive *AHX,
AH->connection = PQconnectdbParams(keywords, values, true); AH->connection = PQconnectdbParams(keywords, values, true);
if (!AH->connection) if (!AH->connection)
exit_horribly(modulename, "failed to connect to database\n"); fatal("failed to connect to database");
if (PQstatus(AH->connection) == CONNECTION_BAD && if (PQstatus(AH->connection) == CONNECTION_BAD &&
PQconnectionNeedsPassword(AH->connection) && PQconnectionNeedsPassword(AH->connection) &&
@ -305,7 +303,7 @@ ConnectDatabase(Archive *AHX,
/* check to see that the backend connection was successfully made */ /* check to see that the backend connection was successfully made */
if (PQstatus(AH->connection) == CONNECTION_BAD) if (PQstatus(AH->connection) == CONNECTION_BAD)
exit_horribly(modulename, "connection to database \"%s\" failed: %s", fatal("connection to database \"%s\" failed: %s",
PQdb(AH->connection) ? PQdb(AH->connection) : "", PQdb(AH->connection) ? PQdb(AH->connection) : "",
PQerrorMessage(AH->connection)); PQerrorMessage(AH->connection));
@ -351,7 +349,7 @@ DisconnectDatabase(Archive *AHX)
/* /*
* If we have an active query, send a cancel before closing, ignoring * If we have an active query, send a cancel before closing, ignoring
* any errors. This is of no use for a normal exit, but might be * any errors. This is of no use for a normal exit, but might be
* helpful during exit_horribly(). * helpful during fatal().
*/ */
if (PQtransactionStatus(AH->connection) == PQTRANS_ACTIVE) if (PQtransactionStatus(AH->connection) == PQTRANS_ACTIVE)
(void) PQcancel(AH->connCancel, errbuf, sizeof(errbuf)); (void) PQcancel(AH->connCancel, errbuf, sizeof(errbuf));
@ -377,16 +375,16 @@ GetConnection(Archive *AHX)
static void static void
notice_processor(void *arg, const char *message) notice_processor(void *arg, const char *message)
{ {
write_msg(NULL, "%s", message); pg_log_generic(PG_LOG_INFO, "%s", message);
} }
/* Like exit_horribly(), but with a complaint about a particular query. */ /* Like exit_fatal(), but with a complaint about a particular query. */
static void static void
die_on_query_failure(ArchiveHandle *AH, const char *modulename, const char *query) die_on_query_failure(ArchiveHandle *AH, const char *query)
{ {
write_msg(modulename, "query failed: %s", pg_log_error("query failed: %s",
PQerrorMessage(AH->connection)); PQerrorMessage(AH->connection));
exit_horribly(modulename, "query was: %s\n", query); fatal("query was: %s", query);
} }
void void
@ -397,7 +395,7 @@ ExecuteSqlStatement(Archive *AHX, const char *query)
res = PQexec(AH->connection, query); res = PQexec(AH->connection, query);
if (PQresultStatus(res) != PGRES_COMMAND_OK) if (PQresultStatus(res) != PGRES_COMMAND_OK)
die_on_query_failure(AH, modulename, query); die_on_query_failure(AH, query);
PQclear(res); PQclear(res);
} }
@ -409,7 +407,7 @@ ExecuteSqlQuery(Archive *AHX, const char *query, ExecStatusType status)
res = PQexec(AH->connection, query); res = PQexec(AH->connection, query);
if (PQresultStatus(res) != status) if (PQresultStatus(res) != status)
die_on_query_failure(AH, modulename, query); die_on_query_failure(AH, query);
return res; return res;
} }
@ -427,9 +425,8 @@ ExecuteSqlQueryForSingleRow(Archive *fout, const char *query)
/* Expecting a single result only */ /* Expecting a single result only */
ntups = PQntuples(res); ntups = PQntuples(res);
if (ntups != 1) if (ntups != 1)
exit_horribly(NULL, fatal(ngettext("query returned %d row instead of one: %s",
ngettext("query returned %d row instead of one: %s\n", "query returned %d rows instead of one: %s",
"query returned %d rows instead of one: %s\n",
ntups), ntups),
ntups, query); ntups, query);
@ -464,7 +461,7 @@ ExecuteSqlCommand(ArchiveHandle *AH, const char *qry, const char *desc)
break; break;
default: default:
/* trouble */ /* trouble */
warn_or_exit_horribly(AH, modulename, "%s: %s Command was: %s\n", warn_or_exit_horribly(AH, "%s: %sCommand was: %s",
desc, PQerrorMessage(conn), qry); desc, PQerrorMessage(conn), qry);
break; break;
} }
@ -573,7 +570,7 @@ ExecuteSqlCommandBuf(Archive *AHX, const char *buf, size_t bufLen)
*/ */
if (AH->pgCopyIn && if (AH->pgCopyIn &&
PQputCopyData(AH->connection, buf, bufLen) <= 0) PQputCopyData(AH->connection, buf, bufLen) <= 0)
exit_horribly(modulename, "error returned by PQputCopyData: %s", fatal("error returned by PQputCopyData: %s",
PQerrorMessage(AH->connection)); PQerrorMessage(AH->connection));
} }
else if (AH->outputKind == OUTPUT_OTHERDATA) else if (AH->outputKind == OUTPUT_OTHERDATA)
@ -622,19 +619,19 @@ EndDBCopyMode(Archive *AHX, const char *tocEntryTag)
PGresult *res; PGresult *res;
if (PQputCopyEnd(AH->connection, NULL) <= 0) if (PQputCopyEnd(AH->connection, NULL) <= 0)
exit_horribly(modulename, "error returned by PQputCopyEnd: %s", fatal("error returned by PQputCopyEnd: %s",
PQerrorMessage(AH->connection)); PQerrorMessage(AH->connection));
/* Check command status and return to normal libpq state */ /* Check command status and return to normal libpq state */
res = PQgetResult(AH->connection); res = PQgetResult(AH->connection);
if (PQresultStatus(res) != PGRES_COMMAND_OK) if (PQresultStatus(res) != PGRES_COMMAND_OK)
warn_or_exit_horribly(AH, modulename, "COPY failed for table \"%s\": %s", warn_or_exit_horribly(AH, "COPY failed for table \"%s\": %s",
tocEntryTag, PQerrorMessage(AH->connection)); tocEntryTag, PQerrorMessage(AH->connection));
PQclear(res); PQclear(res);
/* Do this to ensure we've pumped libpq back to idle state */ /* Do this to ensure we've pumped libpq back to idle state */
if (PQgetResult(AH->connection) != NULL) if (PQgetResult(AH->connection) != NULL)
write_msg(NULL, "WARNING: unexpected extra results during COPY of table \"%s\"\n", pg_log_warning("unexpected extra results during COPY of table \"%s\"",
tocEntryTag); tocEntryTag);
AH->pgCopyIn = false; AH->pgCopyIn = false;

View File

@ -61,9 +61,6 @@ typedef struct
char *filename; /* filename excluding the directory (basename) */ char *filename; /* filename excluding the directory (basename) */
} lclTocEntry; } lclTocEntry;
/* translator: this is a module name */
static const char *modulename = gettext_noop("directory archiver");
/* prototypes for private functions */ /* prototypes for private functions */
static void _ArchiveEntry(ArchiveHandle *AH, TocEntry *te); static void _ArchiveEntry(ArchiveHandle *AH, TocEntry *te);
static void _StartData(ArchiveHandle *AH, TocEntry *te); static void _StartData(ArchiveHandle *AH, TocEntry *te);
@ -156,7 +153,7 @@ InitArchiveFmt_Directory(ArchiveHandle *AH)
*/ */
if (!AH->fSpec || strcmp(AH->fSpec, "") == 0) if (!AH->fSpec || strcmp(AH->fSpec, "") == 0)
exit_horribly(modulename, "no output directory specified\n"); fatal("no output directory specified");
ctx->directory = AH->fSpec; ctx->directory = AH->fSpec;
@ -185,18 +182,18 @@ InitArchiveFmt_Directory(ArchiveHandle *AH)
} }
if (errno) if (errno)
exit_horribly(modulename, "could not read directory \"%s\": %s\n", fatal("could not read directory \"%s\": %m",
ctx->directory, strerror(errno)); ctx->directory);
if (closedir(dir)) if (closedir(dir))
exit_horribly(modulename, "could not close directory \"%s\": %s\n", fatal("could not close directory \"%s\": %m",
ctx->directory, strerror(errno)); ctx->directory);
} }
} }
if (!is_empty && mkdir(ctx->directory, 0700) < 0) if (!is_empty && mkdir(ctx->directory, 0700) < 0)
exit_horribly(modulename, "could not create directory \"%s\": %s\n", fatal("could not create directory \"%s\": %m",
ctx->directory, strerror(errno)); ctx->directory);
} }
else else
{ /* Read Mode */ { /* Read Mode */
@ -207,9 +204,7 @@ InitArchiveFmt_Directory(ArchiveHandle *AH)
tocFH = cfopen_read(fname, PG_BINARY_R); tocFH = cfopen_read(fname, PG_BINARY_R);
if (tocFH == NULL) if (tocFH == NULL)
exit_horribly(modulename, fatal("could not open input file \"%s\": %m", fname);
"could not open input file \"%s\": %s\n",
fname, strerror(errno));
ctx->dataFH = tocFH; ctx->dataFH = tocFH;
@ -224,8 +219,7 @@ InitArchiveFmt_Directory(ArchiveHandle *AH)
/* Nothing else in the file, so close it again... */ /* Nothing else in the file, so close it again... */
if (cfclose(tocFH) != 0) if (cfclose(tocFH) != 0)
exit_horribly(modulename, "could not close TOC file: %s\n", fatal("could not close TOC file: %m");
strerror(errno));
ctx->dataFH = NULL; ctx->dataFH = NULL;
} }
} }
@ -335,8 +329,7 @@ _StartData(ArchiveHandle *AH, TocEntry *te)
ctx->dataFH = cfopen_write(fname, PG_BINARY_W, AH->compression); ctx->dataFH = cfopen_write(fname, PG_BINARY_W, AH->compression);
if (ctx->dataFH == NULL) if (ctx->dataFH == NULL)
exit_horribly(modulename, "could not open output file \"%s\": %s\n", fatal("could not open output file \"%s\": %m", fname);
fname, strerror(errno));
} }
/* /*
@ -354,7 +347,7 @@ _WriteData(ArchiveHandle *AH, const void *data, size_t dLen)
lclContext *ctx = (lclContext *) AH->formatData; lclContext *ctx = (lclContext *) AH->formatData;
if (dLen > 0 && cfwrite(data, dLen, ctx->dataFH) != dLen) if (dLen > 0 && cfwrite(data, dLen, ctx->dataFH) != dLen)
exit_horribly(modulename, "could not write to output file: %s\n", fatal("could not write to output file: %s",
get_cfp_error(ctx->dataFH)); get_cfp_error(ctx->dataFH));
@ -395,8 +388,7 @@ _PrintFileData(ArchiveHandle *AH, char *filename)
cfp = cfopen_read(filename, PG_BINARY_R); cfp = cfopen_read(filename, PG_BINARY_R);
if (!cfp) if (!cfp)
exit_horribly(modulename, "could not open input file \"%s\": %s\n", fatal("could not open input file \"%s\": %m", filename);
filename, strerror(errno));
buf = pg_malloc(ZLIB_OUT_SIZE); buf = pg_malloc(ZLIB_OUT_SIZE);
buflen = ZLIB_OUT_SIZE; buflen = ZLIB_OUT_SIZE;
@ -408,8 +400,7 @@ _PrintFileData(ArchiveHandle *AH, char *filename)
free(buf); free(buf);
if (cfclose(cfp) !=0) if (cfclose(cfp) !=0)
exit_horribly(modulename, "could not close data file: %s\n", fatal("could not close data file: %m");
strerror(errno));
} }
/* /*
@ -449,8 +440,8 @@ _LoadBlobs(ArchiveHandle *AH)
ctx->blobsTocFH = cfopen_read(fname, PG_BINARY_R); ctx->blobsTocFH = cfopen_read(fname, PG_BINARY_R);
if (ctx->blobsTocFH == NULL) if (ctx->blobsTocFH == NULL)
exit_horribly(modulename, "could not open large object TOC file \"%s\" for input: %s\n", fatal("could not open large object TOC file \"%s\" for input: %m",
fname, strerror(errno)); fname);
/* Read the blobs TOC file line-by-line, and process each blob */ /* Read the blobs TOC file line-by-line, and process each blob */
while ((cfgets(ctx->blobsTocFH, line, MAXPGPATH)) != NULL) while ((cfgets(ctx->blobsTocFH, line, MAXPGPATH)) != NULL)
@ -460,7 +451,7 @@ _LoadBlobs(ArchiveHandle *AH)
/* Can't overflow because line and fname are the same length. */ /* Can't overflow because line and fname are the same length. */
if (sscanf(line, "%u %s\n", &oid, fname) != 2) if (sscanf(line, "%u %s\n", &oid, fname) != 2)
exit_horribly(modulename, "invalid line in large object TOC file \"%s\": \"%s\"\n", fatal("invalid line in large object TOC file \"%s\": \"%s\"",
fname, line); fname, line);
StartRestoreBlob(AH, oid, AH->public.ropt->dropSchema); StartRestoreBlob(AH, oid, AH->public.ropt->dropSchema);
@ -469,12 +460,12 @@ _LoadBlobs(ArchiveHandle *AH)
EndRestoreBlob(AH, oid); EndRestoreBlob(AH, oid);
} }
if (!cfeof(ctx->blobsTocFH)) if (!cfeof(ctx->blobsTocFH))
exit_horribly(modulename, "error reading large object TOC file \"%s\"\n", fatal("error reading large object TOC file \"%s\"",
fname); fname);
if (cfclose(ctx->blobsTocFH) != 0) if (cfclose(ctx->blobsTocFH) != 0)
exit_horribly(modulename, "could not close large object TOC file \"%s\": %s\n", fatal("could not close large object TOC file \"%s\": %m",
fname, strerror(errno)); fname);
ctx->blobsTocFH = NULL; ctx->blobsTocFH = NULL;
@ -494,7 +485,7 @@ _WriteByte(ArchiveHandle *AH, const int i)
lclContext *ctx = (lclContext *) AH->formatData; lclContext *ctx = (lclContext *) AH->formatData;
if (cfwrite(&c, 1, ctx->dataFH) != 1) if (cfwrite(&c, 1, ctx->dataFH) != 1)
exit_horribly(modulename, "could not write to output file: %s\n", fatal("could not write to output file: %s",
get_cfp_error(ctx->dataFH)); get_cfp_error(ctx->dataFH));
return 1; return 1;
@ -524,7 +515,7 @@ _WriteBuf(ArchiveHandle *AH, const void *buf, size_t len)
lclContext *ctx = (lclContext *) AH->formatData; lclContext *ctx = (lclContext *) AH->formatData;
if (cfwrite(buf, len, ctx->dataFH) != len) if (cfwrite(buf, len, ctx->dataFH) != len)
exit_horribly(modulename, "could not write to output file: %s\n", fatal("could not write to output file: %s",
get_cfp_error(ctx->dataFH)); get_cfp_error(ctx->dataFH));
return; return;
@ -545,8 +536,7 @@ _ReadBuf(ArchiveHandle *AH, void *buf, size_t len)
* exit on short reads. * exit on short reads.
*/ */
if (cfread(buf, len, ctx->dataFH) != len) if (cfread(buf, len, ctx->dataFH) != len)
exit_horribly(modulename, fatal("could not read from input file: end of file");
"could not read from input file: end of file\n");
return; return;
} }
@ -581,8 +571,7 @@ _CloseArchive(ArchiveHandle *AH)
/* The TOC is always created uncompressed */ /* The TOC is always created uncompressed */
tocFH = cfopen_write(fname, PG_BINARY_W, 0); tocFH = cfopen_write(fname, PG_BINARY_W, 0);
if (tocFH == NULL) if (tocFH == NULL)
exit_horribly(modulename, "could not open output file \"%s\": %s\n", fatal("could not open output file \"%s\": %m", fname);
fname, strerror(errno));
ctx->dataFH = tocFH; ctx->dataFH = tocFH;
/* /*
@ -595,8 +584,7 @@ _CloseArchive(ArchiveHandle *AH)
AH->format = archDirectory; AH->format = archDirectory;
WriteToc(AH); WriteToc(AH);
if (cfclose(tocFH) != 0) if (cfclose(tocFH) != 0)
exit_horribly(modulename, "could not close TOC file: %s\n", fatal("could not close TOC file: %m");
strerror(errno));
WriteDataChunks(AH, ctx->pstate); WriteDataChunks(AH, ctx->pstate);
ParallelBackupEnd(AH, ctx->pstate); ParallelBackupEnd(AH, ctx->pstate);
@ -606,7 +594,7 @@ _CloseArchive(ArchiveHandle *AH)
* individually. Just recurse once through all the files generated. * individually. Just recurse once through all the files generated.
*/ */
if (AH->dosync) if (AH->dosync)
fsync_dir_recurse(ctx->directory, progname); fsync_dir_recurse(ctx->directory);
} }
AH->FH = NULL; AH->FH = NULL;
} }
@ -646,8 +634,7 @@ _StartBlobs(ArchiveHandle *AH, TocEntry *te)
/* The blob TOC file is never compressed */ /* The blob TOC file is never compressed */
ctx->blobsTocFH = cfopen_write(fname, "ab", 0); ctx->blobsTocFH = cfopen_write(fname, "ab", 0);
if (ctx->blobsTocFH == NULL) if (ctx->blobsTocFH == NULL)
exit_horribly(modulename, "could not open output file \"%s\": %s\n", fatal("could not open output file \"%s\": %m", fname);
fname, strerror(errno));
} }
/* /*
@ -666,8 +653,7 @@ _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
ctx->dataFH = cfopen_write(fname, PG_BINARY_W, AH->compression); ctx->dataFH = cfopen_write(fname, PG_BINARY_W, AH->compression);
if (ctx->dataFH == NULL) if (ctx->dataFH == NULL)
exit_horribly(modulename, "could not open output file \"%s\": %s\n", fatal("could not open output file \"%s\": %m", fname);
fname, strerror(errno));
} }
/* /*
@ -689,7 +675,7 @@ _EndBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
/* register the blob in blobs.toc */ /* register the blob in blobs.toc */
len = snprintf(buf, sizeof(buf), "%u blob_%u.dat\n", oid, oid); len = snprintf(buf, sizeof(buf), "%u blob_%u.dat\n", oid, oid);
if (cfwrite(buf, len, ctx->blobsTocFH) != len) if (cfwrite(buf, len, ctx->blobsTocFH) != len)
exit_horribly(modulename, "could not write to blobs TOC file\n"); fatal("could not write to blobs TOC file");
} }
/* /*
@ -721,7 +707,7 @@ setFilePath(ArchiveHandle *AH, char *buf, const char *relativeFilename)
dname = ctx->directory; dname = ctx->directory;
if (strlen(dname) + 1 + strlen(relativeFilename) + 1 > MAXPGPATH) if (strlen(dname) + 1 + strlen(relativeFilename) + 1 > MAXPGPATH)
exit_horribly(modulename, "file name too long: \"%s\"\n", dname); fatal("file name too long: \"%s\"", dname);
strcpy(buf, dname); strcpy(buf, dname);
strcat(buf, "/"); strcat(buf, "/");

View File

@ -72,7 +72,7 @@ InitArchiveFmt_Null(ArchiveHandle *AH)
* Now prevent reading... * Now prevent reading...
*/ */
if (AH->mode == archModeRead) if (AH->mode == archModeRead)
exit_horribly(NULL, "this format cannot be read\n"); fatal("this format cannot be read");
} }
/* /*
@ -147,7 +147,7 @@ _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
bool old_blob_style = (AH->version < K_VERS_1_12); bool old_blob_style = (AH->version < K_VERS_1_12);
if (oid == 0) if (oid == 0)
exit_horribly(NULL, "invalid OID for large object\n"); fatal("invalid OID for large object");
/* With an old archive we must do drop and create logic here */ /* With an old archive we must do drop and create logic here */
if (old_blob_style && AH->public.ropt->dropSchema) if (old_blob_style && AH->public.ropt->dropSchema)

View File

@ -99,9 +99,6 @@ typedef struct
char *filename; char *filename;
} lclTocEntry; } lclTocEntry;
/* translator: this is a module name */
static const char *modulename = gettext_noop("tar archiver");
static void _LoadBlobs(ArchiveHandle *AH); static void _LoadBlobs(ArchiveHandle *AH);
static TAR_MEMBER *tarOpen(ArchiveHandle *AH, const char *filename, char mode); static TAR_MEMBER *tarOpen(ArchiveHandle *AH, const char *filename, char mode);
@ -177,17 +174,14 @@ InitArchiveFmt_Tar(ArchiveHandle *AH)
{ {
ctx->tarFH = fopen(AH->fSpec, PG_BINARY_W); ctx->tarFH = fopen(AH->fSpec, PG_BINARY_W);
if (ctx->tarFH == NULL) if (ctx->tarFH == NULL)
exit_horribly(modulename, fatal("could not open TOC file \"%s\" for output: %m",
"could not open TOC file \"%s\" for output: %s\n", AH->fSpec);
AH->fSpec, strerror(errno));
} }
else else
{ {
ctx->tarFH = stdout; ctx->tarFH = stdout;
if (ctx->tarFH == NULL) if (ctx->tarFH == NULL)
exit_horribly(modulename, fatal("could not open TOC file for output: %m");
"could not open TOC file for output: %s\n",
strerror(errno));
} }
ctx->tarFHpos = 0; ctx->tarFHpos = 0;
@ -206,8 +200,7 @@ InitArchiveFmt_Tar(ArchiveHandle *AH)
* positioning. * positioning.
*/ */
if (AH->compression != 0) if (AH->compression != 0)
exit_horribly(modulename, fatal("compression is not supported by tar archive format");
"compression is not supported by tar archive format\n");
} }
else else
{ /* Read Mode */ { /* Read Mode */
@ -215,15 +208,14 @@ InitArchiveFmt_Tar(ArchiveHandle *AH)
{ {
ctx->tarFH = fopen(AH->fSpec, PG_BINARY_R); ctx->tarFH = fopen(AH->fSpec, PG_BINARY_R);
if (ctx->tarFH == NULL) if (ctx->tarFH == NULL)
exit_horribly(modulename, "could not open TOC file \"%s\" for input: %s\n", fatal("could not open TOC file \"%s\" for input: %m",
AH->fSpec, strerror(errno)); AH->fSpec);
} }
else else
{ {
ctx->tarFH = stdin; ctx->tarFH = stdin;
if (ctx->tarFH == NULL) if (ctx->tarFH == NULL)
exit_horribly(modulename, "could not open TOC file for input: %s\n", fatal("could not open TOC file for input: %m");
strerror(errno));
} }
/* /*
@ -349,7 +341,7 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode)
* Couldn't find the requested file. Future: do SEEK(0) and * Couldn't find the requested file. Future: do SEEK(0) and
* retry. * retry.
*/ */
exit_horribly(modulename, "could not find file \"%s\" in archive\n", filename); fatal("could not find file \"%s\" in archive", filename);
} }
else else
{ {
@ -363,7 +355,7 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode)
if (AH->compression == 0) if (AH->compression == 0)
tm->nFH = ctx->tarFH; tm->nFH = ctx->tarFH;
else else
exit_horribly(modulename, "compression is not supported by tar archive format\n"); fatal("compression is not supported by tar archive format");
/* tm->zFH = gzdopen(dup(fileno(ctx->tarFH)), "rb"); */ /* tm->zFH = gzdopen(dup(fileno(ctx->tarFH)), "rb"); */
#else #else
tm->nFH = ctx->tarFH; tm->nFH = ctx->tarFH;
@ -415,7 +407,7 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode)
#endif #endif
if (tm->tmpFH == NULL) if (tm->tmpFH == NULL)
exit_horribly(modulename, "could not generate temporary file name: %s\n", strerror(errno)); fatal("could not generate temporary file name: %m");
umask(old_umask); umask(old_umask);
@ -426,7 +418,7 @@ tarOpen(ArchiveHandle *AH, const char *filename, char mode)
sprintf(fmode, "wb%d", AH->compression); sprintf(fmode, "wb%d", AH->compression);
tm->zFH = gzdopen(dup(fileno(tm->tmpFH)), fmode); tm->zFH = gzdopen(dup(fileno(tm->tmpFH)), fmode);
if (tm->zFH == NULL) if (tm->zFH == NULL)
exit_horribly(modulename, "could not open temporary file\n"); fatal("could not open temporary file");
} }
else else
tm->nFH = tm->tmpFH; tm->nFH = tm->tmpFH;
@ -453,7 +445,7 @@ tarClose(ArchiveHandle *AH, TAR_MEMBER *th)
*/ */
if (AH->compression != 0) if (AH->compression != 0)
if (GZCLOSE(th->zFH) != 0) if (GZCLOSE(th->zFH) != 0)
exit_horribly(modulename, "could not close tar member\n"); fatal("could not close tar member");
if (th->mode == 'w') if (th->mode == 'w')
_tarAddFile(AH, th); /* This will close the temp file */ _tarAddFile(AH, th); /* This will close the temp file */
@ -560,12 +552,10 @@ _tarReadRaw(ArchiveHandle *AH, void *buf, size_t len, TAR_MEMBER *th, FILE *fh)
int errnum; int errnum;
const char *errmsg = gzerror(th->zFH, &errnum); const char *errmsg = gzerror(th->zFH, &errnum);
exit_horribly(modulename, fatal("could not read from input file: %s",
"could not read from input file: %s\n",
errnum == Z_ERRNO ? strerror(errno) : errmsg); errnum == Z_ERRNO ? strerror(errno) : errmsg);
#else #else
exit_horribly(modulename, fatal("could not read from input file: %s",
"could not read from input file: %s\n",
strerror(errno)); strerror(errno));
#endif #endif
} }
@ -578,7 +568,7 @@ _tarReadRaw(ArchiveHandle *AH, void *buf, size_t len, TAR_MEMBER *th, FILE *fh)
} }
} }
else else
exit_horribly(modulename, "internal error -- neither th nor fh specified in tarReadRaw()\n"); fatal("internal error -- neither th nor fh specified in tarReadRaw()\n");
} }
ctx->tarFHpos += res + used; ctx->tarFHpos += res + used;
@ -700,8 +690,7 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te)
pos1 = (int) strlen(te->copyStmt) - 13; pos1 = (int) strlen(te->copyStmt) - 13;
if (pos1 < 6 || strncmp(te->copyStmt, "COPY ", 5) != 0 || if (pos1 < 6 || strncmp(te->copyStmt, "COPY ", 5) != 0 ||
strcmp(te->copyStmt + pos1, " FROM stdin;\n") != 0) strcmp(te->copyStmt + pos1, " FROM stdin;\n") != 0)
exit_horribly(modulename, fatal("unexpected COPY statement syntax: \"%s\"",
"unexpected COPY statement syntax: \"%s\"\n",
te->copyStmt); te->copyStmt);
/* Emit all but the FROM part ... */ /* Emit all but the FROM part ... */
@ -746,7 +735,7 @@ _LoadBlobs(ArchiveHandle *AH)
oid = atooid(&th->targetFile[5]); oid = atooid(&th->targetFile[5]);
if (oid != 0) if (oid != 0)
{ {
ahlog(AH, 1, "restoring large object with OID %u\n", oid); pg_log_info("restoring large object with OID %u", oid);
StartRestoreBlob(AH, oid, AH->public.ropt->dropSchema); StartRestoreBlob(AH, oid, AH->public.ropt->dropSchema);
@ -803,8 +792,7 @@ _ReadByte(ArchiveHandle *AH)
res = tarRead(&c, 1, ctx->FH); res = tarRead(&c, 1, ctx->FH);
if (res != 1) if (res != 1)
/* We already would have exited for errors on reads, must be EOF */ /* We already would have exited for errors on reads, must be EOF */
exit_horribly(modulename, fatal("could not read from input file: end of file");
"could not read from input file: end of file\n");
ctx->filePos += 1; ctx->filePos += 1;
return c; return c;
} }
@ -827,8 +815,7 @@ _ReadBuf(ArchiveHandle *AH, void *buf, size_t len)
if (tarRead(buf, len, ctx->FH) != len) if (tarRead(buf, len, ctx->FH) != len)
/* We already would have exited for errors on reads, must be EOF */ /* We already would have exited for errors on reads, must be EOF */
exit_horribly(modulename, fatal("could not read from input file: end of file");
"could not read from input file: end of file\n");
ctx->filePos += len; ctx->filePos += len;
return; return;
@ -917,7 +904,7 @@ _CloseArchive(ArchiveHandle *AH)
/* Sync the output file if one is defined */ /* Sync the output file if one is defined */
if (AH->dosync && AH->fSpec) if (AH->dosync && AH->fSpec)
(void) fsync_fname(AH->fSpec, false, progname); (void) fsync_fname(AH->fSpec, false);
} }
AH->FH = NULL; AH->FH = NULL;
@ -971,7 +958,7 @@ _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
char *sfx; char *sfx;
if (oid == 0) if (oid == 0)
exit_horribly(modulename, "invalid OID for large object (%u)\n", oid); fatal("invalid OID for large object (%u)", oid);
if (AH->compression != 0) if (AH->compression != 0)
sfx = ".gz"; sfx = ".gz";
@ -1101,8 +1088,7 @@ _tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th)
fseeko(tmp, 0, SEEK_END); fseeko(tmp, 0, SEEK_END);
th->fileLen = ftello(tmp); th->fileLen = ftello(tmp);
if (th->fileLen < 0) if (th->fileLen < 0)
exit_horribly(modulename, "could not determine seek position in archive file: %s\n", fatal("could not determine seek position in archive file: %m");
strerror(errno));
fseeko(tmp, 0, SEEK_SET); fseeko(tmp, 0, SEEK_SET);
_tarWriteHeader(th); _tarWriteHeader(th);
@ -1117,8 +1103,7 @@ _tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th)
READ_ERROR_EXIT(tmp); READ_ERROR_EXIT(tmp);
if (fclose(tmp) != 0) /* This *should* delete it... */ if (fclose(tmp) != 0) /* This *should* delete it... */
exit_horribly(modulename, "could not close temporary file: %s\n", fatal("could not close temporary file: %m");
strerror(errno));
if (len != th->fileLen) if (len != th->fileLen)
{ {
@ -1127,7 +1112,7 @@ _tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th)
snprintf(buf1, sizeof(buf1), INT64_FORMAT, (int64) len); snprintf(buf1, sizeof(buf1), INT64_FORMAT, (int64) len);
snprintf(buf2, sizeof(buf2), INT64_FORMAT, (int64) th->fileLen); snprintf(buf2, sizeof(buf2), INT64_FORMAT, (int64) th->fileLen);
exit_horribly(modulename, "actual file length (%s) does not match expected (%s)\n", fatal("actual file length (%s) does not match expected (%s)",
buf1, buf2); buf1, buf2);
} }
@ -1164,7 +1149,7 @@ _tarPositionTo(ArchiveHandle *AH, const char *filename)
snprintf(buf1, sizeof(buf1), INT64_FORMAT, (int64) ctx->tarFHpos); snprintf(buf1, sizeof(buf1), INT64_FORMAT, (int64) ctx->tarFHpos);
snprintf(buf2, sizeof(buf2), INT64_FORMAT, (int64) ctx->tarNextMember); snprintf(buf2, sizeof(buf2), INT64_FORMAT, (int64) ctx->tarNextMember);
ahlog(AH, 4, "moving from position %s to next member at file position %s\n", pg_log_debug("moving from position %s to next member at file position %s",
buf1, buf2); buf1, buf2);
while (ctx->tarFHpos < ctx->tarNextMember) while (ctx->tarFHpos < ctx->tarNextMember)
@ -1175,7 +1160,7 @@ _tarPositionTo(ArchiveHandle *AH, const char *filename)
char buf[100]; char buf[100];
snprintf(buf, sizeof(buf), INT64_FORMAT, (int64) ctx->tarFHpos); snprintf(buf, sizeof(buf), INT64_FORMAT, (int64) ctx->tarFHpos);
ahlog(AH, 4, "now at file position %s\n", buf); pg_log_debug("now at file position %s", buf);
} }
/* We are at the start of the file, or at the next member */ /* We are at the start of the file, or at the next member */
@ -1184,7 +1169,7 @@ _tarPositionTo(ArchiveHandle *AH, const char *filename)
if (!_tarGetHeader(AH, th)) if (!_tarGetHeader(AH, th))
{ {
if (filename) if (filename)
exit_horribly(modulename, "could not find header for file \"%s\" in tar archive\n", filename); fatal("could not find header for file \"%s\" in tar archive", filename);
else else
{ {
/* /*
@ -1198,12 +1183,12 @@ _tarPositionTo(ArchiveHandle *AH, const char *filename)
while (filename != NULL && strcmp(th->targetFile, filename) != 0) while (filename != NULL && strcmp(th->targetFile, filename) != 0)
{ {
ahlog(AH, 4, "skipping tar member %s\n", th->targetFile); pg_log_debug("skipping tar member %s", th->targetFile);
id = atoi(th->targetFile); id = atoi(th->targetFile);
if ((TocIDRequired(AH, id) & REQ_DATA) != 0) if ((TocIDRequired(AH, id) & REQ_DATA) != 0)
exit_horribly(modulename, "restoring data out of order is not supported in this archive format: " fatal("restoring data out of order is not supported in this archive format: "
"\"%s\" is required, but comes before \"%s\" in the archive file.\n", "\"%s\" is required, but comes before \"%s\" in the archive file.",
th->targetFile, filename); th->targetFile, filename);
/* Header doesn't match, so read to next header */ /* Header doesn't match, so read to next header */
@ -1214,7 +1199,7 @@ _tarPositionTo(ArchiveHandle *AH, const char *filename)
_tarReadRaw(AH, &header[0], 512, NULL, ctx->tarFH); _tarReadRaw(AH, &header[0], 512, NULL, ctx->tarFH);
if (!_tarGetHeader(AH, th)) if (!_tarGetHeader(AH, th))
exit_horribly(modulename, "could not find header for file \"%s\" in tar archive\n", filename); fatal("could not find header for file \"%s\" in tar archive", filename);
} }
ctx->tarNextMember = ctx->tarFHpos + ((th->fileLen + 511) & ~511); ctx->tarNextMember = ctx->tarFHpos + ((th->fileLen + 511) & ~511);
@ -1247,9 +1232,8 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th)
return 0; return 0;
if (len != 512) if (len != 512)
exit_horribly(modulename, fatal(ngettext("incomplete tar header found (%lu byte)",
ngettext("incomplete tar header found (%lu byte)\n", "incomplete tar header found (%lu bytes)",
"incomplete tar header found (%lu bytes)\n",
len), len),
(unsigned long) len); (unsigned long) len);
@ -1289,7 +1273,7 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th)
snprintf(posbuf, sizeof(posbuf), UINT64_FORMAT, (uint64) hPos); snprintf(posbuf, sizeof(posbuf), UINT64_FORMAT, (uint64) hPos);
snprintf(lenbuf, sizeof(lenbuf), UINT64_FORMAT, (uint64) len); snprintf(lenbuf, sizeof(lenbuf), UINT64_FORMAT, (uint64) len);
ahlog(AH, 3, "TOC Entry %s at %s (length %s, checksum %d)\n", pg_log_debug("TOC Entry %s at %s (length %s, checksum %d)",
tag, posbuf, lenbuf, sum); tag, posbuf, lenbuf, sum);
} }
@ -1299,9 +1283,7 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th)
snprintf(posbuf, sizeof(posbuf), UINT64_FORMAT, snprintf(posbuf, sizeof(posbuf), UINT64_FORMAT,
(uint64) ftello(ctx->tarFH)); (uint64) ftello(ctx->tarFH));
exit_horribly(modulename, fatal("corrupt tar header found in %s (expected %d, computed %d) file position %s",
"corrupt tar header found in %s "
"(expected %d, computed %d) file position %s\n",
tag, sum, chk, posbuf); tag, sum, chk, posbuf);
} }

View File

@ -51,8 +51,7 @@ set_dump_section(const char *arg, int *dumpSections)
*dumpSections |= DUMP_POST_DATA; *dumpSections |= DUMP_POST_DATA;
else else
{ {
fprintf(stderr, _("%s: unrecognized section name: \"%s\"\n"), pg_log_error("unrecognized section name: \"%s\"", arg);
progname, arg);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit_nicely(1); exit_nicely(1);
@ -60,62 +59,15 @@ set_dump_section(const char *arg, int *dumpSections)
} }
/*
* Write a printf-style message to stderr.
*
* The program name is prepended, if "progname" has been set.
* Also, if modulename isn't NULL, that's included too.
* Note that we'll try to translate the modulename and the fmt string.
*/
void
write_msg(const char *modulename, const char *fmt,...)
{
va_list ap;
va_start(ap, fmt);
vwrite_msg(modulename, fmt, ap);
va_end(ap);
}
/*
* As write_msg, but pass a va_list not variable arguments.
*/
void
vwrite_msg(const char *modulename, const char *fmt, va_list ap)
{
if (progname)
{
if (modulename)
fprintf(stderr, "%s: [%s] ", progname, _(modulename));
else
fprintf(stderr, "%s: ", progname);
}
vfprintf(stderr, _(fmt), ap);
}
/*
* Fail and die, with a message to stderr. Parameters as for write_msg.
*
* Note that on_exit_nicely callbacks will get run.
*/
void
exit_horribly(const char *modulename, const char *fmt,...)
{
va_list ap;
va_start(ap, fmt);
vwrite_msg(modulename, fmt, ap);
va_end(ap);
exit_nicely(1);
}
/* Register a callback to be run when exit_nicely is invoked. */ /* Register a callback to be run when exit_nicely is invoked. */
void void
on_exit_nicely(on_exit_nicely_callback function, void *arg) on_exit_nicely(on_exit_nicely_callback function, void *arg)
{ {
if (on_exit_nicely_index >= MAX_ON_EXIT_NICELY) if (on_exit_nicely_index >= MAX_ON_EXIT_NICELY)
exit_horribly(NULL, "out of on_exit_nicely slots\n"); {
pg_log_fatal("out of on_exit_nicely slots");
exit_nicely(1);
}
on_exit_nicely_list[on_exit_nicely_index].function = function; on_exit_nicely_list[on_exit_nicely_index].function = function;
on_exit_nicely_list[on_exit_nicely_index].arg = arg; on_exit_nicely_list[on_exit_nicely_index].arg = arg;
on_exit_nicely_index++; on_exit_nicely_index++;

View File

@ -15,6 +15,8 @@
#ifndef PG_BACKUP_UTILS_H #ifndef PG_BACKUP_UTILS_H
#define PG_BACKUP_UTILS_H #define PG_BACKUP_UTILS_H
#include "fe_utils/logging.h"
typedef enum /* bits returned by set_dump_section */ typedef enum /* bits returned by set_dump_section */
{ {
DUMP_PRE_DATA = 0x01, DUMP_PRE_DATA = 0x01,
@ -28,11 +30,9 @@ typedef void (*on_exit_nicely_callback) (int code, void *arg);
extern const char *progname; extern const char *progname;
extern void set_dump_section(const char *arg, int *dumpSections); extern void set_dump_section(const char *arg, int *dumpSections);
extern void write_msg(const char *modulename, const char *fmt,...) pg_attribute_printf(2, 3);
extern void vwrite_msg(const char *modulename, const char *fmt, va_list ap) pg_attribute_printf(2, 0);
extern void on_exit_nicely(on_exit_nicely_callback function, void *arg); extern void on_exit_nicely(on_exit_nicely_callback function, void *arg);
extern void exit_nicely(int code) pg_attribute_noreturn(); extern void exit_nicely(int code) pg_attribute_noreturn();
extern void exit_horribly(const char *modulename, const char *fmt,...) pg_attribute_printf(2, 3) pg_attribute_noreturn(); #define fatal(...) do { pg_log_error(__VA_ARGS__); exit_nicely(1); } while(0)
#endif /* PG_BACKUP_UTILS_H */ #endif /* PG_BACKUP_UTILS_H */

File diff suppressed because it is too large Load Diff

View File

@ -639,7 +639,6 @@ typedef struct _extensionMemberId
/* global decls */ /* global decls */
extern bool force_quotes; /* double-quotes for identifiers flag */ extern bool force_quotes; /* double-quotes for identifiers flag */
extern bool g_verbose; /* verbose flag */
/* placeholders for comment starting and ending delimiters */ /* placeholders for comment starting and ending delimiters */
extern char g_comment_start[10]; extern char g_comment_start[10];

View File

@ -20,9 +20,7 @@
#include "pg_dump.h" #include "pg_dump.h"
#include "catalog/pg_class_d.h" #include "catalog/pg_class_d.h"
#include "fe_utils/logging.h"
/* translator: this is a module name */
static const char *modulename = gettext_noop("sorter");
/* /*
* Sort priority for database object types. * Sort priority for database object types.
@ -327,13 +325,13 @@ TopoSort(DumpableObject **objs,
obj = objs[i]; obj = objs[i];
j = obj->dumpId; j = obj->dumpId;
if (j <= 0 || j > maxDumpId) if (j <= 0 || j > maxDumpId)
exit_horribly(modulename, "invalid dumpId %d\n", j); fatal("invalid dumpId %d", j);
idMap[j] = i; idMap[j] = i;
for (j = 0; j < obj->nDeps; j++) for (j = 0; j < obj->nDeps; j++)
{ {
k = obj->dependencies[j]; k = obj->dependencies[j];
if (k <= 0 || k > maxDumpId) if (k <= 0 || k > maxDumpId)
exit_horribly(modulename, "invalid dependency %d\n", k); fatal("invalid dependency %d", k);
beforeConstraints[k]++; beforeConstraints[k]++;
} }
} }
@ -566,7 +564,7 @@ findDependencyLoops(DumpableObject **objs, int nObjs, int totObjs)
/* We'd better have fixed at least one loop */ /* We'd better have fixed at least one loop */
if (!fixedloop) if (!fixedloop)
exit_horribly(modulename, "could not identify dependency loop\n"); fatal("could not identify dependency loop");
free(workspace); free(workspace);
free(searchFailed); free(searchFailed);
@ -1129,13 +1127,13 @@ repairDependencyLoop(DumpableObject **loop,
} }
if (i >= nLoop) if (i >= nLoop)
{ {
write_msg(NULL, ngettext("NOTICE: there are circular foreign-key constraints on this table:\n", pg_log_warning(ngettext("there are circular foreign-key constraints on this table:",
"NOTICE: there are circular foreign-key constraints among these tables:\n", "there are circular foreign-key constraints among these tables:",
nLoop)); nLoop));
for (i = 0; i < nLoop; i++) for (i = 0; i < nLoop; i++)
write_msg(NULL, " %s\n", loop[i]->name); pg_log_generic(PG_LOG_INFO, " %s", loop[i]->name);
write_msg(NULL, "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.\n"); pg_log_generic(PG_LOG_INFO, "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints.");
write_msg(NULL, "Consider using a full dump instead of a --data-only dump to avoid this problem.\n"); pg_log_generic(PG_LOG_INFO, "Consider using a full dump instead of a --data-only dump to avoid this problem.");
if (nLoop > 1) if (nLoop > 1)
removeObjectDependency(loop[0], loop[1]->dumpId); removeObjectDependency(loop[0], loop[1]->dumpId);
else /* must be a self-dependency */ else /* must be a self-dependency */
@ -1147,13 +1145,13 @@ repairDependencyLoop(DumpableObject **loop,
* If we can't find a principled way to break the loop, complain and break * If we can't find a principled way to break the loop, complain and break
* it in an arbitrary fashion. * it in an arbitrary fashion.
*/ */
write_msg(modulename, "WARNING: could not resolve dependency loop among these items:\n"); pg_log_warning("could not resolve dependency loop among these items:");
for (i = 0; i < nLoop; i++) for (i = 0; i < nLoop; i++)
{ {
char buf[1024]; char buf[1024];
describeDumpableObject(loop[i], buf, sizeof(buf)); describeDumpableObject(loop[i], buf, sizeof(buf));
write_msg(modulename, " %s\n", buf); pg_log_generic(PG_LOG_INFO, " %s", buf);
} }
if (nLoop > 1) if (nLoop > 1)

View File

@ -24,6 +24,7 @@
#include "pg_backup.h" #include "pg_backup.h"
#include "common/file_utils.h" #include "common/file_utils.h"
#include "fe_utils/connect.h" #include "fe_utils/connect.h"
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h" #include "fe_utils/string_utils.h"
/* version string we expect back from pg_dump */ /* version string we expect back from pg_dump */
@ -168,8 +169,9 @@ main(int argc, char *argv[])
ret; ret;
int optindex; int optindex;
pg_logging_init(argv[0]);
pg_logging_set_level(PG_LOG_WARNING);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump"));
progname = get_progname(argv[0]); progname = get_progname(argv[0]);
if (argc > 1) if (argc > 1)
@ -195,18 +197,15 @@ main(int argc, char *argv[])
strlcpy(full_path, progname, sizeof(full_path)); strlcpy(full_path, progname, sizeof(full_path));
if (ret == -1) if (ret == -1)
fprintf(stderr, pg_log_error("The program \"pg_dump\" is needed by %s but was not found in the\n"
_("The program \"pg_dump\" is needed by %s " "same directory as \"%s\".\n"
"but was not found in the\n" "Check your installation.",
"same directory as \"%s\".\n" progname, full_path);
"Check your installation.\n"),
progname, full_path);
else else
fprintf(stderr, pg_log_error("The program \"pg_dump\" was found by \"%s\"\n"
_("The program \"pg_dump\" was found by \"%s\"\n" "but was not the same version as %s.\n"
"but was not the same version as %s.\n" "Check your installation.",
"Check your installation.\n"), full_path, progname);
full_path, progname);
exit_nicely(1); exit_nicely(1);
} }
@ -288,6 +287,7 @@ main(int argc, char *argv[])
case 'v': case 'v':
verbose = true; verbose = true;
pg_logging_set_level(PG_LOG_INFO);
appendPQExpBufferStr(pgdumpopts, " -v"); appendPQExpBufferStr(pgdumpopts, " -v");
break; break;
@ -343,8 +343,8 @@ main(int argc, char *argv[])
/* Complain if any arguments remain */ /* Complain if any arguments remain */
if (optind < argc) if (optind < argc)
{ {
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), pg_log_error("too many command-line arguments (first is \"%s\")",
progname, argv[optind]); argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit_nicely(1); exit_nicely(1);
@ -353,8 +353,7 @@ main(int argc, char *argv[])
if (database_exclude_patterns.head != NULL && if (database_exclude_patterns.head != NULL &&
(globals_only || roles_only || tablespaces_only)) (globals_only || roles_only || tablespaces_only))
{ {
fprintf(stderr, _("%s: option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only or -t/--tablespaces-only\n"), pg_log_error("option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only or -t/--tablespaces-only");
progname);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit_nicely(1); exit_nicely(1);
@ -363,8 +362,7 @@ main(int argc, char *argv[])
/* Make sure the user hasn't specified a mix of globals-only options */ /* Make sure the user hasn't specified a mix of globals-only options */
if (globals_only && roles_only) if (globals_only && roles_only)
{ {
fprintf(stderr, _("%s: options -g/--globals-only and -r/--roles-only cannot be used together\n"), pg_log_error("options -g/--globals-only and -r/--roles-only cannot be used together");
progname);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit_nicely(1); exit_nicely(1);
@ -372,8 +370,7 @@ main(int argc, char *argv[])
if (globals_only && tablespaces_only) if (globals_only && tablespaces_only)
{ {
fprintf(stderr, _("%s: options -g/--globals-only and -t/--tablespaces-only cannot be used together\n"), pg_log_error("options -g/--globals-only and -t/--tablespaces-only cannot be used together");
progname);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit_nicely(1); exit_nicely(1);
@ -381,15 +378,13 @@ main(int argc, char *argv[])
if (if_exists && !output_clean) if (if_exists && !output_clean)
{ {
fprintf(stderr, _("%s: option --if-exists requires option -c/--clean\n"), pg_log_error("option --if-exists requires option -c/--clean");
progname);
exit_nicely(1); exit_nicely(1);
} }
if (roles_only && tablespaces_only) if (roles_only && tablespaces_only)
{ {
fprintf(stderr, _("%s: options -r/--roles-only and -t/--tablespaces-only cannot be used together\n"), pg_log_error("options -r/--roles-only and -t/--tablespaces-only cannot be used together");
progname);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit_nicely(1); exit_nicely(1);
@ -450,8 +445,7 @@ main(int argc, char *argv[])
if (!conn) if (!conn)
{ {
fprintf(stderr, _("%s: could not connect to database \"%s\"\n"), pg_log_error("could not connect to database \"%s\"", pgdb);
progname, pgdb);
exit_nicely(1); exit_nicely(1);
} }
} }
@ -465,9 +459,8 @@ main(int argc, char *argv[])
if (!conn) if (!conn)
{ {
fprintf(stderr, _("%s: could not connect to databases \"postgres\" or \"template1\"\n" pg_log_error("could not connect to databases \"postgres\" or \"template1\"\n"
"Please specify an alternative database.\n"), "Please specify an alternative database.");
progname);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit_nicely(1); exit_nicely(1);
@ -488,8 +481,8 @@ main(int argc, char *argv[])
OPF = fopen(filename, PG_BINARY_W); OPF = fopen(filename, PG_BINARY_W);
if (!OPF) if (!OPF)
{ {
fprintf(stderr, _("%s: could not open the output file \"%s\": %s\n"), pg_log_error("could not open the output file \"%s\": %m",
progname, filename, strerror(errno)); filename);
exit_nicely(1); exit_nicely(1);
} }
} }
@ -503,8 +496,8 @@ main(int argc, char *argv[])
{ {
if (PQsetClientEncoding(conn, dumpencoding) < 0) if (PQsetClientEncoding(conn, dumpencoding) < 0)
{ {
fprintf(stderr, _("%s: invalid client encoding \"%s\" specified\n"), pg_log_error("invalid client encoding \"%s\" specified",
progname, dumpencoding); dumpencoding);
exit_nicely(1); exit_nicely(1);
} }
} }
@ -610,7 +603,7 @@ main(int argc, char *argv[])
/* sync the resulting file, errors are not fatal */ /* sync the resulting file, errors are not fatal */
if (dosync) if (dosync)
(void) fsync_fname(filename, false, progname); (void) fsync_fname(filename, false);
} }
exit_nicely(0); exit_nicely(0);
@ -880,8 +873,8 @@ dumpRoles(PGconn *conn)
if (strncmp(rolename, "pg_", 3) == 0) if (strncmp(rolename, "pg_", 3) == 0)
{ {
fprintf(stderr, _("%s: role name starting with \"pg_\" skipped (%s)\n"), pg_log_warning("role name starting with \"pg_\" skipped (%s)",
progname, rolename); rolename);
continue; continue;
} }
@ -1262,8 +1255,8 @@ dumpTablespaces(PGconn *conn)
spcacl, rspcacl, spcacl, rspcacl,
spcowner, "", server_version, buf)) spcowner, "", server_version, buf))
{ {
fprintf(stderr, _("%s: could not parse ACL list (%s) for tablespace \"%s\"\n"), pg_log_error("could not parse ACL list (%s) for tablespace \"%s\"",
progname, spcacl, spcname); spcacl, spcname);
PQfinish(conn); PQfinish(conn);
exit_nicely(1); exit_nicely(1);
} }
@ -1479,14 +1472,11 @@ dumpDatabases(PGconn *conn)
/* Skip any explicitly excluded database */ /* Skip any explicitly excluded database */
if (simple_string_list_member(&database_exclude_names, dbname)) if (simple_string_list_member(&database_exclude_names, dbname))
{ {
if (verbose) pg_log_info("excluding database \"%s\"...", dbname);
fprintf(stderr, _("%s: excluding database \"%s\"...\n"),
progname, dbname);
continue; continue;
} }
if (verbose) pg_log_info("dumping database \"%s\"...", dbname);
fprintf(stderr, _("%s: dumping database \"%s\"...\n"), progname, dbname);
fprintf(OPF, "--\n-- Database \"%s\" dump\n--\n\n", dbname); fprintf(OPF, "--\n-- Database \"%s\" dump\n--\n\n", dbname);
@ -1518,7 +1508,7 @@ dumpDatabases(PGconn *conn)
ret = runPgDump(dbname, create_opts); ret = runPgDump(dbname, create_opts);
if (ret != 0) if (ret != 0)
{ {
fprintf(stderr, _("%s: pg_dump failed on database \"%s\", exiting\n"), progname, dbname); pg_log_error("pg_dump failed on database \"%s\", exiting", dbname);
exit_nicely(1); exit_nicely(1);
} }
@ -1527,8 +1517,8 @@ dumpDatabases(PGconn *conn)
OPF = fopen(filename, PG_BINARY_A); OPF = fopen(filename, PG_BINARY_A);
if (!OPF) if (!OPF)
{ {
fprintf(stderr, _("%s: could not re-open the output file \"%s\": %s\n"), pg_log_error("could not re-open the output file \"%s\": %m",
progname, filename, strerror(errno)); filename);
exit_nicely(1); exit_nicely(1);
} }
} }
@ -1571,8 +1561,7 @@ runPgDump(const char *dbname, const char *create_opts)
appendShellString(cmd, connstrbuf->data); appendShellString(cmd, connstrbuf->data);
if (verbose) pg_log_info("running \"%s\"", cmd->data);
fprintf(stderr, _("%s: running \"%s\"\n"), progname, cmd->data);
fflush(stdout); fflush(stdout);
fflush(stderr); fflush(stderr);
@ -1672,7 +1661,7 @@ connectDatabase(const char *dbname, const char *connection_string,
conn_opts = PQconninfoParse(connection_string, &err_msg); conn_opts = PQconninfoParse(connection_string, &err_msg);
if (conn_opts == NULL) if (conn_opts == NULL)
{ {
fprintf(stderr, "%s: %s", progname, err_msg); pg_log_error("%s", err_msg);
exit_nicely(1); exit_nicely(1);
} }
@ -1742,8 +1731,7 @@ connectDatabase(const char *dbname, const char *connection_string,
if (!conn) if (!conn)
{ {
fprintf(stderr, _("%s: could not connect to database \"%s\"\n"), pg_log_error("could not connect to database \"%s\"", dbname);
progname, dbname);
exit_nicely(1); exit_nicely(1);
} }
@ -1764,9 +1752,8 @@ connectDatabase(const char *dbname, const char *connection_string,
{ {
if (fail_on_error) if (fail_on_error)
{ {
fprintf(stderr, pg_log_error("could not connect to database \"%s\": %s",
_("%s: could not connect to database \"%s\": %s"), dbname, PQerrorMessage(conn));
progname, dbname, PQerrorMessage(conn));
exit_nicely(1); exit_nicely(1);
} }
else else
@ -1795,14 +1782,14 @@ connectDatabase(const char *dbname, const char *connection_string,
remoteversion_str = PQparameterStatus(conn, "server_version"); remoteversion_str = PQparameterStatus(conn, "server_version");
if (!remoteversion_str) if (!remoteversion_str)
{ {
fprintf(stderr, _("%s: could not get server version\n"), progname); pg_log_error("could not get server version");
exit_nicely(1); exit_nicely(1);
} }
server_version = PQserverVersion(conn); server_version = PQserverVersion(conn);
if (server_version == 0) if (server_version == 0)
{ {
fprintf(stderr, _("%s: could not parse server version \"%s\"\n"), pg_log_error("could not parse server version \"%s\"",
progname, remoteversion_str); remoteversion_str);
exit_nicely(1); exit_nicely(1);
} }
@ -1816,9 +1803,9 @@ connectDatabase(const char *dbname, const char *connection_string,
&& (server_version < 80000 || && (server_version < 80000 ||
(server_version / 100) > (my_version / 100))) (server_version / 100) > (my_version / 100)))
{ {
fprintf(stderr, _("server version: %s; %s version: %s\n"), pg_log_error("server version: %s; %s version: %s",
remoteversion_str, progname, PG_VERSION); remoteversion_str, progname, PG_VERSION);
fprintf(stderr, _("aborting because of server version mismatch\n")); pg_log_error("aborting because of server version mismatch");
exit_nicely(1); exit_nicely(1);
} }
@ -1873,17 +1860,14 @@ executeQuery(PGconn *conn, const char *query)
{ {
PGresult *res; PGresult *res;
if (verbose) pg_log_info("executing %s", query);
fprintf(stderr, _("%s: executing %s\n"), progname, query);
res = PQexec(conn, query); res = PQexec(conn, query);
if (!res || if (!res ||
PQresultStatus(res) != PGRES_TUPLES_OK) PQresultStatus(res) != PGRES_TUPLES_OK)
{ {
fprintf(stderr, _("%s: query failed: %s"), pg_log_error("query failed: %s", PQerrorMessage(conn));
progname, PQerrorMessage(conn)); pg_log_error("query was: %s", query);
fprintf(stderr, _("%s: query was: %s\n"),
progname, query);
PQfinish(conn); PQfinish(conn);
exit_nicely(1); exit_nicely(1);
} }
@ -1899,17 +1883,14 @@ executeCommand(PGconn *conn, const char *query)
{ {
PGresult *res; PGresult *res;
if (verbose) pg_log_info("executing %s", query);
fprintf(stderr, _("%s: executing %s\n"), progname, query);
res = PQexec(conn, query); res = PQexec(conn, query);
if (!res || if (!res ||
PQresultStatus(res) != PGRES_COMMAND_OK) PQresultStatus(res) != PGRES_COMMAND_OK)
{ {
fprintf(stderr, _("%s: query failed: %s"), pg_log_error("query failed: %s", PQerrorMessage(conn));
progname, PQerrorMessage(conn)); pg_log_error("query was: %s", query);
fprintf(stderr, _("%s: query was: %s\n"),
progname, query);
PQfinish(conn); PQfinish(conn);
exit_nicely(1); exit_nicely(1);
} }

View File

@ -51,6 +51,8 @@
#include "parallel.h" #include "parallel.h"
#include "pg_backup_utils.h" #include "pg_backup_utils.h"
#include "fe_utils/logging.h"
static void usage(const char *progname); static void usage(const char *progname);
@ -128,6 +130,7 @@ main(int argc, char **argv)
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
}; };
pg_logging_init(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump"));
init_parallel_dump_utils(); init_parallel_dump_utils();
@ -296,8 +299,8 @@ main(int argc, char **argv)
/* Complain if any arguments remain */ /* Complain if any arguments remain */
if (optind < argc) if (optind < argc)
{ {
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), pg_log_error("too many command-line arguments (first is \"%s\")",
progname, argv[optind]); argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit_nicely(1); exit_nicely(1);
@ -308,8 +311,7 @@ main(int argc, char **argv)
{ {
if (opts->filename) if (opts->filename)
{ {
fprintf(stderr, _("%s: options -d/--dbname and -f/--file cannot be used together\n"), pg_log_error("options -d/--dbname and -f/--file cannot be used together");
progname);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit_nicely(1); exit_nicely(1);
@ -319,15 +321,13 @@ main(int argc, char **argv)
if (opts->dataOnly && opts->schemaOnly) if (opts->dataOnly && opts->schemaOnly)
{ {
fprintf(stderr, _("%s: options -s/--schema-only and -a/--data-only cannot be used together\n"), pg_log_error("options -s/--schema-only and -a/--data-only cannot be used together");
progname);
exit_nicely(1); exit_nicely(1);
} }
if (opts->dataOnly && opts->dropSchema) if (opts->dataOnly && opts->dropSchema)
{ {
fprintf(stderr, _("%s: options -c/--clean and -a/--data-only cannot be used together\n"), pg_log_error("options -c/--clean and -a/--data-only cannot be used together");
progname);
exit_nicely(1); exit_nicely(1);
} }
@ -337,14 +337,13 @@ main(int argc, char **argv)
*/ */
if (opts->createDB && opts->single_txn) if (opts->createDB && opts->single_txn)
{ {
fprintf(stderr, _("%s: options -C/--create and -1/--single-transaction cannot be used together\n"), pg_log_error("options -C/--create and -1/--single-transaction cannot be used together");
progname);
exit_nicely(1); exit_nicely(1);
} }
if (numWorkers <= 0) if (numWorkers <= 0)
{ {
fprintf(stderr, _("%s: invalid number of parallel jobs\n"), progname); pg_log_error("invalid number of parallel jobs");
exit(1); exit(1);
} }
@ -352,8 +351,8 @@ main(int argc, char **argv)
#ifdef WIN32 #ifdef WIN32
if (numWorkers > MAXIMUM_WAIT_OBJECTS) if (numWorkers > MAXIMUM_WAIT_OBJECTS)
{ {
fprintf(stderr, _("%s: maximum number of parallel jobs is %d\n"), pg_log_error("maximum number of parallel jobs is %d",
progname, MAXIMUM_WAIT_OBJECTS); MAXIMUM_WAIT_OBJECTS);
exit(1); exit(1);
} }
#endif #endif
@ -361,8 +360,7 @@ main(int argc, char **argv)
/* Can't do single-txn mode with multiple connections */ /* Can't do single-txn mode with multiple connections */
if (opts->single_txn && numWorkers > 1) if (opts->single_txn && numWorkers > 1)
{ {
fprintf(stderr, _("%s: cannot specify both --single-transaction and multiple jobs\n"), pg_log_error("cannot specify both --single-transaction and multiple jobs");
progname);
exit_nicely(1); exit_nicely(1);
} }
@ -378,8 +376,7 @@ main(int argc, char **argv)
if (if_exists && !opts->dropSchema) if (if_exists && !opts->dropSchema)
{ {
fprintf(stderr, _("%s: option --if-exists requires option -c/--clean\n"), pg_log_error("option --if-exists requires option -c/--clean");
progname);
exit_nicely(1); exit_nicely(1);
} }
opts->if_exists = if_exists; opts->if_exists = if_exists;
@ -405,7 +402,7 @@ main(int argc, char **argv)
break; break;
default: default:
write_msg(NULL, "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"\n", pg_log_error("unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"",
opts->formatName); opts->formatName);
exit_nicely(1); exit_nicely(1);
} }
@ -445,8 +442,7 @@ main(int argc, char **argv)
/* done, print a summary of ignored errors */ /* done, print a summary of ignored errors */
if (AH->n_errors) if (AH->n_errors)
fprintf(stderr, _("WARNING: errors ignored on restore: %d\n"), pg_log_warning("errors ignored on restore: %d", AH->n_errors);
AH->n_errors);
/* AH may be freed in CloseArchive? */ /* AH may be freed in CloseArchive? */
exit_code = AH->n_errors ? 1 : 0; exit_code = AH->n_errors ? 1 : 0;

View File

@ -30,129 +30,129 @@ program_options_handling_ok('pg_dumpall');
command_fails_like( command_fails_like(
[ 'pg_dump', 'qqq', 'abc' ], [ 'pg_dump', 'qqq', 'abc' ],
qr/\Qpg_dump: too many command-line arguments (first is "abc")\E/, qr/\Qpg_dump: error: too many command-line arguments (first is "abc")\E/,
'pg_dump: too many command-line arguments (first is "asd")'); 'pg_dump: too many command-line arguments');
command_fails_like( command_fails_like(
[ 'pg_restore', 'qqq', 'abc' ], [ 'pg_restore', 'qqq', 'abc' ],
qr/\Qpg_restore: too many command-line arguments (first is "abc")\E/, qr/\Qpg_restore: error: too many command-line arguments (first is "abc")\E/,
'pg_restore too many command-line arguments (first is "abc")'); 'pg_restore: too many command-line arguments');
command_fails_like( command_fails_like(
[ 'pg_dumpall', 'qqq', 'abc' ], [ 'pg_dumpall', 'qqq', 'abc' ],
qr/\Qpg_dumpall: too many command-line arguments (first is "qqq")\E/, qr/\Qpg_dumpall: error: too many command-line arguments (first is "qqq")\E/,
'pg_dumpall: too many command-line arguments (first is "qqq")'); 'pg_dumpall: too many command-line arguments');
command_fails_like( command_fails_like(
[ 'pg_dump', '-s', '-a' ], [ 'pg_dump', '-s', '-a' ],
qr/\Qpg_dump: options -s\/--schema-only and -a\/--data-only cannot be used together\E/, qr/\Qpg_dump: error: options -s\/--schema-only and -a\/--data-only cannot be used together\E/,
'pg_dump: options -s/--schema-only and -a/--data-only cannot be used together' 'pg_dump: options -s/--schema-only and -a/--data-only cannot be used together'
); );
command_fails_like( command_fails_like(
[ 'pg_restore', '-s', '-a' ], [ 'pg_restore', '-s', '-a' ],
qr/\Qpg_restore: options -s\/--schema-only and -a\/--data-only cannot be used together\E/, qr/\Qpg_restore: error: options -s\/--schema-only and -a\/--data-only cannot be used together\E/,
'pg_restore: options -s/--schema-only and -a/--data-only cannot be used together' 'pg_restore: options -s/--schema-only and -a/--data-only cannot be used together'
); );
command_fails_like( command_fails_like(
[ 'pg_restore', '-d', 'xxx', '-f', 'xxx' ], [ 'pg_restore', '-d', 'xxx', '-f', 'xxx' ],
qr/\Qpg_restore: options -d\/--dbname and -f\/--file cannot be used together\E/, qr/\Qpg_restore: error: options -d\/--dbname and -f\/--file cannot be used together\E/,
'pg_restore: options -d/--dbname and -f/--file cannot be used together'); 'pg_restore: options -d/--dbname and -f/--file cannot be used together');
command_fails_like( command_fails_like(
[ 'pg_dump', '-c', '-a' ], [ 'pg_dump', '-c', '-a' ],
qr/\Qpg_dump: options -c\/--clean and -a\/--data-only cannot be used together\E/, qr/\Qpg_dump: error: options -c\/--clean and -a\/--data-only cannot be used together\E/,
'pg_dump: options -c/--clean and -a/--data-only cannot be used together'); 'pg_dump: options -c/--clean and -a/--data-only cannot be used together');
command_fails_like( command_fails_like(
[ 'pg_restore', '-c', '-a' ], [ 'pg_restore', '-c', '-a' ],
qr/\Qpg_restore: options -c\/--clean and -a\/--data-only cannot be used together\E/, qr/\Qpg_restore: error: options -c\/--clean and -a\/--data-only cannot be used together\E/,
'pg_restore: options -c/--clean and -a/--data-only cannot be used together' 'pg_restore: options -c/--clean and -a/--data-only cannot be used together'
); );
command_fails_like( command_fails_like(
[ 'pg_dump', '--if-exists' ], [ 'pg_dump', '--if-exists' ],
qr/\Qpg_dump: option --if-exists requires option -c\/--clean\E/, qr/\Qpg_dump: error: option --if-exists requires option -c\/--clean\E/,
'pg_dump: option --if-exists requires option -c/--clean'); 'pg_dump: option --if-exists requires option -c/--clean');
command_fails_like( command_fails_like(
[ 'pg_dump', '-j3' ], [ 'pg_dump', '-j3' ],
qr/\Qpg_dump: parallel backup only supported by the directory format\E/, qr/\Qpg_dump: error: parallel backup only supported by the directory format\E/,
'pg_dump: parallel backup only supported by the directory format'); 'pg_dump: parallel backup only supported by the directory format');
command_fails_like( command_fails_like(
[ 'pg_dump', '-j', '-1' ], [ 'pg_dump', '-j', '-1' ],
qr/\Qpg_dump: invalid number of parallel jobs\E/, qr/\Qpg_dump: error: invalid number of parallel jobs\E/,
'pg_dump: invalid number of parallel jobs'); 'pg_dump: invalid number of parallel jobs');
command_fails_like( command_fails_like(
[ 'pg_dump', '-F', 'garbage' ], [ 'pg_dump', '-F', 'garbage' ],
qr/\Qpg_dump: invalid output format\E/, qr/\Qpg_dump: error: invalid output format\E/,
'pg_dump: invalid output format'); 'pg_dump: invalid output format');
command_fails_like( command_fails_like(
[ 'pg_restore', '-j', '-1' ], [ 'pg_restore', '-j', '-1' ],
qr/\Qpg_restore: invalid number of parallel jobs\E/, qr/\Qpg_restore: error: invalid number of parallel jobs\E/,
'pg_restore: invalid number of parallel jobs'); 'pg_restore: invalid number of parallel jobs');
command_fails_like( command_fails_like(
[ 'pg_restore', '--single-transaction', '-j3' ], [ 'pg_restore', '--single-transaction', '-j3' ],
qr/\Qpg_restore: cannot specify both --single-transaction and multiple jobs\E/, qr/\Qpg_restore: error: cannot specify both --single-transaction and multiple jobs\E/,
'pg_restore: cannot specify both --single-transaction and multiple jobs'); 'pg_restore: cannot specify both --single-transaction and multiple jobs');
command_fails_like( command_fails_like(
[ 'pg_dump', '-Z', '-1' ], [ 'pg_dump', '-Z', '-1' ],
qr/\Qpg_dump: compression level must be in range 0..9\E/, qr/\Qpg_dump: error: compression level must be in range 0..9\E/,
'pg_dump: compression level must be in range 0..9'); 'pg_dump: compression level must be in range 0..9');
command_fails_like( command_fails_like(
[ 'pg_restore', '--if-exists' ], [ 'pg_restore', '--if-exists' ],
qr/\Qpg_restore: option --if-exists requires option -c\/--clean\E/, qr/\Qpg_restore: error: option --if-exists requires option -c\/--clean\E/,
'pg_restore: option --if-exists requires option -c/--clean'); 'pg_restore: option --if-exists requires option -c/--clean');
command_fails_like( command_fails_like(
[ 'pg_restore', '-F', 'garbage' ], [ 'pg_restore', '-F', 'garbage' ],
qr/\Qpg_restore: unrecognized archive format "garbage";\E/, qr/\Qpg_restore: error: unrecognized archive format "garbage";\E/,
'pg_dump: unrecognized archive format'); 'pg_dump: unrecognized archive format');
command_fails_like( command_fails_like(
[ 'pg_dump', '--on-conflict-do-nothing' ], [ 'pg_dump', '--on-conflict-do-nothing' ],
qr/pg_dump: option --on-conflict-do-nothing requires option --inserts, --rows-per-insert or --column-inserts/, qr/pg_dump: error: option --on-conflict-do-nothing requires option --inserts, --rows-per-insert or --column-inserts/,
'pg_dump: --on-conflict-do-nothing requires --inserts, --rows-per-insert, --column-inserts'); 'pg_dump: --on-conflict-do-nothing requires --inserts, --rows-per-insert, --column-inserts');
# pg_dumpall command-line argument checks # pg_dumpall command-line argument checks
command_fails_like( command_fails_like(
[ 'pg_dumpall', '-g', '-r' ], [ 'pg_dumpall', '-g', '-r' ],
qr/\Qpg_dumpall: options -g\/--globals-only and -r\/--roles-only cannot be used together\E/, qr/\Qpg_dumpall: error: options -g\/--globals-only and -r\/--roles-only cannot be used together\E/,
'pg_dumpall: options -g/--globals-only and -r/--roles-only cannot be used together' 'pg_dumpall: options -g/--globals-only and -r/--roles-only cannot be used together'
); );
command_fails_like( command_fails_like(
[ 'pg_dumpall', '-g', '-t' ], [ 'pg_dumpall', '-g', '-t' ],
qr/\Qpg_dumpall: options -g\/--globals-only and -t\/--tablespaces-only cannot be used together\E/, qr/\Qpg_dumpall: error: options -g\/--globals-only and -t\/--tablespaces-only cannot be used together\E/,
'pg_dumpall: options -g/--globals-only and -t/--tablespaces-only cannot be used together' 'pg_dumpall: options -g/--globals-only and -t/--tablespaces-only cannot be used together'
); );
command_fails_like( command_fails_like(
[ 'pg_dumpall', '-r', '-t' ], [ 'pg_dumpall', '-r', '-t' ],
qr/\Qpg_dumpall: options -r\/--roles-only and -t\/--tablespaces-only cannot be used together\E/, qr/\Qpg_dumpall: error: options -r\/--roles-only and -t\/--tablespaces-only cannot be used together\E/,
'pg_dumpall: options -r/--roles-only and -t/--tablespaces-only cannot be used together' 'pg_dumpall: options -r/--roles-only and -t/--tablespaces-only cannot be used together'
); );
command_fails_like( command_fails_like(
[ 'pg_dumpall', '--if-exists' ], [ 'pg_dumpall', '--if-exists' ],
qr/\Qpg_dumpall: option --if-exists requires option -c\/--clean\E/, qr/\Qpg_dumpall: error: option --if-exists requires option -c\/--clean\E/,
'pg_dumpall: option --if-exists requires option -c/--clean'); 'pg_dumpall: option --if-exists requires option -c/--clean');
command_fails_like( command_fails_like(
[ 'pg_restore', '-C', '-1' ], [ 'pg_restore', '-C', '-1' ],
qr/\Qpg_restore: options -C\/--create and -1\/--single-transaction cannot be used together\E/, qr/\Qpg_restore: error: options -C\/--create and -1\/--single-transaction cannot be used together\E/,
'pg_restore: options -C\/--create and -1\/--single-transaction cannot be used together' 'pg_restore: options -C\/--create and -1\/--single-transaction cannot be used together'
); );
# also fails for -r and -t, but it seems pointless to add more tests for those. # also fails for -r and -t, but it seems pointless to add more tests for those.
command_fails_like( command_fails_like(
[ 'pg_dumpall', '--exclude-database=foo', '--globals-only' ], [ 'pg_dumpall', '--exclude-database=foo', '--globals-only' ],
qr/\Qpg_dumpall: option --exclude-database cannot be used together with -g\/--globals-only\E/, qr/\Qpg_dumpall: error: option --exclude-database cannot be used together with -g\/--globals-only\E/,
'pg_dumpall: option --exclude-database cannot be used together with -g/--globals-only'); 'pg_dumpall: option --exclude-database cannot be used together with -g/--globals-only');

View File

@ -3329,8 +3329,8 @@ foreach my $db (sort keys %create_sql)
command_fails_like( command_fails_like(
[ 'pg_dump', '-p', "$port", 'qqq' ], [ 'pg_dump', '-p', "$port", 'qqq' ],
qr/\Qpg_dump: [archiver (db)] connection to database "qqq" failed: FATAL: database "qqq" does not exist\E/, qr/\Qpg_dump: error: connection to database "qqq" failed: FATAL: database "qqq" does not exist\E/,
'pg_dump: [archiver (db)] connection to database "qqq" failed: FATAL: database "qqq" does not exist' 'connecting to a non-existent database'
); );
######################################### #########################################
@ -3338,31 +3338,31 @@ command_fails_like(
command_fails_like( command_fails_like(
[ 'pg_dump', '-p', "$port", '--role=regress_dump_test_role' ], [ 'pg_dump', '-p', "$port", '--role=regress_dump_test_role' ],
qr/\Qpg_dump: [archiver (db)] query failed: ERROR: permission denied for\E/, qr/\Qpg_dump: error: query failed: ERROR: permission denied for\E/,
'pg_dump: [archiver (db)] query failed: ERROR: permission denied for'); 'connecting with an unprivileged user');
######################################### #########################################
# Test dumping a non-existent schema, table, and patterns with --strict-names # Test dumping a non-existent schema, table, and patterns with --strict-names
command_fails_like( command_fails_like(
[ 'pg_dump', '-p', "$port", '-n', 'nonexistant' ], [ 'pg_dump', '-p', "$port", '-n', 'nonexistant' ],
qr/\Qpg_dump: no matching schemas were found\E/, qr/\Qpg_dump: error: no matching schemas were found\E/,
'pg_dump: no matching schemas were found'); 'dumping a non-existent schema');
command_fails_like( command_fails_like(
[ 'pg_dump', '-p', "$port", '-t', 'nonexistant' ], [ 'pg_dump', '-p', "$port", '-t', 'nonexistant' ],
qr/\Qpg_dump: no matching tables were found\E/, qr/\Qpg_dump: error: no matching tables were found\E/,
'pg_dump: no matching tables were found'); 'dumping a non-existent table');
command_fails_like( command_fails_like(
[ 'pg_dump', '-p', "$port", '--strict-names', '-n', 'nonexistant*' ], [ 'pg_dump', '-p', "$port", '--strict-names', '-n', 'nonexistant*' ],
qr/\Qpg_dump: no matching schemas were found for pattern\E/, qr/\Qpg_dump: error: no matching schemas were found for pattern\E/,
'pg_dump: no matching schemas were found for pattern'); 'no matching schemas');
command_fails_like( command_fails_like(
[ 'pg_dump', '-p', "$port", '--strict-names', '-t', 'nonexistant*' ], [ 'pg_dump', '-p', "$port", '--strict-names', '-t', 'nonexistant*' ],
qr/\Qpg_dump: no matching tables were found for pattern\E/, qr/\Qpg_dump: error: no matching tables were found for pattern\E/,
'pg_dump: no matching tables were found for pattern'); 'no matching tables');
######################################### #########################################
# Run all runs # Run all runs

View File

@ -15,11 +15,13 @@ subdir = src/bin/pg_resetwal
top_builddir = ../../.. top_builddir = ../../..
include $(top_builddir)/src/Makefile.global include $(top_builddir)/src/Makefile.global
LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils
OBJS= pg_resetwal.o $(WIN32RES) OBJS= pg_resetwal.o $(WIN32RES)
all: pg_resetwal all: pg_resetwal
pg_resetwal: $(OBJS) | submake-libpgport pg_resetwal: $(OBJS) | submake-libpgport submake-libpgfeutils
$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
install: all installdirs install: all installdirs

View File

@ -1,4 +1,6 @@
# src/bin/pg_resetwal/nls.mk # src/bin/pg_resetwal/nls.mk
CATALOG_NAME = pg_resetwal CATALOG_NAME = pg_resetwal
AVAIL_LANGUAGES = cs de es fr it ja ko pl pt_BR ru sv tr zh_CN AVAIL_LANGUAGES = cs de es fr it ja ko pl pt_BR ru sv tr zh_CN
GETTEXT_FILES = pg_resetwal.c ../../common/restricted_token.c GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_resetwal.c ../../common/restricted_token.c
GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS)
GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)

View File

@ -53,6 +53,7 @@
#include "common/fe_memutils.h" #include "common/fe_memutils.h"
#include "common/file_perm.h" #include "common/file_perm.h"
#include "common/restricted_token.h" #include "common/restricted_token.h"
#include "fe_utils/logging.h"
#include "storage/large_object.h" #include "storage/large_object.h"
#include "pg_getopt.h" #include "pg_getopt.h"
#include "getopt_long.h" #include "getopt_long.h"
@ -115,8 +116,8 @@ main(int argc, char *argv[])
char *log_fname = NULL; char *log_fname = NULL;
int fd; int fd;
pg_logging_init(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_resetwal")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_resetwal"));
progname = get_progname(argv[0]); progname = get_progname(argv[0]);
if (argc > 1) if (argc > 1)
@ -156,13 +157,13 @@ main(int argc, char *argv[])
{ {
/*------ /*------
translator: the second %s is a command line argument (-e, etc) */ translator: the second %s is a command line argument (-e, etc) */
fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-e"); pg_log_error("invalid argument for option %s", "-e");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
if (set_xid_epoch == -1) if (set_xid_epoch == -1)
{ {
fprintf(stderr, _("%s: transaction ID epoch (-e) must not be -1\n"), progname); pg_log_error("transaction ID epoch (-e) must not be -1");
exit(1); exit(1);
} }
break; break;
@ -171,13 +172,13 @@ main(int argc, char *argv[])
set_xid = strtoul(optarg, &endptr, 0); set_xid = strtoul(optarg, &endptr, 0);
if (endptr == optarg || *endptr != '\0') if (endptr == optarg || *endptr != '\0')
{ {
fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-x"); pg_log_error("invalid argument for option %s", "-x");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
if (set_xid == 0) if (set_xid == 0)
{ {
fprintf(stderr, _("%s: transaction ID (-x) must not be 0\n"), progname); pg_log_error("transaction ID (-x) must not be 0");
exit(1); exit(1);
} }
break; break;
@ -186,14 +187,14 @@ main(int argc, char *argv[])
set_oldest_commit_ts_xid = strtoul(optarg, &endptr, 0); set_oldest_commit_ts_xid = strtoul(optarg, &endptr, 0);
if (endptr == optarg || *endptr != ',') if (endptr == optarg || *endptr != ',')
{ {
fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-c"); pg_log_error("invalid argument for option %s", "-c");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
set_newest_commit_ts_xid = strtoul(endptr + 1, &endptr2, 0); set_newest_commit_ts_xid = strtoul(endptr + 1, &endptr2, 0);
if (endptr2 == endptr + 1 || *endptr2 != '\0') if (endptr2 == endptr + 1 || *endptr2 != '\0')
{ {
fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-c"); pg_log_error("invalid argument for option %s", "-c");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
@ -201,14 +202,14 @@ main(int argc, char *argv[])
if (set_oldest_commit_ts_xid < 2 && if (set_oldest_commit_ts_xid < 2 &&
set_oldest_commit_ts_xid != 0) set_oldest_commit_ts_xid != 0)
{ {
fprintf(stderr, _("%s: transaction ID (-c) must be either 0 or greater than or equal to 2\n"), progname); pg_log_error("transaction ID (-c) must be either 0 or greater than or equal to 2");
exit(1); exit(1);
} }
if (set_newest_commit_ts_xid < 2 && if (set_newest_commit_ts_xid < 2 &&
set_newest_commit_ts_xid != 0) set_newest_commit_ts_xid != 0)
{ {
fprintf(stderr, _("%s: transaction ID (-c) must be either 0 or greater than or equal to 2\n"), progname); pg_log_error("transaction ID (-c) must be either 0 or greater than or equal to 2");
exit(1); exit(1);
} }
break; break;
@ -217,13 +218,13 @@ main(int argc, char *argv[])
set_oid = strtoul(optarg, &endptr, 0); set_oid = strtoul(optarg, &endptr, 0);
if (endptr == optarg || *endptr != '\0') if (endptr == optarg || *endptr != '\0')
{ {
fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-o"); pg_log_error("invalid argument for option %s", "-o");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
if (set_oid == 0) if (set_oid == 0)
{ {
fprintf(stderr, _("%s: OID (-o) must not be 0\n"), progname); pg_log_error("OID (-o) must not be 0");
exit(1); exit(1);
} }
break; break;
@ -232,7 +233,7 @@ main(int argc, char *argv[])
set_mxid = strtoul(optarg, &endptr, 0); set_mxid = strtoul(optarg, &endptr, 0);
if (endptr == optarg || *endptr != ',') if (endptr == optarg || *endptr != ',')
{ {
fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-m"); pg_log_error("invalid argument for option %s", "-m");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
@ -240,13 +241,13 @@ main(int argc, char *argv[])
set_oldestmxid = strtoul(endptr + 1, &endptr2, 0); set_oldestmxid = strtoul(endptr + 1, &endptr2, 0);
if (endptr2 == endptr + 1 || *endptr2 != '\0') if (endptr2 == endptr + 1 || *endptr2 != '\0')
{ {
fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-m"); pg_log_error("invalid argument for option %s", "-m");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
if (set_mxid == 0) if (set_mxid == 0)
{ {
fprintf(stderr, _("%s: multitransaction ID (-m) must not be 0\n"), progname); pg_log_error("multitransaction ID (-m) must not be 0");
exit(1); exit(1);
} }
@ -256,8 +257,7 @@ main(int argc, char *argv[])
*/ */
if (set_oldestmxid == 0) if (set_oldestmxid == 0)
{ {
fprintf(stderr, _("%s: oldest multitransaction ID (-m) must not be 0\n"), pg_log_error("oldest multitransaction ID (-m) must not be 0");
progname);
exit(1); exit(1);
} }
break; break;
@ -266,13 +266,13 @@ main(int argc, char *argv[])
set_mxoff = strtoul(optarg, &endptr, 0); set_mxoff = strtoul(optarg, &endptr, 0);
if (endptr == optarg || *endptr != '\0') if (endptr == optarg || *endptr != '\0')
{ {
fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-O"); pg_log_error("invalid argument for option %s", "-O");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
if (set_mxoff == -1) if (set_mxoff == -1)
{ {
fprintf(stderr, _("%s: multitransaction offset (-O) must not be -1\n"), progname); pg_log_error("multitransaction offset (-O) must not be -1");
exit(1); exit(1);
} }
break; break;
@ -280,7 +280,7 @@ main(int argc, char *argv[])
case 'l': case 'l':
if (strspn(optarg, "01234567890ABCDEFabcdef") != XLOG_FNAME_LEN) if (strspn(optarg, "01234567890ABCDEFabcdef") != XLOG_FNAME_LEN)
{ {
fprintf(stderr, _("%s: invalid argument for option %s\n"), progname, "-l"); pg_log_error("invalid argument for option %s", "-l");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
@ -296,16 +296,12 @@ main(int argc, char *argv[])
set_wal_segsize = strtol(optarg, &endptr, 10) * 1024 * 1024; set_wal_segsize = strtol(optarg, &endptr, 10) * 1024 * 1024;
if (endptr == optarg || *endptr != '\0') if (endptr == optarg || *endptr != '\0')
{ {
fprintf(stderr, pg_log_error("argument of --wal-segsize must be a number");
_("%s: argument of --wal-segsize must be a number\n"),
progname);
exit(1); exit(1);
} }
if (!IsValidWalSegSize(set_wal_segsize)) if (!IsValidWalSegSize(set_wal_segsize))
{ {
fprintf(stderr, pg_log_error("argument of --wal-segsize must be a power of 2 between 1 and 1024");
_("%s: argument of --wal-segsize must be a power of 2 between 1 and 1024\n"),
progname);
exit(1); exit(1);
} }
break; break;
@ -322,8 +318,8 @@ main(int argc, char *argv[])
/* Complain if any arguments remain */ /* Complain if any arguments remain */
if (optind < argc) if (optind < argc)
{ {
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), pg_log_error("too many command-line arguments (first is \"%s\")",
progname, argv[optind]); argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -331,7 +327,7 @@ main(int argc, char *argv[])
if (DataDir == NULL) if (DataDir == NULL)
{ {
fprintf(stderr, _("%s: no data directory specified\n"), progname); pg_log_error("no data directory specified");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
@ -345,21 +341,20 @@ main(int argc, char *argv[])
#ifndef WIN32 #ifndef WIN32
if (geteuid() == 0) if (geteuid() == 0)
{ {
fprintf(stderr, _("%s: cannot be executed by \"root\"\n"), pg_log_error("cannot be executed by \"root\"");
progname); pg_log_info("You must run %s as the PostgreSQL superuser.",
fprintf(stderr, _("You must run %s as the PostgreSQL superuser.\n"), progname);
progname);
exit(1); exit(1);
} }
#endif #endif
get_restricted_token(progname); get_restricted_token();
/* Set mask based on PGDATA permissions */ /* Set mask based on PGDATA permissions */
if (!GetDataDirectoryCreatePerm(DataDir)) if (!GetDataDirectoryCreatePerm(DataDir))
{ {
fprintf(stderr, _("%s: could not read permissions of directory \"%s\": %s\n"), pg_log_error("could not read permissions of directory \"%s\": %m",
progname, DataDir, strerror(errno)); DataDir);
exit(1); exit(1);
} }
@ -367,8 +362,8 @@ main(int argc, char *argv[])
if (chdir(DataDir) < 0) if (chdir(DataDir) < 0)
{ {
fprintf(stderr, _("%s: could not change directory to \"%s\": %s\n"), pg_log_error("could not change directory to \"%s\": %m",
progname, DataDir, strerror(errno)); DataDir);
exit(1); exit(1);
} }
@ -383,16 +378,15 @@ main(int argc, char *argv[])
{ {
if (errno != ENOENT) if (errno != ENOENT)
{ {
fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), pg_log_error("could not open file \"%s\" for reading: %m",
progname, "postmaster.pid", strerror(errno)); "postmaster.pid");
exit(1); exit(1);
} }
} }
else else
{ {
fprintf(stderr, _("%s: lock file \"%s\" exists\n" pg_log_error("lock file \"%s\" exists", "postmaster.pid");
"Is a server running? If not, delete the lock file and try again.\n"), pg_log_info("Is a server running? If not, delete the lock file and try again.");
progname, "postmaster.pid");
exit(1); exit(1);
} }
@ -548,8 +542,8 @@ CheckDataVersion(void)
if ((ver_fd = fopen(ver_file, "r")) == NULL) if ((ver_fd = fopen(ver_file, "r")) == NULL)
{ {
fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), pg_log_error("could not open file \"%s\" for reading: %m",
progname, ver_file, strerror(errno)); ver_file);
exit(1); exit(1);
} }
@ -557,15 +551,9 @@ CheckDataVersion(void)
if (!fgets(rawline, sizeof(rawline), ver_fd)) if (!fgets(rawline, sizeof(rawline), ver_fd))
{ {
if (!ferror(ver_fd)) if (!ferror(ver_fd))
{ pg_log_error("unexpected empty file \"%s\"", ver_file);
fprintf(stderr, _("%s: unexpected empty file \"%s\"\n"),
progname, ver_file);
}
else else
{ pg_log_error("could not read file \"%s\": %m", ver_file);
fprintf(stderr, _("%s: could not read file \"%s\": %s\n"),
progname, ver_file, strerror(errno));
}
exit(1); exit(1);
} }
@ -580,9 +568,9 @@ CheckDataVersion(void)
if (strcmp(rawline, PG_MAJORVERSION) != 0) if (strcmp(rawline, PG_MAJORVERSION) != 0)
{ {
fprintf(stderr, _("%s: data directory is of wrong version\n" pg_log_error("data directory is of wrong version");
"File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\".\n"), pg_log_info("File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\".",
progname, ver_file, rawline, PG_MAJORVERSION); ver_file, rawline, PG_MAJORVERSION);
exit(1); exit(1);
} }
@ -611,13 +599,13 @@ ReadControlFile(void)
* are we've been handed a bad DataDir path, so give up. User can do * are we've been handed a bad DataDir path, so give up. User can do
* "touch pg_control" to force us to proceed. * "touch pg_control" to force us to proceed.
*/ */
fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"), pg_log_error("could not open file \"%s\" for reading: %m",
progname, XLOG_CONTROL_FILE, strerror(errno)); XLOG_CONTROL_FILE);
if (errno == ENOENT) if (errno == ENOENT)
fprintf(stderr, _("If you are sure the data directory path is correct, execute\n" pg_log_info("If you are sure the data directory path is correct, execute\n"
" touch %s\n" " touch %s\n"
"and try again.\n"), "and try again.",
XLOG_CONTROL_FILE); XLOG_CONTROL_FILE);
exit(1); exit(1);
} }
@ -627,8 +615,7 @@ ReadControlFile(void)
len = read(fd, buffer, PG_CONTROL_FILE_SIZE); len = read(fd, buffer, PG_CONTROL_FILE_SIZE);
if (len < 0) if (len < 0)
{ {
fprintf(stderr, _("%s: could not read file \"%s\": %s\n"), pg_log_error("could not read file \"%s\": %m", XLOG_CONTROL_FILE);
progname, XLOG_CONTROL_FILE, strerror(errno));
exit(1); exit(1);
} }
close(fd); close(fd);
@ -646,9 +633,7 @@ ReadControlFile(void)
if (!EQ_CRC32C(crc, ((ControlFileData *) buffer)->crc)) if (!EQ_CRC32C(crc, ((ControlFileData *) buffer)->crc))
{ {
/* We will use the data but treat it as guessed. */ /* We will use the data but treat it as guessed. */
fprintf(stderr, pg_log_warning("pg_control exists but has invalid CRC; proceed with caution");
_("%s: pg_control exists but has invalid CRC; proceed with caution\n"),
progname);
guessed = true; guessed = true;
} }
@ -657,11 +642,10 @@ ReadControlFile(void)
/* return false if WAL segment size is not valid */ /* return false if WAL segment size is not valid */
if (!IsValidWalSegSize(ControlFile.xlog_seg_size)) if (!IsValidWalSegSize(ControlFile.xlog_seg_size))
{ {
fprintf(stderr, pg_log_warning(ngettext("pg_control specifies invalid WAL segment size (%d byte); proceed with caution",
ngettext("%s: pg_control specifies invalid WAL segment size (%d byte); proceed with caution\n", "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution",
"%s: pg_control specifies invalid WAL segment size (%d bytes); proceed with caution\n", ControlFile.xlog_seg_size),
ControlFile.xlog_seg_size), ControlFile.xlog_seg_size);
progname, ControlFile.xlog_seg_size);
return false; return false;
} }
@ -669,8 +653,7 @@ ReadControlFile(void)
} }
/* Looks like it's a mess. */ /* Looks like it's a mess. */
fprintf(stderr, _("%s: pg_control exists but is broken or wrong version; ignoring it\n"), pg_log_warning("pg_control exists but is broken or wrong version; ignoring it");
progname);
return false; return false;
} }
@ -953,7 +936,7 @@ RewriteControlFile(void)
ControlFile.max_locks_per_xact = 64; ControlFile.max_locks_per_xact = 64;
/* The control file gets flushed here. */ /* The control file gets flushed here. */
update_controlfile(".", progname, &ControlFile, true); update_controlfile(".", &ControlFile, true);
} }
@ -989,8 +972,7 @@ FindEndOfXLOG(void)
xldir = opendir(XLOGDIR); xldir = opendir(XLOGDIR);
if (xldir == NULL) if (xldir == NULL)
{ {
fprintf(stderr, _("%s: could not open directory \"%s\": %s\n"), pg_log_error("could not open directory \"%s\": %m", XLOGDIR);
progname, XLOGDIR, strerror(errno));
exit(1); exit(1);
} }
@ -1025,15 +1007,13 @@ FindEndOfXLOG(void)
if (errno) if (errno)
{ {
fprintf(stderr, _("%s: could not read directory \"%s\": %s\n"), pg_log_error("could not read directory \"%s\": %m", XLOGDIR);
progname, XLOGDIR, strerror(errno));
exit(1); exit(1);
} }
if (closedir(xldir)) if (closedir(xldir))
{ {
fprintf(stderr, _("%s: could not close directory \"%s\": %s\n"), pg_log_error("could not close directory \"%s\": %m", XLOGDIR);
progname, XLOGDIR, strerror(errno));
exit(1); exit(1);
} }
@ -1060,8 +1040,7 @@ KillExistingXLOG(void)
xldir = opendir(XLOGDIR); xldir = opendir(XLOGDIR);
if (xldir == NULL) if (xldir == NULL)
{ {
fprintf(stderr, _("%s: could not open directory \"%s\": %s\n"), pg_log_error("could not open directory \"%s\": %m", XLOGDIR);
progname, XLOGDIR, strerror(errno));
exit(1); exit(1);
} }
@ -1073,8 +1052,7 @@ KillExistingXLOG(void)
snprintf(path, sizeof(path), "%s/%s", XLOGDIR, xlde->d_name); snprintf(path, sizeof(path), "%s/%s", XLOGDIR, xlde->d_name);
if (unlink(path) < 0) if (unlink(path) < 0)
{ {
fprintf(stderr, _("%s: could not delete file \"%s\": %s\n"), pg_log_error("could not delete file \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
} }
@ -1082,15 +1060,13 @@ KillExistingXLOG(void)
if (errno) if (errno)
{ {
fprintf(stderr, _("%s: could not read directory \"%s\": %s\n"), pg_log_error("could not read directory \"%s\": %m", XLOGDIR);
progname, XLOGDIR, strerror(errno));
exit(1); exit(1);
} }
if (closedir(xldir)) if (closedir(xldir))
{ {
fprintf(stderr, _("%s: could not close directory \"%s\": %s\n"), pg_log_error("could not close directory \"%s\": %m", XLOGDIR);
progname, XLOGDIR, strerror(errno));
exit(1); exit(1);
} }
} }
@ -1111,8 +1087,7 @@ KillExistingArchiveStatus(void)
xldir = opendir(ARCHSTATDIR); xldir = opendir(ARCHSTATDIR);
if (xldir == NULL) if (xldir == NULL)
{ {
fprintf(stderr, _("%s: could not open directory \"%s\": %s\n"), pg_log_error("could not open directory \"%s\": %m", ARCHSTATDIR);
progname, ARCHSTATDIR, strerror(errno));
exit(1); exit(1);
} }
@ -1127,8 +1102,7 @@ KillExistingArchiveStatus(void)
snprintf(path, sizeof(path), "%s/%s", ARCHSTATDIR, xlde->d_name); snprintf(path, sizeof(path), "%s/%s", ARCHSTATDIR, xlde->d_name);
if (unlink(path) < 0) if (unlink(path) < 0)
{ {
fprintf(stderr, _("%s: could not delete file \"%s\": %s\n"), pg_log_error("could not delete file \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
} }
@ -1136,15 +1110,13 @@ KillExistingArchiveStatus(void)
if (errno) if (errno)
{ {
fprintf(stderr, _("%s: could not read directory \"%s\": %s\n"), pg_log_error("could not read directory \"%s\": %m", ARCHSTATDIR);
progname, ARCHSTATDIR, strerror(errno));
exit(1); exit(1);
} }
if (closedir(xldir)) if (closedir(xldir))
{ {
fprintf(stderr, _("%s: could not close directory \"%s\": %s\n"), pg_log_error("could not close directory \"%s\": %m", ARCHSTATDIR);
progname, ARCHSTATDIR, strerror(errno));
exit(1); exit(1);
} }
} }
@ -1211,8 +1183,7 @@ WriteEmptyXLOG(void)
pg_file_create_mode); pg_file_create_mode);
if (fd < 0) if (fd < 0)
{ {
fprintf(stderr, _("%s: could not open file \"%s\": %s\n"), pg_log_error("could not open file \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
@ -1222,8 +1193,7 @@ WriteEmptyXLOG(void)
/* if write didn't set errno, assume problem is no disk space */ /* if write didn't set errno, assume problem is no disk space */
if (errno == 0) if (errno == 0)
errno = ENOSPC; errno = ENOSPC;
fprintf(stderr, _("%s: could not write file \"%s\": %s\n"), pg_log_error("could not write file \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
@ -1236,15 +1206,14 @@ WriteEmptyXLOG(void)
{ {
if (errno == 0) if (errno == 0)
errno = ENOSPC; errno = ENOSPC;
fprintf(stderr, _("%s: could not write file \"%s\": %s\n"), pg_log_error("could not write file \"%s\": %m", path);
progname, path, strerror(errno));
exit(1); exit(1);
} }
} }
if (fsync(fd) != 0) if (fsync(fd) != 0)
{ {
fprintf(stderr, _("%s: fsync error: %s\n"), progname, strerror(errno)); pg_log_error("fsync error: %m");
exit(1); exit(1);
} }

View File

@ -32,7 +32,7 @@ command_checks_all(
0, 0,
[qr/pg_control version number/], [qr/pg_control version number/],
[ [
qr/pg_resetwal: pg_control exists but is broken or wrong version; ignoring it/ qr/pg_resetwal: warning: pg_control exists but is broken or wrong version; ignoring it/
], ],
'processes corrupted pg_control all zeroes'); 'processes corrupted pg_control all zeroes');
@ -48,6 +48,6 @@ command_checks_all(
0, 0,
[qr/pg_control version number/], [qr/pg_control version number/],
[ [
qr/\Qpg_resetwal: pg_control specifies invalid WAL segment size (0 bytes); proceed with caution\E/ qr/\Qpg_resetwal: warning: pg_control specifies invalid WAL segment size (0 bytes); proceed with caution\E/
], ],
'processes zero WAL segment size'); 'processes zero WAL segment size');

View File

@ -16,7 +16,7 @@ top_builddir = ../../..
include $(top_builddir)/src/Makefile.global include $(top_builddir)/src/Makefile.global
override CPPFLAGS := -I$(libpq_srcdir) -DFRONTEND $(CPPFLAGS) override CPPFLAGS := -I$(libpq_srcdir) -DFRONTEND $(CPPFLAGS)
LDFLAGS_INTERNAL += $(libpq_pgport) LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
OBJS = pg_rewind.o parsexlog.o xlogreader.o datapagemap.o timeline.o \ OBJS = pg_rewind.o parsexlog.o xlogreader.o datapagemap.o timeline.o \
fetch.o file_ops.o copy_fetch.o libpq_fetch.o filemap.o logging.o \ fetch.o file_ops.o copy_fetch.o libpq_fetch.o filemap.o logging.o \
@ -26,7 +26,7 @@ EXTRA_CLEAN = xlogreader.c
all: pg_rewind all: pg_rewind
pg_rewind: $(OBJS) | submake-libpq submake-libpgport pg_rewind: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/% xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/%

View File

@ -57,8 +57,8 @@ recurse_dir(const char *datadir, const char *parentpath,
xldir = opendir(fullparentpath); xldir = opendir(fullparentpath);
if (xldir == NULL) if (xldir == NULL)
pg_fatal("could not open directory \"%s\": %s\n", pg_fatal("could not open directory \"%s\": %m",
fullparentpath, strerror(errno)); fullparentpath);
while (errno = 0, (xlde = readdir(xldir)) != NULL) while (errno = 0, (xlde = readdir(xldir)) != NULL)
{ {
@ -86,8 +86,8 @@ recurse_dir(const char *datadir, const char *parentpath,
*/ */
} }
else else
pg_fatal("could not stat file \"%s\": %s\n", pg_fatal("could not stat file \"%s\": %m",
fullpath, strerror(errno)); fullpath);
} }
if (parentpath) if (parentpath)
@ -115,10 +115,10 @@ recurse_dir(const char *datadir, const char *parentpath,
len = readlink(fullpath, link_target, sizeof(link_target)); len = readlink(fullpath, link_target, sizeof(link_target));
if (len < 0) if (len < 0)
pg_fatal("could not read symbolic link \"%s\": %s\n", pg_fatal("could not read symbolic link \"%s\": %m",
fullpath, strerror(errno)); fullpath);
if (len >= sizeof(link_target)) if (len >= sizeof(link_target))
pg_fatal("symbolic link \"%s\" target is too long\n", pg_fatal("symbolic link \"%s\" target is too long",
fullpath); fullpath);
link_target[len] = '\0'; link_target[len] = '\0';
@ -133,19 +133,19 @@ recurse_dir(const char *datadir, const char *parentpath,
strcmp(path, "pg_wal") == 0) strcmp(path, "pg_wal") == 0)
recurse_dir(datadir, path, callback); recurse_dir(datadir, path, callback);
#else #else
pg_fatal("\"%s\" is a symbolic link, but symbolic links are not supported on this platform\n", pg_fatal("\"%s\" is a symbolic link, but symbolic links are not supported on this platform",
fullpath); fullpath);
#endif /* HAVE_READLINK */ #endif /* HAVE_READLINK */
} }
} }
if (errno) if (errno)
pg_fatal("could not read directory \"%s\": %s\n", pg_fatal("could not read directory \"%s\": %m",
fullparentpath, strerror(errno)); fullparentpath);
if (closedir(xldir)) if (closedir(xldir))
pg_fatal("could not close directory \"%s\": %s\n", pg_fatal("could not close directory \"%s\": %m",
fullparentpath, strerror(errno)); fullparentpath);
} }
/* /*
@ -164,11 +164,11 @@ rewind_copy_file_range(const char *path, off_t begin, off_t end, bool trunc)
srcfd = open(srcpath, O_RDONLY | PG_BINARY, 0); srcfd = open(srcpath, O_RDONLY | PG_BINARY, 0);
if (srcfd < 0) if (srcfd < 0)
pg_fatal("could not open source file \"%s\": %s\n", pg_fatal("could not open source file \"%s\": %m",
srcpath, strerror(errno)); srcpath);
if (lseek(srcfd, begin, SEEK_SET) == -1) if (lseek(srcfd, begin, SEEK_SET) == -1)
pg_fatal("could not seek in source file: %s\n", strerror(errno)); pg_fatal("could not seek in source file: %m");
open_target_file(path, trunc); open_target_file(path, trunc);
@ -185,17 +185,17 @@ rewind_copy_file_range(const char *path, off_t begin, off_t end, bool trunc)
readlen = read(srcfd, buf.data, len); readlen = read(srcfd, buf.data, len);
if (readlen < 0) if (readlen < 0)
pg_fatal("could not read file \"%s\": %s\n", pg_fatal("could not read file \"%s\": %m",
srcpath, strerror(errno)); srcpath);
else if (readlen == 0) else if (readlen == 0)
pg_fatal("unexpected EOF while reading file \"%s\"\n", srcpath); pg_fatal("unexpected EOF while reading file \"%s\"", srcpath);
write_target_range(buf.data, begin, readlen); write_target_range(buf.data, begin, readlen);
begin += readlen; begin += readlen;
} }
if (close(srcfd) != 0) if (close(srcfd) != 0)
pg_fatal("could not close file \"%s\": %s\n", srcpath, strerror(errno)); pg_fatal("could not close file \"%s\": %m", srcpath);
} }
/* /*

View File

@ -13,7 +13,8 @@
#include "postgres_fe.h" #include "postgres_fe.h"
#include "datapagemap.h" #include "datapagemap.h"
#include "logging.h"
#include "fe_utils/logging.h"
struct datapagemap_iterator struct datapagemap_iterator
{ {
@ -121,7 +122,7 @@ datapagemap_print(datapagemap_t *map)
iter = datapagemap_iterate(map); iter = datapagemap_iterate(map);
while (datapagemap_next(iter, &blocknum)) while (datapagemap_next(iter, &blocknum))
pg_log(PG_DEBUG, " block %u\n", blocknum); pg_log_debug("block %u", blocknum);
pg_free(iter); pg_free(iter);
} }

View File

@ -60,8 +60,8 @@ open_target_file(const char *path, bool trunc)
mode |= O_TRUNC; mode |= O_TRUNC;
dstfd = open(dstpath, mode, pg_file_create_mode); dstfd = open(dstpath, mode, pg_file_create_mode);
if (dstfd < 0) if (dstfd < 0)
pg_fatal("could not open target file \"%s\": %s\n", pg_fatal("could not open target file \"%s\": %m",
dstpath, strerror(errno)); dstpath);
} }
/* /*
@ -74,8 +74,8 @@ close_target_file(void)
return; return;
if (close(dstfd) != 0) if (close(dstfd) != 0)
pg_fatal("could not close target file \"%s\": %s\n", pg_fatal("could not close target file \"%s\": %m",
dstpath, strerror(errno)); dstpath);
dstfd = -1; dstfd = -1;
} }
@ -94,8 +94,8 @@ write_target_range(char *buf, off_t begin, size_t size)
return; return;
if (lseek(dstfd, begin, SEEK_SET) == -1) if (lseek(dstfd, begin, SEEK_SET) == -1)
pg_fatal("could not seek in target file \"%s\": %s\n", pg_fatal("could not seek in target file \"%s\": %m",
dstpath, strerror(errno)); dstpath);
writeleft = size; writeleft = size;
p = buf; p = buf;
@ -110,8 +110,8 @@ write_target_range(char *buf, off_t begin, size_t size)
/* if write didn't set errno, assume problem is no disk space */ /* if write didn't set errno, assume problem is no disk space */
if (errno == 0) if (errno == 0)
errno = ENOSPC; errno = ENOSPC;
pg_fatal("could not write file \"%s\": %s\n", pg_fatal("could not write file \"%s\": %m",
dstpath, strerror(errno)); dstpath);
} }
p += writelen; p += writelen;
@ -160,7 +160,7 @@ create_target(file_entry_t *entry)
case FILE_TYPE_REGULAR: case FILE_TYPE_REGULAR:
/* can't happen. Regular files are created with open_target_file. */ /* can't happen. Regular files are created with open_target_file. */
pg_fatal("invalid action (CREATE) for regular file\n"); pg_fatal("invalid action (CREATE) for regular file");
break; break;
} }
} }
@ -183,8 +183,8 @@ remove_target_file(const char *path, bool missing_ok)
if (errno == ENOENT && missing_ok) if (errno == ENOENT && missing_ok)
return; return;
pg_fatal("could not remove file \"%s\": %s\n", pg_fatal("could not remove file \"%s\": %m",
dstpath, strerror(errno)); dstpath);
} }
} }
@ -201,12 +201,12 @@ truncate_target_file(const char *path, off_t newsize)
fd = open(dstpath, O_WRONLY, pg_file_create_mode); fd = open(dstpath, O_WRONLY, pg_file_create_mode);
if (fd < 0) if (fd < 0)
pg_fatal("could not open file \"%s\" for truncation: %s\n", pg_fatal("could not open file \"%s\" for truncation: %m",
dstpath, strerror(errno)); dstpath);
if (ftruncate(fd, newsize) != 0) if (ftruncate(fd, newsize) != 0)
pg_fatal("could not truncate file \"%s\" to %u: %s\n", pg_fatal("could not truncate file \"%s\" to %u: %m",
dstpath, (unsigned int) newsize, strerror(errno)); dstpath, (unsigned int) newsize);
close(fd); close(fd);
} }
@ -221,8 +221,8 @@ create_target_dir(const char *path)
snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path); snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
if (mkdir(dstpath, pg_dir_create_mode) != 0) if (mkdir(dstpath, pg_dir_create_mode) != 0)
pg_fatal("could not create directory \"%s\": %s\n", pg_fatal("could not create directory \"%s\": %m",
dstpath, strerror(errno)); dstpath);
} }
static void static void
@ -235,8 +235,8 @@ remove_target_dir(const char *path)
snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path); snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
if (rmdir(dstpath) != 0) if (rmdir(dstpath) != 0)
pg_fatal("could not remove directory \"%s\": %s\n", pg_fatal("could not remove directory \"%s\": %m",
dstpath, strerror(errno)); dstpath);
} }
static void static void
@ -249,8 +249,8 @@ create_target_symlink(const char *path, const char *link)
snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path); snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
if (symlink(link, dstpath) != 0) if (symlink(link, dstpath) != 0)
pg_fatal("could not create symbolic link at \"%s\": %s\n", pg_fatal("could not create symbolic link at \"%s\": %m",
dstpath, strerror(errno)); dstpath);
} }
static void static void
@ -263,8 +263,8 @@ remove_target_symlink(const char *path)
snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path); snprintf(dstpath, sizeof(dstpath), "%s/%s", datadir_target, path);
if (unlink(dstpath) != 0) if (unlink(dstpath) != 0)
pg_fatal("could not remove symbolic link \"%s\": %s\n", pg_fatal("could not remove symbolic link \"%s\": %m",
dstpath, strerror(errno)); dstpath);
} }
@ -294,12 +294,12 @@ slurpFile(const char *datadir, const char *path, size_t *filesize)
snprintf(fullpath, sizeof(fullpath), "%s/%s", datadir, path); snprintf(fullpath, sizeof(fullpath), "%s/%s", datadir, path);
if ((fd = open(fullpath, O_RDONLY | PG_BINARY, 0)) == -1) if ((fd = open(fullpath, O_RDONLY | PG_BINARY, 0)) == -1)
pg_fatal("could not open file \"%s\" for reading: %s\n", pg_fatal("could not open file \"%s\" for reading: %m",
fullpath, strerror(errno)); fullpath);
if (fstat(fd, &statbuf) < 0) if (fstat(fd, &statbuf) < 0)
pg_fatal("could not open file \"%s\" for reading: %s\n", pg_fatal("could not open file \"%s\" for reading: %m",
fullpath, strerror(errno)); fullpath);
len = statbuf.st_size; len = statbuf.st_size;
@ -309,10 +309,10 @@ slurpFile(const char *datadir, const char *path, size_t *filesize)
if (r != len) if (r != len)
{ {
if (r < 0) if (r < 0)
pg_fatal("could not read file \"%s\": %s\n", pg_fatal("could not read file \"%s\": %m",
fullpath, strerror(errno)); fullpath);
else else
pg_fatal("could not read file \"%s\": read %d of %zu\n", pg_fatal("could not read file \"%s\": read %d of %zu",
fullpath, r, (Size) len); fullpath, r, (Size) len);
} }
close(fd); close(fd);

View File

@ -20,6 +20,7 @@
#include "common/string.h" #include "common/string.h"
#include "catalog/pg_tablespace_d.h" #include "catalog/pg_tablespace_d.h"
#include "fe_utils/logging.h"
#include "storage/fd.h" #include "storage/fd.h"
filemap_t *filemap = NULL; filemap_t *filemap = NULL;
@ -177,7 +178,7 @@ process_source_file(const char *path, file_type_t type, size_t newsize,
* regular file * regular file
*/ */
if (type != FILE_TYPE_REGULAR && isRelDataFile(path)) if (type != FILE_TYPE_REGULAR && isRelDataFile(path))
pg_fatal("data file \"%s\" in source is not a regular file\n", path); pg_fatal("data file \"%s\" in source is not a regular file", path);
snprintf(localpath, sizeof(localpath), "%s/%s", datadir_target, path); snprintf(localpath, sizeof(localpath), "%s/%s", datadir_target, path);
@ -185,8 +186,8 @@ process_source_file(const char *path, file_type_t type, size_t newsize,
if (lstat(localpath, &statbuf) < 0) if (lstat(localpath, &statbuf) < 0)
{ {
if (errno != ENOENT) if (errno != ENOENT)
pg_fatal("could not stat file \"%s\": %s\n", pg_fatal("could not stat file \"%s\": %m",
localpath, strerror(errno)); localpath);
exists = false; exists = false;
} }
@ -199,7 +200,7 @@ process_source_file(const char *path, file_type_t type, size_t newsize,
if (exists && !S_ISDIR(statbuf.st_mode) && strcmp(path, "pg_wal") != 0) if (exists && !S_ISDIR(statbuf.st_mode) && strcmp(path, "pg_wal") != 0)
{ {
/* it's a directory in source, but not in target. Strange.. */ /* it's a directory in source, but not in target. Strange.. */
pg_fatal("\"%s\" is not a directory\n", localpath); pg_fatal("\"%s\" is not a directory", localpath);
} }
if (!exists) if (!exists)
@ -222,7 +223,7 @@ process_source_file(const char *path, file_type_t type, size_t newsize,
* It's a symbolic link in source, but not in target. * It's a symbolic link in source, but not in target.
* Strange.. * Strange..
*/ */
pg_fatal("\"%s\" is not a symbolic link\n", localpath); pg_fatal("\"%s\" is not a symbolic link", localpath);
} }
if (!exists) if (!exists)
@ -234,7 +235,7 @@ process_source_file(const char *path, file_type_t type, size_t newsize,
case FILE_TYPE_REGULAR: case FILE_TYPE_REGULAR:
if (exists && !S_ISREG(statbuf.st_mode)) if (exists && !S_ISREG(statbuf.st_mode))
pg_fatal("\"%s\" is not a regular file\n", localpath); pg_fatal("\"%s\" is not a regular file", localpath);
if (!exists || !isRelDataFile(path)) if (!exists || !isRelDataFile(path))
{ {
@ -346,8 +347,8 @@ process_target_file(const char *path, file_type_t type, size_t oldsize,
if (lstat(localpath, &statbuf) < 0) if (lstat(localpath, &statbuf) < 0)
{ {
if (errno != ENOENT) if (errno != ENOENT)
pg_fatal("could not stat file \"%s\": %s\n", pg_fatal("could not stat file \"%s\": %m",
localpath, strerror(errno)); localpath);
exists = false; exists = false;
} }
@ -358,7 +359,7 @@ process_target_file(const char *path, file_type_t type, size_t oldsize,
if (map->nlist == 0) if (map->nlist == 0)
{ {
/* should not happen */ /* should not happen */
pg_fatal("source file list is empty\n"); pg_fatal("source file list is empty");
} }
filemap_list_to_array(map); filemap_list_to_array(map);
@ -473,7 +474,7 @@ process_block_change(ForkNumber forknum, RelFileNode rnode, BlockNumber blkno)
break; break;
case FILE_ACTION_CREATE: case FILE_ACTION_CREATE:
pg_fatal("unexpected page modification for directory or symbolic link \"%s\"\n", entry->path); pg_fatal("unexpected page modification for directory or symbolic link \"%s\"", entry->path);
} }
} }
else else
@ -508,10 +509,10 @@ check_file_excluded(const char *path, bool is_source)
if (strcmp(filename, excludeFiles[excludeIdx]) == 0) if (strcmp(filename, excludeFiles[excludeIdx]) == 0)
{ {
if (is_source) if (is_source)
pg_log(PG_DEBUG, "entry \"%s\" excluded from source file list\n", pg_log_debug("entry \"%s\" excluded from source file list",
path); path);
else else
pg_log(PG_DEBUG, "entry \"%s\" excluded from target file list\n", pg_log_debug("entry \"%s\" excluded from target file list",
path); path);
return true; return true;
} }
@ -528,10 +529,10 @@ check_file_excluded(const char *path, bool is_source)
if (strstr(path, localpath) == path) if (strstr(path, localpath) == path)
{ {
if (is_source) if (is_source)
pg_log(PG_DEBUG, "entry \"%s\" excluded from source file list\n", pg_log_debug("entry \"%s\" excluded from source file list",
path); path);
else else
pg_log(PG_DEBUG, "entry \"%s\" excluded from target file list\n", pg_log_debug("entry \"%s\" excluded from target file list",
path); path);
return true; return true;
} }
@ -659,10 +660,7 @@ print_filemap(void)
if (entry->action != FILE_ACTION_NONE || if (entry->action != FILE_ACTION_NONE ||
entry->pagemap.bitmapsize > 0) entry->pagemap.bitmapsize > 0)
{ {
pg_log(PG_DEBUG, pg_log_debug("%s (%s)", entry->path,
/*------
translator: first %s is a file path, second is a keyword such as COPY */
"%s (%s)\n", entry->path,
action_to_str(entry->action)); action_to_str(entry->action));
if (entry->pagemap.bitmapsize > 0) if (entry->pagemap.bitmapsize > 0)

View File

@ -24,6 +24,7 @@
#include "libpq-fe.h" #include "libpq-fe.h"
#include "catalog/pg_type_d.h" #include "catalog/pg_type_d.h"
#include "fe_utils/connect.h" #include "fe_utils/connect.h"
#include "fe_utils/logging.h"
#include "port/pg_bswap.h" #include "port/pg_bswap.h"
static PGconn *conn = NULL; static PGconn *conn = NULL;
@ -52,7 +53,8 @@ libpqConnect(const char *connstr)
pg_fatal("could not connect to server: %s", pg_fatal("could not connect to server: %s",
PQerrorMessage(conn)); PQerrorMessage(conn));
pg_log(PG_PROGRESS, "connected to server\n"); if (showprogress)
pg_log_info("connected to server");
res = PQexec(conn, ALWAYS_SECURE_SEARCH_PATH_SQL); res = PQexec(conn, ALWAYS_SECURE_SEARCH_PATH_SQL);
if (PQresultStatus(res) != PGRES_TUPLES_OK) if (PQresultStatus(res) != PGRES_TUPLES_OK)
@ -68,7 +70,7 @@ libpqConnect(const char *connstr)
*/ */
str = run_simple_query("SELECT pg_is_in_recovery()"); str = run_simple_query("SELECT pg_is_in_recovery()");
if (strcmp(str, "f") != 0) if (strcmp(str, "f") != 0)
pg_fatal("source server must not be in recovery mode\n"); pg_fatal("source server must not be in recovery mode");
pg_free(str); pg_free(str);
/* /*
@ -78,7 +80,7 @@ libpqConnect(const char *connstr)
*/ */
str = run_simple_query("SHOW full_page_writes"); str = run_simple_query("SHOW full_page_writes");
if (strcmp(str, "on") != 0) if (strcmp(str, "on") != 0)
pg_fatal("full_page_writes must be enabled in the source server\n"); pg_fatal("full_page_writes must be enabled in the source server");
pg_free(str); pg_free(str);
/* /*
@ -113,7 +115,7 @@ run_simple_query(const char *sql)
/* sanity check the result set */ /* sanity check the result set */
if (PQnfields(res) != 1 || PQntuples(res) != 1 || PQgetisnull(res, 0, 0)) if (PQnfields(res) != 1 || PQntuples(res) != 1 || PQgetisnull(res, 0, 0))
pg_fatal("unexpected result set from query\n"); pg_fatal("unexpected result set from query");
result = pg_strdup(PQgetvalue(res, 0, 0)); result = pg_strdup(PQgetvalue(res, 0, 0));
@ -136,7 +138,7 @@ libpqGetCurrentXlogInsertLocation(void)
val = run_simple_query("SELECT pg_current_wal_insert_lsn()"); val = run_simple_query("SELECT pg_current_wal_insert_lsn()");
if (sscanf(val, "%X/%X", &hi, &lo) != 2) if (sscanf(val, "%X/%X", &hi, &lo) != 2)
pg_fatal("unrecognized result \"%s\" for current WAL insert location\n", val); pg_fatal("unrecognized result \"%s\" for current WAL insert location", val);
result = ((uint64) hi) << 32 | lo; result = ((uint64) hi) << 32 | lo;
@ -191,7 +193,7 @@ libpqProcessFileList(void)
/* sanity check the result set */ /* sanity check the result set */
if (PQnfields(res) != 4) if (PQnfields(res) != 4)
pg_fatal("unexpected result set while fetching file list\n"); pg_fatal("unexpected result set while fetching file list");
/* Read result to local variables */ /* Read result to local variables */
for (i = 0; i < PQntuples(res); i++) for (i = 0; i < PQntuples(res); i++)
@ -241,10 +243,10 @@ receiveFileChunks(const char *sql)
if (PQsendQueryParams(conn, sql, 0, NULL, NULL, NULL, NULL, 1) != 1) if (PQsendQueryParams(conn, sql, 0, NULL, NULL, NULL, NULL, 1) != 1)
pg_fatal("could not send query: %s", PQerrorMessage(conn)); pg_fatal("could not send query: %s", PQerrorMessage(conn));
pg_log(PG_DEBUG, "getting file chunks\n"); pg_log_debug("getting file chunks");
if (PQsetSingleRowMode(conn) != 1) if (PQsetSingleRowMode(conn) != 1)
pg_fatal("could not set libpq connection to single row mode\n"); pg_fatal("could not set libpq connection to single row mode");
while ((res = PQgetResult(conn)) != NULL) while ((res = PQgetResult(conn)) != NULL)
{ {
@ -271,13 +273,13 @@ receiveFileChunks(const char *sql)
/* sanity check the result set */ /* sanity check the result set */
if (PQnfields(res) != 3 || PQntuples(res) != 1) if (PQnfields(res) != 3 || PQntuples(res) != 1)
pg_fatal("unexpected result set size while fetching remote files\n"); pg_fatal("unexpected result set size while fetching remote files");
if (PQftype(res, 0) != TEXTOID || if (PQftype(res, 0) != TEXTOID ||
PQftype(res, 1) != INT8OID || PQftype(res, 1) != INT8OID ||
PQftype(res, 2) != BYTEAOID) PQftype(res, 2) != BYTEAOID)
{ {
pg_fatal("unexpected data types in result set while fetching remote files: %u %u %u\n", pg_fatal("unexpected data types in result set while fetching remote files: %u %u %u",
PQftype(res, 0), PQftype(res, 1), PQftype(res, 2)); PQftype(res, 0), PQftype(res, 1), PQftype(res, 2));
} }
@ -285,17 +287,17 @@ receiveFileChunks(const char *sql)
PQfformat(res, 1) != 1 && PQfformat(res, 1) != 1 &&
PQfformat(res, 2) != 1) PQfformat(res, 2) != 1)
{ {
pg_fatal("unexpected result format while fetching remote files\n"); pg_fatal("unexpected result format while fetching remote files");
} }
if (PQgetisnull(res, 0, 0) || if (PQgetisnull(res, 0, 0) ||
PQgetisnull(res, 0, 1)) PQgetisnull(res, 0, 1))
{ {
pg_fatal("unexpected null values in result while fetching remote files\n"); pg_fatal("unexpected null values in result while fetching remote files");
} }
if (PQgetlength(res, 0, 1) != sizeof(int64)) if (PQgetlength(res, 0, 1) != sizeof(int64))
pg_fatal("unexpected result length while fetching remote files\n"); pg_fatal("unexpected result length while fetching remote files");
/* Read result set to local variables */ /* Read result set to local variables */
memcpy(&chunkoff, PQgetvalue(res, 0, 1), sizeof(int64)); memcpy(&chunkoff, PQgetvalue(res, 0, 1), sizeof(int64));
@ -319,8 +321,7 @@ receiveFileChunks(const char *sql)
*/ */
if (PQgetisnull(res, 0, 2)) if (PQgetisnull(res, 0, 2))
{ {
pg_log(PG_DEBUG, pg_log_debug("received null value for chunk for file \"%s\", file has been deleted",
"received null value for chunk for file \"%s\", file has been deleted\n",
filename); filename);
remove_target_file(filename, true); remove_target_file(filename, true);
pg_free(filename); pg_free(filename);
@ -333,7 +334,7 @@ receiveFileChunks(const char *sql)
* translatable strings. * translatable strings.
*/ */
snprintf(chunkoff_str, sizeof(chunkoff_str), INT64_FORMAT, chunkoff); snprintf(chunkoff_str, sizeof(chunkoff_str), INT64_FORMAT, chunkoff);
pg_log(PG_DEBUG, "received chunk for file \"%s\", offset %s, size %d\n", pg_log_debug("received chunk for file \"%s\", offset %s, size %d",
filename, chunkoff_str, chunksize); filename, chunkoff_str, chunksize);
open_target_file(filename, false); open_target_file(filename, false);
@ -367,7 +368,7 @@ libpqGetFile(const char *filename, size_t *filesize)
/* sanity check the result set */ /* sanity check the result set */
if (PQntuples(res) != 1 || PQgetisnull(res, 0, 0)) if (PQntuples(res) != 1 || PQgetisnull(res, 0, 0))
pg_fatal("unexpected result set while fetching remote file \"%s\"\n", pg_fatal("unexpected result set while fetching remote file \"%s\"",
filename); filename);
/* Read result to local variables */ /* Read result to local variables */
@ -378,7 +379,7 @@ libpqGetFile(const char *filename, size_t *filesize)
PQclear(res); PQclear(res);
pg_log(PG_DEBUG, "fetched file \"%s\", length %d\n", filename, len); pg_log_debug("fetched file \"%s\", length %d", filename, len);
if (filesize) if (filesize)
*filesize = len; *filesize = len;

View File

@ -23,72 +23,6 @@ uint64 fetch_done;
static pg_time_t last_progress_report = 0; static pg_time_t last_progress_report = 0;
#define QUERY_ALLOC 8192
static
pg_attribute_printf(2, 0)
void
pg_log_v(eLogType type, const char *fmt, va_list ap)
{
char message[QUERY_ALLOC];
vsnprintf(message, sizeof(message), _(fmt), ap);
switch (type)
{
case PG_DEBUG:
if (debug)
printf("%s", message);
break;
case PG_PROGRESS:
if (showprogress)
printf("%s", message);
break;
case PG_WARNING:
printf("%s", message);
break;
case PG_FATAL:
printf("\n%s", message);
printf("%s", _("Failure, exiting\n"));
exit(1);
break;
default:
break;
}
fflush(stdout);
}
void
pg_log(eLogType type, const char *fmt,...)
{
va_list args;
va_start(args, fmt);
pg_log_v(type, fmt, args);
va_end(args);
}
/*
* Print an error message, and exit.
*/
void
pg_fatal(const char *fmt,...)
{
va_list args;
va_start(args, fmt);
pg_log_v(PG_FATAL, fmt, args);
va_end(args);
/* should not get here, pg_log_v() exited already */
exit(1);
}
/* /*
* Print a progress report based on the global variables. * Print a progress report based on the global variables.
@ -135,8 +69,11 @@ progress_report(bool force)
snprintf(fetch_size_str, sizeof(fetch_size_str), INT64_FORMAT, snprintf(fetch_size_str, sizeof(fetch_size_str), INT64_FORMAT,
fetch_size / 1024); fetch_size / 1024);
pg_log(PG_PROGRESS, "%*s/%s kB (%d%%) copied", fprintf(stderr, _("%*s/%s kB (%d%%) copied"),
(int) strlen(fetch_size_str), fetch_done_str, fetch_size_str, (int) strlen(fetch_size_str), fetch_done_str, fetch_size_str,
percent); percent);
printf("\r"); if (isatty(fileno(stderr)))
fprintf(stderr, "\r");
else
fprintf(stderr, "\n");
} }

View File

@ -12,24 +12,14 @@
#ifndef PG_REWIND_LOGGING_H #ifndef PG_REWIND_LOGGING_H
#define PG_REWIND_LOGGING_H #define PG_REWIND_LOGGING_H
#include "fe_utils/logging.h"
/* progress counters */ /* progress counters */
extern uint64 fetch_size; extern uint64 fetch_size;
extern uint64 fetch_done; extern uint64 fetch_done;
/*
* Enumeration to denote pg_log modes
*/
typedef enum
{
PG_DEBUG,
PG_PROGRESS,
PG_WARNING,
PG_FATAL
} eLogType;
extern void pg_log(eLogType type, const char *fmt,...) pg_attribute_printf(2, 3);
extern void pg_fatal(const char *fmt,...) pg_attribute_printf(1, 2) pg_attribute_noreturn();
extern void progress_report(bool force); extern void progress_report(bool force);
#define pg_fatal(...) do { pg_log_fatal(__VA_ARGS__); exit(1); } while(0)
#endif /* PG_REWIND_LOGGING_H */ #endif /* PG_REWIND_LOGGING_H */

View File

@ -1,9 +1,8 @@
# src/bin/pg_rewind/nls.mk # src/bin/pg_rewind/nls.mk
CATALOG_NAME = pg_rewind CATALOG_NAME = pg_rewind
AVAIL_LANGUAGES =de es fr it ja ko pl pt_BR ru sv tr zh_CN AVAIL_LANGUAGES =de es fr it ja ko pl pt_BR ru sv tr zh_CN
GETTEXT_FILES = copy_fetch.c datapagemap.c fetch.c file_ops.c filemap.c libpq_fetch.c logging.c parsexlog.c pg_rewind.c timeline.c ../../common/fe_memutils.c ../../common/restricted_token.c xlogreader.c GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) copy_fetch.c datapagemap.c fetch.c file_ops.c filemap.c libpq_fetch.c logging.c parsexlog.c pg_rewind.c timeline.c ../../common/fe_memutils.c ../../common/restricted_token.c xlogreader.c
GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) pg_fatal report_invalid_record:2
GETTEXT_TRIGGERS = pg_log:2 pg_fatal report_invalid_record:2 GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
GETTEXT_FLAGS = pg_log:2:c-format \
pg_fatal:1:c-format \ pg_fatal:1:c-format \
report_invalid_record:2:c-format report_invalid_record:2:c-format

View File

@ -72,7 +72,7 @@ extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex,
xlogreader = XLogReaderAllocate(WalSegSz, &SimpleXLogPageRead, xlogreader = XLogReaderAllocate(WalSegSz, &SimpleXLogPageRead,
&private); &private);
if (xlogreader == NULL) if (xlogreader == NULL)
pg_fatal("out of memory\n"); pg_fatal("out of memory");
do do
{ {
@ -85,11 +85,11 @@ extractPageMap(const char *datadir, XLogRecPtr startpoint, int tliIndex,
errptr = startpoint ? startpoint : xlogreader->EndRecPtr; errptr = startpoint ? startpoint : xlogreader->EndRecPtr;
if (errormsg) if (errormsg)
pg_fatal("could not read WAL record at %X/%X: %s\n", pg_fatal("could not read WAL record at %X/%X: %s",
(uint32) (errptr >> 32), (uint32) (errptr), (uint32) (errptr >> 32), (uint32) (errptr),
errormsg); errormsg);
else else
pg_fatal("could not read WAL record at %X/%X\n", pg_fatal("could not read WAL record at %X/%X",
(uint32) (startpoint >> 32), (uint32) (startpoint >> 32),
(uint32) (startpoint)); (uint32) (startpoint));
} }
@ -126,16 +126,16 @@ readOneRecord(const char *datadir, XLogRecPtr ptr, int tliIndex)
xlogreader = XLogReaderAllocate(WalSegSz, &SimpleXLogPageRead, xlogreader = XLogReaderAllocate(WalSegSz, &SimpleXLogPageRead,
&private); &private);
if (xlogreader == NULL) if (xlogreader == NULL)
pg_fatal("out of memory\n"); pg_fatal("out of memory");
record = XLogReadRecord(xlogreader, ptr, &errormsg); record = XLogReadRecord(xlogreader, ptr, &errormsg);
if (record == NULL) if (record == NULL)
{ {
if (errormsg) if (errormsg)
pg_fatal("could not read WAL record at %X/%X: %s\n", pg_fatal("could not read WAL record at %X/%X: %s",
(uint32) (ptr >> 32), (uint32) (ptr), errormsg); (uint32) (ptr >> 32), (uint32) (ptr), errormsg);
else else
pg_fatal("could not read WAL record at %X/%X\n", pg_fatal("could not read WAL record at %X/%X",
(uint32) (ptr >> 32), (uint32) (ptr)); (uint32) (ptr >> 32), (uint32) (ptr));
} }
endptr = xlogreader->EndRecPtr; endptr = xlogreader->EndRecPtr;
@ -184,7 +184,7 @@ findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex,
xlogreader = XLogReaderAllocate(WalSegSz, &SimpleXLogPageRead, xlogreader = XLogReaderAllocate(WalSegSz, &SimpleXLogPageRead,
&private); &private);
if (xlogreader == NULL) if (xlogreader == NULL)
pg_fatal("out of memory\n"); pg_fatal("out of memory");
searchptr = forkptr; searchptr = forkptr;
for (;;) for (;;)
@ -196,11 +196,11 @@ findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex,
if (record == NULL) if (record == NULL)
{ {
if (errormsg) if (errormsg)
pg_fatal("could not find previous WAL record at %X/%X: %s\n", pg_fatal("could not find previous WAL record at %X/%X: %s",
(uint32) (searchptr >> 32), (uint32) (searchptr), (uint32) (searchptr >> 32), (uint32) (searchptr),
errormsg); errormsg);
else else
pg_fatal("could not find previous WAL record at %X/%X\n", pg_fatal("could not find previous WAL record at %X/%X",
(uint32) (searchptr >> 32), (uint32) (searchptr)); (uint32) (searchptr >> 32), (uint32) (searchptr));
} }
@ -291,8 +291,7 @@ SimpleXLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr,
if (xlogreadfd < 0) if (xlogreadfd < 0)
{ {
printf(_("could not open file \"%s\": %s\n"), xlogfpath, pg_log_error("could not open file \"%s\": %m", xlogfpath);
strerror(errno));
return -1; return -1;
} }
} }
@ -305,8 +304,7 @@ SimpleXLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr,
/* Read the requested page */ /* Read the requested page */
if (lseek(xlogreadfd, (off_t) targetPageOff, SEEK_SET) < 0) if (lseek(xlogreadfd, (off_t) targetPageOff, SEEK_SET) < 0)
{ {
printf(_("could not seek in file \"%s\": %s\n"), xlogfpath, pg_log_error("could not seek in file \"%s\": %m", xlogfpath);
strerror(errno));
return -1; return -1;
} }
@ -315,10 +313,9 @@ SimpleXLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr,
if (r != XLOG_BLCKSZ) if (r != XLOG_BLCKSZ)
{ {
if (r < 0) if (r < 0)
printf(_("could not read file \"%s\": %s\n"), xlogfpath, pg_log_error("could not read file \"%s\": %m", xlogfpath);
strerror(errno));
else else
printf(_("could not read file \"%s\": read %d of %zu\n"), pg_log_error("could not read file \"%s\": read %d of %zu",
xlogfpath, r, (Size) XLOG_BLCKSZ); xlogfpath, r, (Size) XLOG_BLCKSZ);
return -1; return -1;
@ -387,8 +384,8 @@ extractPageInfo(XLogReaderState *record)
* we don't recognize the type. That's bad - we don't know how to * we don't recognize the type. That's bad - we don't know how to
* track that change. * track that change.
*/ */
pg_fatal("WAL record modifies a relation, but record type is not recognized\n" pg_fatal("WAL record modifies a relation, but record type is not recognized: "
"lsn: %X/%X, rmgr: %s, info: %02X\n", "lsn: %X/%X, rmgr: %s, info: %02X",
(uint32) (record->ReadRecPtr >> 32), (uint32) (record->ReadRecPtr), (uint32) (record->ReadRecPtr >> 32), (uint32) (record->ReadRecPtr),
RmgrNames[rmid], info); RmgrNames[rmid], info);
} }

View File

@ -28,6 +28,7 @@
#include "common/file_perm.h" #include "common/file_perm.h"
#include "common/file_utils.h" #include "common/file_utils.h"
#include "common/restricted_token.h" #include "common/restricted_token.h"
#include "fe_utils/logging.h"
#include "getopt_long.h" #include "getopt_long.h"
#include "storage/bufpage.h" #include "storage/bufpage.h"
@ -53,7 +54,7 @@ char *datadir_target = NULL;
char *datadir_source = NULL; char *datadir_source = NULL;
char *connstr_source = NULL; char *connstr_source = NULL;
bool debug = false; static bool debug = false;
bool showprogress = false; bool showprogress = false;
bool dry_run = false; bool dry_run = false;
bool do_sync = true; bool do_sync = true;
@ -111,6 +112,7 @@ main(int argc, char **argv)
TimeLineID endtli; TimeLineID endtli;
ControlFileData ControlFile_new; ControlFileData ControlFile_new;
pg_logging_init(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_rewind")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_rewind"));
progname = get_progname(argv[0]); progname = get_progname(argv[0]);
@ -151,6 +153,7 @@ main(int argc, char **argv)
case 3: case 3:
debug = true; debug = true;
pg_logging_set_level(PG_LOG_DEBUG);
break; break;
case 'D': /* -D or --target-pgdata */ case 'D': /* -D or --target-pgdata */
@ -168,29 +171,29 @@ main(int argc, char **argv)
if (datadir_source == NULL && connstr_source == NULL) if (datadir_source == NULL && connstr_source == NULL)
{ {
fprintf(stderr, _("%s: no source specified (--source-pgdata or --source-server)\n"), progname); pg_log_error("no source specified (--source-pgdata or --source-server)");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
if (datadir_source != NULL && connstr_source != NULL) if (datadir_source != NULL && connstr_source != NULL)
{ {
fprintf(stderr, _("%s: only one of --source-pgdata or --source-server can be specified\n"), progname); pg_log_error("only one of --source-pgdata or --source-server can be specified");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
if (datadir_target == NULL) if (datadir_target == NULL)
{ {
fprintf(stderr, _("%s: no target data directory specified (--target-pgdata)\n"), progname); pg_log_error("no target data directory specified (--target-pgdata)");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
if (optind < argc) if (optind < argc)
{ {
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"), pg_log_error("too many command-line arguments (first is \"%s\")",
progname, argv[optind]); argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1); exit(1);
} }
@ -204,20 +207,20 @@ main(int argc, char **argv)
#ifndef WIN32 #ifndef WIN32
if (geteuid() == 0) if (geteuid() == 0)
{ {
fprintf(stderr, _("cannot be executed by \"root\"\n")); pg_log_error("cannot be executed by \"root\"");
fprintf(stderr, _("You must run %s as the PostgreSQL superuser.\n"), fprintf(stderr, _("You must run %s as the PostgreSQL superuser.\n"),
progname); progname);
exit(1); exit(1);
} }
#endif #endif
get_restricted_token(progname); get_restricted_token();
/* Set mask based on PGDATA permissions */ /* Set mask based on PGDATA permissions */
if (!GetDataDirectoryCreatePerm(datadir_target)) if (!GetDataDirectoryCreatePerm(datadir_target))
{ {
fprintf(stderr, _("%s: could not read permissions of directory \"%s\": %s\n"), pg_log_error("could not read permissions of directory \"%s\": %m",
progname, datadir_target, strerror(errno)); datadir_target);
exit(1); exit(1);
} }
@ -247,13 +250,13 @@ main(int argc, char **argv)
*/ */
if (ControlFile_target.checkPointCopy.ThisTimeLineID == ControlFile_source.checkPointCopy.ThisTimeLineID) if (ControlFile_target.checkPointCopy.ThisTimeLineID == ControlFile_source.checkPointCopy.ThisTimeLineID)
{ {
printf(_("source and target cluster are on the same timeline\n")); pg_log_info("source and target cluster are on the same timeline");
rewind_needed = false; rewind_needed = false;
} }
else else
{ {
findCommonAncestorTimeline(&divergerec, &lastcommontliIndex); findCommonAncestorTimeline(&divergerec, &lastcommontliIndex);
printf(_("servers diverged at WAL location %X/%X on timeline %u\n"), pg_log_info("servers diverged at WAL location %X/%X on timeline %u",
(uint32) (divergerec >> 32), (uint32) divergerec, (uint32) (divergerec >> 32), (uint32) divergerec,
targetHistory[lastcommontliIndex].tli); targetHistory[lastcommontliIndex].tli);
@ -290,14 +293,14 @@ main(int argc, char **argv)
if (!rewind_needed) if (!rewind_needed)
{ {
printf(_("no rewind required\n")); pg_log_info("no rewind required");
exit(0); exit(0);
} }
findLastCheckpoint(datadir_target, divergerec, findLastCheckpoint(datadir_target, divergerec,
lastcommontliIndex, lastcommontliIndex,
&chkptrec, &chkpttli, &chkptredo); &chkptrec, &chkpttli, &chkptredo);
printf(_("rewinding from last common checkpoint at %X/%X on timeline %u\n"), pg_log_info("rewinding from last common checkpoint at %X/%X on timeline %u",
(uint32) (chkptrec >> 32), (uint32) chkptrec, (uint32) (chkptrec >> 32), (uint32) chkptrec,
chkpttli); chkpttli);
@ -305,9 +308,11 @@ main(int argc, char **argv)
* Build the filemap, by comparing the source and target data directories. * Build the filemap, by comparing the source and target data directories.
*/ */
filemap_create(); filemap_create();
pg_log(PG_PROGRESS, "reading source file list\n"); if (showprogress)
pg_log_info("reading source file list");
fetchSourceFileList(); fetchSourceFileList();
pg_log(PG_PROGRESS, "reading target file list\n"); if (showprogress)
pg_log_info("reading target file list");
traverse_datadir(datadir_target, &process_target_file); traverse_datadir(datadir_target, &process_target_file);
/* /*
@ -317,7 +322,8 @@ main(int argc, char **argv)
* XXX: If we supported rewinding a server that was not shut down cleanly, * XXX: If we supported rewinding a server that was not shut down cleanly,
* we would need to replay until the end of WAL here. * we would need to replay until the end of WAL here.
*/ */
pg_log(PG_PROGRESS, "reading WAL in target\n"); if (showprogress)
pg_log_info("reading WAL in target");
extractPageMap(datadir_target, chkptrec, lastcommontliIndex, extractPageMap(datadir_target, chkptrec, lastcommontliIndex,
ControlFile_target.checkPoint); ControlFile_target.checkPoint);
filemap_finalize(); filemap_finalize();
@ -334,7 +340,7 @@ main(int argc, char **argv)
*/ */
if (showprogress) if (showprogress)
{ {
pg_log(PG_PROGRESS, "need to copy %lu MB (total source directory size is %lu MB)\n", pg_log_info("need to copy %lu MB (total source directory size is %lu MB)",
(unsigned long) (filemap->fetch_size / (1024 * 1024)), (unsigned long) (filemap->fetch_size / (1024 * 1024)),
(unsigned long) (filemap->total_size / (1024 * 1024))); (unsigned long) (filemap->total_size / (1024 * 1024)));
@ -350,8 +356,10 @@ main(int argc, char **argv)
executeFileMap(); executeFileMap();
progress_report(true); progress_report(true);
printf("\n");
pg_log(PG_PROGRESS, "\ncreating backup label and updating control file\n"); if (showprogress)
pg_log_info("creating backup label and updating control file");
createBackupLabel(chkptredo, chkpttli, chkptrec); createBackupLabel(chkptredo, chkpttli, chkptrec);
/* /*
@ -377,12 +385,13 @@ main(int argc, char **argv)
ControlFile_new.minRecoveryPoint = endrec; ControlFile_new.minRecoveryPoint = endrec;
ControlFile_new.minRecoveryPointTLI = endtli; ControlFile_new.minRecoveryPointTLI = endtli;
ControlFile_new.state = DB_IN_ARCHIVE_RECOVERY; ControlFile_new.state = DB_IN_ARCHIVE_RECOVERY;
update_controlfile(datadir_target, progname, &ControlFile_new, do_sync); update_controlfile(datadir_target, &ControlFile_new, do_sync);
pg_log(PG_PROGRESS, "syncing target data directory\n"); if (showprogress)
pg_log_info("syncing target data directory");
syncTargetDirectory(); syncTargetDirectory();
printf(_("Done!\n")); pg_log_info("Done!");
return 0; return 0;
} }
@ -394,7 +403,7 @@ sanityChecks(void)
/* Check system_id match */ /* Check system_id match */
if (ControlFile_target.system_identifier != ControlFile_source.system_identifier) if (ControlFile_target.system_identifier != ControlFile_source.system_identifier)
pg_fatal("source and target clusters are from different systems\n"); pg_fatal("source and target clusters are from different systems");
/* check version */ /* check version */
if (ControlFile_target.pg_control_version != PG_CONTROL_VERSION || if (ControlFile_target.pg_control_version != PG_CONTROL_VERSION ||
@ -402,7 +411,7 @@ sanityChecks(void)
ControlFile_target.catalog_version_no != CATALOG_VERSION_NO || ControlFile_target.catalog_version_no != CATALOG_VERSION_NO ||
ControlFile_source.catalog_version_no != CATALOG_VERSION_NO) ControlFile_source.catalog_version_no != CATALOG_VERSION_NO)
{ {
pg_fatal("clusters are not compatible with this version of pg_rewind\n"); pg_fatal("clusters are not compatible with this version of pg_rewind");
} }
/* /*
@ -412,7 +421,7 @@ sanityChecks(void)
if (ControlFile_target.data_checksum_version != PG_DATA_CHECKSUM_VERSION && if (ControlFile_target.data_checksum_version != PG_DATA_CHECKSUM_VERSION &&
!ControlFile_target.wal_log_hints) !ControlFile_target.wal_log_hints)
{ {
pg_fatal("target server needs to use either data checksums or \"wal_log_hints = on\"\n"); pg_fatal("target server needs to use either data checksums or \"wal_log_hints = on\"");
} }
/* /*
@ -423,7 +432,7 @@ sanityChecks(void)
*/ */
if (ControlFile_target.state != DB_SHUTDOWNED && if (ControlFile_target.state != DB_SHUTDOWNED &&
ControlFile_target.state != DB_SHUTDOWNED_IN_RECOVERY) ControlFile_target.state != DB_SHUTDOWNED_IN_RECOVERY)
pg_fatal("target server must be shut down cleanly\n"); pg_fatal("target server must be shut down cleanly");
/* /*
* When the source is a data directory, also require that the source * When the source is a data directory, also require that the source
@ -433,7 +442,7 @@ sanityChecks(void)
if (datadir_source && if (datadir_source &&
ControlFile_source.state != DB_SHUTDOWNED && ControlFile_source.state != DB_SHUTDOWNED &&
ControlFile_source.state != DB_SHUTDOWNED_IN_RECOVERY) ControlFile_source.state != DB_SHUTDOWNED_IN_RECOVERY)
pg_fatal("source data directory must be shut down cleanly\n"); pg_fatal("source data directory must be shut down cleanly");
} }
/* /*
@ -499,9 +508,9 @@ getTimelineHistory(ControlFileData *controlFile, int *nentries)
int i; int i;
if (controlFile == &ControlFile_source) if (controlFile == &ControlFile_source)
pg_log(PG_DEBUG, "Source timeline history:\n"); pg_log_debug("Source timeline history:");
else if (controlFile == &ControlFile_target) else if (controlFile == &ControlFile_target)
pg_log(PG_DEBUG, "Target timeline history:\n"); pg_log_debug("Target timeline history:");
else else
Assert(false); Assert(false);
@ -513,9 +522,7 @@ getTimelineHistory(ControlFileData *controlFile, int *nentries)
TimeLineHistoryEntry *entry; TimeLineHistoryEntry *entry;
entry = &history[i]; entry = &history[i];
pg_log(PG_DEBUG, pg_log_debug("%d: %X/%X - %X/%X", entry->tli,
/* translator: %d is a timeline number, others are LSN positions */
"%d: %X/%X - %X/%X\n", entry->tli,
(uint32) (entry->begin >> 32), (uint32) (entry->begin), (uint32) (entry->begin >> 32), (uint32) (entry->begin),
(uint32) (entry->end >> 32), (uint32) (entry->end)); (uint32) (entry->end >> 32), (uint32) (entry->end));
} }
@ -574,7 +581,7 @@ findCommonAncestorTimeline(XLogRecPtr *recptr, int *tliIndex)
} }
else else
{ {
pg_fatal("could not find common ancestor of the source and target cluster's timelines\n"); pg_fatal("could not find common ancestor of the source and target cluster's timelines");
} }
} }
@ -615,7 +622,7 @@ createBackupLabel(XLogRecPtr startpoint, TimeLineID starttli, XLogRecPtr checkpo
(uint32) (checkpointloc >> 32), (uint32) checkpointloc, (uint32) (checkpointloc >> 32), (uint32) checkpointloc,
strfbuf); strfbuf);
if (len >= sizeof(buf)) if (len >= sizeof(buf))
pg_fatal("backup label buffer too small\n"); /* shouldn't happen */ pg_fatal("backup label buffer too small"); /* shouldn't happen */
/* TODO: move old file out of the way, if any. */ /* TODO: move old file out of the way, if any. */
open_target_file("backup_label", true); /* BACKUP_LABEL_FILE */ open_target_file("backup_label", true); /* BACKUP_LABEL_FILE */
@ -638,7 +645,7 @@ checkControlFile(ControlFileData *ControlFile)
/* And simply compare it */ /* And simply compare it */
if (!EQ_CRC32C(crc, ControlFile->crc)) if (!EQ_CRC32C(crc, ControlFile->crc))
pg_fatal("unexpected control file CRC\n"); pg_fatal("unexpected control file CRC");
} }
/* /*
@ -648,7 +655,7 @@ static void
digestControlFile(ControlFileData *ControlFile, char *src, size_t size) digestControlFile(ControlFileData *ControlFile, char *src, size_t size)
{ {
if (size != PG_CONTROL_FILE_SIZE) if (size != PG_CONTROL_FILE_SIZE)
pg_fatal("unexpected control file size %d, expected %d\n", pg_fatal("unexpected control file size %d, expected %d",
(int) size, PG_CONTROL_FILE_SIZE); (int) size, PG_CONTROL_FILE_SIZE);
memcpy(ControlFile, src, sizeof(ControlFileData)); memcpy(ControlFile, src, sizeof(ControlFileData));
@ -657,8 +664,8 @@ digestControlFile(ControlFileData *ControlFile, char *src, size_t size)
WalSegSz = ControlFile->xlog_seg_size; WalSegSz = ControlFile->xlog_seg_size;
if (!IsValidWalSegSize(WalSegSz)) if (!IsValidWalSegSize(WalSegSz))
pg_fatal(ngettext("WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte\n", pg_fatal(ngettext("WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte",
"WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes\n", "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes",
WalSegSz), WalSegSz),
WalSegSz); WalSegSz);
@ -681,5 +688,5 @@ syncTargetDirectory(void)
if (!do_sync || dry_run) if (!do_sync || dry_run)
return; return;
fsync_pgdata(datadir_target, progname, PG_VERSION_NUM); fsync_pgdata(datadir_target, PG_VERSION_NUM);
} }

View File

@ -21,7 +21,6 @@
extern char *datadir_target; extern char *datadir_target;
extern char *datadir_source; extern char *datadir_source;
extern char *connstr_source; extern char *connstr_source;
extern bool debug;
extern bool showprogress; extern bool showprogress;
extern bool dry_run; extern bool dry_run;
extern int WalSegSz; extern int WalSegSz;

View File

@ -13,6 +13,7 @@
#include "access/timeline.h" #include "access/timeline.h"
#include "access/xlog_internal.h" #include "access/xlog_internal.h"
#include "fe_utils/logging.h"
/* /*
* This is copy-pasted from the backend readTimeLineHistory, modified to * This is copy-pasted from the backend readTimeLineHistory, modified to
@ -73,20 +74,20 @@ rewind_parseTimeLineHistory(char *buffer, TimeLineID targetTLI, int *nentries)
if (nfields < 1) if (nfields < 1)
{ {
/* expect a numeric timeline ID as first field of line */ /* expect a numeric timeline ID as first field of line */
fprintf(stderr, _("syntax error in history file: %s\n"), fline); pg_log_error("syntax error in history file: %s", fline);
fprintf(stderr, _("Expected a numeric timeline ID.\n")); pg_log_error("Expected a numeric timeline ID.");
exit(1); exit(1);
} }
if (nfields != 3) if (nfields != 3)
{ {
fprintf(stderr, _("syntax error in history file: %s\n"), fline); pg_log_error("syntax error in history file: %s", fline);
fprintf(stderr, _("Expected a write-ahead log switchpoint location.\n")); pg_log_error("Expected a write-ahead log switchpoint location.");
exit(1); exit(1);
} }
if (entries && tli <= lasttli) if (entries && tli <= lasttli)
{ {
fprintf(stderr, _("invalid data in history file: %s\n"), fline); pg_log_error("invalid data in history file: %s", fline);
fprintf(stderr, _("Timeline IDs must be in increasing sequence.\n")); pg_log_error("Timeline IDs must be in increasing sequence.");
exit(1); exit(1);
} }
@ -106,8 +107,8 @@ rewind_parseTimeLineHistory(char *buffer, TimeLineID targetTLI, int *nentries)
if (entries && targetTLI <= lasttli) if (entries && targetTLI <= lasttli)
{ {
fprintf(stderr, _("invalid data in history file\n")); pg_log_error("invalid data in history file");
fprintf(stderr, _("Timeline IDs must be less than child timeline's ID.\n")); pg_log_error("Timeline IDs must be less than child timeline's ID.");
exit(1); exit(1);
} }

View File

@ -7,11 +7,13 @@ subdir = src/bin/pg_test_fsync
top_builddir = ../../.. top_builddir = ../../..
include $(top_builddir)/src/Makefile.global include $(top_builddir)/src/Makefile.global
LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils
OBJS = pg_test_fsync.o $(WIN32RES) OBJS = pg_test_fsync.o $(WIN32RES)
all: pg_test_fsync all: pg_test_fsync
pg_test_fsync: $(OBJS) | submake-libpgport pg_test_fsync: $(OBJS) | submake-libpgport submake-libpgfeutils
$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
install: all installdirs install: all installdirs

View File

@ -14,6 +14,7 @@
#include "getopt_long.h" #include "getopt_long.h"
#include "access/xlogdefs.h" #include "access/xlogdefs.h"
#include "fe_utils/logging.h"
/* /*
@ -46,7 +47,7 @@ do { \
if (CreateThread(NULL, 0, process_alarm, NULL, 0, NULL) == \ if (CreateThread(NULL, 0, process_alarm, NULL, 0, NULL) == \
INVALID_HANDLE_VALUE) \ INVALID_HANDLE_VALUE) \
{ \ { \
fprintf(stderr, _("Could not create thread for alarm\n")); \ pg_log_error("could not create thread for alarm"); \
exit(1); \ exit(1); \
} \ } \
gettimeofday(&start_t, NULL); \ gettimeofday(&start_t, NULL); \
@ -92,12 +93,14 @@ static void signal_cleanup(int sig);
static int pg_fsync_writethrough(int fd); static int pg_fsync_writethrough(int fd);
#endif #endif
static void print_elapse(struct timeval start_t, struct timeval stop_t, int ops); static void print_elapse(struct timeval start_t, struct timeval stop_t, int ops);
static void die(const char *str);
#define die(msg) do { pg_log_error("%s: %m", _(msg)); exit(1); } while(0)
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
pg_logging_init(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_test_fsync")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_test_fsync"));
progname = get_progname(argv[0]); progname = get_progname(argv[0]);
@ -184,9 +187,8 @@ handle_args(int argc, char *argv[])
if (argc > optind) if (argc > optind)
{ {
fprintf(stderr, pg_log_error("too many command-line arguments (first is \"%s\")",
_("%s: too many command-line arguments (first is \"%s\")\n"), argv[optind]);
progname, argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname); progname);
exit(1); exit(1);
@ -601,10 +603,3 @@ process_alarm(LPVOID param)
ExitThread(0); ExitThread(0);
} }
#endif #endif
static void
die(const char *str)
{
fprintf(stderr, _("%s: %s\n"), _(str), strerror(errno));
exit(1);
}

View File

@ -41,6 +41,7 @@
#include "catalog/pg_class_d.h" #include "catalog/pg_class_d.h"
#include "common/file_perm.h" #include "common/file_perm.h"
#include "common/restricted_token.h" #include "common/restricted_token.h"
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h" #include "fe_utils/string_utils.h"
#ifdef HAVE_LANGINFO_H #ifdef HAVE_LANGINFO_H
@ -78,6 +79,7 @@ main(int argc, char **argv)
char *deletion_script_file_name = NULL; char *deletion_script_file_name = NULL;
bool live_check = false; bool live_check = false;
pg_logging_init(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_upgrade")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_upgrade"));
/* Set default restrictive mask until new cluster permissions are read */ /* Set default restrictive mask until new cluster permissions are read */
@ -85,7 +87,7 @@ main(int argc, char **argv)
parseCommandLine(argc, argv); parseCommandLine(argc, argv);
get_restricted_token(os_info.progname); get_restricted_token();
adjust_data_dir(&old_cluster); adjust_data_dir(&old_cluster);
adjust_data_dir(&new_cluster); adjust_data_dir(&new_cluster);

View File

@ -11,6 +11,7 @@ OBJS = pg_waldump.o compat.o xlogreader.o rmgrdesc.o \
$(RMGRDESCOBJS) $(WIN32RES) $(RMGRDESCOBJS) $(WIN32RES)
override CPPFLAGS := -DFRONTEND $(CPPFLAGS) override CPPFLAGS := -DFRONTEND $(CPPFLAGS)
LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils
RMGRDESCSOURCES = $(sort $(notdir $(wildcard $(top_srcdir)/src/backend/access/rmgrdesc/*desc.c))) RMGRDESCSOURCES = $(sort $(notdir $(wildcard $(top_srcdir)/src/backend/access/rmgrdesc/*desc.c)))
RMGRDESCOBJS = $(patsubst %.c,%.o,$(RMGRDESCSOURCES)) RMGRDESCOBJS = $(patsubst %.c,%.o,$(RMGRDESCSOURCES))
@ -18,7 +19,7 @@ RMGRDESCOBJS = $(patsubst %.c,%.o,$(RMGRDESCSOURCES))
all: pg_waldump all: pg_waldump
pg_waldump: $(OBJS) | submake-libpgport pg_waldump: $(OBJS) | submake-libpgport submake-libpgfeutils
$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/% xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/%

View File

@ -1,6 +1,6 @@
# src/bin/pg_waldump/nls.mk # src/bin/pg_waldump/nls.mk
CATALOG_NAME = pg_waldump CATALOG_NAME = pg_waldump
AVAIL_LANGUAGES = de es fr ja ko ru sv tr vi AVAIL_LANGUAGES = de es fr ja ko ru sv tr vi
GETTEXT_FILES = pg_waldump.c GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_waldump.c
GETTEXT_TRIGGERS = fatal_error GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) fatal_error
GETTEXT_FLAGS = fatal_error:1:c-format GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) fatal_error:1:c-format

View File

@ -21,6 +21,7 @@
#include "access/xlog_internal.h" #include "access/xlog_internal.h"
#include "access/transam.h" #include "access/transam.h"
#include "common/fe_memutils.h" #include "common/fe_memutils.h"
#include "fe_utils/logging.h"
#include "getopt_long.h" #include "getopt_long.h"
#include "rmgrdesc.h" #include "rmgrdesc.h"
@ -70,26 +71,7 @@ typedef struct XLogDumpStats
Stats record_stats[RM_NEXT_ID][MAX_XLINFO_TYPES]; Stats record_stats[RM_NEXT_ID][MAX_XLINFO_TYPES];
} XLogDumpStats; } XLogDumpStats;
static void fatal_error(const char *fmt,...) pg_attribute_printf(1, 2); #define fatal_error(...) do { pg_log_fatal(__VA_ARGS__); exit(EXIT_FAILURE); } while(0)
/*
* Big red button to push when things go horribly wrong.
*/
static void
fatal_error(const char *fmt,...)
{
va_list args;
fflush(stdout);
fprintf(stderr, _("%s: FATAL: "), progname);
va_start(args, fmt);
vfprintf(stderr, _(fmt), args);
va_end(args);
fputc('\n', stderr);
exit(EXIT_FAILURE);
}
static void static void
print_rmgr_list(void) print_rmgr_list(void)
@ -858,6 +840,7 @@ main(int argc, char **argv)
int option; int option;
int optindex = 0; int optindex = 0;
pg_logging_init(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_waldump")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_waldump"));
progname = get_progname(argv[0]); progname = get_progname(argv[0]);
@ -882,7 +865,7 @@ main(int argc, char **argv)
if (argc <= 1) if (argc <= 1)
{ {
fprintf(stderr, _("%s: no arguments specified\n"), progname); pg_log_error("no arguments specified");
goto bad_argument; goto bad_argument;
} }
@ -897,8 +880,8 @@ main(int argc, char **argv)
case 'e': case 'e':
if (sscanf(optarg, "%X/%X", &xlogid, &xrecoff) != 2) if (sscanf(optarg, "%X/%X", &xlogid, &xrecoff) != 2)
{ {
fprintf(stderr, _("%s: could not parse end WAL location \"%s\"\n"), pg_log_error("could not parse end WAL location \"%s\"",
progname, optarg); optarg);
goto bad_argument; goto bad_argument;
} }
private.endptr = (uint64) xlogid << 32 | xrecoff; private.endptr = (uint64) xlogid << 32 | xrecoff;
@ -913,8 +896,7 @@ main(int argc, char **argv)
case 'n': case 'n':
if (sscanf(optarg, "%d", &config.stop_after_records) != 1) if (sscanf(optarg, "%d", &config.stop_after_records) != 1)
{ {
fprintf(stderr, _("%s: could not parse limit \"%s\"\n"), pg_log_error("could not parse limit \"%s\"", optarg);
progname, optarg);
goto bad_argument; goto bad_argument;
} }
break; break;
@ -942,8 +924,8 @@ main(int argc, char **argv)
if (config.filter_by_rmgr == -1) if (config.filter_by_rmgr == -1)
{ {
fprintf(stderr, _("%s: resource manager \"%s\" does not exist\n"), pg_log_error("resource manager \"%s\" does not exist",
progname, optarg); optarg);
goto bad_argument; goto bad_argument;
} }
} }
@ -951,8 +933,8 @@ main(int argc, char **argv)
case 's': case 's':
if (sscanf(optarg, "%X/%X", &xlogid, &xrecoff) != 2) if (sscanf(optarg, "%X/%X", &xlogid, &xrecoff) != 2)
{ {
fprintf(stderr, _("%s: could not parse start WAL location \"%s\"\n"), pg_log_error("could not parse start WAL location \"%s\"",
progname, optarg); optarg);
goto bad_argument; goto bad_argument;
} }
else else
@ -961,8 +943,7 @@ main(int argc, char **argv)
case 't': case 't':
if (sscanf(optarg, "%d", &private.timeline) != 1) if (sscanf(optarg, "%d", &private.timeline) != 1)
{ {
fprintf(stderr, _("%s: could not parse timeline \"%s\"\n"), pg_log_error("could not parse timeline \"%s\"", optarg);
progname, optarg);
goto bad_argument; goto bad_argument;
} }
break; break;
@ -973,8 +954,8 @@ main(int argc, char **argv)
case 'x': case 'x':
if (sscanf(optarg, "%u", &config.filter_by_xid) != 1) if (sscanf(optarg, "%u", &config.filter_by_xid) != 1)
{ {
fprintf(stderr, _("%s: could not parse \"%s\" as a transaction ID\n"), pg_log_error("could not parse \"%s\" as a transaction ID",
progname, optarg); optarg);
goto bad_argument; goto bad_argument;
} }
config.filter_by_xid_enabled = true; config.filter_by_xid_enabled = true;
@ -988,8 +969,8 @@ main(int argc, char **argv)
config.stats_per_record = true; config.stats_per_record = true;
else if (strcmp(optarg, "rmgr") != 0) else if (strcmp(optarg, "rmgr") != 0)
{ {
fprintf(stderr, _("%s: unrecognized argument to --stats: %s\n"), pg_log_error("unrecognized argument to --stats: %s",
progname, optarg); optarg);
goto bad_argument; goto bad_argument;
} }
} }
@ -1001,9 +982,8 @@ main(int argc, char **argv)
if ((optind + 2) < argc) if ((optind + 2) < argc)
{ {
fprintf(stderr, pg_log_error("too many command-line arguments (first is \"%s\")",
_("%s: too many command-line arguments (first is \"%s\")\n"), argv[optind + 2]);
progname, argv[optind + 2]);
goto bad_argument; goto bad_argument;
} }
@ -1012,9 +992,8 @@ main(int argc, char **argv)
/* validate path points to directory */ /* validate path points to directory */
if (!verify_directory(private.inpath)) if (!verify_directory(private.inpath))
{ {
fprintf(stderr, pg_log_error("path \"%s\" could not be opened: %s",
_("%s: path \"%s\" could not be opened: %s\n"), private.inpath, strerror(errno));
progname, private.inpath, strerror(errno));
goto bad_argument; goto bad_argument;
} }
} }
@ -1051,9 +1030,7 @@ main(int argc, char **argv)
XLogSegNoOffsetToRecPtr(segno, 0, WalSegSz, private.startptr); XLogSegNoOffsetToRecPtr(segno, 0, WalSegSz, private.startptr);
else if (!XLByteInSeg(private.startptr, segno, WalSegSz)) else if (!XLByteInSeg(private.startptr, segno, WalSegSz))
{ {
fprintf(stderr, pg_log_error("start WAL location %X/%X is not inside file \"%s\"",
_("%s: start WAL location %X/%X is not inside file \"%s\"\n"),
progname,
(uint32) (private.startptr >> 32), (uint32) (private.startptr >> 32),
(uint32) private.startptr, (uint32) private.startptr,
fname); fname);
@ -1096,9 +1073,7 @@ main(int argc, char **argv)
if (!XLByteInSeg(private.endptr, segno, WalSegSz) && if (!XLByteInSeg(private.endptr, segno, WalSegSz) &&
private.endptr != (segno + 1) * WalSegSz) private.endptr != (segno + 1) * WalSegSz)
{ {
fprintf(stderr, pg_log_error("end WAL location %X/%X is not inside file \"%s\"",
_("%s: end WAL location %X/%X is not inside file \"%s\"\n"),
progname,
(uint32) (private.endptr >> 32), (uint32) (private.endptr >> 32),
(uint32) private.endptr, (uint32) private.endptr,
argv[argc - 1]); argv[argc - 1]);
@ -1111,7 +1086,7 @@ main(int argc, char **argv)
/* we don't know what to print */ /* we don't know what to print */
if (XLogRecPtrIsInvalid(private.startptr)) if (XLogRecPtrIsInvalid(private.startptr))
{ {
fprintf(stderr, _("%s: no start WAL location given\n"), progname); pg_log_error("no start WAL location given");
goto bad_argument; goto bad_argument;
} }

View File

@ -34,6 +34,7 @@
#include "postgres_fe.h" #include "postgres_fe.h"
#include "common/int.h" #include "common/int.h"
#include "fe_utils/conditional.h" #include "fe_utils/conditional.h"
#include "fe_utils/logging.h"
#include "getopt_long.h" #include "getopt_long.h"
#include "libpq-fe.h" #include "libpq-fe.h"
#include "portability/instr_time.h" #include "portability/instr_time.h"
@ -613,7 +614,6 @@ static void doLog(TState *thread, CState *st,
StatsData *agg, bool skipped, double latency, double lag); StatsData *agg, bool skipped, double latency, double lag);
static void processXactStats(TState *thread, CState *st, instr_time *now, static void processXactStats(TState *thread, CState *st, instr_time *now,
bool skipped, StatsData *agg); bool skipped, StatsData *agg);
static void pgbench_error(const char *fmt,...) pg_attribute_printf(1, 2);
static void addScript(ParsedScript script); static void addScript(ParsedScript script);
static void *threadRun(void *arg); static void *threadRun(void *arg);
static void finishCon(CState *st); static void finishCon(CState *st);
@ -629,7 +629,6 @@ static bool socket_has_input(socket_set *sa, int fd, int idx);
/* callback functions for our flex lexer */ /* callback functions for our flex lexer */
static const PsqlScanCallbacks pgbench_callbacks = { static const PsqlScanCallbacks pgbench_callbacks = {
NULL, /* don't need get_variable functionality */ NULL, /* don't need get_variable functionality */
pgbench_error
}; };
@ -4153,20 +4152,6 @@ parseQuery(Command *cmd)
return true; return true;
} }
/*
* Simple error-printing function, might be needed by lexer
*/
static void
pgbench_error(const char *fmt,...)
{
va_list ap;
fflush(stdout);
va_start(ap, fmt);
vfprintf(stderr, _(fmt), ap);
va_end(ap);
}
/* /*
* syntax error while parsing a script (in practice, while parsing a * syntax error while parsing a script (in practice, while parsing a
* backslash command, because we don't detect syntax errors in SQL) * backslash command, because we don't detect syntax errors in SQL)
@ -5276,6 +5261,7 @@ main(int argc, char **argv)
int exit_code = 0; int exit_code = 0;
pg_logging_init(argv[0]);
progname = get_progname(argv[0]); progname = get_progname(argv[0]);
if (argc > 1) if (argc > 1)
@ -5292,11 +5278,6 @@ main(int argc, char **argv)
} }
} }
#ifdef WIN32
/* stderr is buffered on Win32. */
setvbuf(stderr, NULL, _IONBF, 0);
#endif
if ((env = getenv("PGHOST")) != NULL && *env != '\0') if ((env = getenv("PGHOST")) != NULL && *env != '\0')
pghost = env; pghost = env;
if ((env = getenv("PGPORT")) != NULL && *env != '\0') if ((env = getenv("PGPORT")) != NULL && *env != '\0')

View File

@ -28,6 +28,7 @@
#include "libpq-fe.h" #include "libpq-fe.h"
#include "pqexpbuffer.h" #include "pqexpbuffer.h"
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h" #include "fe_utils/string_utils.h"
#include "common.h" #include "common.h"
@ -216,10 +217,9 @@ HandleSlashCmds(PsqlScanState scan_state,
if (status == PSQL_CMD_UNKNOWN) if (status == PSQL_CMD_UNKNOWN)
{ {
pg_log_error("invalid command \\%s", cmd);
if (pset.cur_cmd_interactive) if (pset.cur_cmd_interactive)
psql_error("Invalid command \\%s. Try \\? for help.\n", cmd); pg_log_info("Try \\? for help.");
else
psql_error("invalid command \\%s\n", cmd);
status = PSQL_CMD_ERROR; status = PSQL_CMD_ERROR;
} }
@ -237,7 +237,7 @@ HandleSlashCmds(PsqlScanState scan_state,
OT_NORMAL, NULL, false))) OT_NORMAL, NULL, false)))
{ {
if (active_branch) if (active_branch)
psql_error("\\%s: extra argument \"%s\" ignored\n", cmd, arg); pg_log_warning("\\%s: extra argument \"%s\" ignored", cmd, arg);
free(arg); free(arg);
} }
conditional_stack_pop(cstack); conditional_stack_pop(cstack);
@ -289,7 +289,7 @@ exec_command(const char *cmd,
if (pset.cur_cmd_interactive && !active_branch && if (pset.cur_cmd_interactive && !active_branch &&
!is_branching_command(cmd)) !is_branching_command(cmd))
{ {
psql_error("\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block\n", pg_log_warning("\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block",
cmd); cmd);
} }
@ -549,7 +549,7 @@ exec_command_cd(PsqlScanState scan_state, bool active_branch, const char *cmd)
pw = getpwuid(user_id); pw = getpwuid(user_id);
if (!pw) if (!pw)
{ {
psql_error("could not get home directory for user ID %ld: %s\n", pg_log_error("could not get home directory for user ID %ld: %s",
(long) user_id, (long) user_id,
errno ? strerror(errno) : _("user does not exist")); errno ? strerror(errno) : _("user does not exist"));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -567,8 +567,8 @@ exec_command_cd(PsqlScanState scan_state, bool active_branch, const char *cmd)
if (chdir(dir) == -1) if (chdir(dir) == -1)
{ {
psql_error("\\%s: could not change directory to \"%s\": %s\n", pg_log_error("\\%s: could not change directory to \"%s\": %m",
cmd, dir, strerror(errno)); cmd, dir);
success = false; success = false;
} }
@ -908,7 +908,7 @@ exec_command_edit(PsqlScanState scan_state, bool active_branch,
{ {
if (!query_buf) if (!query_buf)
{ {
psql_error("no query buffer\n"); pg_log_error("no query buffer");
status = PSQL_CMD_ERROR; status = PSQL_CMD_ERROR;
} }
else else
@ -941,7 +941,7 @@ exec_command_edit(PsqlScanState scan_state, bool active_branch,
lineno = atoi(ln); lineno = atoi(ln);
if (lineno < 1) if (lineno < 1)
{ {
psql_error("invalid line number: %s\n", ln); pg_log_error("invalid line number: %s", ln);
status = PSQL_CMD_ERROR; status = PSQL_CMD_ERROR;
} }
} }
@ -995,16 +995,16 @@ exec_command_ef_ev(PsqlScanState scan_state, bool active_branch,
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf)); sverbuf, sizeof(sverbuf));
if (is_func) if (is_func)
psql_error("The server (version %s) does not support editing function source.\n", pg_log_error("The server (version %s) does not support editing function source.",
sverbuf); sverbuf);
else else
psql_error("The server (version %s) does not support editing view definitions.\n", pg_log_error("The server (version %s) does not support editing view definitions.",
sverbuf); sverbuf);
status = PSQL_CMD_ERROR; status = PSQL_CMD_ERROR;
} }
else if (!query_buf) else if (!query_buf)
{ {
psql_error("no query buffer\n"); pg_log_error("no query buffer");
status = PSQL_CMD_ERROR; status = PSQL_CMD_ERROR;
} }
else else
@ -1157,7 +1157,7 @@ exec_command_encoding(PsqlScanState scan_state, bool active_branch)
{ {
/* set encoding */ /* set encoding */
if (PQsetClientEncoding(pset.db, encoding) == -1) if (PQsetClientEncoding(pset.db, encoding) == -1)
psql_error("%s: invalid encoding name or conversion procedure not found\n", encoding); pg_log_error("%s: invalid encoding name or conversion procedure not found", encoding);
else else
{ {
/* save encoding info into psql internal data */ /* save encoding info into psql internal data */
@ -1192,7 +1192,7 @@ exec_command_errverbose(PsqlScanState scan_state, bool active_branch)
PQSHOW_CONTEXT_ALWAYS); PQSHOW_CONTEXT_ALWAYS);
if (msg) if (msg)
{ {
psql_error("%s", msg); pg_log_error("%s", msg);
PQfreemem(msg); PQfreemem(msg);
} }
else else
@ -1387,7 +1387,7 @@ exec_command_include(PsqlScanState scan_state, bool active_branch, const char *c
if (!fname) if (!fname)
{ {
psql_error("\\%s: missing required argument\n", cmd); pg_log_error("\\%s: missing required argument", cmd);
success = false; success = false;
} }
else else
@ -1518,12 +1518,12 @@ exec_command_elif(PsqlScanState scan_state, ConditionalStack cstack,
break; break;
case IFSTATE_ELSE_TRUE: case IFSTATE_ELSE_TRUE:
case IFSTATE_ELSE_FALSE: case IFSTATE_ELSE_FALSE:
psql_error("\\elif: cannot occur after \\else\n"); pg_log_error("\\elif: cannot occur after \\else");
success = false; success = false;
break; break;
case IFSTATE_NONE: case IFSTATE_NONE:
/* no \if to elif from */ /* no \if to elif from */
psql_error("\\elif: no matching \\if\n"); pg_log_error("\\elif: no matching \\if");
success = false; success = false;
break; break;
} }
@ -1587,12 +1587,12 @@ exec_command_else(PsqlScanState scan_state, ConditionalStack cstack,
break; break;
case IFSTATE_ELSE_TRUE: case IFSTATE_ELSE_TRUE:
case IFSTATE_ELSE_FALSE: case IFSTATE_ELSE_FALSE:
psql_error("\\else: cannot occur after \\else\n"); pg_log_error("\\else: cannot occur after \\else");
success = false; success = false;
break; break;
case IFSTATE_NONE: case IFSTATE_NONE:
/* no \if to else from */ /* no \if to else from */
psql_error("\\else: no matching \\if\n"); pg_log_error("\\else: no matching \\if");
success = false; success = false;
break; break;
} }
@ -1632,7 +1632,7 @@ exec_command_endif(PsqlScanState scan_state, ConditionalStack cstack,
break; break;
case IFSTATE_NONE: case IFSTATE_NONE:
/* no \if to end */ /* no \if to end */
psql_error("\\endif: no matching \\if\n"); pg_log_error("\\endif: no matching \\if");
success = false; success = false;
break; break;
} }
@ -1692,7 +1692,7 @@ exec_command_lo(PsqlScanState scan_state, bool active_branch, const char *cmd)
{ {
if (!opt2) if (!opt2)
{ {
psql_error("\\%s: missing required argument\n", cmd); pg_log_error("\\%s: missing required argument", cmd);
success = false; success = false;
} }
else else
@ -1706,7 +1706,7 @@ exec_command_lo(PsqlScanState scan_state, bool active_branch, const char *cmd)
{ {
if (!opt1) if (!opt1)
{ {
psql_error("\\%s: missing required argument\n", cmd); pg_log_error("\\%s: missing required argument", cmd);
success = false; success = false;
} }
else else
@ -1723,7 +1723,7 @@ exec_command_lo(PsqlScanState scan_state, bool active_branch, const char *cmd)
{ {
if (!opt1) if (!opt1)
{ {
psql_error("\\%s: missing required argument\n", cmd); pg_log_error("\\%s: missing required argument", cmd);
success = false; success = false;
} }
else else
@ -1814,7 +1814,7 @@ exec_command_password(PsqlScanState scan_state, bool active_branch)
if (strcmp(pw1, pw2) != 0) if (strcmp(pw1, pw2) != 0)
{ {
psql_error("Passwords didn't match.\n"); pg_log_error("Passwords didn't match.");
success = false; success = false;
} }
else else
@ -1831,7 +1831,7 @@ exec_command_password(PsqlScanState scan_state, bool active_branch)
if (!encrypted_password) if (!encrypted_password)
{ {
psql_error("%s", PQerrorMessage(pset.db)); pg_log_info("%s", PQerrorMessage(pset.db));
success = false; success = false;
} }
else else
@ -1883,7 +1883,7 @@ exec_command_prompt(PsqlScanState scan_state, bool active_branch,
if (!arg1) if (!arg1)
{ {
psql_error("\\%s: missing required argument\n", cmd); pg_log_error("\\%s: missing required argument", cmd);
success = false; success = false;
} }
else else
@ -1913,7 +1913,7 @@ exec_command_prompt(PsqlScanState scan_state, bool active_branch,
result = gets_fromFile(stdin); result = gets_fromFile(stdin);
if (!result) if (!result)
{ {
psql_error("\\%s: could not read value for variable\n", pg_log_error("\\%s: could not read value for variable",
cmd); cmd);
success = false; success = false;
} }
@ -2120,12 +2120,12 @@ exec_command_setenv(PsqlScanState scan_state, bool active_branch,
if (!envvar) if (!envvar)
{ {
psql_error("\\%s: missing required argument\n", cmd); pg_log_error("\\%s: missing required argument", cmd);
success = false; success = false;
} }
else if (strchr(envvar, '=') != NULL) else if (strchr(envvar, '=') != NULL)
{ {
psql_error("\\%s: environment variable name must not contain \"=\"\n", pg_log_error("\\%s: environment variable name must not contain \"=\"",
cmd); cmd);
success = false; success = false;
} }
@ -2186,19 +2186,19 @@ exec_command_sf_sv(PsqlScanState scan_state, bool active_branch,
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf)); sverbuf, sizeof(sverbuf));
if (is_func) if (is_func)
psql_error("The server (version %s) does not support showing function source.\n", pg_log_error("The server (version %s) does not support showing function source.",
sverbuf); sverbuf);
else else
psql_error("The server (version %s) does not support showing view definitions.\n", pg_log_error("The server (version %s) does not support showing view definitions.",
sverbuf); sverbuf);
status = PSQL_CMD_ERROR; status = PSQL_CMD_ERROR;
} }
else if (!obj_desc) else if (!obj_desc)
{ {
if (is_func) if (is_func)
psql_error("function name is required\n"); pg_log_error("function name is required");
else else
psql_error("view name is required\n"); pg_log_error("view name is required");
status = PSQL_CMD_ERROR; status = PSQL_CMD_ERROR;
} }
else if (!lookup_object_oid(eot, obj_desc, &obj_oid)) else if (!lookup_object_oid(eot, obj_desc, &obj_oid))
@ -2356,7 +2356,7 @@ exec_command_unset(PsqlScanState scan_state, bool active_branch,
if (!opt) if (!opt)
{ {
psql_error("\\%s: missing required argument\n", cmd); pg_log_error("\\%s: missing required argument", cmd);
success = false; success = false;
} }
else if (!SetVariable(pset.vars, opt, NULL)) else if (!SetVariable(pset.vars, opt, NULL))
@ -2389,14 +2389,14 @@ exec_command_write(PsqlScanState scan_state, bool active_branch,
if (!query_buf) if (!query_buf)
{ {
psql_error("no query buffer\n"); pg_log_error("no query buffer");
status = PSQL_CMD_ERROR; status = PSQL_CMD_ERROR;
} }
else else
{ {
if (!fname) if (!fname)
{ {
psql_error("\\%s: missing required argument\n", cmd); pg_log_error("\\%s: missing required argument", cmd);
status = PSQL_CMD_ERROR; status = PSQL_CMD_ERROR;
} }
else else
@ -2415,7 +2415,7 @@ exec_command_write(PsqlScanState scan_state, bool active_branch,
} }
if (!fd) if (!fd)
{ {
psql_error("%s: %s\n", fname, strerror(errno)); pg_log_error("%s: %m", fname);
status = PSQL_CMD_ERROR; status = PSQL_CMD_ERROR;
} }
} }
@ -2443,7 +2443,7 @@ exec_command_write(PsqlScanState scan_state, bool active_branch,
if (result == EOF) if (result == EOF)
{ {
psql_error("%s: %s\n", fname, strerror(errno)); pg_log_error("%s: %m", fname);
status = PSQL_CMD_ERROR; status = PSQL_CMD_ERROR;
} }
} }
@ -2883,8 +2883,8 @@ do_connect(enum trivalue reuse_previous_specification,
* connect to the wrong database by using defaults, so require all * connect to the wrong database by using defaults, so require all
* parameters to be specified. * parameters to be specified.
*/ */
psql_error("All connection parameters must be supplied because no " pg_log_error("All connection parameters must be supplied because no "
"database connection exists\n"); "database connection exists");
return false; return false;
} }
@ -3067,15 +3067,15 @@ do_connect(enum trivalue reuse_previous_specification,
*/ */
if (pset.cur_cmd_interactive) if (pset.cur_cmd_interactive)
{ {
psql_error("%s", PQerrorMessage(n_conn)); pg_log_info("%s", PQerrorMessage(n_conn));
/* pset.db is left unmodified */ /* pset.db is left unmodified */
if (o_conn) if (o_conn)
psql_error("Previous connection kept\n"); pg_log_info("Previous connection kept");
} }
else else
{ {
psql_error("\\connect: %s", PQerrorMessage(n_conn)); pg_log_error("\\connect: %s", PQerrorMessage(n_conn));
if (o_conn) if (o_conn)
{ {
PQfinish(o_conn); PQfinish(o_conn);
@ -3337,7 +3337,7 @@ editFile(const char *fname, int lineno)
#endif #endif
if (!editor_lineno_arg) if (!editor_lineno_arg)
{ {
psql_error("environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number\n"); pg_log_error("environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number");
return false; return false;
} }
} }
@ -3366,9 +3366,9 @@ editFile(const char *fname, int lineno)
#endif #endif
result = system(sys); result = system(sys);
if (result == -1) if (result == -1)
psql_error("could not start editor \"%s\"\n", editorName); pg_log_error("could not start editor \"%s\"", editorName);
else if (result == 127) else if (result == 127)
psql_error("could not start /bin/sh\n"); pg_log_error("could not start /bin/sh");
free(sys); free(sys);
return result == 0; return result == 0;
@ -3406,7 +3406,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
ret = GetTempPath(MAXPGPATH, tmpdir); ret = GetTempPath(MAXPGPATH, tmpdir);
if (ret == 0 || ret > MAXPGPATH) if (ret == 0 || ret > MAXPGPATH)
{ {
psql_error("could not locate temporary directory: %s\n", pg_log_error("could not locate temporary directory: %s",
!ret ? strerror(errno) : ""); !ret ? strerror(errno) : "");
return false; return false;
} }
@ -3433,7 +3433,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
if (fd == -1 || !stream) if (fd == -1 || !stream)
{ {
psql_error("could not open temporary file \"%s\": %s\n", fname, strerror(errno)); pg_log_error("could not open temporary file \"%s\": %m", fname);
error = true; error = true;
} }
else else
@ -3448,21 +3448,21 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
if (fwrite(query_buf->data, 1, ql, stream) != ql) if (fwrite(query_buf->data, 1, ql, stream) != ql)
{ {
psql_error("%s: %s\n", fname, strerror(errno)); pg_log_error("%s: %m", fname);
if (fclose(stream) != 0) if (fclose(stream) != 0)
psql_error("%s: %s\n", fname, strerror(errno)); pg_log_error("%s: %m", fname);
if (remove(fname) != 0) if (remove(fname) != 0)
psql_error("%s: %s\n", fname, strerror(errno)); pg_log_error("%s: %m", fname);
error = true; error = true;
} }
else if (fclose(stream) != 0) else if (fclose(stream) != 0)
{ {
psql_error("%s: %s\n", fname, strerror(errno)); pg_log_error("%s: %m", fname);
if (remove(fname) != 0) if (remove(fname) != 0)
psql_error("%s: %s\n", fname, strerror(errno)); pg_log_error("%s: %m", fname);
error = true; error = true;
} }
} }
@ -3470,7 +3470,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
if (!error && stat(fname, &before) != 0) if (!error && stat(fname, &before) != 0)
{ {
psql_error("%s: %s\n", fname, strerror(errno)); pg_log_error("%s: %m", fname);
error = true; error = true;
} }
@ -3480,7 +3480,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
if (!error && stat(fname, &after) != 0) if (!error && stat(fname, &after) != 0)
{ {
psql_error("%s: %s\n", fname, strerror(errno)); pg_log_error("%s: %m", fname);
error = true; error = true;
} }
@ -3489,7 +3489,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
stream = fopen(fname, PG_BINARY_R); stream = fopen(fname, PG_BINARY_R);
if (!stream) if (!stream)
{ {
psql_error("%s: %s\n", fname, strerror(errno)); pg_log_error("%s: %m", fname);
error = true; error = true;
} }
else else
@ -3503,7 +3503,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
if (ferror(stream)) if (ferror(stream))
{ {
psql_error("%s: %s\n", fname, strerror(errno)); pg_log_error("%s: %m", fname);
error = true; error = true;
} }
else if (edited) else if (edited)
@ -3520,7 +3520,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
{ {
if (remove(fname) == -1) if (remove(fname) == -1)
{ {
psql_error("%s: %s\n", fname, strerror(errno)); pg_log_error("%s: %m", fname);
error = true; error = true;
} }
} }
@ -3578,7 +3578,7 @@ process_file(char *filename, bool use_relative_path)
if (!fd) if (!fd)
{ {
psql_error("%s: %s\n", filename, strerror(errno)); pg_log_error("%s: %m", filename);
return EXIT_FAILURE; return EXIT_FAILURE;
} }
} }
@ -3591,12 +3591,17 @@ process_file(char *filename, bool use_relative_path)
oldfilename = pset.inputfile; oldfilename = pset.inputfile;
pset.inputfile = filename; pset.inputfile = filename;
pg_logging_config(pset.inputfile ? 0 : PG_LOG_FLAG_TERSE);
result = MainLoop(fd); result = MainLoop(fd);
if (fd != stdin) if (fd != stdin)
fclose(fd); fclose(fd);
pset.inputfile = oldfilename; pset.inputfile = oldfilename;
pg_logging_config(pset.inputfile ? 0 : PG_LOG_FLAG_TERSE);
return result; return result;
} }
@ -3721,7 +3726,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
match_pos = i; match_pos = i;
else else
{ {
psql_error("\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"\n", pg_log_error("\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"",
value, value,
formats[match_pos].name, formats[i].name); formats[match_pos].name, formats[i].name);
return false; return false;
@ -3741,7 +3746,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
} }
else else
{ {
psql_error("\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped\n"); pg_log_error("\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped");
return false; return false;
} }
} }
@ -3760,7 +3765,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
popt->topt.line_style = &pg_utf8format; popt->topt.line_style = &pg_utf8format;
else else
{ {
psql_error("\\pset: allowed line styles are ascii, old-ascii, unicode\n"); pg_log_error("\\pset: allowed line styles are ascii, old-ascii, unicode");
return false; return false;
} }
} }
@ -3775,7 +3780,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
refresh_utf8format(&(popt->topt)); refresh_utf8format(&(popt->topt));
else else
{ {
psql_error("\\pset: allowed Unicode border line styles are single, double\n"); pg_log_error("\\pset: allowed Unicode border line styles are single, double");
return false; return false;
} }
} }
@ -3790,7 +3795,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
refresh_utf8format(&(popt->topt)); refresh_utf8format(&(popt->topt));
else else
{ {
psql_error("\\pset: allowed Unicode column line styles are single, double\n"); pg_log_error("\\pset: allowed Unicode column line styles are single, double");
return false; return false;
} }
} }
@ -3805,7 +3810,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
refresh_utf8format(&(popt->topt)); refresh_utf8format(&(popt->topt));
else else
{ {
psql_error("\\pset: allowed Unicode header line styles are single, double\n"); pg_log_error("\\pset: allowed Unicode header line styles are single, double");
return false; return false;
} }
} }
@ -3848,12 +3853,12 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
/* CSV separator has to be a one-byte character */ /* CSV separator has to be a one-byte character */
if (strlen(value) != 1) if (strlen(value) != 1)
{ {
psql_error("\\pset: csv_fieldsep must be a single one-byte character\n"); pg_log_error("\\pset: csv_fieldsep must be a single one-byte character");
return false; return false;
} }
if (value[0] == '"' || value[0] == '\n' || value[0] == '\r') if (value[0] == '"' || value[0] == '\n' || value[0] == '\r')
{ {
psql_error("\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return\n"); pg_log_error("\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return");
return false; return false;
} }
popt->topt.csvFieldSep[0] = value[0]; popt->topt.csvFieldSep[0] = value[0];
@ -3990,7 +3995,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
} }
else else
{ {
psql_error("\\pset: unknown option: %s\n", param); pg_log_error("\\pset: unknown option: %s", param);
return false; return false;
} }
@ -4176,7 +4181,7 @@ printPsetInfo(const char *param, struct printQueryOpt *popt)
else else
{ {
psql_error("\\pset: unknown option: %s\n", param); pg_log_error("\\pset: unknown option: %s", param);
return false; return false;
} }
@ -4332,7 +4337,7 @@ do_shell(const char *command)
if (result == 127 || result == -1) if (result == 127 || result == -1)
{ {
psql_error("\\!: failed\n"); pg_log_error("\\!: failed");
return false; return false;
} }
return true; return true;
@ -4357,7 +4362,7 @@ do_watch(PQExpBuffer query_buf, double sleep)
if (!query_buf || query_buf->len <= 0) if (!query_buf || query_buf->len <= 0)
{ {
psql_error("\\watch cannot be used with an empty query\n"); pg_log_error("\\watch cannot be used with an empty query");
return false; return false;
} }
@ -4654,7 +4659,7 @@ get_create_object_cmd(EditableObjectType obj_type, Oid oid,
appendPQExpBufferStr(buf, "CREATE OR REPLACE VIEW "); appendPQExpBufferStr(buf, "CREATE OR REPLACE VIEW ");
break; break;
default: default:
psql_error("\"%s.%s\" is not a view\n", pg_log_error("\"%s.%s\" is not a view",
nspname, relname); nspname, relname);
result = false; result = false;
break; break;
@ -4670,7 +4675,7 @@ get_create_object_cmd(EditableObjectType obj_type, Oid oid,
pset.encoding, pset.encoding,
standard_strings())) standard_strings()))
{ {
psql_error("could not parse reloptions array\n"); pg_log_error("could not parse reloptions array");
result = false; result = false;
} }
appendPQExpBufferChar(buf, ')'); appendPQExpBufferChar(buf, ')');
@ -4759,7 +4764,7 @@ strip_lineno_from_objdesc(char *obj)
lineno = atoi(c); lineno = atoi(c);
if (lineno < 1) if (lineno < 1)
{ {
psql_error("invalid line number: %s\n", c); pg_log_error("invalid line number: %s", c);
return 0; return 0;
} }
@ -4861,7 +4866,7 @@ minimal_error_message(PGresult *res)
appendPQExpBufferStr(msg, "(not available)"); appendPQExpBufferStr(msg, "(not available)");
appendPQExpBufferChar(msg, '\n'); appendPQExpBufferChar(msg, '\n');
psql_error("%s", msg->data); pg_log_error("%s", msg->data);
destroyPQExpBuffer(msg); destroyPQExpBuffer(msg);
} }

View File

@ -19,6 +19,7 @@
#include <win32.h> #include <win32.h>
#endif #endif
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h" #include "fe_utils/string_utils.h"
#include "portability/instr_time.h" #include "portability/instr_time.h"
@ -67,7 +68,7 @@ openQueryOutputFile(const char *fname, FILE **fout, bool *is_pipe)
if (*fout == NULL) if (*fout == NULL)
{ {
psql_error("%s: %s\n", fname, strerror(errno)); pg_log_error("%s: %m", fname);
return false; return false;
} }
@ -156,7 +157,7 @@ psql_get_variable(const char *varname, PsqlScanQuoteType quote,
if (!pset.db) if (!pset.db)
{ {
psql_error("cannot escape without active connection\n"); pg_log_error("cannot escape without active connection");
return NULL; return NULL;
} }
@ -171,7 +172,7 @@ psql_get_variable(const char *varname, PsqlScanQuoteType quote,
{ {
const char *error = PQerrorMessage(pset.db); const char *error = PQerrorMessage(pset.db);
psql_error("%s", error); pg_log_info("%s", error);
return NULL; return NULL;
} }
@ -197,7 +198,7 @@ psql_get_variable(const char *varname, PsqlScanQuoteType quote,
initPQExpBuffer(&buf); initPQExpBuffer(&buf);
if (!appendShellStringNoError(&buf, value)) if (!appendShellStringNoError(&buf, value))
{ {
psql_error("shell command argument contains a newline or carriage return: \"%s\"\n", pg_log_error("shell command argument contains a newline or carriage return: \"%s\"",
value); value);
free(buf.data); free(buf.data);
return NULL; return NULL;
@ -213,28 +214,6 @@ psql_get_variable(const char *varname, PsqlScanQuoteType quote,
} }
/*
* Error reporting for scripts. Errors should look like
* psql:filename:lineno: message
*/
void
psql_error(const char *fmt,...)
{
va_list ap;
fflush(stdout);
if (pset.queryFout && pset.queryFout != stdout)
fflush(pset.queryFout);
if (pset.inputfile)
fprintf(stderr, "%s:%s:" UINT64_FORMAT ": ", pset.progname, pset.inputfile, pset.lineno);
va_start(ap, fmt);
vfprintf(stderr, _(fmt), ap);
va_end(ap);
}
/* /*
* for backend Notice messages (INFO, WARNING, etc) * for backend Notice messages (INFO, WARNING, etc)
*/ */
@ -242,7 +221,7 @@ void
NoticeProcessor(void *arg, const char *message) NoticeProcessor(void *arg, const char *message)
{ {
(void) arg; /* not used */ (void) arg; /* not used */
psql_error("%s", message); pg_log_info("%s", message);
} }
@ -413,23 +392,23 @@ CheckConnection(void)
{ {
if (!pset.cur_cmd_interactive) if (!pset.cur_cmd_interactive)
{ {
psql_error("connection to server was lost\n"); pg_log_fatal("connection to server was lost");
exit(EXIT_BADCONN); exit(EXIT_BADCONN);
} }
psql_error("The connection to the server was lost. Attempting reset: "); fprintf(stderr, _("The connection to the server was lost. Attempting reset: "));
PQreset(pset.db); PQreset(pset.db);
OK = ConnectionUp(); OK = ConnectionUp();
if (!OK) if (!OK)
{ {
psql_error("Failed.\n"); fprintf(stderr, _("Failed.\n"));
PQfinish(pset.db); PQfinish(pset.db);
pset.db = NULL; pset.db = NULL;
ResetCancelConn(); ResetCancelConn();
UnsyncVariables(); UnsyncVariables();
} }
else else
psql_error("Succeeded.\n"); fprintf(stderr, _("Succeeded.\n"));
} }
return OK; return OK;
@ -529,7 +508,7 @@ AcceptResult(const PGresult *result)
default: default:
OK = false; OK = false;
psql_error("unexpected PQresultStatus: %d\n", pg_log_error("unexpected PQresultStatus: %d",
PQresultStatus(result)); PQresultStatus(result));
break; break;
} }
@ -539,7 +518,7 @@ AcceptResult(const PGresult *result)
const char *error = PQerrorMessage(pset.db); const char *error = PQerrorMessage(pset.db);
if (strlen(error)) if (strlen(error))
psql_error("%s", error); pg_log_info("%s", error);
CheckConnection(); CheckConnection();
} }
@ -693,7 +672,7 @@ PSQLexec(const char *query)
if (!pset.db) if (!pset.db)
{ {
psql_error("You are currently not connected to a database.\n"); pg_log_error("You are currently not connected to a database.");
return NULL; return NULL;
} }
@ -751,7 +730,7 @@ PSQLexecWatch(const char *query, const printQueryOpt *opt)
if (!pset.db) if (!pset.db)
{ {
psql_error("You are currently not connected to a database.\n"); pg_log_error("You are currently not connected to a database.");
return 0; return 0;
} }
@ -799,19 +778,19 @@ PSQLexecWatch(const char *query, const printQueryOpt *opt)
break; break;
case PGRES_EMPTY_QUERY: case PGRES_EMPTY_QUERY:
psql_error("\\watch cannot be used with an empty query\n"); pg_log_error("\\watch cannot be used with an empty query");
PQclear(res); PQclear(res);
return -1; return -1;
case PGRES_COPY_OUT: case PGRES_COPY_OUT:
case PGRES_COPY_IN: case PGRES_COPY_IN:
case PGRES_COPY_BOTH: case PGRES_COPY_BOTH:
psql_error("\\watch cannot be used with COPY\n"); pg_log_error("\\watch cannot be used with COPY");
PQclear(res); PQclear(res);
return -1; return -1;
default: default:
psql_error("unexpected result status for \\watch\n"); pg_log_error("unexpected result status for \\watch");
PQclear(res); PQclear(res);
return -1; return -1;
} }
@ -907,12 +886,12 @@ StoreQueryTuple(const PGresult *result)
if (PQntuples(result) < 1) if (PQntuples(result) < 1)
{ {
psql_error("no rows returned for \\gset\n"); pg_log_error("no rows returned for \\gset");
success = false; success = false;
} }
else if (PQntuples(result) > 1) else if (PQntuples(result) > 1)
{ {
psql_error("more than one row returned for \\gset\n"); pg_log_error("more than one row returned for \\gset");
success = false; success = false;
} }
else else
@ -1081,7 +1060,7 @@ ProcessResult(PGresult **results)
default: default:
/* AcceptResult() should have caught anything else. */ /* AcceptResult() should have caught anything else. */
is_copy = false; is_copy = false;
psql_error("unexpected PQresultStatus: %d\n", result_status); pg_log_error("unexpected PQresultStatus: %d", result_status);
break; break;
} }
@ -1298,7 +1277,7 @@ PrintQueryResults(PGresult *results)
default: default:
success = false; success = false;
psql_error("unexpected PQresultStatus: %d\n", pg_log_error("unexpected PQresultStatus: %d",
PQresultStatus(results)); PQresultStatus(results));
break; break;
} }
@ -1334,7 +1313,7 @@ SendQuery(const char *query)
if (!pset.db) if (!pset.db)
{ {
psql_error("You are currently not connected to a database.\n"); pg_log_error("You are currently not connected to a database.");
goto sendquery_cleanup; goto sendquery_cleanup;
} }
@ -1380,7 +1359,7 @@ SendQuery(const char *query)
results = PQexec(pset.db, "BEGIN"); results = PQexec(pset.db, "BEGIN");
if (PQresultStatus(results) != PGRES_COMMAND_OK) if (PQresultStatus(results) != PGRES_COMMAND_OK)
{ {
psql_error("%s", PQerrorMessage(pset.db)); pg_log_info("%s", PQerrorMessage(pset.db));
ClearOrSaveResult(results); ClearOrSaveResult(results);
ResetCancelConn(); ResetCancelConn();
goto sendquery_cleanup; goto sendquery_cleanup;
@ -1398,7 +1377,7 @@ SendQuery(const char *query)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK.\n", pg_log_warning("The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
on_error_rollback_warning = true; on_error_rollback_warning = true;
@ -1408,7 +1387,7 @@ SendQuery(const char *query)
results = PQexec(pset.db, "SAVEPOINT pg_psql_temporary_savepoint"); results = PQexec(pset.db, "SAVEPOINT pg_psql_temporary_savepoint");
if (PQresultStatus(results) != PGRES_COMMAND_OK) if (PQresultStatus(results) != PGRES_COMMAND_OK)
{ {
psql_error("%s", PQerrorMessage(pset.db)); pg_log_info("%s", PQerrorMessage(pset.db));
ClearOrSaveResult(results); ClearOrSaveResult(results);
ResetCancelConn(); ResetCancelConn();
goto sendquery_cleanup; goto sendquery_cleanup;
@ -1461,7 +1440,7 @@ SendQuery(const char *query)
} }
if (!OK && pset.echo == PSQL_ECHO_ERRORS) if (!OK && pset.echo == PSQL_ECHO_ERRORS)
psql_error("STATEMENT: %s\n", query); pg_log_info("STATEMENT: %s", query);
/* If we made a temporary savepoint, possibly release/rollback */ /* If we made a temporary savepoint, possibly release/rollback */
if (on_error_rollback_savepoint) if (on_error_rollback_savepoint)
@ -1504,7 +1483,7 @@ SendQuery(const char *query)
OK = false; OK = false;
/* PQTRANS_UNKNOWN is expected given a broken connection. */ /* PQTRANS_UNKNOWN is expected given a broken connection. */
if (transaction_status != PQTRANS_UNKNOWN || ConnectionUp()) if (transaction_status != PQTRANS_UNKNOWN || ConnectionUp())
psql_error("unexpected transaction status (%d)\n", pg_log_error("unexpected transaction status (%d)",
transaction_status); transaction_status);
break; break;
} }
@ -1516,7 +1495,7 @@ SendQuery(const char *query)
svptres = PQexec(pset.db, svptcmd); svptres = PQexec(pset.db, svptcmd);
if (PQresultStatus(svptres) != PGRES_COMMAND_OK) if (PQresultStatus(svptres) != PGRES_COMMAND_OK)
{ {
psql_error("%s", PQerrorMessage(pset.db)); pg_log_info("%s", PQerrorMessage(pset.db));
ClearOrSaveResult(svptres); ClearOrSaveResult(svptres);
OK = false; OK = false;
@ -1619,7 +1598,7 @@ DescribeQuery(const char *query, double *elapsed_msec)
results = PQprepare(pset.db, "", query, 0, NULL); results = PQprepare(pset.db, "", query, 0, NULL);
if (PQresultStatus(results) != PGRES_COMMAND_OK) if (PQresultStatus(results) != PGRES_COMMAND_OK)
{ {
psql_error("%s", PQerrorMessage(pset.db)); pg_log_info("%s", PQerrorMessage(pset.db));
SetResultVariables(results, false); SetResultVariables(results, false);
ClearOrSaveResult(results); ClearOrSaveResult(results);
return false; return false;
@ -1657,7 +1636,7 @@ DescribeQuery(const char *query, double *elapsed_msec)
if (escname == NULL) if (escname == NULL)
{ {
psql_error("%s", PQerrorMessage(pset.db)); pg_log_info("%s", PQerrorMessage(pset.db));
PQclear(results); PQclear(results);
termPQExpBuffer(&buf); termPQExpBuffer(&buf);
return false; return false;

View File

@ -20,8 +20,6 @@ extern bool setQFout(const char *fname);
extern char *psql_get_variable(const char *varname, PsqlScanQuoteType quote, extern char *psql_get_variable(const char *varname, PsqlScanQuoteType quote,
void *passthrough); void *passthrough);
extern void psql_error(const char *fmt,...) pg_attribute_printf(1, 2);
extern void NoticeProcessor(void *arg, const char *message); extern void NoticeProcessor(void *arg, const char *message);
extern volatile bool sigint_interrupt_enabled; extern volatile bool sigint_interrupt_enabled;

View File

@ -24,6 +24,7 @@
#include "prompt.h" #include "prompt.h"
#include "stringutils.h" #include "stringutils.h"
#include "fe_utils/logging.h"
/* /*
* parse_slash_copy * parse_slash_copy
@ -96,7 +97,7 @@ parse_slash_copy(const char *args)
if (!args) if (!args)
{ {
psql_error("\\copy: arguments required\n"); pg_log_error("\\copy: arguments required");
return NULL; return NULL;
} }
@ -251,9 +252,9 @@ parse_slash_copy(const char *args)
error: error:
if (token) if (token)
psql_error("\\copy: parse error at \"%s\"\n", token); pg_log_error("\\copy: parse error at \"%s\"", token);
else else
psql_error("\\copy: parse error at end of line\n"); pg_log_error("\\copy: parse error at end of line");
free_copy_options(result); free_copy_options(result);
return NULL; return NULL;
@ -326,11 +327,11 @@ do_copy(const char *args)
if (!copystream) if (!copystream)
{ {
if (options->program) if (options->program)
psql_error("could not execute command \"%s\": %s\n", pg_log_error("could not execute command \"%s\": %m",
options->file, strerror(errno)); options->file);
else else
psql_error("%s: %s\n", pg_log_error("%s: %m",
options->file, strerror(errno)); options->file);
free_copy_options(options); free_copy_options(options);
return false; return false;
} }
@ -342,12 +343,12 @@ do_copy(const char *args)
/* make sure the specified file is not a directory */ /* make sure the specified file is not a directory */
if ((result = fstat(fileno(copystream), &st)) < 0) if ((result = fstat(fileno(copystream), &st)) < 0)
psql_error("could not stat file \"%s\": %s\n", pg_log_error("could not stat file \"%s\": %m",
options->file, strerror(errno)); options->file);
if (result == 0 && S_ISDIR(st.st_mode)) if (result == 0 && S_ISDIR(st.st_mode))
psql_error("%s: cannot copy from/to a directory\n", pg_log_error("%s: cannot copy from/to a directory",
options->file); options->file);
if (result < 0 || S_ISDIR(st.st_mode)) if (result < 0 || S_ISDIR(st.st_mode))
{ {
@ -383,13 +384,12 @@ do_copy(const char *args)
if (pclose_rc != 0) if (pclose_rc != 0)
{ {
if (pclose_rc < 0) if (pclose_rc < 0)
psql_error("could not close pipe to external command: %s\n", pg_log_error("could not close pipe to external command: %m");
strerror(errno));
else else
{ {
char *reason = wait_result_to_str(pclose_rc); char *reason = wait_result_to_str(pclose_rc);
psql_error("%s: %s\n", options->file, pg_log_error("%s: %s", options->file,
reason ? reason : ""); reason ? reason : "");
if (reason) if (reason)
free(reason); free(reason);
@ -402,7 +402,7 @@ do_copy(const char *args)
{ {
if (fclose(copystream) != 0) if (fclose(copystream) != 0)
{ {
psql_error("%s: %s\n", options->file, strerror(errno)); pg_log_error("%s: %m", options->file);
success = false; success = false;
} }
} }
@ -452,8 +452,7 @@ handleCopyOut(PGconn *conn, FILE *copystream, PGresult **res)
{ {
if (OK && copystream && fwrite(buf, 1, ret, copystream) != ret) if (OK && copystream && fwrite(buf, 1, ret, copystream) != ret)
{ {
psql_error("could not write COPY data: %s\n", pg_log_error("could not write COPY data: %m");
strerror(errno));
/* complain only once, keep reading data from server */ /* complain only once, keep reading data from server */
OK = false; OK = false;
} }
@ -463,14 +462,13 @@ handleCopyOut(PGconn *conn, FILE *copystream, PGresult **res)
if (OK && copystream && fflush(copystream)) if (OK && copystream && fflush(copystream))
{ {
psql_error("could not write COPY data: %s\n", pg_log_error("could not write COPY data: %m");
strerror(errno));
OK = false; OK = false;
} }
if (ret == -2) if (ret == -2)
{ {
psql_error("COPY data transfer failed: %s", PQerrorMessage(conn)); pg_log_error("COPY data transfer failed: %s", PQerrorMessage(conn));
OK = false; OK = false;
} }
@ -489,7 +487,7 @@ handleCopyOut(PGconn *conn, FILE *copystream, PGresult **res)
*res = PQgetResult(conn); *res = PQgetResult(conn);
if (PQresultStatus(*res) != PGRES_COMMAND_OK) if (PQresultStatus(*res) != PGRES_COMMAND_OK)
{ {
psql_error("%s", PQerrorMessage(conn)); pg_log_info("%s", PQerrorMessage(conn));
OK = false; OK = false;
} }
@ -708,7 +706,7 @@ copyin_cleanup:
} }
if (PQresultStatus(*res) != PGRES_COMMAND_OK) if (PQresultStatus(*res) != PGRES_COMMAND_OK)
{ {
psql_error("%s", PQerrorMessage(conn)); pg_log_info("%s", PQerrorMessage(conn));
OK = false; OK = false;
} }

View File

@ -13,6 +13,7 @@
#include "psqlscanslash.h" #include "psqlscanslash.h"
#include "settings.h" #include "settings.h"
#include "fe_utils/logging.h"
/* /*
* Value/position from the resultset that goes into the horizontal or vertical * Value/position from the resultset that goes into the horizontal or vertical
@ -120,13 +121,13 @@ PrintResultsInCrosstab(const PGresult *res)
if (PQresultStatus(res) != PGRES_TUPLES_OK) if (PQresultStatus(res) != PGRES_TUPLES_OK)
{ {
psql_error("\\crosstabview: statement did not return a result set\n"); pg_log_error("\\crosstabview: statement did not return a result set");
goto error_return; goto error_return;
} }
if (PQnfields(res) < 3) if (PQnfields(res) < 3)
{ {
psql_error("\\crosstabview: query must return at least three columns\n"); pg_log_error("\\crosstabview: query must return at least three columns");
goto error_return; goto error_return;
} }
@ -153,7 +154,7 @@ PrintResultsInCrosstab(const PGresult *res)
/* Insist that header columns be distinct */ /* Insist that header columns be distinct */
if (field_for_columns == field_for_rows) if (field_for_columns == field_for_rows)
{ {
psql_error("\\crosstabview: vertical and horizontal headers must be different columns\n"); pg_log_error("\\crosstabview: vertical and horizontal headers must be different columns");
goto error_return; goto error_return;
} }
@ -169,7 +170,7 @@ PrintResultsInCrosstab(const PGresult *res)
*/ */
if (PQnfields(res) != 3) if (PQnfields(res) != 3)
{ {
psql_error("\\crosstabview: data column must be specified when query returns more than three columns\n"); pg_log_error("\\crosstabview: data column must be specified when query returns more than three columns");
goto error_return; goto error_return;
} }
@ -225,7 +226,7 @@ PrintResultsInCrosstab(const PGresult *res)
if (piv_columns.count > CROSSTABVIEW_MAX_COLUMNS) if (piv_columns.count > CROSSTABVIEW_MAX_COLUMNS)
{ {
psql_error("\\crosstabview: maximum number of columns (%d) exceeded\n", pg_log_error("\\crosstabview: maximum number of columns (%d) exceeded",
CROSSTABVIEW_MAX_COLUMNS); CROSSTABVIEW_MAX_COLUMNS);
goto error_return; goto error_return;
} }
@ -394,7 +395,7 @@ printCrosstab(const PGresult *results,
*/ */
if (cont.cells[idx] != NULL) if (cont.cells[idx] != NULL)
{ {
psql_error("\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"\n", pg_log_error("\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"",
rp->name ? rp->name : rp->name ? rp->name :
(popt.nullPrint ? popt.nullPrint : "(null)"), (popt.nullPrint ? popt.nullPrint : "(null)"),
cp->name ? cp->name : cp->name ? cp->name :
@ -642,7 +643,7 @@ indexOfColumn(char *arg, const PGresult *res)
idx = atoi(arg) - 1; idx = atoi(arg) - 1;
if (idx < 0 || idx >= PQnfields(res)) if (idx < 0 || idx >= PQnfields(res))
{ {
psql_error("\\crosstabview: column number %d is out of range 1..%d\n", pg_log_error("\\crosstabview: column number %d is out of range 1..%d",
idx + 1, PQnfields(res)); idx + 1, PQnfields(res));
return -1; return -1;
} }
@ -667,7 +668,7 @@ indexOfColumn(char *arg, const PGresult *res)
if (idx >= 0) if (idx >= 0)
{ {
/* another idx was already found for the same name */ /* another idx was already found for the same name */
psql_error("\\crosstabview: ambiguous column name: \"%s\"\n", arg); pg_log_error("\\crosstabview: ambiguous column name: \"%s\"", arg);
return -1; return -1;
} }
idx = i; idx = i;
@ -675,7 +676,7 @@ indexOfColumn(char *arg, const PGresult *res)
} }
if (idx == -1) if (idx == -1)
{ {
psql_error("\\crosstabview: column name not found: \"%s\"\n", arg); pg_log_error("\\crosstabview: column name not found: \"%s\"", arg);
return -1; return -1;
} }
} }

View File

@ -18,6 +18,7 @@
#include "catalog/pg_cast_d.h" #include "catalog/pg_cast_d.h"
#include "catalog/pg_class_d.h" #include "catalog/pg_class_d.h"
#include "catalog/pg_default_acl_d.h" #include "catalog/pg_default_acl_d.h"
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h" #include "fe_utils/string_utils.h"
#include "common.h" #include "common.h"
@ -157,7 +158,7 @@ describeAccessMethods(const char *pattern, bool verbose)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support access methods.\n", pg_log_error("The server (version %s) does not support access methods.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -226,7 +227,7 @@ describeTablespaces(const char *pattern, bool verbose)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support tablespaces.\n", pg_log_info("The server (version %s) does not support tablespaces.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -329,7 +330,7 @@ describeFunctions(const char *functypes, const char *pattern, bool verbose, bool
if (strlen(functypes) != strspn(functypes, "anptwS+")) if (strlen(functypes) != strspn(functypes, "anptwS+"))
{ {
psql_error("\\df only takes [anptwS+] as options\n"); pg_log_error("\\df only takes [anptwS+] as options");
return true; return true;
} }
@ -337,7 +338,7 @@ describeFunctions(const char *functypes, const char *pattern, bool verbose, bool
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("\\df does not take a \"%c\" option with server version %s\n", pg_log_error("\\df does not take a \"%c\" option with server version %s",
'p', 'p',
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
@ -348,7 +349,7 @@ describeFunctions(const char *functypes, const char *pattern, bool verbose, bool
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("\\df does not take a \"%c\" option with server version %s\n", pg_log_error("\\df does not take a \"%c\" option with server version %s",
'w', 'w',
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
@ -1097,7 +1098,7 @@ listDefaultACLs(const char *pattern)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support altering default privileges.\n", pg_log_error("The server (version %s) does not support altering default privileges.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -1398,10 +1399,10 @@ describeTableDetails(const char *pattern, bool verbose, bool showSystem)
if (!pset.quiet) if (!pset.quiet)
{ {
if (pattern) if (pattern)
psql_error("Did not find any relation named \"%s\".\n", pg_log_error("Did not find any relation named \"%s\".",
pattern); pattern);
else else
psql_error("Did not find any relations.\n"); pg_log_error("Did not find any relations.");
} }
PQclear(res); PQclear(res);
return false; return false;
@ -1656,7 +1657,7 @@ describeOneTableDetails(const char *schemaname,
if (PQntuples(res) == 0) if (PQntuples(res) == 0)
{ {
if (!pset.quiet) if (!pset.quiet)
psql_error("Did not find any relation with OID %s.\n", oid); pg_log_error("Did not find any relation with OID %s.", oid);
goto error_return; goto error_return;
} }
@ -3541,7 +3542,7 @@ listDbRoleSettings(const char *pattern, const char *pattern2)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support per-database role settings.\n", pg_log_error("The server (version %s) does not support per-database role settings.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -3577,13 +3578,13 @@ listDbRoleSettings(const char *pattern, const char *pattern2)
if (PQntuples(res) == 0 && !pset.quiet) if (PQntuples(res) == 0 && !pset.quiet)
{ {
if (pattern && pattern2) if (pattern && pattern2)
psql_error("Did not find any settings for role \"%s\" and database \"%s\".\n", pg_log_error("Did not find any settings for role \"%s\" and database \"%s\".",
pattern, pattern2); pattern, pattern2);
else if (pattern) else if (pattern)
psql_error("Did not find any settings for role \"%s\".\n", pg_log_error("Did not find any settings for role \"%s\".",
pattern); pattern);
else else
psql_error("Did not find any settings.\n"); pg_log_error("Did not find any settings.");
} }
else else
{ {
@ -3753,10 +3754,10 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys
if (PQntuples(res) == 0 && !pset.quiet) if (PQntuples(res) == 0 && !pset.quiet)
{ {
if (pattern) if (pattern)
psql_error("Did not find any relation named \"%s\".\n", pg_log_error("Did not find any relation named \"%s\".",
pattern); pattern);
else else
psql_error("Did not find any relations.\n"); pg_log_error("Did not find any relations.");
} }
else else
{ {
@ -4212,7 +4213,7 @@ listCollations(const char *pattern, bool verbose, bool showSystem)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support collations.\n", pg_log_error("The server (version %s) does not support collations.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -4367,7 +4368,7 @@ listTSParsers(const char *pattern, bool verbose)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support full text search.\n", pg_log_error("The server (version %s) does not support full text search.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -4447,10 +4448,10 @@ listTSParsersVerbose(const char *pattern)
if (!pset.quiet) if (!pset.quiet)
{ {
if (pattern) if (pattern)
psql_error("Did not find any text search parser named \"%s\".\n", pg_log_error("Did not find any text search parser named \"%s\".",
pattern); pattern);
else else
psql_error("Did not find any text search parsers.\n"); pg_log_error("Did not find any text search parsers.");
} }
PQclear(res); PQclear(res);
return false; return false;
@ -4614,7 +4615,7 @@ listTSDictionaries(const char *pattern, bool verbose)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support full text search.\n", pg_log_error("The server (version %s) does not support full text search.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -4685,7 +4686,7 @@ listTSTemplates(const char *pattern, bool verbose)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support full text search.\n", pg_log_error("The server (version %s) does not support full text search.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -4756,7 +4757,7 @@ listTSConfigs(const char *pattern, bool verbose)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support full text search.\n", pg_log_error("The server (version %s) does not support full text search.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -4837,10 +4838,10 @@ listTSConfigsVerbose(const char *pattern)
if (!pset.quiet) if (!pset.quiet)
{ {
if (pattern) if (pattern)
psql_error("Did not find any text search configuration named \"%s\".\n", pg_log_error("Did not find any text search configuration named \"%s\".",
pattern); pattern);
else else
psql_error("Did not find any text search configurations.\n"); pg_log_error("Did not find any text search configurations.");
} }
PQclear(res); PQclear(res);
return false; return false;
@ -4962,7 +4963,7 @@ listForeignDataWrappers(const char *pattern, bool verbose)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support foreign-data wrappers.\n", pg_log_error("The server (version %s) does not support foreign-data wrappers.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -5045,7 +5046,7 @@ listForeignServers(const char *pattern, bool verbose)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support foreign servers.\n", pg_log_error("The server (version %s) does not support foreign servers.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -5127,7 +5128,7 @@ listUserMappings(const char *pattern, bool verbose)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support user mappings.\n", pg_log_error("The server (version %s) does not support user mappings.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -5188,7 +5189,7 @@ listForeignTables(const char *pattern, bool verbose)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support foreign tables.\n", pg_log_error("The server (version %s) does not support foreign tables.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -5266,7 +5267,7 @@ listExtensions(const char *pattern)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support extensions.\n", pg_log_error("The server (version %s) does not support extensions.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -5323,7 +5324,7 @@ listExtensionContents(const char *pattern)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support extensions.\n", pg_log_error("The server (version %s) does not support extensions.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -5351,10 +5352,10 @@ listExtensionContents(const char *pattern)
if (!pset.quiet) if (!pset.quiet)
{ {
if (pattern) if (pattern)
psql_error("Did not find any extension named \"%s\".\n", pg_log_error("Did not find any extension named \"%s\".",
pattern); pattern);
else else
psql_error("Did not find any extensions.\n"); pg_log_error("Did not find any extensions.");
} }
PQclear(res); PQclear(res);
return false; return false;
@ -5437,7 +5438,7 @@ listPublications(const char *pattern)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support publications.\n", pg_log_error("The server (version %s) does not support publications.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -5508,7 +5509,7 @@ describePublications(const char *pattern)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support publications.\n", pg_log_error("The server (version %s) does not support publications.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;
@ -5546,10 +5547,10 @@ describePublications(const char *pattern)
if (!pset.quiet) if (!pset.quiet)
{ {
if (pattern) if (pattern)
psql_error("Did not find any publication named \"%s\".\n", pg_log_error("Did not find any publication named \"%s\".",
pattern); pattern);
else else
psql_error("Did not find any publications.\n"); pg_log_error("Did not find any publications.");
} }
termPQExpBuffer(&buf); termPQExpBuffer(&buf);
@ -5664,7 +5665,7 @@ describeSubscriptions(const char *pattern, bool verbose)
{ {
char sverbuf[32]; char sverbuf[32];
psql_error("The server (version %s) does not support subscriptions.\n", pg_log_error("The server (version %s) does not support subscriptions.",
formatPGVersionNumber(pset.sversion, false, formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf))); sverbuf, sizeof(sverbuf)));
return true; return true;

View File

@ -28,6 +28,7 @@
#include "settings.h" #include "settings.h"
#include "sql_help.h" #include "sql_help.h"
#include "fe_utils/logging.h"
/* /*
* PLEASE: * PLEASE:
@ -59,7 +60,7 @@ usage(unsigned short int pager)
user = get_user_name(&errstr); user = get_user_name(&errstr);
if (!user) if (!user)
{ {
psql_error("%s\n", errstr); pg_log_fatal("%s", errstr);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }

View File

@ -18,6 +18,8 @@
#include "tab-complete.h" #include "tab-complete.h"
#include "common.h" #include "common.h"
#include "fe_utils/logging.h"
#ifndef WIN32 #ifndef WIN32
#define PSQLHISTORY ".psql_history" #define PSQLHISTORY ".psql_history"
#else #else
@ -213,8 +215,7 @@ gets_fromFile(FILE *source)
{ {
if (ferror(source)) if (ferror(source))
{ {
psql_error("could not read from input file: %s\n", pg_log_error("could not read from input file: %m");
strerror(errno));
return NULL; return NULL;
} }
break; break;
@ -224,7 +225,7 @@ gets_fromFile(FILE *source)
if (PQExpBufferBroken(buffer)) if (PQExpBufferBroken(buffer))
{ {
psql_error("out of memory\n"); pg_log_error("out of memory");
return NULL; return NULL;
} }
@ -468,8 +469,7 @@ saveHistory(char *fname, int max_lines)
} }
#endif #endif
psql_error("could not save history to file \"%s\": %s\n", pg_log_error("could not save history to file \"%s\": %m", fname);
fname, strerror(errnum));
} }
return false; return false;
} }
@ -507,8 +507,7 @@ printHistory(const char *fname, unsigned short int pager)
output = fopen(fname, "w"); output = fopen(fname, "w");
if (output == NULL) if (output == NULL)
{ {
psql_error("could not save history to file \"%s\": %s\n", pg_log_error("could not save history to file \"%s\": %m", fname);
fname, strerror(errno));
return false; return false;
} }
is_pager = false; is_pager = false;
@ -527,7 +526,7 @@ printHistory(const char *fname, unsigned short int pager)
return true; return true;
#else #else
psql_error("history is not supported by this installation\n"); pg_log_error("history is not supported by this installation");
return false; return false;
#endif #endif
} }

View File

@ -8,10 +8,11 @@
#include "postgres_fe.h" #include "postgres_fe.h"
#include "large_obj.h" #include "large_obj.h"
#include "settings.h" #include "settings.h"
#include "common.h" #include "common.h"
#include "fe_utils/logging.h"
static void print_lo_result(const char *fmt,...) pg_attribute_printf(1, 2); static void print_lo_result(const char *fmt,...) pg_attribute_printf(1, 2);
static void static void
@ -61,7 +62,7 @@ start_lo_xact(const char *operation, bool *own_transaction)
if (!pset.db) if (!pset.db)
{ {
psql_error("%s: not connected to a database\n", operation); pg_log_error("%s: not connected to a database", operation);
return false; return false;
} }
@ -80,10 +81,10 @@ start_lo_xact(const char *operation, bool *own_transaction)
/* use the existing xact */ /* use the existing xact */
break; break;
case PQTRANS_INERROR: case PQTRANS_INERROR:
psql_error("%s: current transaction is aborted\n", operation); pg_log_error("%s: current transaction is aborted", operation);
return false; return false;
default: default:
psql_error("%s: unknown transaction status\n", operation); pg_log_error("%s: unknown transaction status", operation);
return false; return false;
} }
@ -153,7 +154,7 @@ do_lo_export(const char *loid_arg, const char *filename_arg)
/* of course this status is documented nowhere :( */ /* of course this status is documented nowhere :( */
if (status != 1) if (status != 1)
{ {
psql_error("%s", PQerrorMessage(pset.db)); pg_log_info("%s", PQerrorMessage(pset.db));
return fail_lo_xact("\\lo_export", own_transaction); return fail_lo_xact("\\lo_export", own_transaction);
} }
@ -188,7 +189,7 @@ do_lo_import(const char *filename_arg, const char *comment_arg)
if (loid == InvalidOid) if (loid == InvalidOid)
{ {
psql_error("%s", PQerrorMessage(pset.db)); pg_log_info("%s", PQerrorMessage(pset.db));
return fail_lo_xact("\\lo_import", own_transaction); return fail_lo_xact("\\lo_import", own_transaction);
} }
@ -250,7 +251,7 @@ do_lo_unlink(const char *loid_arg)
if (status == -1) if (status == -1)
{ {
psql_error("%s", PQerrorMessage(pset.db)); pg_log_info("%s", PQerrorMessage(pset.db));
return fail_lo_xact("\\lo_unlink", own_transaction); return fail_lo_xact("\\lo_unlink", own_transaction);
} }

View File

@ -14,13 +14,13 @@
#include "prompt.h" #include "prompt.h"
#include "settings.h" #include "settings.h"
#include "fe_utils/logging.h"
#include "mb/pg_wchar.h" #include "mb/pg_wchar.h"
/* callback functions for our flex lexer */ /* callback functions for our flex lexer */
const PsqlScanCallbacks psqlscan_callbacks = { const PsqlScanCallbacks psqlscan_callbacks = {
psql_get_variable, psql_get_variable,
psql_error
}; };
@ -79,7 +79,7 @@ MainLoop(FILE *source)
PQExpBufferBroken(previous_buf) || PQExpBufferBroken(previous_buf) ||
PQExpBufferBroken(history_buf)) PQExpBufferBroken(history_buf))
{ {
psql_error("out of memory\n"); pg_log_error("out of memory");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -133,7 +133,7 @@ MainLoop(FILE *source)
*/ */
if (!conditional_stack_empty(cond_stack)) if (!conditional_stack_empty(cond_stack))
{ {
psql_error("\\if: escaped\n"); pg_log_error("\\if: escaped");
conditional_stack_pop(cond_stack); conditional_stack_pop(cond_stack);
} }
} }
@ -383,7 +383,7 @@ MainLoop(FILE *source)
if (PQExpBufferBroken(query_buf)) if (PQExpBufferBroken(query_buf))
{ {
psql_error("out of memory\n"); pg_log_error("out of memory");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -446,7 +446,7 @@ MainLoop(FILE *source)
{ {
/* if interactive, warn about non-executed query */ /* if interactive, warn about non-executed query */
if (pset.cur_cmd_interactive) if (pset.cur_cmd_interactive)
psql_error("query ignored; use \\endif or Ctrl-C to exit current \\if block\n"); pg_log_error("query ignored; use \\endif or Ctrl-C to exit current \\if block");
/* fake an OK result for purposes of loop checks */ /* fake an OK result for purposes of loop checks */
success = true; success = true;
slashCmdStatus = PSQL_CMD_SEND; slashCmdStatus = PSQL_CMD_SEND;
@ -588,7 +588,7 @@ MainLoop(FILE *source)
else else
{ {
if (pset.cur_cmd_interactive) if (pset.cur_cmd_interactive)
psql_error("query ignored; use \\endif or Ctrl-C to exit current \\if block\n"); pg_log_error("query ignored; use \\endif or Ctrl-C to exit current \\if block");
success = true; success = true;
} }
@ -606,7 +606,7 @@ MainLoop(FILE *source)
successResult != EXIT_USER && successResult != EXIT_USER &&
!conditional_stack_empty(cond_stack)) !conditional_stack_empty(cond_stack))
{ {
psql_error("reached EOF without finding closing \\endif(s)\n"); pg_log_error("reached EOF without finding closing \\endif(s)");
if (die_on_error && !pset.cur_cmd_interactive) if (die_on_error && !pset.cur_cmd_interactive)
successResult = EXIT_USER; successResult = EXIT_USER;
} }

View File

@ -1,12 +1,14 @@
# src/bin/psql/nls.mk # src/bin/psql/nls.mk
CATALOG_NAME = psql CATALOG_NAME = psql
AVAIL_LANGUAGES = cs de es fr he it ja ko pl pt_BR ru sv zh_CN zh_TW AVAIL_LANGUAGES = cs de es fr he it ja ko pl pt_BR ru sv zh_CN zh_TW
GETTEXT_FILES = command.c common.c copy.c crosstabview.c help.c input.c large_obj.c \ GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
command.c common.c copy.c crosstabview.c help.c input.c large_obj.c \
mainloop.c psqlscanslash.c startup.c \ mainloop.c psqlscanslash.c startup.c \
describe.c sql_help.h sql_help.c \ describe.c sql_help.h sql_help.c \
tab-complete.c variables.c \ tab-complete.c variables.c \
../../fe_utils/print.c ../../fe_utils/psqlscan.c \ ../../fe_utils/print.c ../../fe_utils/psqlscan.c \
../../common/exec.c ../../common/fe_memutils.c ../../common/username.c \ ../../common/exec.c ../../common/fe_memutils.c ../../common/username.c \
../../common/wait_error.c ../../common/wait_error.c
GETTEXT_TRIGGERS = N_ psql_error simple_prompt write_error GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \
GETTEXT_FLAGS = psql_error:1:c-format write_error:1:c-format N_ simple_prompt
GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)

View File

@ -20,6 +20,7 @@
#include "psqlscanslash.h" #include "psqlscanslash.h"
#include "fe_utils/conditional.h" #include "fe_utils/conditional.h"
#include "fe_utils/logging.h"
#include "libpq-fe.h" #include "libpq-fe.h"
} }
@ -633,7 +634,7 @@ psql_scan_slash_option(PsqlScanState state,
case xslashbackquote: case xslashbackquote:
case xslashdquote: case xslashdquote:
/* must have hit EOL inside quotes */ /* must have hit EOL inside quotes */
state->callbacks->write_error("unterminated quoted string\n"); pg_log_error("unterminated quoted string");
termPQExpBuffer(&mybuf); termPQExpBuffer(&mybuf);
return NULL; return NULL;
case xslashwholeline: case xslashwholeline:
@ -779,7 +780,7 @@ evaluate_backtick(PsqlScanState state)
fd = popen(cmd, PG_BINARY_R); fd = popen(cmd, PG_BINARY_R);
if (!fd) if (!fd)
{ {
state->callbacks->write_error("%s: %s\n", cmd, strerror(errno)); pg_log_error("%s: %m", cmd);
error = true; error = true;
} }
@ -790,7 +791,7 @@ evaluate_backtick(PsqlScanState state)
result = fread(buf, 1, sizeof(buf), fd); result = fread(buf, 1, sizeof(buf), fd);
if (ferror(fd)) if (ferror(fd))
{ {
state->callbacks->write_error("%s: %s\n", cmd, strerror(errno)); pg_log_error("%s: %m", cmd);
error = true; error = true;
break; break;
} }
@ -800,13 +801,13 @@ evaluate_backtick(PsqlScanState state)
if (fd && pclose(fd) == -1) if (fd && pclose(fd) == -1)
{ {
state->callbacks->write_error("%s: %s\n", cmd, strerror(errno)); pg_log_error("%s: %m", cmd);
error = true; error = true;
} }
if (PQExpBufferDataBroken(cmd_output)) if (PQExpBufferDataBroken(cmd_output))
{ {
state->callbacks->write_error("%s: out of memory\n", cmd); pg_log_error("%s: out of memory", cmd);
error = true; error = true;
} }

View File

@ -22,6 +22,7 @@
#include "help.h" #include "help.h"
#include "input.h" #include "input.h"
#include "mainloop.h" #include "mainloop.h"
#include "fe_utils/logging.h"
#include "fe_utils/print.h" #include "fe_utils/print.h"
#include "settings.h" #include "settings.h"
@ -89,6 +90,28 @@ static void EstablishVariableSpace(void);
#define NOPAGER 0 #define NOPAGER 0
static void
log_pre_callback(void)
{
if (pset.queryFout && pset.queryFout != stdout)
fflush(pset.queryFout);
}
static void
log_locus_callback(const char **filename, uint64 *lineno)
{
if (pset.inputfile)
{
*filename = pset.inputfile;
*lineno = pset.lineno;
}
else
{
*filename = NULL;
*lineno = 0;
}
}
/* /*
* *
* main * main
@ -103,6 +126,9 @@ main(int argc, char *argv[])
char password[100]; char password[100];
bool new_pass; bool new_pass;
pg_logging_init(argv[0]);
pg_logging_set_pre_callback(log_pre_callback);
pg_logging_set_locus_callback(log_locus_callback);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("psql")); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("psql"));
if (argc > 1) if (argc > 1)
@ -119,10 +145,6 @@ main(int argc, char *argv[])
} }
} }
#ifdef WIN32
setvbuf(stderr, NULL, _IONBF, 0);
#endif
pset.progname = get_progname(argv[0]); pset.progname = get_progname(argv[0]);
pset.db = NULL; pset.db = NULL;
@ -190,7 +212,7 @@ main(int argc, char *argv[])
/* Bail out if -1 was specified but will be ignored. */ /* Bail out if -1 was specified but will be ignored. */
if (options.single_txn && options.actions.head == NULL) if (options.single_txn && options.actions.head == NULL)
{ {
fprintf(stderr, _("%s: -1 can only be used in non-interactive mode\n"), pset.progname); pg_log_fatal("-1 can only be used in non-interactive mode");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -277,7 +299,7 @@ main(int argc, char *argv[])
if (PQstatus(pset.db) == CONNECTION_BAD) if (PQstatus(pset.db) == CONNECTION_BAD)
{ {
fprintf(stderr, "%s: %s", pset.progname, PQerrorMessage(pset.db)); pg_log_error("could not connect to server: %s", PQerrorMessage(pset.db));
PQfinish(pset.db); PQfinish(pset.db);
exit(EXIT_BADCONN); exit(EXIT_BADCONN);
} }
@ -305,8 +327,8 @@ main(int argc, char *argv[])
pset.logfile = fopen(options.logfilename, "a"); pset.logfile = fopen(options.logfilename, "a");
if (!pset.logfile) if (!pset.logfile)
{ {
fprintf(stderr, _("%s: could not open log file \"%s\": %s\n"), pg_log_fatal("could not open log file \"%s\": %m",
pset.progname, options.logfilename, strerror(errno)); options.logfilename);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
} }
@ -343,6 +365,8 @@ main(int argc, char *argv[])
{ {
if (cell->action == ACT_SINGLE_QUERY) if (cell->action == ACT_SINGLE_QUERY)
{ {
pg_logging_config(PG_LOG_FLAG_TERSE);
if (pset.echo == PSQL_ECHO_ALL) if (pset.echo == PSQL_ECHO_ALL)
puts(cell->val); puts(cell->val);
@ -354,6 +378,8 @@ main(int argc, char *argv[])
PsqlScanState scan_state; PsqlScanState scan_state;
ConditionalStack cond_stack; ConditionalStack cond_stack;
pg_logging_config(PG_LOG_FLAG_TERSE);
if (pset.echo == PSQL_ECHO_ALL) if (pset.echo == PSQL_ECHO_ALL)
puts(cell->val); puts(cell->val);
@ -562,7 +588,7 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts *options)
if (!result) if (!result)
{ {
fprintf(stderr, _("%s: could not set printing parameter \"%s\"\n"), pset.progname, value); pg_log_fatal("could not set printing parameter \"%s\"", value);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -684,8 +710,8 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts *options)
else if (!options->username) else if (!options->username)
options->username = argv[optind]; options->username = argv[optind];
else if (!pset.quiet) else if (!pset.quiet)
fprintf(stderr, _("%s: warning: extra command-line argument \"%s\" ignored\n"), pg_log_warning("extra command-line argument \"%s\" ignored",
pset.progname, argv[optind]); argv[optind]);
optind++; optind++;
} }
@ -733,7 +759,7 @@ process_psqlrc(char *argv0)
if (find_my_exec(argv0, my_exec_path) < 0) if (find_my_exec(argv0, my_exec_path) < 0)
{ {
fprintf(stderr, _("%s: could not find own program executable\n"), argv0); pg_log_fatal("could not find own program executable");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@ -4329,7 +4329,7 @@ exec_query(const char *query)
if (PQresultStatus(result) != PGRES_TUPLES_OK) if (PQresultStatus(result) != PGRES_TUPLES_OK)
{ {
#ifdef NOT_USED #ifdef NOT_USED
psql_error("tab completion query failed: %s\nQuery was:\n%s\n", pg_log_error("tab completion query failed: %s\nQuery was:\n%s",
PQerrorMessage(pset.db), query); PQerrorMessage(pset.db), query);
#endif #endif
PQclear(result); PQclear(result);

Some files were not shown because too many files have changed in this diff Show More