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>
</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>
<para>

View File

@ -322,6 +322,17 @@ PostgreSQL documentation
</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>
<para>

View File

@ -400,6 +400,17 @@ PostgreSQL documentation
</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>
<para>

View File

@ -228,6 +228,17 @@ PostgreSQL documentation
</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>
<para>

View File

@ -220,6 +220,17 @@ PostgreSQL documentation
</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>
<para>

View File

@ -461,6 +461,17 @@ PostgreSQL documentation
</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>
<varlistentry>
<term><envar>TZ</envar></term>

View File

@ -687,6 +687,12 @@ PostgreSQL documentation
(see <xref linkend="libpq-envars"/>).
</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>

View File

@ -173,6 +173,17 @@ PostgreSQL documentation
</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>

View File

@ -68,6 +68,17 @@ PostgreSQL documentation
</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>
</refentry>

View File

@ -1224,6 +1224,17 @@ PostgreSQL documentation
</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>
<para>

View File

@ -695,6 +695,17 @@ PostgreSQL documentation
</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>
<para>

View File

@ -164,6 +164,13 @@ PostgreSQL documentation
also uses the environment variables supported by <application>libpq</application>
(see <xref linkend="libpq-envars"/>).
</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 id="app-pg-isready-notes">

View File

@ -408,6 +408,12 @@ PostgreSQL documentation
(see <xref linkend="libpq-envars"/>).
</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>

View File

@ -397,6 +397,13 @@ PostgreSQL documentation
uses the environment variables supported by <application>libpq</application>
(see <xref linkend="libpq-envars"/>).
</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>

View File

@ -320,6 +320,23 @@ PostgreSQL documentation
</variablelist>
</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>
<title>Notes</title>

View File

@ -822,6 +822,17 @@
</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>
<para>

View File

@ -234,6 +234,13 @@ PostgreSQL documentation
<application>pg_rewind</application> also uses the environment variables
supported by <application>libpq</application> (see <xref linkend="libpq-envars"/>).
</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>

View File

@ -206,6 +206,32 @@ PostgreSQL documentation
</para>
</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>
<title>Notes</title>
<para>

View File

@ -4333,6 +4333,17 @@ $endif
</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>
<varlistentry>
<term><envar>PSQL_EDITOR</envar></term>
<term><envar>EDITOR</envar></term>

View File

@ -352,6 +352,17 @@ PostgreSQL documentation
</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>
<para>

View File

@ -451,6 +451,17 @@ PostgreSQL documentation
</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>
<para>

View File

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

View File

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

View File

@ -1,5 +1,6 @@
# src/bin/initdb/nls.mk
CATALOG_NAME = initdb
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_TRIGGERS = simple_prompt
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 = $(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 = ../../..
include $(top_builddir)/src/Makefile.global
LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils
OBJS = pg_archivecleanup.o $(WIN32RES)
all: pg_archivecleanup
pg_archivecleanup: $(OBJS) | submake-libpgport
pg_archivecleanup: $(OBJS) | submake-libpgport submake-libpgfeutils
$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
install: all installdirs

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,6 @@
# src/bin/pg_checksums/nls.mk
CATALOG_NAME = pg_checksums
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/file_perm.h"
#include "common/file_utils.h"
#include "fe_utils/logging.h"
#include "getopt_long.h"
#include "pg_getopt.h"
#include "storage/bufpage.h"
@ -126,8 +127,7 @@ scan_file(const char *fn, BlockNumber segmentno)
if (f < 0)
{
fprintf(stderr, _("%s: could not open file \"%s\": %s\n"),
progname, fn, strerror(errno));
pg_log_error("could not open file \"%s\": %m", fn);
exit(1);
}
@ -142,8 +142,8 @@ scan_file(const char *fn, BlockNumber segmentno)
break;
if (r != BLCKSZ)
{
fprintf(stderr, _("%s: could not read block %u in file \"%s\": read %d of %d\n"),
progname, blockno, fn, r, BLCKSZ);
pg_log_error("could not read block %u in file \"%s\": read %d of %d",
blockno, fn, r, BLCKSZ);
exit(1);
}
blocks++;
@ -158,8 +158,8 @@ scan_file(const char *fn, BlockNumber segmentno)
if (csum != header->pd_checksum)
{
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"),
progname, fn, blockno, csum, header->pd_checksum);
pg_log_error("checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X",
fn, blockno, csum, header->pd_checksum);
badblocks++;
}
}
@ -171,15 +171,15 @@ scan_file(const char *fn, BlockNumber segmentno)
/* Seek back to beginning of block */
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);
}
/* Write block with checksum */
if (write(f, buf.data, BLCKSZ) != BLCKSZ)
{
fprintf(stderr, _("%s: could not update checksum of block %d in file \"%s\": %s\n"),
progname, blockno, fn, strerror(errno));
pg_log_error("could not update checksum of block %d in file \"%s\": %m",
blockno, fn);
exit(1);
}
}
@ -188,11 +188,9 @@ scan_file(const char *fn, BlockNumber segmentno)
if (verbose)
{
if (mode == PG_MODE_CHECK)
fprintf(stderr,
_("%s: checksums verified in file \"%s\"\n"), progname, fn);
pg_log_info("checksums verified in file \"%s\"", fn);
if (mode == PG_MODE_ENABLE)
fprintf(stderr,
_("%s: checksums enabled in file \"%s\"\n"), progname, fn);
pg_log_info("checksums enabled in file \"%s\"", fn);
}
close(f);
@ -209,8 +207,7 @@ scan_directory(const char *basedir, const char *subdir)
dir = opendir(path);
if (!dir)
{
fprintf(stderr, _("%s: could not open directory \"%s\": %s\n"),
progname, path, strerror(errno));
pg_log_error("could not open directory \"%s\": %m", path);
exit(1);
}
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);
if (lstat(fn, &st) < 0)
{
fprintf(stderr, _("%s: could not stat file \"%s\": %s\n"),
progname, fn, strerror(errno));
pg_log_error("could not stat file \"%s\": %m", fn);
exit(1);
}
if (S_ISREG(st.st_mode))
@ -265,8 +261,8 @@ scan_directory(const char *basedir, const char *subdir)
segmentno = atoi(segmentpath);
if (segmentno == 0)
{
fprintf(stderr, _("%s: invalid segment number %d in file name \"%s\"\n"),
progname, segmentno, fn);
pg_log_error("invalid segment number %d in file name \"%s\"",
segmentno, fn);
exit(1);
}
}
@ -309,8 +305,8 @@ main(int argc, char *argv[])
int option_index;
bool crc_ok;
pg_logging_init(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_checksums"));
progname = get_progname(argv[0]);
if (argc > 1)
@ -352,7 +348,7 @@ main(int argc, char *argv[])
case 'r':
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);
}
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 (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);
exit(1);
}
@ -382,8 +378,8 @@ main(int argc, char *argv[])
/* Complain if any arguments remain */
if (optind < argc)
{
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
progname, argv[optind]);
pg_log_error("too many command-line arguments (first is \"%s\")",
argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@ -392,31 +388,29 @@ main(int argc, char *argv[])
/* Relfilenode checking only works in --check mode */
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"),
progname);
exit(1);
}
/* Check if cluster is running */
ControlFile = get_controlfile(DataDir, progname, &crc_ok);
ControlFile = get_controlfile(DataDir, &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);
}
if (ControlFile->pg_control_version != PG_CONTROL_VERSION)
{
fprintf(stderr, _("%s: cluster is not compatible with this version of pg_checksums\n"),
progname);
pg_log_error("cluster is not compatible with this version of pg_checksums");
exit(1);
}
if (ControlFile->blcksz != BLCKSZ)
{
fprintf(stderr, _("%s: database cluster is not compatible.\n"),
progname);
pg_log_error("database cluster is not compatible");
fprintf(stderr, _("The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.\n"),
ControlFile->blcksz, BLCKSZ);
exit(1);
@ -425,28 +419,28 @@ main(int argc, char *argv[])
if (ControlFile->state != DB_SHUTDOWNED &&
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);
}
if (ControlFile->data_checksum_version == 0 &&
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);
}
if (ControlFile->data_checksum_version == 0 &&
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);
}
if (ControlFile->data_checksum_version > 0 &&
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);
}
@ -482,12 +476,12 @@ main(int argc, char *argv[])
if (do_sync)
{
printf(_("Syncing data directory\n"));
fsync_pgdata(DataDir, progname, PG_VERSION_NUM);
pg_log_info("syncing data directory");
fsync_pgdata(DataDir, PG_VERSION_NUM);
}
printf(_("Updating control file\n"));
update_controlfile(DataDir, progname, ControlFile, do_sync);
pg_log_info("updating control file");
update_controlfile(DataDir, ControlFile, do_sync);
if (verbose)
printf(_("Data checksum version: %d\n"), ControlFile->data_checksum_version);

View File

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

View File

@ -25,6 +25,7 @@
#include "access/xlog_internal.h"
#include "catalog/pg_control.h"
#include "common/controldata_utils.h"
#include "fe_utils/logging.h"
#include "pg_getopt.h"
#include "getopt_long.h"
@ -107,8 +108,8 @@ main(int argc, char *argv[])
int i;
int WalSegSz;
pg_logging_init(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_controldata"));
progname = get_progname(argv[0]);
if (argc > 1)
@ -150,8 +151,8 @@ main(int argc, char *argv[])
/* Complain if any arguments remain */
if (optind < argc)
{
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
progname, argv[optind]);
pg_log_error("too many command-line arguments (first is \"%s\")",
argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@ -159,13 +160,13 @@ main(int argc, char *argv[])
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);
exit(1);
}
/* get a copy of the control file */
ControlFile = get_controlfile(DataDir, progname, &crc_ok);
ControlFile = get_controlfile(DataDir, &crc_ok);
if (!crc_ok)
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"

View File

@ -16,6 +16,8 @@ subdir = src/bin/pg_ctl
top_builddir = ../../..
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;
# but let's not pull that in on platforms where we don't need it.
ifeq ($(PORTNAME), win32)
@ -28,7 +30,7 @@ OBJS= pg_ctl.o $(WIN32RES)
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)
install: all installdirs

View File

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

View File

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

View File

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

View File

@ -1,7 +1,8 @@
# src/bin/pg_dump/nls.mk
CATALOG_NAME = pg_dump
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_directory.c dumputils.c compress_io.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 \
../../common/exec.c ../../common/fe_memutils.c \
../../common/wait_error.c
GETTEXT_TRIGGERS = write_msg:2 exit_horribly:2 simple_prompt \
ExecuteSqlCommand:3 ahlog:3 warn_or_exit_horribly:3
GETTEXT_FLAGS = \
write_msg:2:c-format \
exit_horribly:2:c-format \
ahlog:3:c-format \
warn_or_exit_horribly:3:c-format
GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \
fatal simple_prompt \
ExecuteSqlCommand:3 warn_or_exit_horribly:3
GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \
fatal:1:c-format \
warn_or_exit_horribly:2:c-format

View File

@ -197,8 +197,6 @@ bool parallel_init_done = false;
DWORD mainThreadId;
#endif /* WIN32 */
static const char *modulename = gettext_noop("parallel archiver");
/* Local function prototypes */
static ParallelSlot *GetMyPSlot(ParallelState *pstate);
static void archive_close_connection(int code, void *arg);
@ -262,7 +260,7 @@ init_parallel_dump_utils(void)
err = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (err != 0)
{
fprintf(stderr, _("%s: WSAStartup failed: %d\n"), progname, err);
pg_log_error("WSAStartup failed: %d", err);
exit_nicely(1);
}
/* ... 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.
*
* 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
* exit_horribly() situation, so intervening to cancel active commands is
* should be long gone, and the ParallelState too). We're only here in a
* fatal() situation, so intervening to cancel active commands is
* appropriate.
*/
static void
@ -697,7 +695,7 @@ consoleHandler(DWORD dwCtrlType)
/*
* 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
* seems better to assume as little as possible.)
*/
@ -967,9 +965,7 @@ ParallelBackupStart(ArchiveHandle *AH)
/* Create communication pipes for this worker */
if (pgpipe(pipeMW) < 0 || pgpipe(pipeWM) < 0)
exit_horribly(modulename,
"could not create communication channels: %s\n",
strerror(errno));
fatal("could not create communication channels: %m");
pstate->te[i] = NULL; /* just for safety */
@ -1032,9 +1028,7 @@ ParallelBackupStart(ArchiveHandle *AH)
else if (pid < 0)
{
/* fork failed */
exit_horribly(modulename,
"could not create worker process: %s\n",
strerror(errno));
fatal("could not create worker process: %m");
}
/* In Master after successful fork */
@ -1163,8 +1157,7 @@ parseWorkerCommand(ArchiveHandle *AH, TocEntry **te, T_Action *act,
Assert(*te != NULL);
}
else
exit_horribly(modulename,
"unrecognized command received from master: \"%s\"\n",
fatal("unrecognized command received from master: \"%s\"",
msg);
}
@ -1207,8 +1200,7 @@ parseWorkerResponse(ArchiveHandle *AH, TocEntry *te,
AH->public.n_errors += n_errors;
}
else
exit_horribly(modulename,
"invalid message received from worker: \"%s\"\n",
fatal("invalid message received from worker: \"%s\"",
msg);
return status;
@ -1340,11 +1332,10 @@ lockTableForWorker(ArchiveHandle *AH, TocEntry *te)
res = PQexec(AH->connection, query->data);
if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
exit_horribly(modulename,
"could not obtain lock on relation \"%s\"\n"
"This usually means that someone requested an ACCESS EXCLUSIVE lock "
"on the table after the pg_dump parent process had gotten the "
"initial ACCESS SHARE lock on the table.\n", qualId);
fatal("could not obtain lock on relation \"%s\"\n"
"This usually means that someone requested an ACCESS EXCLUSIVE lock "
"on the table after the pg_dump parent process had gotten the "
"initial ACCESS SHARE lock on the table.", qualId);
PQclear(res);
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)
exit_horribly(modulename, "a worker process died unexpectedly\n");
fatal("a worker process died unexpectedly");
return false;
}
@ -1447,8 +1438,7 @@ ListenToWorkers(ArchiveHandle *AH, ParallelState *pstate, bool do_wait)
pstate->te[worker] = NULL;
}
else
exit_horribly(modulename,
"invalid message received from worker: \"%s\"\n",
fatal("invalid message received from worker: \"%s\"",
msg);
/* Free the string returned from getMessageFromWorker */
@ -1553,9 +1543,7 @@ sendMessageToMaster(int pipefd[2], const char *str)
int len = strlen(str) + 1;
if (pipewrite(pipefd[PIPE_WRITE], str, len) != len)
exit_horribly(modulename,
"could not write to the communication channel: %s\n",
strerror(errno));
fatal("could not write to the communication channel: %m");
}
/*
@ -1632,7 +1620,7 @@ getMessageFromWorker(ParallelState *pstate, bool do_wait, int *worker)
}
if (i < 0)
exit_horribly(modulename, "select() failed: %s\n", strerror(errno));
fatal("select() failed: %m");
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)
{
exit_horribly(modulename,
"could not write to the communication channel: %s\n",
strerror(errno));
fatal("could not write to the communication channel: %m");
}
}
@ -1757,7 +1743,7 @@ pgpipe(int handles[2])
*/
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());
return -1;
}
@ -1768,21 +1754,21 @@ pgpipe(int handles[2])
serv_addr.sin_addr.s_addr = pg_hton32(INADDR_LOOPBACK);
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());
closesocket(s);
return -1;
}
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());
closesocket(s);
return -1;
}
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());
closesocket(s);
return -1;
@ -1793,7 +1779,7 @@ pgpipe(int handles[2])
*/
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());
closesocket(s);
return -1;
@ -1802,7 +1788,7 @@ pgpipe(int handles[2])
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());
closesocket(handles[1]);
handles[1] = -1;
@ -1811,7 +1797,7 @@ pgpipe(int handles[2])
}
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());
closesocket(handles[1]);
handles[1] = -1;

View File

@ -35,6 +35,7 @@
#include "pg_backup_db.h"
#include "pg_backup_utils.h"
#include "dumputils.h"
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h"
#include "libpq/libpq-fs.h"
@ -67,9 +68,6 @@ typedef struct _parallelReadyList
bool sorted; /* are valid entries currently sorted? */
} ParallelReadyList;
/* translator: this is a module name */
static const char *modulename = gettext_noop("archiver");
static ArchiveHandle *_allocAH(const char *FileSpec, const ArchiveFormat fmt,
const int compression, bool dosync, ArchiveMode mode,
@ -272,8 +270,7 @@ CloseArchive(Archive *AHX)
res = fclose(AH->OF);
if (res != 0)
exit_horribly(modulename, "could not close output file: %s\n",
strerror(errno));
fatal("could not close output file: %m");
}
/* Public */
@ -317,19 +314,17 @@ ProcessArchiveRestoreOptions(Archive *AHX)
break;
case SECTION_PRE_DATA:
if (curSection != SECTION_PRE_DATA)
write_msg(modulename,
"WARNING: archive items not in correct section order\n");
pg_log_warning("archive items not in correct section order");
break;
case SECTION_DATA:
if (curSection == SECTION_POST_DATA)
write_msg(modulename,
"WARNING: archive items not in correct section order\n");
pg_log_warning("archive items not in correct section order");
break;
case SECTION_POST_DATA:
/* ok no matter which section we were in */
break;
default:
exit_horribly(modulename, "unexpected section code %d\n",
fatal("unexpected section code %d",
(int) te->section);
break;
}
@ -366,11 +361,11 @@ RestoreArchive(Archive *AHX)
{
/* We haven't got round to making this work for all archive formats */
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 */
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
@ -388,7 +383,7 @@ RestoreArchive(Archive *AHX)
for (te = AH->toc->next; te != AH->toc; te = te->next)
{
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
@ -405,9 +400,9 @@ RestoreArchive(Archive *AHX)
*/
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)
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
@ -452,7 +447,7 @@ RestoreArchive(Archive *AHX)
if (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 */
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 */
_becomeOwner(AH, te);
_selectOutputSchema(AH, te->namespace);
@ -613,8 +608,7 @@ RestoreArchive(Archive *AHX)
else
{
/* complain and emit unmodified command */
write_msg(modulename,
"WARNING: could not find where to insert IF EXISTS in statement \"%s\"\n",
pg_log_warning("could not find where to insert IF EXISTS in statement \"%s\"",
dropStmtOrig);
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->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)
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 */
@ -787,10 +781,11 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
{
/* Show namespace in log message if available */
if (te->namespace)
ahlog(AH, 1, "creating %s \"%s.%s\"\n",
te->desc, te->namespace, te->tag);
pg_log_info("creating %s \"%s.%s\"",
te->desc, te->namespace, te->tag);
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);
defnDumped = true;
@ -846,7 +841,7 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
appendConnStrVal(&connstr, te->tag);
/* 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);
ropt->dbname = connstr.data;
}
@ -874,7 +869,7 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
if (strcmp(te->desc, "BLOBS") == 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");
@ -894,7 +889,7 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
_becomeOwner(AH, te);
_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);
/*
@ -956,7 +951,7 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel)
else if (!defnDumped)
{
/* 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);
}
}
@ -995,7 +990,7 @@ _disableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te)
if (!ropt->dataOnly || !ropt->disable_triggers)
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
@ -1021,7 +1016,7 @@ _enableTriggersIfNecessary(ArchiveHandle *AH, TocEntry *te)
if (!ropt->dataOnly || !ropt->disable_triggers)
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
@ -1049,7 +1044,7 @@ WriteData(Archive *AHX, const void *data, size_t dLen)
ArchiveHandle *AH = (ArchiveHandle *) AHX;
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);
@ -1234,7 +1229,7 @@ StartBlob(Archive *AHX, Oid oid)
ArchiveHandle *AH = (ArchiveHandle *) AHX;
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);
@ -1292,8 +1287,8 @@ EndRestoreBlobs(ArchiveHandle *AH)
ahprintf(AH, "COMMIT;\n\n");
}
ahlog(AH, 1, ngettext("restored %d large object\n",
"restored %d large objects\n",
pg_log_info(ngettext("restored %d large object",
"restored %d large objects",
AH->blobCount),
AH->blobCount);
}
@ -1313,7 +1308,7 @@ StartRestoreBlob(ArchiveHandle *AH, Oid oid, bool drop)
/* Initialize the LO Buffer */
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 */
if (old_blob_style && drop)
@ -1325,12 +1320,12 @@ StartRestoreBlob(ArchiveHandle *AH, Oid oid, bool drop)
{
loOid = lo_create(AH->connection, 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));
}
AH->loFd = lo_open(AH->connection, oid, INV_WRITE);
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));
}
else
@ -1387,8 +1382,7 @@ SortTocFromFile(Archive *AHX)
/* Setup the file */
fh = fopen(ropt->tocFile, PG_BINARY_R);
if (!fh)
exit_horribly(modulename, "could not open TOC file \"%s\": %s\n",
ropt->tocFile, strerror(errno));
fatal("could not open TOC file \"%s\": %m", ropt->tocFile);
incomplete_line = false;
while (fgets(buf, sizeof(buf), fh) != NULL)
@ -1428,14 +1422,14 @@ SortTocFromFile(Archive *AHX)
if (endptr == buf || id <= 0 || id > AH->maxDumpId ||
ropt->idWanted[id - 1])
{
write_msg(modulename, "WARNING: line ignored: %s\n", buf);
pg_log_warning("line ignored: %s", buf);
continue;
}
/* Find TOC entry */
te = getTocEntryByDumpId(AH, id);
if (!te)
exit_horribly(modulename, "could not find entry for ID %d\n",
fatal("could not find entry for ID %d",
id);
/* Mark it wanted */
@ -1456,8 +1450,7 @@ SortTocFromFile(Archive *AHX)
}
if (fclose(fh) != 0)
exit_horribly(modulename, "could not close TOC file: %s\n",
strerror(errno));
fatal("could not close TOC file: %m");
}
/**********************
@ -1567,11 +1560,9 @@ SetOutput(ArchiveHandle *AH, const char *filename, int compression)
if (!AH->OF)
{
if (filename)
exit_horribly(modulename, "could not open output file \"%s\": %s\n",
filename, strerror(errno));
fatal("could not open output file \"%s\": %m", filename);
else
exit_horribly(modulename, "could not open output file: %s\n",
strerror(errno));
fatal("could not open output file: %m");
}
}
@ -1597,8 +1588,7 @@ RestoreOutput(ArchiveHandle *AH, OutputContext savedContext)
res = fclose(AH->OF);
if (res != 0)
exit_horribly(modulename, "could not close output file: %s\n",
strerror(errno));
fatal("could not close output file: %m");
AH->gzOut = savedContext.gzOut;
AH->OF = savedContext.OF;
@ -1643,19 +1633,6 @@ ahprintf(ArchiveHandle *AH, const char *fmt,...)
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'.
*/
@ -1678,13 +1655,12 @@ dump_lo_buf(ArchiveHandle *AH)
size_t res;
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",
"wrote %lu bytes 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)",
AH->lo_buf_used),
(unsigned long) AH->lo_buf_used, (unsigned long) res);
if (res != AH->lo_buf_used)
exit_horribly(modulename,
"could not write to large object (result: %lu, expected: %lu)\n",
fatal("could not write to large object (result: %lu, expected: %lu)",
(unsigned long) res, (unsigned long) AH->lo_buf_used);
}
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... */
void
warn_or_exit_horribly(ArchiveHandle *AH,
const char *modulename, const char *fmt,...)
warn_or_exit_horribly(ArchiveHandle *AH, const char *fmt,...)
{
va_list ap;
@ -1777,22 +1752,22 @@ warn_or_exit_horribly(ArchiveHandle *AH,
case STAGE_INITIALIZING:
if (AH->stage != AH->lastErrorStage)
write_msg(modulename, "Error while INITIALIZING:\n");
pg_log_generic(PG_LOG_INFO, "while INITIALIZING:");
break;
case STAGE_PROCESSING:
if (AH->stage != AH->lastErrorStage)
write_msg(modulename, "Error while PROCESSING TOC:\n");
pg_log_generic(PG_LOG_INFO, "while PROCESSING TOC:");
break;
case STAGE_FINALIZING:
if (AH->stage != AH->lastErrorStage)
write_msg(modulename, "Error while FINALIZING:\n");
pg_log_generic(PG_LOG_INFO, "while FINALIZING:");
break;
}
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->catalogId.tableoid,
AH->currentTE->catalogId.oid,
@ -1804,7 +1779,7 @@ warn_or_exit_horribly(ArchiveHandle *AH,
AH->lastErrorTE = AH->currentTE;
va_start(ap, fmt);
vwrite_msg(modulename, fmt, ap);
pg_log_generic_v(PG_LOG_ERROR, fmt, ap);
va_end(ap);
if (AH->public.exit_on_error)
@ -1868,7 +1843,7 @@ buildTocEntryArrays(ArchiveHandle *AH)
{
/* this check is purely paranoia, maxDumpId should be correct */
if (te->dumpId <= 0 || te->dumpId > maxDumpId)
exit_horribly(modulename, "bad dumpId\n");
fatal("bad dumpId");
/* tocsByDumpId indexes all TOCs by their dump ID */
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.
*/
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;
}
@ -1981,7 +1956,7 @@ ReadOffset(ArchiveHandle *AH, pgoff_t * o)
break;
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
{
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;
int wantClose = 0;
#if 0
write_msg(modulename, "attempting to ascertain archive format\n");
#endif
pg_log_debug("attempting to ascertain archive format");
if (AH->lookahead)
free(AH->lookahead);
@ -2133,7 +2106,7 @@ _discoverArchiveFormat(ArchiveHandle *AH)
char buf[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);
if (stat(buf, &st) == 0 && S_ISREG(st.st_mode))
{
@ -2143,7 +2116,7 @@ _discoverArchiveFormat(ArchiveHandle *AH)
#ifdef HAVE_LIBZ
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);
if (stat(buf, &st) == 0 && S_ISREG(st.st_mode))
{
@ -2151,7 +2124,7 @@ _discoverArchiveFormat(ArchiveHandle *AH)
return AH->format;
}
#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);
fh = NULL; /* keep compiler quiet */
}
@ -2159,24 +2132,22 @@ _discoverArchiveFormat(ArchiveHandle *AH)
{
fh = fopen(AH->fSpec, PG_BINARY_R);
if (!fh)
exit_horribly(modulename, "could not open input file \"%s\": %s\n",
AH->fSpec, strerror(errno));
fatal("could not open input file \"%s\": %m", AH->fSpec);
}
}
else
{
fh = stdin;
if (!fh)
exit_horribly(modulename, "could not open input file: %s\n",
strerror(errno));
fatal("could not open input file: %m");
}
if ((cnt = fread(sig, 1, 5, fh)) != 5)
{
if (ferror(fh))
exit_horribly(modulename, "could not read input file: %s\n", strerror(errno));
fatal("could not read input file: %m");
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);
}
@ -2261,19 +2232,19 @@ _discoverArchiveFormat(ArchiveHandle *AH)
* looks like it's probably a text format dump. so suggest they
* 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 (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
READ_ERROR_EXIT(fh);
}
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;
}
@ -2293,8 +2264,7 @@ _discoverArchiveFormat(ArchiveHandle *AH)
/* Close the file */
if (wantClose)
if (fclose(fh) != 0)
exit_horribly(modulename, "could not close input file: %s\n",
strerror(errno));
fatal("could not close input file: %m");
return AH->format;
}
@ -2310,14 +2280,10 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt,
{
ArchiveHandle *AH;
#if 0
write_msg(modulename, "allocating AH for %s, format %d\n", FileSpec, fmt);
#endif
pg_log_debug("allocating AH for %s, format %d", FileSpec, fmt);
AH = (ArchiveHandle *) pg_malloc0(sizeof(ArchiveHandle));
/* AH->debugLevel = 100; */
AH->version = K_VERS_SELF;
/* initialize for backwards compatible string processing */
@ -2412,7 +2378,7 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt,
break;
default:
exit_horribly(modulename, "unrecognized file format \"%d\"\n", fmt);
fatal("unrecognized file format \"%d\"", fmt);
}
return AH;
@ -2494,11 +2460,11 @@ mark_dump_job_done(ArchiveHandle *AH,
int status,
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);
if (status != 0)
exit_horribly(modulename, "worker process failed: exit code %d\n",
fatal("worker process failed: exit code %d",
status);
}
@ -2618,8 +2584,7 @@ ReadToc(ArchiveHandle *AH)
/* Sanity check */
if (te->dumpId <= 0)
exit_horribly(modulename,
"entry ID %d out of range -- perhaps a corrupt TOC\n",
fatal("entry ID %d out of range -- perhaps a corrupt TOC",
te->dumpId);
te->hadDumper = ReadInt(AH);
@ -2686,8 +2651,7 @@ ReadToc(ArchiveHandle *AH)
te->owner = ReadStr(AH);
if (AH->version < K_VERS_1_9 || strcmp(ReadStr(AH), "true") == 0)
write_msg(modulename,
"WARNING: restoring tables WITH OIDS is not supported anymore\n");
pg_log_warning("restoring tables WITH OIDS is not supported anymore");
/* Read TOC entry dependencies */
if (AH->version >= K_VERS_1_5)
@ -2733,7 +2697,7 @@ ReadToc(ArchiveHandle *AH)
if (AH->ReadExtraTocPtr)
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);
/* link completed entry into TOC circular list */
@ -2769,12 +2733,12 @@ processEncodingEntry(ArchiveHandle *AH, TocEntry *te)
*ptr2 = '\0';
encoding = pg_char_to_encoding(ptr1);
if (encoding < 0)
exit_horribly(modulename, "unrecognized encoding \"%s\"\n",
fatal("unrecognized encoding \"%s\"",
ptr1);
AH->public.encoding = encoding;
}
else
exit_horribly(modulename, "invalid ENCODING item: %s\n",
fatal("invalid ENCODING item: %s",
te->defn);
free(defn);
@ -2792,7 +2756,7 @@ processStdStringsEntry(ArchiveHandle *AH, TocEntry *te)
else if (ptr1 && strncmp(ptr1, "'off'", 5) == 0)
AH->public.std_strings = false;
else
exit_horribly(modulename, "invalid STDSTRINGS item: %s\n",
fatal("invalid STDSTRINGS item: %s",
te->defn);
}
@ -2817,35 +2781,35 @@ StrictNamesCheck(RestoreOptions *ropt)
{
missing_name = simple_string_list_not_touched(&ropt->schemaNames);
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)
{
missing_name = simple_string_list_not_touched(&ropt->tableNames);
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)
{
missing_name = simple_string_list_not_touched(&ropt->indexNames);
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)
{
missing_name = simple_string_list_not_touched(&ropt->functionNames);
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)
{
missing_name = simple_string_list_not_touched(&ropt->triggerNames);
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)
/* 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));
PQclear(res);
@ -3362,7 +3326,7 @@ _selectOutputSchema(ArchiveHandle *AH, const char *schemaName)
res = PQexec(AH->connection, qry->data);
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",
schemaName, PQerrorMessage(AH->connection));
@ -3424,7 +3388,7 @@ _selectTablespace(ArchiveHandle *AH, const char *tablespace)
res = PQexec(AH->connection, qry->data);
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",
fmtId(want), PQerrorMessage(AH->connection));
@ -3468,7 +3432,7 @@ _selectTableAccessMethod(ArchiveHandle *AH, const char *tableam)
res = PQexec(AH->connection, cmd->data);
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",
PQerrorMessage(AH->connection));
@ -3561,7 +3525,7 @@ _getObjectDescription(PQExpBuffer buf, TocEntry *te, ArchiveHandle *AH)
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);
}
@ -3718,7 +3682,7 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData)
}
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);
}
}
@ -3822,7 +3786,7 @@ ReadHead(ArchiveHandle *AH)
AH->ReadBufPtr(AH, tmpMag, 5);
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);
vmin = AH->ReadBytePtr(AH);
@ -3835,16 +3799,16 @@ ReadHead(ArchiveHandle *AH)
AH->version = MAKE_ARCHIVE_VERSION(vmaj, vmin, vrev);
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);
AH->intSize = AH->ReadBytePtr(AH);
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);
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)
AH->offSize = AH->ReadBytePtr(AH);
@ -3854,7 +3818,7 @@ ReadHead(ArchiveHandle *AH)
fmt = AH->ReadBytePtr(AH);
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);
}
@ -3870,7 +3834,7 @@ ReadHead(ArchiveHandle *AH)
#ifndef HAVE_LIBZ
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
if (AH->version >= K_VERS_1_4)
@ -3888,7 +3852,7 @@ ReadHead(ArchiveHandle *AH)
AH->createDate = mktime(&crtm);
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)
@ -3961,7 +3925,7 @@ restore_toc_entries_prefork(ArchiveHandle *AH, TocEntry *pending_list)
bool skipped_some;
TocEntry *next_work_item;
ahlog(AH, 2, "entering restore_toc_entries_prefork\n");
pg_log_debug("entering restore_toc_entries_prefork");
/* Adjust dependency information */
fix_dependencies(AH);
@ -4025,7 +3989,7 @@ restore_toc_entries_prefork(ArchiveHandle *AH, TocEntry *pending_list)
if (do_now)
{
/* 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->desc, next_work_item->tag);
@ -4081,7 +4045,7 @@ restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate,
ParallelReadyList ready_list;
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 */
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
* 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 (;;)
{
@ -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 ((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->desc, next_work_item->tag);
/* Update its dependencies as though we'd completed it */
@ -4124,7 +4088,7 @@ restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate,
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->desc, next_work_item->tag);
@ -4178,7 +4142,7 @@ restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate,
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;
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.
@ -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)
{
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);
(void) restore_toc_entry(AH, te, false);
}
@ -4458,7 +4422,7 @@ pop_next_work_item(ArchiveHandle *AH, ParallelReadyList *ready_list,
return te;
}
ahlog(AH, 2, "no item ready\n");
pg_log_debug("no item ready");
return NULL;
}
@ -4502,7 +4466,7 @@ mark_restore_job_done(ArchiveHandle *AH,
{
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);
if (status == WORKER_CREATE_DONE)
@ -4515,7 +4479,7 @@ mark_restore_job_done(ArchiveHandle *AH,
else if (status == WORKER_IGNORED_ERRORS)
AH->public.n_errors++;
else if (status != 0)
exit_horribly(modulename, "worker process failed: exit code %d\n",
fatal("worker process failed: exit code %d",
status);
reduce_dependencies(AH, te, ready_list);
@ -4687,7 +4651,7 @@ repoint_table_dependencies(ArchiveHandle *AH)
te->dependencies[i] = tabledataid;
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);
}
}
@ -4769,7 +4733,7 @@ reduce_dependencies(ArchiveHandle *AH, TocEntry *te,
{
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++)
{
@ -4821,7 +4785,7 @@ mark_create_done(ArchiveHandle *AH, TocEntry *te)
static void
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);
if (AH->tableDataId[te->dumpId] != 0)

View File

@ -132,17 +132,14 @@ struct ParallelState;
#define READ_ERROR_EXIT(fd) \
do { \
if (feof(fd)) \
exit_horribly(modulename, \
"could not read from input file: end of file\n"); \
fatal("could not read from input file: end of file"); \
else \
exit_horribly(modulename, \
"could not read from input file: %s\n", strerror(errno)); \
fatal("could not read from input file: %m"); \
} while (0)
#define WRITE_ERROR_EXIT \
do { \
exit_horribly(modulename, "could not write to output file: %s\n", \
strerror(errno)); \
fatal("could not write to output file: %m"); \
} while (0)
typedef enum T_Action
@ -252,8 +249,6 @@ struct _archiveHandle
char *archiveDumpVersion; /* When reading an archive, the version of
* the dumper */
int debugLevel; /* Used for logging (currently only by
* --verbose) */
size_t intSize; /* Size of an integer in the archive */
size_t offSize; /* Size of a file offset in the archive -
* Added V1.7 */
@ -411,7 +406,7 @@ struct _tocEntry
extern int parallel_restore(ArchiveHandle *AH, TocEntry *te);
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 */
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);
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

View File

@ -29,6 +29,7 @@
#include "parallel.h"
#include "pg_backup_utils.h"
#include "common/file_utils.h"
#include "fe_utils/logging.h"
/*--------
* 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 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
@ -159,15 +156,13 @@ InitArchiveFmt_Custom(ArchiveHandle *AH)
{
AH->FH = fopen(AH->fSpec, PG_BINARY_W);
if (!AH->FH)
exit_horribly(modulename, "could not open output file \"%s\": %s\n",
AH->fSpec, strerror(errno));
fatal("could not open output file \"%s\": %m", AH->fSpec);
}
else
{
AH->FH = stdout;
if (!AH->FH)
exit_horribly(modulename, "could not open output file: %s\n",
strerror(errno));
fatal("could not open output file: %m");
}
ctx->hasSeek = checkSeek(AH->FH);
@ -178,15 +173,13 @@ InitArchiveFmt_Custom(ArchiveHandle *AH)
{
AH->FH = fopen(AH->fSpec, PG_BINARY_R);
if (!AH->FH)
exit_horribly(modulename, "could not open input file \"%s\": %s\n",
AH->fSpec, strerror(errno));
fatal("could not open input file \"%s\": %m", AH->fSpec);
}
else
{
AH->FH = stdin;
if (!AH->FH)
exit_horribly(modulename, "could not open input file: %s\n",
strerror(errno));
fatal("could not open input file: %m");
}
ctx->hasSeek = checkSeek(AH->FH);
@ -381,7 +374,7 @@ _StartBlob(ArchiveHandle *AH, TocEntry *te, Oid oid)
lclContext *ctx = (lclContext *) AH->formatData;
if (oid == 0)
exit_horribly(modulename, "invalid OID for large object\n");
fatal("invalid OID for large object");
WriteInt(AH, oid);
@ -451,8 +444,7 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te)
break;
default: /* Always have a default */
exit_horribly(modulename,
"unrecognized data block type (%d) while searching archive\n",
fatal("unrecognized data block type (%d) while searching archive",
blkType);
break;
}
@ -463,8 +455,7 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te)
{
/* We can just seek to the place we need to be. */
if (fseeko(AH->FH, tctx->dataPos, SEEK_SET) != 0)
exit_horribly(modulename, "error during file seek: %s\n",
strerror(errno));
fatal("error during file seek: %m");
_readBlockHeader(AH, &blkType, &id);
}
@ -473,24 +464,24 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te)
if (blkType == EOF)
{
if (tctx->dataState == K_OFFSET_POS_NOT_SET)
exit_horribly(modulename, "could not find block ID %d in archive -- "
"possibly due to out-of-order restore request, "
"which cannot be handled due to lack of data offsets in archive\n",
te->dumpId);
fatal("could not find block ID %d in archive -- "
"possibly due to out-of-order restore request, "
"which cannot be handled due to lack of data offsets in archive",
te->dumpId);
else if (!ctx->hasSeek)
exit_horribly(modulename, "could not find block ID %d in archive -- "
"possibly due to out-of-order restore request, "
"which cannot be handled due to non-seekable input file\n",
te->dumpId);
fatal("could not find block ID %d in archive -- "
"possibly due to out-of-order restore request, "
"which cannot be handled due to non-seekable input file",
te->dumpId);
else /* huh, the dataPos led us to EOF? */
exit_horribly(modulename, "could not find block ID %d in archive -- "
"possibly corrupt archive\n",
te->dumpId);
fatal("could not find block ID %d in archive -- "
"possibly corrupt archive",
te->dumpId);
}
/* Are we sane? */
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);
switch (blkType)
@ -504,7 +495,7 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te)
break;
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);
break;
}
@ -584,11 +575,9 @@ _skipData(ArchiveHandle *AH)
if ((cnt = fread(buf, 1, blkLen, AH->FH)) != blkLen)
{
if (feof(AH->FH))
exit_horribly(modulename,
"could not read from input file: end of file\n");
fatal("could not read from input file: end of file");
else
exit_horribly(modulename,
"could not read from input file: %s\n", strerror(errno));
fatal("could not read from input file: %m");
}
ctx->filePos += blkLen;
@ -706,8 +695,7 @@ _CloseArchive(ArchiveHandle *AH)
/* Remember TOC's seek position for use below */
tpos = ftello(AH->FH);
if (tpos < 0 && ctx->hasSeek)
exit_horribly(modulename, "could not determine seek position in archive file: %s\n",
strerror(errno));
fatal("could not determine seek position in archive file: %m");
WriteToc(AH);
ctx->dataStart = _getFilePos(AH, ctx);
WriteDataChunks(AH, NULL);
@ -724,11 +712,11 @@ _CloseArchive(ArchiveHandle *AH)
}
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 */
if (AH->dosync && AH->mode == archModeWrite && AH->fSpec)
(void) fsync_fname(AH->fSpec, false, progname);
(void) fsync_fname(AH->fSpec, false);
AH->FH = NULL;
}
@ -747,36 +735,32 @@ _ReopenArchive(ArchiveHandle *AH)
pgoff_t tpos;
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
* (but not invalid) use-cases. Word the error messages appropriately.
*/
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)
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);
if (tpos < 0)
exit_horribly(modulename, "could not determine seek position in archive file: %s\n",
strerror(errno));
fatal("could not determine seek position in archive file: %m");
#ifndef WIN32
if (fclose(AH->FH) != 0)
exit_horribly(modulename, "could not close archive file: %s\n",
strerror(errno));
fatal("could not close archive file: %m");
#endif
AH->FH = fopen(AH->fSpec, PG_BINARY_R);
if (!AH->FH)
exit_horribly(modulename, "could not open input file \"%s\": %s\n",
AH->fSpec, strerror(errno));
fatal("could not open input file \"%s\": %m", AH->fSpec);
if (fseeko(AH->FH, tpos, SEEK_SET) != 0)
exit_horribly(modulename, "could not set seek position in archive file: %s\n",
strerror(errno));
fatal("could not set seek position in archive file: %m");
}
/*
@ -831,8 +815,7 @@ _PrepParallelRestore(ArchiveHandle *AH)
pgoff_t endpos;
if (fseeko(AH->FH, 0, SEEK_END) != 0)
exit_horribly(modulename, "error during file seek: %s\n",
strerror(errno));
fatal("error during file seek: %m");
endpos = ftello(AH->FH);
if (endpos > prev_tctx->dataPos)
prev_te->dataLength = endpos - prev_tctx->dataPos;
@ -853,7 +836,7 @@ _Clone(ArchiveHandle *AH)
/* sanity check, shouldn't happen */
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
@ -905,11 +888,10 @@ _getFilePos(ArchiveHandle *AH, lclContext *ctx)
*/
pos = ftello(AH->FH);
if (pos < 0)
exit_horribly(modulename, "could not determine seek position in archive file: %s\n",
strerror(errno));
fatal("could not determine seek position in archive file: %m");
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
pos = ctx->filePos;
@ -928,7 +910,7 @@ _readBlockHeader(ArchiveHandle *AH, int *type, int *id)
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
* 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

View File

@ -13,6 +13,7 @@
#include "dumputils.h"
#include "fe_utils/connect.h"
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h"
#include "parallel.h"
#include "pg_backup_archiver.h"
@ -26,9 +27,6 @@
#endif
/* translator: this is a module name */
static const char *modulename = gettext_noop("archiver (db)");
static void _check_database_version(ArchiveHandle *AH);
static PGconn *_connectDB(ArchiveHandle *AH, const char *newdbname, const char *newUser);
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 = PQserverVersion(AH->connection);
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.remoteVersion = remoteversion;
@ -54,9 +52,9 @@ _check_database_version(ArchiveHandle *AH)
&& (remoteversion < AH->public.minRemoteVersion ||
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);
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
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);
password = AH->savedPassword;
@ -178,12 +176,12 @@ _connectDB(ArchiveHandle *AH, const char *reqdb, const char *requser)
newConn = PQconnectdbParams(keywords, values, true);
if (!newConn)
exit_horribly(modulename, "failed to reconnect to database\n");
fatal("failed to reconnect to database");
if (PQstatus(newConn) == CONNECTION_BAD)
{
if (!PQconnectionNeedsPassword(newConn))
exit_horribly(modulename, "could not reconnect to database: %s",
fatal("could not reconnect to database: %s",
PQerrorMessage(newConn));
PQfinish(newConn);
@ -199,7 +197,7 @@ _connectDB(ArchiveHandle *AH, const char *reqdb, const char *requser)
password = passbuf;
}
else
exit_horribly(modulename, "connection needs password\n");
fatal("connection needs password");
new_pass = true;
}
@ -250,7 +248,7 @@ ConnectDatabase(Archive *AHX,
bool new_pass;
if (AH->connection)
exit_horribly(modulename, "already connected to a database\n");
fatal("already connected to a database");
password = AH->savedPassword;
@ -289,7 +287,7 @@ ConnectDatabase(Archive *AHX,
AH->connection = PQconnectdbParams(keywords, values, true);
if (!AH->connection)
exit_horribly(modulename, "failed to connect to database\n");
fatal("failed to connect to database");
if (PQstatus(AH->connection) == CONNECTION_BAD &&
PQconnectionNeedsPassword(AH->connection) &&
@ -305,7 +303,7 @@ ConnectDatabase(Archive *AHX,
/* check to see that the backend connection was successfully made */
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) : "",
PQerrorMessage(AH->connection));
@ -351,7 +349,7 @@ DisconnectDatabase(Archive *AHX)
/*
* 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
* helpful during exit_horribly().
* helpful during fatal().
*/
if (PQtransactionStatus(AH->connection) == PQTRANS_ACTIVE)
(void) PQcancel(AH->connCancel, errbuf, sizeof(errbuf));
@ -377,16 +375,16 @@ GetConnection(Archive *AHX)
static void
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
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));
exit_horribly(modulename, "query was: %s\n", query);
fatal("query was: %s", query);
}
void
@ -397,7 +395,7 @@ ExecuteSqlStatement(Archive *AHX, const char *query)
res = PQexec(AH->connection, query);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
die_on_query_failure(AH, modulename, query);
die_on_query_failure(AH, query);
PQclear(res);
}
@ -409,7 +407,7 @@ ExecuteSqlQuery(Archive *AHX, const char *query, ExecStatusType status)
res = PQexec(AH->connection, query);
if (PQresultStatus(res) != status)
die_on_query_failure(AH, modulename, query);
die_on_query_failure(AH, query);
return res;
}
@ -427,9 +425,8 @@ ExecuteSqlQueryForSingleRow(Archive *fout, const char *query)
/* Expecting a single result only */
ntups = PQntuples(res);
if (ntups != 1)
exit_horribly(NULL,
ngettext("query returned %d row instead of one: %s\n",
"query returned %d rows instead of one: %s\n",
fatal(ngettext("query returned %d row instead of one: %s",
"query returned %d rows instead of one: %s",
ntups),
ntups, query);
@ -464,7 +461,7 @@ ExecuteSqlCommand(ArchiveHandle *AH, const char *qry, const char *desc)
break;
default:
/* 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);
break;
}
@ -573,7 +570,7 @@ ExecuteSqlCommandBuf(Archive *AHX, const char *buf, size_t bufLen)
*/
if (AH->pgCopyIn &&
PQputCopyData(AH->connection, buf, bufLen) <= 0)
exit_horribly(modulename, "error returned by PQputCopyData: %s",
fatal("error returned by PQputCopyData: %s",
PQerrorMessage(AH->connection));
}
else if (AH->outputKind == OUTPUT_OTHERDATA)
@ -622,19 +619,19 @@ EndDBCopyMode(Archive *AHX, const char *tocEntryTag)
PGresult *res;
if (PQputCopyEnd(AH->connection, NULL) <= 0)
exit_horribly(modulename, "error returned by PQputCopyEnd: %s",
fatal("error returned by PQputCopyEnd: %s",
PQerrorMessage(AH->connection));
/* Check command status and return to normal libpq state */
res = PQgetResult(AH->connection);
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));
PQclear(res);
/* Do this to ensure we've pumped libpq back to idle state */
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);
AH->pgCopyIn = false;

View File

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

View File

@ -72,7 +72,7 @@ InitArchiveFmt_Null(ArchiveHandle *AH)
* Now prevent reading...
*/
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);
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 */
if (old_blob_style && AH->public.ropt->dropSchema)

View File

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

View File

@ -51,8 +51,7 @@ set_dump_section(const char *arg, int *dumpSections)
*dumpSections |= DUMP_POST_DATA;
else
{
fprintf(stderr, _("%s: unrecognized section name: \"%s\"\n"),
progname, arg);
pg_log_error("unrecognized section name: \"%s\"", arg);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
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. */
void
on_exit_nicely(on_exit_nicely_callback function, void *arg)
{
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].arg = arg;
on_exit_nicely_index++;

View File

@ -15,6 +15,8 @@
#ifndef PG_BACKUP_UTILS_H
#define PG_BACKUP_UTILS_H
#include "fe_utils/logging.h"
typedef enum /* bits returned by set_dump_section */
{
DUMP_PRE_DATA = 0x01,
@ -28,11 +30,9 @@ typedef void (*on_exit_nicely_callback) (int code, void *arg);
extern const char *progname;
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 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 */

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

@ -30,129 +30,129 @@ program_options_handling_ok('pg_dumpall');
command_fails_like(
[ 'pg_dump', 'qqq', 'abc' ],
qr/\Qpg_dump: too many command-line arguments (first is "abc")\E/,
'pg_dump: too many command-line arguments (first is "asd")');
qr/\Qpg_dump: error: too many command-line arguments (first is "abc")\E/,
'pg_dump: too many command-line arguments');
command_fails_like(
[ 'pg_restore', 'qqq', 'abc' ],
qr/\Qpg_restore: too many command-line arguments (first is "abc")\E/,
'pg_restore too many command-line arguments (first is "abc")');
qr/\Qpg_restore: error: too many command-line arguments (first is "abc")\E/,
'pg_restore: too many command-line arguments');
command_fails_like(
[ 'pg_dumpall', 'qqq', 'abc' ],
qr/\Qpg_dumpall: too many command-line arguments (first is "qqq")\E/,
'pg_dumpall: too many command-line arguments (first is "qqq")');
qr/\Qpg_dumpall: error: too many command-line arguments (first is "qqq")\E/,
'pg_dumpall: too many command-line arguments');
command_fails_like(
[ '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'
);
command_fails_like(
[ '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'
);
command_fails_like(
[ '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');
command_fails_like(
[ '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');
command_fails_like(
[ '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'
);
command_fails_like(
[ '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');
command_fails_like(
[ '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');
command_fails_like(
[ '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');
command_fails_like(
[ 'pg_dump', '-F', 'garbage' ],
qr/\Qpg_dump: invalid output format\E/,
qr/\Qpg_dump: error: invalid output format\E/,
'pg_dump: invalid output format');
command_fails_like(
[ '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');
command_fails_like(
[ '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');
command_fails_like(
[ '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');
command_fails_like(
[ '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');
command_fails_like(
[ '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');
command_fails_like(
[ '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_dumpall command-line argument checks
command_fails_like(
[ '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'
);
command_fails_like(
[ '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'
);
command_fails_like(
[ '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'
);
command_fails_like(
[ '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');
command_fails_like(
[ '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'
);
# also fails for -r and -t, but it seems pointless to add more tests for those.
command_fails_like(
[ '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');

View File

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

View File

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

View File

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

View File

@ -32,7 +32,7 @@ command_checks_all(
0,
[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');
@ -48,6 +48,6 @@ command_checks_all(
0,
[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');

View File

@ -16,7 +16,7 @@ top_builddir = ../../..
include $(top_builddir)/src/Makefile.global
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 \
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
pg_rewind: $(OBJS) | submake-libpq submake-libpgport
pg_rewind: $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
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);
if (xldir == NULL)
pg_fatal("could not open directory \"%s\": %s\n",
fullparentpath, strerror(errno));
pg_fatal("could not open directory \"%s\": %m",
fullparentpath);
while (errno = 0, (xlde = readdir(xldir)) != NULL)
{
@ -86,8 +86,8 @@ recurse_dir(const char *datadir, const char *parentpath,
*/
}
else
pg_fatal("could not stat file \"%s\": %s\n",
fullpath, strerror(errno));
pg_fatal("could not stat file \"%s\": %m",
fullpath);
}
if (parentpath)
@ -115,10 +115,10 @@ recurse_dir(const char *datadir, const char *parentpath,
len = readlink(fullpath, link_target, sizeof(link_target));
if (len < 0)
pg_fatal("could not read symbolic link \"%s\": %s\n",
fullpath, strerror(errno));
pg_fatal("could not read symbolic link \"%s\": %m",
fullpath);
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);
link_target[len] = '\0';
@ -133,19 +133,19 @@ recurse_dir(const char *datadir, const char *parentpath,
strcmp(path, "pg_wal") == 0)
recurse_dir(datadir, path, callback);
#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);
#endif /* HAVE_READLINK */
}
}
if (errno)
pg_fatal("could not read directory \"%s\": %s\n",
fullparentpath, strerror(errno));
pg_fatal("could not read directory \"%s\": %m",
fullparentpath);
if (closedir(xldir))
pg_fatal("could not close directory \"%s\": %s\n",
fullparentpath, strerror(errno));
pg_fatal("could not close directory \"%s\": %m",
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);
if (srcfd < 0)
pg_fatal("could not open source file \"%s\": %s\n",
srcpath, strerror(errno));
pg_fatal("could not open source file \"%s\": %m",
srcpath);
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);
@ -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);
if (readlen < 0)
pg_fatal("could not read file \"%s\": %s\n",
srcpath, strerror(errno));
pg_fatal("could not read file \"%s\": %m",
srcpath);
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);
begin += readlen;
}
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 "datapagemap.h"
#include "logging.h"
#include "fe_utils/logging.h"
struct datapagemap_iterator
{
@ -121,7 +122,7 @@ datapagemap_print(datapagemap_t *map)
iter = datapagemap_iterate(map);
while (datapagemap_next(iter, &blocknum))
pg_log(PG_DEBUG, " block %u\n", blocknum);
pg_log_debug("block %u", blocknum);
pg_free(iter);
}

View File

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

View File

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

View File

@ -24,6 +24,7 @@
#include "libpq-fe.h"
#include "catalog/pg_type_d.h"
#include "fe_utils/connect.h"
#include "fe_utils/logging.h"
#include "port/pg_bswap.h"
static PGconn *conn = NULL;
@ -52,7 +53,8 @@ libpqConnect(const char *connstr)
pg_fatal("could not connect to server: %s",
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);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
@ -68,7 +70,7 @@ libpqConnect(const char *connstr)
*/
str = run_simple_query("SELECT pg_is_in_recovery()");
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);
/*
@ -78,7 +80,7 @@ libpqConnect(const char *connstr)
*/
str = run_simple_query("SHOW full_page_writes");
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);
/*
@ -113,7 +115,7 @@ run_simple_query(const char *sql)
/* sanity check the result set */
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));
@ -136,7 +138,7 @@ libpqGetCurrentXlogInsertLocation(void)
val = run_simple_query("SELECT pg_current_wal_insert_lsn()");
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;
@ -191,7 +193,7 @@ libpqProcessFileList(void)
/* sanity check the result set */
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 */
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)
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)
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)
{
@ -271,13 +273,13 @@ receiveFileChunks(const char *sql)
/* sanity check the result set */
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 ||
PQftype(res, 1) != INT8OID ||
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));
}
@ -285,17 +287,17 @@ receiveFileChunks(const char *sql)
PQfformat(res, 1) != 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) ||
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))
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 */
memcpy(&chunkoff, PQgetvalue(res, 0, 1), sizeof(int64));
@ -319,8 +321,7 @@ receiveFileChunks(const char *sql)
*/
if (PQgetisnull(res, 0, 2))
{
pg_log(PG_DEBUG,
"received null value for chunk for file \"%s\", file has been deleted\n",
pg_log_debug("received null value for chunk for file \"%s\", file has been deleted",
filename);
remove_target_file(filename, true);
pg_free(filename);
@ -333,7 +334,7 @@ receiveFileChunks(const char *sql)
* translatable strings.
*/
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);
open_target_file(filename, false);
@ -367,7 +368,7 @@ libpqGetFile(const char *filename, size_t *filesize)
/* sanity check the result set */
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);
/* Read result to local variables */
@ -378,7 +379,7 @@ libpqGetFile(const char *filename, size_t *filesize)
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)
*filesize = len;

View File

@ -23,72 +23,6 @@ uint64 fetch_done;
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.
@ -135,8 +69,11 @@ progress_report(bool force)
snprintf(fetch_size_str, sizeof(fetch_size_str), INT64_FORMAT,
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,
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
#define PG_REWIND_LOGGING_H
#include "fe_utils/logging.h"
/* progress counters */
extern uint64 fetch_size;
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);
#define pg_fatal(...) do { pg_log_fatal(__VA_ARGS__); exit(1); } while(0)
#endif /* PG_REWIND_LOGGING_H */

View File

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

View File

@ -28,6 +28,7 @@
#include "common/file_perm.h"
#include "common/file_utils.h"
#include "common/restricted_token.h"
#include "fe_utils/logging.h"
#include "getopt_long.h"
#include "storage/bufpage.h"
@ -53,7 +54,7 @@ char *datadir_target = NULL;
char *datadir_source = NULL;
char *connstr_source = NULL;
bool debug = false;
static bool debug = false;
bool showprogress = false;
bool dry_run = false;
bool do_sync = true;
@ -111,6 +112,7 @@ main(int argc, char **argv)
TimeLineID endtli;
ControlFileData ControlFile_new;
pg_logging_init(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_rewind"));
progname = get_progname(argv[0]);
@ -151,6 +153,7 @@ main(int argc, char **argv)
case 3:
debug = true;
pg_logging_set_level(PG_LOG_DEBUG);
break;
case 'D': /* -D or --target-pgdata */
@ -168,29 +171,29 @@ main(int argc, char **argv)
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);
exit(1);
}
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);
exit(1);
}
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);
exit(1);
}
if (optind < argc)
{
fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
progname, argv[optind]);
pg_log_error("too many command-line arguments (first is \"%s\")",
argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
}
@ -204,20 +207,20 @@ main(int argc, char **argv)
#ifndef WIN32
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"),
progname);
exit(1);
}
#endif
get_restricted_token(progname);
get_restricted_token();
/* Set mask based on PGDATA permissions */
if (!GetDataDirectoryCreatePerm(datadir_target))
{
fprintf(stderr, _("%s: could not read permissions of directory \"%s\": %s\n"),
progname, datadir_target, strerror(errno));
pg_log_error("could not read permissions of directory \"%s\": %m",
datadir_target);
exit(1);
}
@ -247,13 +250,13 @@ main(int argc, char **argv)
*/
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;
}
else
{
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,
targetHistory[lastcommontliIndex].tli);
@ -290,14 +293,14 @@ main(int argc, char **argv)
if (!rewind_needed)
{
printf(_("no rewind required\n"));
pg_log_info("no rewind required");
exit(0);
}
findLastCheckpoint(datadir_target, divergerec,
lastcommontliIndex,
&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,
chkpttli);
@ -305,9 +308,11 @@ main(int argc, char **argv)
* Build the filemap, by comparing the source and target data directories.
*/
filemap_create();
pg_log(PG_PROGRESS, "reading source file list\n");
if (showprogress)
pg_log_info("reading source file list");
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);
/*
@ -317,7 +322,8 @@ main(int argc, char **argv)
* XXX: If we supported rewinding a server that was not shut down cleanly,
* 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,
ControlFile_target.checkPoint);
filemap_finalize();
@ -334,7 +340,7 @@ main(int argc, char **argv)
*/
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->total_size / (1024 * 1024)));
@ -350,8 +356,10 @@ main(int argc, char **argv)
executeFileMap();
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);
/*
@ -377,12 +385,13 @@ main(int argc, char **argv)
ControlFile_new.minRecoveryPoint = endrec;
ControlFile_new.minRecoveryPointTLI = endtli;
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();
printf(_("Done!\n"));
pg_log_info("Done!");
return 0;
}
@ -394,7 +403,7 @@ sanityChecks(void)
/* Check system_id match */
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 */
if (ControlFile_target.pg_control_version != PG_CONTROL_VERSION ||
@ -402,7 +411,7 @@ sanityChecks(void)
ControlFile_target.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 &&
!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 &&
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
@ -433,7 +442,7 @@ sanityChecks(void)
if (datadir_source &&
ControlFile_source.state != DB_SHUTDOWNED &&
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;
if (controlFile == &ControlFile_source)
pg_log(PG_DEBUG, "Source timeline history:\n");
pg_log_debug("Source timeline history:");
else if (controlFile == &ControlFile_target)
pg_log(PG_DEBUG, "Target timeline history:\n");
pg_log_debug("Target timeline history:");
else
Assert(false);
@ -513,9 +522,7 @@ getTimelineHistory(ControlFileData *controlFile, int *nentries)
TimeLineHistoryEntry *entry;
entry = &history[i];
pg_log(PG_DEBUG,
/* translator: %d is a timeline number, others are LSN positions */
"%d: %X/%X - %X/%X\n", entry->tli,
pg_log_debug("%d: %X/%X - %X/%X", entry->tli,
(uint32) (entry->begin >> 32), (uint32) (entry->begin),
(uint32) (entry->end >> 32), (uint32) (entry->end));
}
@ -574,7 +581,7 @@ findCommonAncestorTimeline(XLogRecPtr *recptr, int *tliIndex)
}
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,
strfbuf);
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. */
open_target_file("backup_label", true); /* BACKUP_LABEL_FILE */
@ -638,7 +645,7 @@ checkControlFile(ControlFileData *ControlFile)
/* And simply compare it */
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)
{
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);
memcpy(ControlFile, src, sizeof(ControlFileData));
@ -657,8 +664,8 @@ digestControlFile(ControlFileData *ControlFile, char *src, size_t size)
WalSegSz = ControlFile->xlog_seg_size;
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",
"WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes\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",
WalSegSz),
WalSegSz);
@ -681,5 +688,5 @@ syncTargetDirectory(void)
if (!do_sync || dry_run)
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_source;
extern char *connstr_source;
extern bool debug;
extern bool showprogress;
extern bool dry_run;
extern int WalSegSz;

View File

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

View File

@ -7,11 +7,13 @@ subdir = src/bin/pg_test_fsync
top_builddir = ../../..
include $(top_builddir)/src/Makefile.global
LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils
OBJS = pg_test_fsync.o $(WIN32RES)
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)
install: all installdirs

View File

@ -14,6 +14,7 @@
#include "getopt_long.h"
#include "access/xlogdefs.h"
#include "fe_utils/logging.h"
/*
@ -46,7 +47,7 @@ do { \
if (CreateThread(NULL, 0, process_alarm, NULL, 0, NULL) == \
INVALID_HANDLE_VALUE) \
{ \
fprintf(stderr, _("Could not create thread for alarm\n")); \
pg_log_error("could not create thread for alarm"); \
exit(1); \
} \
gettimeofday(&start_t, NULL); \
@ -92,12 +93,14 @@ static void signal_cleanup(int sig);
static int pg_fsync_writethrough(int fd);
#endif
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
main(int argc, char *argv[])
{
pg_logging_init(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_test_fsync"));
progname = get_progname(argv[0]);
@ -184,9 +187,8 @@ handle_args(int argc, char *argv[])
if (argc > optind)
{
fprintf(stderr,
_("%s: too many command-line arguments (first is \"%s\")\n"),
progname, argv[optind]);
pg_log_error("too many command-line arguments (first is \"%s\")",
argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@ -601,10 +603,3 @@ process_alarm(LPVOID param)
ExitThread(0);
}
#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 "common/file_perm.h"
#include "common/restricted_token.h"
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h"
#ifdef HAVE_LANGINFO_H
@ -78,6 +79,7 @@ main(int argc, char **argv)
char *deletion_script_file_name = NULL;
bool live_check = false;
pg_logging_init(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_upgrade"));
/* Set default restrictive mask until new cluster permissions are read */
@ -85,7 +87,7 @@ main(int argc, char **argv)
parseCommandLine(argc, argv);
get_restricted_token(os_info.progname);
get_restricted_token();
adjust_data_dir(&old_cluster);
adjust_data_dir(&new_cluster);

View File

@ -11,6 +11,7 @@ OBJS = pg_waldump.o compat.o xlogreader.o rmgrdesc.o \
$(RMGRDESCOBJS) $(WIN32RES)
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)))
RMGRDESCOBJS = $(patsubst %.c,%.o,$(RMGRDESCSOURCES))
@ -18,7 +19,7 @@ RMGRDESCOBJS = $(patsubst %.c,%.o,$(RMGRDESCSOURCES))
all: pg_waldump
pg_waldump: $(OBJS) | submake-libpgport
pg_waldump: $(OBJS) | submake-libpgport submake-libpgfeutils
$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/%

View File

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

View File

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

View File

@ -34,6 +34,7 @@
#include "postgres_fe.h"
#include "common/int.h"
#include "fe_utils/conditional.h"
#include "fe_utils/logging.h"
#include "getopt_long.h"
#include "libpq-fe.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);
static void processXactStats(TState *thread, CState *st, instr_time *now,
bool skipped, StatsData *agg);
static void pgbench_error(const char *fmt,...) pg_attribute_printf(1, 2);
static void addScript(ParsedScript script);
static void *threadRun(void *arg);
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 */
static const PsqlScanCallbacks pgbench_callbacks = {
NULL, /* don't need get_variable functionality */
pgbench_error
};
@ -4153,20 +4152,6 @@ parseQuery(Command *cmd)
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
* backslash command, because we don't detect syntax errors in SQL)
@ -5276,6 +5261,7 @@ main(int argc, char **argv)
int exit_code = 0;
pg_logging_init(argv[0]);
progname = get_progname(argv[0]);
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')
pghost = env;
if ((env = getenv("PGPORT")) != NULL && *env != '\0')

View File

@ -28,6 +28,7 @@
#include "libpq-fe.h"
#include "pqexpbuffer.h"
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h"
#include "common.h"
@ -216,10 +217,9 @@ HandleSlashCmds(PsqlScanState scan_state,
if (status == PSQL_CMD_UNKNOWN)
{
pg_log_error("invalid command \\%s", cmd);
if (pset.cur_cmd_interactive)
psql_error("Invalid command \\%s. Try \\? for help.\n", cmd);
else
psql_error("invalid command \\%s\n", cmd);
pg_log_info("Try \\? for help.");
status = PSQL_CMD_ERROR;
}
@ -237,7 +237,7 @@ HandleSlashCmds(PsqlScanState scan_state,
OT_NORMAL, NULL, false)))
{
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);
}
conditional_stack_pop(cstack);
@ -289,7 +289,7 @@ exec_command(const char *cmd,
if (pset.cur_cmd_interactive && !active_branch &&
!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);
}
@ -549,7 +549,7 @@ exec_command_cd(PsqlScanState scan_state, bool active_branch, const char *cmd)
pw = getpwuid(user_id);
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,
errno ? strerror(errno) : _("user does not exist"));
exit(EXIT_FAILURE);
@ -567,8 +567,8 @@ exec_command_cd(PsqlScanState scan_state, bool active_branch, const char *cmd)
if (chdir(dir) == -1)
{
psql_error("\\%s: could not change directory to \"%s\": %s\n",
cmd, dir, strerror(errno));
pg_log_error("\\%s: could not change directory to \"%s\": %m",
cmd, dir);
success = false;
}
@ -908,7 +908,7 @@ exec_command_edit(PsqlScanState scan_state, bool active_branch,
{
if (!query_buf)
{
psql_error("no query buffer\n");
pg_log_error("no query buffer");
status = PSQL_CMD_ERROR;
}
else
@ -941,7 +941,7 @@ exec_command_edit(PsqlScanState scan_state, bool active_branch,
lineno = atoi(ln);
if (lineno < 1)
{
psql_error("invalid line number: %s\n", ln);
pg_log_error("invalid line number: %s", ln);
status = PSQL_CMD_ERROR;
}
}
@ -995,16 +995,16 @@ exec_command_ef_ev(PsqlScanState scan_state, bool active_branch,
formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf));
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);
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);
status = PSQL_CMD_ERROR;
}
else if (!query_buf)
{
psql_error("no query buffer\n");
pg_log_error("no query buffer");
status = PSQL_CMD_ERROR;
}
else
@ -1157,7 +1157,7 @@ exec_command_encoding(PsqlScanState scan_state, bool active_branch)
{
/* set encoding */
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
{
/* save encoding info into psql internal data */
@ -1192,7 +1192,7 @@ exec_command_errverbose(PsqlScanState scan_state, bool active_branch)
PQSHOW_CONTEXT_ALWAYS);
if (msg)
{
psql_error("%s", msg);
pg_log_error("%s", msg);
PQfreemem(msg);
}
else
@ -1387,7 +1387,7 @@ exec_command_include(PsqlScanState scan_state, bool active_branch, const char *c
if (!fname)
{
psql_error("\\%s: missing required argument\n", cmd);
pg_log_error("\\%s: missing required argument", cmd);
success = false;
}
else
@ -1518,12 +1518,12 @@ exec_command_elif(PsqlScanState scan_state, ConditionalStack cstack,
break;
case IFSTATE_ELSE_TRUE:
case IFSTATE_ELSE_FALSE:
psql_error("\\elif: cannot occur after \\else\n");
pg_log_error("\\elif: cannot occur after \\else");
success = false;
break;
case IFSTATE_NONE:
/* no \if to elif from */
psql_error("\\elif: no matching \\if\n");
pg_log_error("\\elif: no matching \\if");
success = false;
break;
}
@ -1587,12 +1587,12 @@ exec_command_else(PsqlScanState scan_state, ConditionalStack cstack,
break;
case IFSTATE_ELSE_TRUE:
case IFSTATE_ELSE_FALSE:
psql_error("\\else: cannot occur after \\else\n");
pg_log_error("\\else: cannot occur after \\else");
success = false;
break;
case IFSTATE_NONE:
/* no \if to else from */
psql_error("\\else: no matching \\if\n");
pg_log_error("\\else: no matching \\if");
success = false;
break;
}
@ -1632,7 +1632,7 @@ exec_command_endif(PsqlScanState scan_state, ConditionalStack cstack,
break;
case IFSTATE_NONE:
/* no \if to end */
psql_error("\\endif: no matching \\if\n");
pg_log_error("\\endif: no matching \\if");
success = false;
break;
}
@ -1692,7 +1692,7 @@ exec_command_lo(PsqlScanState scan_state, bool active_branch, const char *cmd)
{
if (!opt2)
{
psql_error("\\%s: missing required argument\n", cmd);
pg_log_error("\\%s: missing required argument", cmd);
success = false;
}
else
@ -1706,7 +1706,7 @@ exec_command_lo(PsqlScanState scan_state, bool active_branch, const char *cmd)
{
if (!opt1)
{
psql_error("\\%s: missing required argument\n", cmd);
pg_log_error("\\%s: missing required argument", cmd);
success = false;
}
else
@ -1723,7 +1723,7 @@ exec_command_lo(PsqlScanState scan_state, bool active_branch, const char *cmd)
{
if (!opt1)
{
psql_error("\\%s: missing required argument\n", cmd);
pg_log_error("\\%s: missing required argument", cmd);
success = false;
}
else
@ -1814,7 +1814,7 @@ exec_command_password(PsqlScanState scan_state, bool active_branch)
if (strcmp(pw1, pw2) != 0)
{
psql_error("Passwords didn't match.\n");
pg_log_error("Passwords didn't match.");
success = false;
}
else
@ -1831,7 +1831,7 @@ exec_command_password(PsqlScanState scan_state, bool active_branch)
if (!encrypted_password)
{
psql_error("%s", PQerrorMessage(pset.db));
pg_log_info("%s", PQerrorMessage(pset.db));
success = false;
}
else
@ -1883,7 +1883,7 @@ exec_command_prompt(PsqlScanState scan_state, bool active_branch,
if (!arg1)
{
psql_error("\\%s: missing required argument\n", cmd);
pg_log_error("\\%s: missing required argument", cmd);
success = false;
}
else
@ -1913,7 +1913,7 @@ exec_command_prompt(PsqlScanState scan_state, bool active_branch,
result = gets_fromFile(stdin);
if (!result)
{
psql_error("\\%s: could not read value for variable\n",
pg_log_error("\\%s: could not read value for variable",
cmd);
success = false;
}
@ -2120,12 +2120,12 @@ exec_command_setenv(PsqlScanState scan_state, bool active_branch,
if (!envvar)
{
psql_error("\\%s: missing required argument\n", cmd);
pg_log_error("\\%s: missing required argument", cmd);
success = false;
}
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);
success = false;
}
@ -2186,19 +2186,19 @@ exec_command_sf_sv(PsqlScanState scan_state, bool active_branch,
formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf));
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);
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);
status = PSQL_CMD_ERROR;
}
else if (!obj_desc)
{
if (is_func)
psql_error("function name is required\n");
pg_log_error("function name is required");
else
psql_error("view name is required\n");
pg_log_error("view name is required");
status = PSQL_CMD_ERROR;
}
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)
{
psql_error("\\%s: missing required argument\n", cmd);
pg_log_error("\\%s: missing required argument", cmd);
success = false;
}
else if (!SetVariable(pset.vars, opt, NULL))
@ -2389,14 +2389,14 @@ exec_command_write(PsqlScanState scan_state, bool active_branch,
if (!query_buf)
{
psql_error("no query buffer\n");
pg_log_error("no query buffer");
status = PSQL_CMD_ERROR;
}
else
{
if (!fname)
{
psql_error("\\%s: missing required argument\n", cmd);
pg_log_error("\\%s: missing required argument", cmd);
status = PSQL_CMD_ERROR;
}
else
@ -2415,7 +2415,7 @@ exec_command_write(PsqlScanState scan_state, bool active_branch,
}
if (!fd)
{
psql_error("%s: %s\n", fname, strerror(errno));
pg_log_error("%s: %m", fname);
status = PSQL_CMD_ERROR;
}
}
@ -2443,7 +2443,7 @@ exec_command_write(PsqlScanState scan_state, bool active_branch,
if (result == EOF)
{
psql_error("%s: %s\n", fname, strerror(errno));
pg_log_error("%s: %m", fname);
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
* parameters to be specified.
*/
psql_error("All connection parameters must be supplied because no "
"database connection exists\n");
pg_log_error("All connection parameters must be supplied because no "
"database connection exists");
return false;
}
@ -3067,15 +3067,15 @@ do_connect(enum trivalue reuse_previous_specification,
*/
if (pset.cur_cmd_interactive)
{
psql_error("%s", PQerrorMessage(n_conn));
pg_log_info("%s", PQerrorMessage(n_conn));
/* pset.db is left unmodified */
if (o_conn)
psql_error("Previous connection kept\n");
pg_log_info("Previous connection kept");
}
else
{
psql_error("\\connect: %s", PQerrorMessage(n_conn));
pg_log_error("\\connect: %s", PQerrorMessage(n_conn));
if (o_conn)
{
PQfinish(o_conn);
@ -3337,7 +3337,7 @@ editFile(const char *fname, int lineno)
#endif
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;
}
}
@ -3366,9 +3366,9 @@ editFile(const char *fname, int lineno)
#endif
result = system(sys);
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)
psql_error("could not start /bin/sh\n");
pg_log_error("could not start /bin/sh");
free(sys);
return result == 0;
@ -3406,7 +3406,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
ret = GetTempPath(MAXPGPATH, tmpdir);
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) : "");
return false;
}
@ -3433,7 +3433,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
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;
}
else
@ -3448,21 +3448,21 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
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)
psql_error("%s: %s\n", fname, strerror(errno));
pg_log_error("%s: %m", fname);
if (remove(fname) != 0)
psql_error("%s: %s\n", fname, strerror(errno));
pg_log_error("%s: %m", fname);
error = true;
}
else if (fclose(stream) != 0)
{
psql_error("%s: %s\n", fname, strerror(errno));
pg_log_error("%s: %m", fname);
if (remove(fname) != 0)
psql_error("%s: %s\n", fname, strerror(errno));
pg_log_error("%s: %m", fname);
error = true;
}
}
@ -3470,7 +3470,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
if (!error && stat(fname, &before) != 0)
{
psql_error("%s: %s\n", fname, strerror(errno));
pg_log_error("%s: %m", fname);
error = true;
}
@ -3480,7 +3480,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
if (!error && stat(fname, &after) != 0)
{
psql_error("%s: %s\n", fname, strerror(errno));
pg_log_error("%s: %m", fname);
error = true;
}
@ -3489,7 +3489,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
stream = fopen(fname, PG_BINARY_R);
if (!stream)
{
psql_error("%s: %s\n", fname, strerror(errno));
pg_log_error("%s: %m", fname);
error = true;
}
else
@ -3503,7 +3503,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
if (ferror(stream))
{
psql_error("%s: %s\n", fname, strerror(errno));
pg_log_error("%s: %m", fname);
error = true;
}
else if (edited)
@ -3520,7 +3520,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf,
{
if (remove(fname) == -1)
{
psql_error("%s: %s\n", fname, strerror(errno));
pg_log_error("%s: %m", fname);
error = true;
}
}
@ -3578,7 +3578,7 @@ process_file(char *filename, bool use_relative_path)
if (!fd)
{
psql_error("%s: %s\n", filename, strerror(errno));
pg_log_error("%s: %m", filename);
return EXIT_FAILURE;
}
}
@ -3591,12 +3591,17 @@ process_file(char *filename, bool use_relative_path)
oldfilename = pset.inputfile;
pset.inputfile = filename;
pg_logging_config(pset.inputfile ? 0 : PG_LOG_FLAG_TERSE);
result = MainLoop(fd);
if (fd != stdin)
fclose(fd);
pset.inputfile = oldfilename;
pg_logging_config(pset.inputfile ? 0 : PG_LOG_FLAG_TERSE);
return result;
}
@ -3721,7 +3726,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
match_pos = i;
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,
formats[match_pos].name, formats[i].name);
return false;
@ -3741,7 +3746,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
}
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;
}
}
@ -3760,7 +3765,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
popt->topt.line_style = &pg_utf8format;
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;
}
}
@ -3775,7 +3780,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
refresh_utf8format(&(popt->topt));
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;
}
}
@ -3790,7 +3795,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
refresh_utf8format(&(popt->topt));
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;
}
}
@ -3805,7 +3810,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
refresh_utf8format(&(popt->topt));
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;
}
}
@ -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 */
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;
}
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;
}
popt->topt.csvFieldSep[0] = value[0];
@ -3990,7 +3995,7 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet)
}
else
{
psql_error("\\pset: unknown option: %s\n", param);
pg_log_error("\\pset: unknown option: %s", param);
return false;
}
@ -4176,7 +4181,7 @@ printPsetInfo(const char *param, struct printQueryOpt *popt)
else
{
psql_error("\\pset: unknown option: %s\n", param);
pg_log_error("\\pset: unknown option: %s", param);
return false;
}
@ -4332,7 +4337,7 @@ do_shell(const char *command)
if (result == 127 || result == -1)
{
psql_error("\\!: failed\n");
pg_log_error("\\!: failed");
return false;
}
return true;
@ -4357,7 +4362,7 @@ do_watch(PQExpBuffer query_buf, double sleep)
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;
}
@ -4654,7 +4659,7 @@ get_create_object_cmd(EditableObjectType obj_type, Oid oid,
appendPQExpBufferStr(buf, "CREATE OR REPLACE VIEW ");
break;
default:
psql_error("\"%s.%s\" is not a view\n",
pg_log_error("\"%s.%s\" is not a view",
nspname, relname);
result = false;
break;
@ -4670,7 +4675,7 @@ get_create_object_cmd(EditableObjectType obj_type, Oid oid,
pset.encoding,
standard_strings()))
{
psql_error("could not parse reloptions array\n");
pg_log_error("could not parse reloptions array");
result = false;
}
appendPQExpBufferChar(buf, ')');
@ -4759,7 +4764,7 @@ strip_lineno_from_objdesc(char *obj)
lineno = atoi(c);
if (lineno < 1)
{
psql_error("invalid line number: %s\n", c);
pg_log_error("invalid line number: %s", c);
return 0;
}
@ -4861,7 +4866,7 @@ minimal_error_message(PGresult *res)
appendPQExpBufferStr(msg, "(not available)");
appendPQExpBufferChar(msg, '\n');
psql_error("%s", msg->data);
pg_log_error("%s", msg->data);
destroyPQExpBuffer(msg);
}

View File

@ -19,6 +19,7 @@
#include <win32.h>
#endif
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h"
#include "portability/instr_time.h"
@ -67,7 +68,7 @@ openQueryOutputFile(const char *fname, FILE **fout, bool *is_pipe)
if (*fout == NULL)
{
psql_error("%s: %s\n", fname, strerror(errno));
pg_log_error("%s: %m", fname);
return false;
}
@ -156,7 +157,7 @@ psql_get_variable(const char *varname, PsqlScanQuoteType quote,
if (!pset.db)
{
psql_error("cannot escape without active connection\n");
pg_log_error("cannot escape without active connection");
return NULL;
}
@ -171,7 +172,7 @@ psql_get_variable(const char *varname, PsqlScanQuoteType quote,
{
const char *error = PQerrorMessage(pset.db);
psql_error("%s", error);
pg_log_info("%s", error);
return NULL;
}
@ -197,7 +198,7 @@ psql_get_variable(const char *varname, PsqlScanQuoteType quote,
initPQExpBuffer(&buf);
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);
free(buf.data);
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)
*/
@ -242,7 +221,7 @@ void
NoticeProcessor(void *arg, const char *message)
{
(void) arg; /* not used */
psql_error("%s", message);
pg_log_info("%s", message);
}
@ -413,23 +392,23 @@ CheckConnection(void)
{
if (!pset.cur_cmd_interactive)
{
psql_error("connection to server was lost\n");
pg_log_fatal("connection to server was lost");
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);
OK = ConnectionUp();
if (!OK)
{
psql_error("Failed.\n");
fprintf(stderr, _("Failed.\n"));
PQfinish(pset.db);
pset.db = NULL;
ResetCancelConn();
UnsyncVariables();
}
else
psql_error("Succeeded.\n");
fprintf(stderr, _("Succeeded.\n"));
}
return OK;
@ -529,7 +508,7 @@ AcceptResult(const PGresult *result)
default:
OK = false;
psql_error("unexpected PQresultStatus: %d\n",
pg_log_error("unexpected PQresultStatus: %d",
PQresultStatus(result));
break;
}
@ -539,7 +518,7 @@ AcceptResult(const PGresult *result)
const char *error = PQerrorMessage(pset.db);
if (strlen(error))
psql_error("%s", error);
pg_log_info("%s", error);
CheckConnection();
}
@ -693,7 +672,7 @@ PSQLexec(const char *query)
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;
}
@ -751,7 +730,7 @@ PSQLexecWatch(const char *query, const printQueryOpt *opt)
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;
}
@ -799,19 +778,19 @@ PSQLexecWatch(const char *query, const printQueryOpt *opt)
break;
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);
return -1;
case PGRES_COPY_OUT:
case PGRES_COPY_IN:
case PGRES_COPY_BOTH:
psql_error("\\watch cannot be used with COPY\n");
pg_log_error("\\watch cannot be used with COPY");
PQclear(res);
return -1;
default:
psql_error("unexpected result status for \\watch\n");
pg_log_error("unexpected result status for \\watch");
PQclear(res);
return -1;
}
@ -907,12 +886,12 @@ StoreQueryTuple(const PGresult *result)
if (PQntuples(result) < 1)
{
psql_error("no rows returned for \\gset\n");
pg_log_error("no rows returned for \\gset");
success = false;
}
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;
}
else
@ -1081,7 +1060,7 @@ ProcessResult(PGresult **results)
default:
/* AcceptResult() should have caught anything else. */
is_copy = false;
psql_error("unexpected PQresultStatus: %d\n", result_status);
pg_log_error("unexpected PQresultStatus: %d", result_status);
break;
}
@ -1298,7 +1277,7 @@ PrintQueryResults(PGresult *results)
default:
success = false;
psql_error("unexpected PQresultStatus: %d\n",
pg_log_error("unexpected PQresultStatus: %d",
PQresultStatus(results));
break;
}
@ -1334,7 +1313,7 @@ SendQuery(const char *query)
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;
}
@ -1380,7 +1359,7 @@ SendQuery(const char *query)
results = PQexec(pset.db, "BEGIN");
if (PQresultStatus(results) != PGRES_COMMAND_OK)
{
psql_error("%s", PQerrorMessage(pset.db));
pg_log_info("%s", PQerrorMessage(pset.db));
ClearOrSaveResult(results);
ResetCancelConn();
goto sendquery_cleanup;
@ -1398,7 +1377,7 @@ SendQuery(const char *query)
{
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,
sverbuf, sizeof(sverbuf)));
on_error_rollback_warning = true;
@ -1408,7 +1387,7 @@ SendQuery(const char *query)
results = PQexec(pset.db, "SAVEPOINT pg_psql_temporary_savepoint");
if (PQresultStatus(results) != PGRES_COMMAND_OK)
{
psql_error("%s", PQerrorMessage(pset.db));
pg_log_info("%s", PQerrorMessage(pset.db));
ClearOrSaveResult(results);
ResetCancelConn();
goto sendquery_cleanup;
@ -1461,7 +1440,7 @@ SendQuery(const char *query)
}
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 (on_error_rollback_savepoint)
@ -1504,7 +1483,7 @@ SendQuery(const char *query)
OK = false;
/* PQTRANS_UNKNOWN is expected given a broken connection. */
if (transaction_status != PQTRANS_UNKNOWN || ConnectionUp())
psql_error("unexpected transaction status (%d)\n",
pg_log_error("unexpected transaction status (%d)",
transaction_status);
break;
}
@ -1516,7 +1495,7 @@ SendQuery(const char *query)
svptres = PQexec(pset.db, svptcmd);
if (PQresultStatus(svptres) != PGRES_COMMAND_OK)
{
psql_error("%s", PQerrorMessage(pset.db));
pg_log_info("%s", PQerrorMessage(pset.db));
ClearOrSaveResult(svptres);
OK = false;
@ -1619,7 +1598,7 @@ DescribeQuery(const char *query, double *elapsed_msec)
results = PQprepare(pset.db, "", query, 0, NULL);
if (PQresultStatus(results) != PGRES_COMMAND_OK)
{
psql_error("%s", PQerrorMessage(pset.db));
pg_log_info("%s", PQerrorMessage(pset.db));
SetResultVariables(results, false);
ClearOrSaveResult(results);
return false;
@ -1657,7 +1636,7 @@ DescribeQuery(const char *query, double *elapsed_msec)
if (escname == NULL)
{
psql_error("%s", PQerrorMessage(pset.db));
pg_log_info("%s", PQerrorMessage(pset.db));
PQclear(results);
termPQExpBuffer(&buf);
return false;

View File

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

View File

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

View File

@ -13,6 +13,7 @@
#include "psqlscanslash.h"
#include "settings.h"
#include "fe_utils/logging.h"
/*
* 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)
{
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;
}
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;
}
@ -153,7 +154,7 @@ PrintResultsInCrosstab(const PGresult *res)
/* Insist that header columns be distinct */
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;
}
@ -169,7 +170,7 @@ PrintResultsInCrosstab(const PGresult *res)
*/
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;
}
@ -225,7 +226,7 @@ PrintResultsInCrosstab(const PGresult *res)
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);
goto error_return;
}
@ -394,7 +395,7 @@ printCrosstab(const PGresult *results,
*/
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 :
(popt.nullPrint ? popt.nullPrint : "(null)"),
cp->name ? cp->name :
@ -642,7 +643,7 @@ indexOfColumn(char *arg, const PGresult *res)
idx = atoi(arg) - 1;
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));
return -1;
}
@ -667,7 +668,7 @@ indexOfColumn(char *arg, const PGresult *res)
if (idx >= 0)
{
/* 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;
}
idx = i;
@ -675,7 +676,7 @@ indexOfColumn(char *arg, const PGresult *res)
}
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;
}
}

View File

@ -18,6 +18,7 @@
#include "catalog/pg_cast_d.h"
#include "catalog/pg_class_d.h"
#include "catalog/pg_default_acl_d.h"
#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h"
#include "common.h"
@ -157,7 +158,7 @@ describeAccessMethods(const char *pattern, bool verbose)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -226,7 +227,7 @@ describeTablespaces(const char *pattern, bool verbose)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -329,7 +330,7 @@ describeFunctions(const char *functypes, const char *pattern, bool verbose, bool
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;
}
@ -337,7 +338,7 @@ describeFunctions(const char *functypes, const char *pattern, bool verbose, bool
{
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',
formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf)));
@ -348,7 +349,7 @@ describeFunctions(const char *functypes, const char *pattern, bool verbose, bool
{
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',
formatPGVersionNumber(pset.sversion, false,
sverbuf, sizeof(sverbuf)));
@ -1097,7 +1098,7 @@ listDefaultACLs(const char *pattern)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -1398,10 +1399,10 @@ describeTableDetails(const char *pattern, bool verbose, bool showSystem)
if (!pset.quiet)
{
if (pattern)
psql_error("Did not find any relation named \"%s\".\n",
pg_log_error("Did not find any relation named \"%s\".",
pattern);
else
psql_error("Did not find any relations.\n");
pg_log_error("Did not find any relations.");
}
PQclear(res);
return false;
@ -1656,7 +1657,7 @@ describeOneTableDetails(const char *schemaname,
if (PQntuples(res) == 0)
{
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;
}
@ -3541,7 +3542,7 @@ listDbRoleSettings(const char *pattern, const char *pattern2)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -3577,13 +3578,13 @@ listDbRoleSettings(const char *pattern, const char *pattern2)
if (PQntuples(res) == 0 && !pset.quiet)
{
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);
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);
else
psql_error("Did not find any settings.\n");
pg_log_error("Did not find any settings.");
}
else
{
@ -3753,10 +3754,10 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys
if (PQntuples(res) == 0 && !pset.quiet)
{
if (pattern)
psql_error("Did not find any relation named \"%s\".\n",
pg_log_error("Did not find any relation named \"%s\".",
pattern);
else
psql_error("Did not find any relations.\n");
pg_log_error("Did not find any relations.");
}
else
{
@ -4212,7 +4213,7 @@ listCollations(const char *pattern, bool verbose, bool showSystem)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -4367,7 +4368,7 @@ listTSParsers(const char *pattern, bool verbose)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -4447,10 +4448,10 @@ listTSParsersVerbose(const char *pattern)
if (!pset.quiet)
{
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);
else
psql_error("Did not find any text search parsers.\n");
pg_log_error("Did not find any text search parsers.");
}
PQclear(res);
return false;
@ -4614,7 +4615,7 @@ listTSDictionaries(const char *pattern, bool verbose)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -4685,7 +4686,7 @@ listTSTemplates(const char *pattern, bool verbose)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -4756,7 +4757,7 @@ listTSConfigs(const char *pattern, bool verbose)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -4837,10 +4838,10 @@ listTSConfigsVerbose(const char *pattern)
if (!pset.quiet)
{
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);
else
psql_error("Did not find any text search configurations.\n");
pg_log_error("Did not find any text search configurations.");
}
PQclear(res);
return false;
@ -4962,7 +4963,7 @@ listForeignDataWrappers(const char *pattern, bool verbose)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -5045,7 +5046,7 @@ listForeignServers(const char *pattern, bool verbose)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -5127,7 +5128,7 @@ listUserMappings(const char *pattern, bool verbose)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -5188,7 +5189,7 @@ listForeignTables(const char *pattern, bool verbose)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -5266,7 +5267,7 @@ listExtensions(const char *pattern)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -5323,7 +5324,7 @@ listExtensionContents(const char *pattern)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -5351,10 +5352,10 @@ listExtensionContents(const char *pattern)
if (!pset.quiet)
{
if (pattern)
psql_error("Did not find any extension named \"%s\".\n",
pg_log_error("Did not find any extension named \"%s\".",
pattern);
else
psql_error("Did not find any extensions.\n");
pg_log_error("Did not find any extensions.");
}
PQclear(res);
return false;
@ -5437,7 +5438,7 @@ listPublications(const char *pattern)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -5508,7 +5509,7 @@ describePublications(const char *pattern)
{
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,
sverbuf, sizeof(sverbuf)));
return true;
@ -5546,10 +5547,10 @@ describePublications(const char *pattern)
if (!pset.quiet)
{
if (pattern)
psql_error("Did not find any publication named \"%s\".\n",
pg_log_error("Did not find any publication named \"%s\".",
pattern);
else
psql_error("Did not find any publications.\n");
pg_log_error("Did not find any publications.");
}
termPQExpBuffer(&buf);
@ -5664,7 +5665,7 @@ describeSubscriptions(const char *pattern, bool verbose)
{
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,
sverbuf, sizeof(sverbuf)));
return true;

View File

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

View File

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

View File

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

View File

@ -14,13 +14,13 @@
#include "prompt.h"
#include "settings.h"
#include "fe_utils/logging.h"
#include "mb/pg_wchar.h"
/* callback functions for our flex lexer */
const PsqlScanCallbacks psqlscan_callbacks = {
psql_get_variable,
psql_error
};
@ -79,7 +79,7 @@ MainLoop(FILE *source)
PQExpBufferBroken(previous_buf) ||
PQExpBufferBroken(history_buf))
{
psql_error("out of memory\n");
pg_log_error("out of memory");
exit(EXIT_FAILURE);
}
@ -133,7 +133,7 @@ MainLoop(FILE *source)
*/
if (!conditional_stack_empty(cond_stack))
{
psql_error("\\if: escaped\n");
pg_log_error("\\if: escaped");
conditional_stack_pop(cond_stack);
}
}
@ -383,7 +383,7 @@ MainLoop(FILE *source)
if (PQExpBufferBroken(query_buf))
{
psql_error("out of memory\n");
pg_log_error("out of memory");
exit(EXIT_FAILURE);
}
@ -446,7 +446,7 @@ MainLoop(FILE *source)
{
/* if interactive, warn about non-executed query */
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 */
success = true;
slashCmdStatus = PSQL_CMD_SEND;
@ -588,7 +588,7 @@ MainLoop(FILE *source)
else
{
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;
}
@ -606,7 +606,7 @@ MainLoop(FILE *source)
successResult != EXIT_USER &&
!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)
successResult = EXIT_USER;
}

View File

@ -1,12 +1,14 @@
# src/bin/psql/nls.mk
CATALOG_NAME = psql
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 \
describe.c sql_help.h sql_help.c \
tab-complete.c variables.c \
../../fe_utils/print.c ../../fe_utils/psqlscan.c \
../../common/exec.c ../../common/fe_memutils.c ../../common/username.c \
../../common/wait_error.c
GETTEXT_TRIGGERS = N_ psql_error simple_prompt write_error
GETTEXT_FLAGS = psql_error:1:c-format write_error:1:c-format
GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \
N_ simple_prompt
GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)

View File

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

View File

@ -22,6 +22,7 @@
#include "help.h"
#include "input.h"
#include "mainloop.h"
#include "fe_utils/logging.h"
#include "fe_utils/print.h"
#include "settings.h"
@ -89,6 +90,28 @@ static void EstablishVariableSpace(void);
#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
@ -103,6 +126,9 @@ main(int argc, char *argv[])
char password[100];
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"));
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.db = NULL;
@ -190,7 +212,7 @@ main(int argc, char *argv[])
/* Bail out if -1 was specified but will be ignored. */
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);
}
@ -277,7 +299,7 @@ main(int argc, char *argv[])
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);
exit(EXIT_BADCONN);
}
@ -305,8 +327,8 @@ main(int argc, char *argv[])
pset.logfile = fopen(options.logfilename, "a");
if (!pset.logfile)
{
fprintf(stderr, _("%s: could not open log file \"%s\": %s\n"),
pset.progname, options.logfilename, strerror(errno));
pg_log_fatal("could not open log file \"%s\": %m",
options.logfilename);
exit(EXIT_FAILURE);
}
}
@ -343,6 +365,8 @@ main(int argc, char *argv[])
{
if (cell->action == ACT_SINGLE_QUERY)
{
pg_logging_config(PG_LOG_FLAG_TERSE);
if (pset.echo == PSQL_ECHO_ALL)
puts(cell->val);
@ -354,6 +378,8 @@ main(int argc, char *argv[])
PsqlScanState scan_state;
ConditionalStack cond_stack;
pg_logging_config(PG_LOG_FLAG_TERSE);
if (pset.echo == PSQL_ECHO_ALL)
puts(cell->val);
@ -562,7 +588,7 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts *options)
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);
}
@ -684,8 +710,8 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts *options)
else if (!options->username)
options->username = argv[optind];
else if (!pset.quiet)
fprintf(stderr, _("%s: warning: extra command-line argument \"%s\" ignored\n"),
pset.progname, argv[optind]);
pg_log_warning("extra command-line argument \"%s\" ignored",
argv[optind]);
optind++;
}
@ -733,7 +759,7 @@ process_psqlrc(char *argv0)
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);
}

View File

@ -4329,7 +4329,7 @@ exec_query(const char *query)
if (PQresultStatus(result) != PGRES_TUPLES_OK)
{
#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);
#endif
PQclear(result);

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