diff --git a/doc/src/sgml/ref/clusterdb.sgml b/doc/src/sgml/ref/clusterdb.sgml
index ed343dd7dae..b25845ffc67 100644
--- a/doc/src/sgml/ref/clusterdb.sgml
+++ b/doc/src/sgml/ref/clusterdb.sgml
@@ -274,6 +274,17 @@ PostgreSQL documentation
+
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
diff --git a/doc/src/sgml/ref/createdb.sgml b/doc/src/sgml/ref/createdb.sgml
index 2658efeb1a1..8fc8128bf9c 100644
--- a/doc/src/sgml/ref/createdb.sgml
+++ b/doc/src/sgml/ref/createdb.sgml
@@ -322,6 +322,17 @@ PostgreSQL documentation
+
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
diff --git a/doc/src/sgml/ref/createuser.sgml b/doc/src/sgml/ref/createuser.sgml
index 22ee99f2cc4..abe25f17d01 100644
--- a/doc/src/sgml/ref/createuser.sgml
+++ b/doc/src/sgml/ref/createuser.sgml
@@ -400,6 +400,17 @@ PostgreSQL documentation
+
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
diff --git a/doc/src/sgml/ref/dropdb.sgml b/doc/src/sgml/ref/dropdb.sgml
index 38f38f01ce6..3fbdb337164 100644
--- a/doc/src/sgml/ref/dropdb.sgml
+++ b/doc/src/sgml/ref/dropdb.sgml
@@ -228,6 +228,17 @@ PostgreSQL documentation
+
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
diff --git a/doc/src/sgml/ref/dropuser.sgml b/doc/src/sgml/ref/dropuser.sgml
index 3d4e4b37b35..72bb7e8535c 100644
--- a/doc/src/sgml/ref/dropuser.sgml
+++ b/doc/src/sgml/ref/dropuser.sgml
@@ -220,6 +220,17 @@ PostgreSQL documentation
+
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
diff --git a/doc/src/sgml/ref/initdb.sgml b/doc/src/sgml/ref/initdb.sgml
index 84fb37c293a..7f323103084 100644
--- a/doc/src/sgml/ref/initdb.sgml
+++ b/doc/src/sgml/ref/initdb.sgml
@@ -461,6 +461,17 @@ PostgreSQL documentation
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
+
TZ
diff --git a/doc/src/sgml/ref/pg_basebackup.sgml b/doc/src/sgml/ref/pg_basebackup.sgml
index c4f3950e5bc..dd6bce57d2b 100644
--- a/doc/src/sgml/ref/pg_basebackup.sgml
+++ b/doc/src/sgml/ref/pg_basebackup.sgml
@@ -687,6 +687,12 @@ PostgreSQL documentation
(see ).
+
+ The environment variable PG_COLOR specifies whether to use
+ color in diagnostics messages. Possible values are
+ always, auto,
+ never.
+
diff --git a/doc/src/sgml/ref/pg_checksums.sgml b/doc/src/sgml/ref/pg_checksums.sgml
index 70339eaec9c..d93793da5dd 100644
--- a/doc/src/sgml/ref/pg_checksums.sgml
+++ b/doc/src/sgml/ref/pg_checksums.sgml
@@ -173,6 +173,17 @@ PostgreSQL documentation
+
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
diff --git a/doc/src/sgml/ref/pg_controldata.sgml b/doc/src/sgml/ref/pg_controldata.sgml
index 32081e9b91c..abac59aa500 100644
--- a/doc/src/sgml/ref/pg_controldata.sgml
+++ b/doc/src/sgml/ref/pg_controldata.sgml
@@ -68,6 +68,17 @@ PostgreSQL documentation
+
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml
index e0e65f9c21c..8fa23143474 100644
--- a/doc/src/sgml/ref/pg_dump.sgml
+++ b/doc/src/sgml/ref/pg_dump.sgml
@@ -1224,6 +1224,17 @@ PostgreSQL documentation
+
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
diff --git a/doc/src/sgml/ref/pg_dumpall.sgml b/doc/src/sgml/ref/pg_dumpall.sgml
index e3676cf811f..24c8c031d64 100644
--- a/doc/src/sgml/ref/pg_dumpall.sgml
+++ b/doc/src/sgml/ref/pg_dumpall.sgml
@@ -695,6 +695,17 @@ PostgreSQL documentation
+
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
diff --git a/doc/src/sgml/ref/pg_isready.sgml b/doc/src/sgml/ref/pg_isready.sgml
index 9567b57ebe2..68447b5093d 100644
--- a/doc/src/sgml/ref/pg_isready.sgml
+++ b/doc/src/sgml/ref/pg_isready.sgml
@@ -164,6 +164,13 @@ PostgreSQL documentation
also uses the environment variables supported by libpq
(see ).
+
+
+ The environment variable PG_COLOR specifies whether to use
+ color in diagnostics messages. Possible values are
+ always, auto,
+ never.
+
diff --git a/doc/src/sgml/ref/pg_receivewal.sgml b/doc/src/sgml/ref/pg_receivewal.sgml
index a18ddd4bff1..0506120c00b 100644
--- a/doc/src/sgml/ref/pg_receivewal.sgml
+++ b/doc/src/sgml/ref/pg_receivewal.sgml
@@ -408,6 +408,12 @@ PostgreSQL documentation
(see ).
+
+ The environment variable PG_COLOR specifies whether to use
+ color in diagnostics messages. Possible values are
+ always, auto,
+ never.
+
diff --git a/doc/src/sgml/ref/pg_recvlogical.sgml b/doc/src/sgml/ref/pg_recvlogical.sgml
index 141c5cddce1..4c79f90414d 100644
--- a/doc/src/sgml/ref/pg_recvlogical.sgml
+++ b/doc/src/sgml/ref/pg_recvlogical.sgml
@@ -397,6 +397,13 @@ PostgreSQL documentation
uses the environment variables supported by libpq
(see ).
+
+
+ The environment variable PG_COLOR specifies whether to use
+ color in diagnostics messages. Possible values are
+ always, auto,
+ never.
+
diff --git a/doc/src/sgml/ref/pg_resetwal.sgml b/doc/src/sgml/ref/pg_resetwal.sgml
index 3f885bdd620..8a9e22d050f 100644
--- a/doc/src/sgml/ref/pg_resetwal.sgml
+++ b/doc/src/sgml/ref/pg_resetwal.sgml
@@ -320,6 +320,23 @@ PostgreSQL documentation
+
+ Environment
+
+
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
+
+
+
Notes
diff --git a/doc/src/sgml/ref/pg_restore.sgml b/doc/src/sgml/ref/pg_restore.sgml
index 725acb192c9..cf369a0f3b9 100644
--- a/doc/src/sgml/ref/pg_restore.sgml
+++ b/doc/src/sgml/ref/pg_restore.sgml
@@ -822,6 +822,17 @@
+
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
diff --git a/doc/src/sgml/ref/pg_rewind.sgml b/doc/src/sgml/ref/pg_rewind.sgml
index 53a64ee29ef..d98406c420e 100644
--- a/doc/src/sgml/ref/pg_rewind.sgml
+++ b/doc/src/sgml/ref/pg_rewind.sgml
@@ -234,6 +234,13 @@ PostgreSQL documentation
pg_rewind also uses the environment variables
supported by libpq (see ).
+
+
+ The environment variable PG_COLOR specifies whether to use
+ color in diagnostics messages. Possible values are
+ always, auto,
+ never.
+
diff --git a/doc/src/sgml/ref/pg_waldump.sgml b/doc/src/sgml/ref/pg_waldump.sgml
index 389c314ef3b..329c10e4303 100644
--- a/doc/src/sgml/ref/pg_waldump.sgml
+++ b/doc/src/sgml/ref/pg_waldump.sgml
@@ -206,6 +206,32 @@ PostgreSQL documentation
+
+ Environment
+
+
+
+ PGDATA
+
+
+ Data directory; see also the option.
+
+
+
+
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
+
+
+
Notes
diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index 1b5d82ed8ee..b29e7547c6a 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -4333,6 +4333,17 @@ $endif
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
+
PSQL_EDITOR
EDITOR
diff --git a/doc/src/sgml/ref/reindexdb.sgml b/doc/src/sgml/ref/reindexdb.sgml
index cdfac3fe4f9..25b5a727705 100644
--- a/doc/src/sgml/ref/reindexdb.sgml
+++ b/doc/src/sgml/ref/reindexdb.sgml
@@ -352,6 +352,17 @@ PostgreSQL documentation
+
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
diff --git a/doc/src/sgml/ref/vacuumdb.sgml b/doc/src/sgml/ref/vacuumdb.sgml
index 41c7f3df793..47d93456f86 100644
--- a/doc/src/sgml/ref/vacuumdb.sgml
+++ b/doc/src/sgml/ref/vacuumdb.sgml
@@ -451,6 +451,17 @@ PostgreSQL documentation
+
+
+ PG_COLOR
+
+
+ Specifies whether to use color in diagnostics messages. Possible values
+ are always, auto,
+ never.
+
+
+
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 9840a55c10a..a181e33dd4d 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -4761,7 +4761,7 @@ ReadControlFile(void)
void
UpdateControlFile(void)
{
- update_controlfile(DataDir, NULL, ControlFile, true);
+ update_controlfile(DataDir, ControlFile, true);
}
/*
diff --git a/src/backend/utils/misc/pg_controldata.c b/src/backend/utils/misc/pg_controldata.c
index e675c33c547..b42921800b7 100644
--- a/src/backend/utils/misc/pg_controldata.c
+++ b/src/backend/utils/misc/pg_controldata.c
@@ -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")));
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 4886090132e..09b59c83246 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -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
diff --git a/src/bin/initdb/nls.mk b/src/bin/initdb/nls.mk
index b0ce62980a0..803388d4c7b 100644
--- a/src/bin/initdb/nls.mk
+++ b/src/bin/initdb/nls.mk
@@ -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)
diff --git a/src/bin/pg_archivecleanup/Makefile b/src/bin/pg_archivecleanup/Makefile
index c5bf99db0f4..14e834677b2 100644
--- a/src/bin/pg_archivecleanup/Makefile
+++ b/src/bin/pg_archivecleanup/Makefile
@@ -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
diff --git a/src/bin/pg_archivecleanup/nls.mk b/src/bin/pg_archivecleanup/nls.mk
index 2cd81d32a7d..c2d625c52ff 100644
--- a/src/bin/pg_archivecleanup/nls.mk
+++ b/src/bin/pg_archivecleanup/nls.mk
@@ -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)
diff --git a/src/bin/pg_archivecleanup/pg_archivecleanup.c b/src/bin/pg_archivecleanup/pg_archivecleanup.c
index 4c3a2de0453..b297f210df6 100644
--- a/src/bin/pg_archivecleanup/pg_archivecleanup.c
+++ b/src/bin/pg_archivecleanup/pg_archivecleanup.c
@@ -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
diff --git a/src/bin/pg_basebackup/nls.mk b/src/bin/pg_basebackup/nls.mk
index f7694343fc7..fece5551bda 100644
--- a/src/bin/pg_basebackup/nls.mk
+++ b/src/bin/pg_basebackup/nls.mk
@@ -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)
diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c
index 916371232bf..1a735b80467 100644
--- a/src/bin/pg_basebackup/pg_basebackup.c
+++ b/src/bin/pg_basebackup/pg_basebackup.c
@@ -30,6 +30,7 @@
#include "common/file_perm.h"
#include "common/file_utils.h"
#include "common/string.h"
+#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h"
#include "getopt_long.h"
#include "libpq-fe.h"
@@ -167,57 +168,41 @@ cleanup_directories_atexit(void)
{
if (made_new_pgdata)
{
- fprintf(stderr, _("%s: removing data directory \"%s\"\n"),
- progname, basedir);
+ pg_log_info("removing data directory \"%s\"", basedir);
if (!rmtree(basedir, 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, basedir);
+ pg_log_info("removing contents of data directory \"%s\"", basedir);
if (!rmtree(basedir, 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");
}
}
else
{
if ((made_new_pgdata || found_existing_pgdata) && !checksum_failure)
- fprintf(stderr,
- _("%s: data directory \"%s\" not removed at user's request\n"),
- progname, basedir);
+ pg_log_info("data directory \"%s\" not removed at user's request", basedir);
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);
}
if ((made_tablespace_dirs || found_tablespace_dirs) && !checksum_failure)
- fprintf(stderr,
- _("%s: changes to tablespace directories will not be undone\n"),
- progname);
+ pg_log_info("changes to tablespace directories will not be undone");
}
static void
@@ -258,7 +243,7 @@ tablespace_list_append(const char *arg)
{
if (dst_ptr - dst >= MAXPGPATH)
{
- fprintf(stderr, _("%s: directory name too long\n"), progname);
+ pg_log_error("directory name too long");
exit(1);
}
@@ -268,7 +253,7 @@ tablespace_list_append(const char *arg)
{
if (*cell->new_dir)
{
- fprintf(stderr, _("%s: multiple \"=\" signs in tablespace mapping\n"), progname);
+ pg_log_error("multiple \"=\" signs in tablespace mapping");
exit(1);
}
else
@@ -280,9 +265,7 @@ tablespace_list_append(const char *arg)
if (!*cell->old_dir || !*cell->new_dir)
{
- fprintf(stderr,
- _("%s: invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"\n"),
- progname, arg);
+ pg_log_error("invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"", arg);
exit(1);
}
@@ -294,15 +277,15 @@ tablespace_list_append(const char *arg)
*/
if (!is_absolute_path(cell->old_dir))
{
- fprintf(stderr, _("%s: old directory is not an absolute path in tablespace mapping: %s\n"),
- progname, cell->old_dir);
+ pg_log_error("old directory is not an absolute path in tablespace mapping: %s",
+ cell->old_dir);
exit(1);
}
if (!is_absolute_path(cell->new_dir))
{
- fprintf(stderr, _("%s: new directory is not an absolute path in tablespace mapping: %s\n"),
- progname, cell->new_dir);
+ pg_log_error("new directory is not an absolute path in tablespace mapping: %s",
+ cell->new_dir);
exit(1);
}
@@ -425,16 +408,14 @@ reached_end_position(XLogRecPtr segendpos, uint32 timeline,
r = read(bgpipe[0], xlogend, sizeof(xlogend) - 1);
if (r < 0)
{
- fprintf(stderr, _("%s: could not read from ready pipe: %s\n"),
- progname, strerror(errno));
+ pg_log_error("could not read from ready pipe: %m");
exit(1);
}
if (sscanf(xlogend, "%X/%X", &hi, &lo) != 2)
{
- fprintf(stderr,
- _("%s: could not parse write-ahead log location \"%s\"\n"),
- progname, xlogend);
+ pg_log_error("could not parse write-ahead log location \"%s\"",
+ xlogend);
exit(1);
}
xlogendptr = ((uint64) hi) << 32 | lo;
@@ -526,9 +507,7 @@ LogStreamerMain(logstreamer_param *param)
if (!stream.walmethod->finish())
{
- fprintf(stderr,
- _("%s: could not finish writing WAL files: %s\n"),
- progname, strerror(errno));
+ pg_log_error("could not finish writing WAL files: %m");
return 1;
}
@@ -563,9 +542,8 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier)
/* Convert the starting position */
if (sscanf(startpos, "%X/%X", &hi, &lo) != 2)
{
- fprintf(stderr,
- _("%s: could not parse write-ahead log location \"%s\"\n"),
- progname, startpos);
+ pg_log_error("could not parse write-ahead log location \"%s\"",
+ startpos);
exit(1);
}
param->startptr = ((uint64) hi) << 32 | lo;
@@ -576,9 +554,7 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier)
/* Create our background pipe */
if (pipe(bgpipe) < 0)
{
- fprintf(stderr,
- _("%s: could not create pipe for background process: %s\n"),
- progname, strerror(errno));
+ pg_log_error("could not create pipe for background process: %m");
exit(1);
}
#endif
@@ -613,11 +589,11 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier)
if (verbose)
{
if (temp_replication_slot)
- fprintf(stderr, _("%s: created temporary replication slot \"%s\"\n"),
- progname, replication_slot);
+ pg_log_info("created temporary replication slot \"%s\"",
+ replication_slot);
else
- fprintf(stderr, _("%s: created replication slot \"%s\"\n"),
- progname, replication_slot);
+ pg_log_info("created replication slot \"%s\"",
+ replication_slot);
}
}
@@ -636,9 +612,7 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier)
if (pg_mkdir_p(statusdir, pg_dir_create_mode) != 0 && errno != EEXIST)
{
- fprintf(stderr,
- _("%s: could not create directory \"%s\": %s\n"),
- progname, statusdir, strerror(errno));
+ pg_log_error("could not create directory \"%s\": %m", statusdir);
exit(1);
}
}
@@ -656,8 +630,7 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier)
}
else if (bgchild < 0)
{
- fprintf(stderr, _("%s: could not create background process: %s\n"),
- progname, strerror(errno));
+ pg_log_error("could not create background process: %m");
exit(1);
}
@@ -669,8 +642,7 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier)
bgchild = _beginthreadex(NULL, 0, (void *) LogStreamerMain, param, 0, NULL);
if (bgchild == 0)
{
- fprintf(stderr, _("%s: could not create background thread: %s\n"),
- progname, strerror(errno));
+ pg_log_error("could not create background thread: %m");
exit(1);
}
#endif
@@ -693,9 +665,7 @@ verify_dir_is_empty_or_create(char *dirname, bool *created, bool *found)
*/
if (pg_mkdir_p(dirname, pg_dir_create_mode) == -1)
{
- fprintf(stderr,
- _("%s: could not create directory \"%s\": %s\n"),
- progname, dirname, strerror(errno));
+ pg_log_error("could not create directory \"%s\": %m", dirname);
exit(1);
}
if (created)
@@ -716,17 +686,14 @@ verify_dir_is_empty_or_create(char *dirname, bool *created, bool *found)
/*
* Exists, not empty
*/
- fprintf(stderr,
- _("%s: directory \"%s\" exists but is not empty\n"),
- progname, dirname);
+ pg_log_error("directory \"%s\" exists but is not empty", dirname);
exit(1);
case -1:
/*
* Access problem
*/
- fprintf(stderr, _("%s: could not access directory \"%s\": %s\n"),
- progname, dirname, strerror(errno));
+ pg_log_error("could not access directory \"%s\": %m", dirname);
exit(1);
}
}
@@ -839,16 +806,12 @@ parse_max_rate(char *src)
result = strtod(src, &after_num);
if (src == after_num)
{
- fprintf(stderr,
- _("%s: transfer rate \"%s\" is not a valid value\n"),
- progname, src);
+ pg_log_error("transfer rate \"%s\" is not a valid value", src);
exit(1);
}
if (errno != 0)
{
- fprintf(stderr,
- _("%s: invalid transfer rate \"%s\": %s\n"),
- progname, src, strerror(errno));
+ pg_log_error("invalid transfer rate \"%s\": %m", src);
exit(1);
}
@@ -857,8 +820,7 @@ parse_max_rate(char *src)
/*
* Reject obviously wrong values here.
*/
- fprintf(stderr, _("%s: transfer rate must be greater than zero\n"),
- progname);
+ pg_log_error("transfer rate must be greater than zero");
exit(1);
}
@@ -890,18 +852,14 @@ parse_max_rate(char *src)
if (*after_num != '\0')
{
- fprintf(stderr,
- _("%s: invalid --max-rate unit: \"%s\"\n"),
- progname, suffix);
+ pg_log_error("invalid --max-rate unit: \"%s\"", suffix);
exit(1);
}
/* Valid integer? */
if ((uint64) result != (uint64) ((uint32) result))
{
- fprintf(stderr,
- _("%s: transfer rate \"%s\" exceeds integer range\n"),
- progname, src);
+ pg_log_error("transfer rate \"%s\" exceeds integer range", src);
exit(1);
}
@@ -911,9 +869,7 @@ parse_max_rate(char *src)
*/
if (result < MAX_RATE_LOWER || result > MAX_RATE_UPPER)
{
- fprintf(stderr,
- _("%s: transfer rate \"%s\" is out of range\n"),
- progname, src);
+ pg_log_error("transfer rate \"%s\" is out of range", src);
exit(1);
}
@@ -935,9 +891,8 @@ writeTarData(
{
if (gzwrite(ztarfile, buf, r) != r)
{
- fprintf(stderr,
- _("%s: could not write to compressed file \"%s\": %s\n"),
- progname, current_file, get_gz_error(ztarfile));
+ pg_log_error("could not write to compressed file \"%s\": %s",
+ current_file, get_gz_error(ztarfile));
exit(1);
}
}
@@ -946,8 +901,7 @@ writeTarData(
{
if (fwrite(buf, r, 1, tarfile) != 1)
{
- fprintf(stderr, _("%s: could not write to file \"%s\": %s\n"),
- progname, current_file, strerror(errno));
+ pg_log_error("could not write to file \"%s\": %m", current_file);
exit(1);
}
}
@@ -1012,9 +966,8 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
if (gzsetparams(ztarfile, compresslevel,
Z_DEFAULT_STRATEGY) != Z_OK)
{
- fprintf(stderr,
- _("%s: could not set compression level %d: %s\n"),
- progname, compresslevel, get_gz_error(ztarfile));
+ pg_log_error("could not set compression level %d: %s",
+ compresslevel, get_gz_error(ztarfile));
exit(1);
}
}
@@ -1033,9 +986,8 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
if (gzsetparams(ztarfile, compresslevel,
Z_DEFAULT_STRATEGY) != Z_OK)
{
- fprintf(stderr,
- _("%s: could not set compression level %d: %s\n"),
- progname, compresslevel, get_gz_error(ztarfile));
+ pg_log_error("could not set compression level %d: %s",
+ compresslevel, get_gz_error(ztarfile));
exit(1);
}
}
@@ -1061,9 +1013,8 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
if (gzsetparams(ztarfile, compresslevel,
Z_DEFAULT_STRATEGY) != Z_OK)
{
- fprintf(stderr,
- _("%s: could not set compression level %d: %s\n"),
- progname, compresslevel, get_gz_error(ztarfile));
+ pg_log_error("could not set compression level %d: %s",
+ compresslevel, get_gz_error(ztarfile));
exit(1);
}
}
@@ -1082,9 +1033,8 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
if (!ztarfile)
{
/* Compression is in use */
- fprintf(stderr,
- _("%s: could not create compressed file \"%s\": %s\n"),
- progname, filename, get_gz_error(ztarfile));
+ pg_log_error("could not create compressed file \"%s\": %s",
+ filename, get_gz_error(ztarfile));
exit(1);
}
}
@@ -1094,8 +1044,7 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
/* Either no zlib support, or zlib support but compresslevel = 0 */
if (!tarfile)
{
- fprintf(stderr, _("%s: could not create file \"%s\": %s\n"),
- progname, filename, strerror(errno));
+ pg_log_error("could not create file \"%s\": %m", filename);
exit(1);
}
}
@@ -1106,8 +1055,8 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
res = PQgetResult(conn);
if (PQresultStatus(res) != PGRES_COPY_OUT)
{
- fprintf(stderr, _("%s: could not get COPY data stream: %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("could not get COPY data stream: %s",
+ PQerrorMessage(conn));
exit(1);
}
@@ -1191,9 +1140,8 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
{
if (gzclose(ztarfile) != 0)
{
- fprintf(stderr,
- _("%s: could not close compressed file \"%s\": %s\n"),
- progname, filename, get_gz_error(ztarfile));
+ pg_log_error("could not close compressed file \"%s\": %s",
+ filename, get_gz_error(ztarfile));
exit(1);
}
}
@@ -1204,9 +1152,8 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
{
if (fclose(tarfile) != 0)
{
- fprintf(stderr,
- _("%s: could not close file \"%s\": %s\n"),
- progname, filename, strerror(errno));
+ pg_log_error("could not close file \"%s\": %m",
+ filename);
exit(1);
}
}
@@ -1216,8 +1163,8 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
}
else 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));
exit(1);
}
@@ -1401,7 +1348,7 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
/* sync the resulting tar file, errors are not considered fatal */
if (do_sync && strcmp(basedir, "-") != 0)
- (void) fsync_fname(filename, false, progname);
+ (void) fsync_fname(filename, false);
}
@@ -1462,8 +1409,8 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
res = PQgetResult(conn);
if (PQresultStatus(res) != PGRES_COPY_OUT)
{
- fprintf(stderr, _("%s: could not get COPY data stream: %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("could not get COPY data stream: %s",
+ PQerrorMessage(conn));
exit(1);
}
@@ -1491,8 +1438,8 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
}
else 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));
exit(1);
}
@@ -1505,8 +1452,7 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
*/
if (r != 512)
{
- fprintf(stderr, _("%s: invalid tar block header size: %d\n"),
- progname, r);
+ pg_log_error("invalid tar block header size: %d", r);
exit(1);
}
totaldone += 512;
@@ -1554,17 +1500,15 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
pg_str_endswith(filename, "/archive_status")) &&
errno == EEXIST))
{
- fprintf(stderr,
- _("%s: could not create directory \"%s\": %s\n"),
- progname, filename, strerror(errno));
+ pg_log_error("could not create directory \"%s\": %m",
+ filename);
exit(1);
}
}
#ifndef WIN32
if (chmod(filename, (mode_t) filemode))
- fprintf(stderr,
- _("%s: could not set permissions on directory \"%s\": %s\n"),
- progname, filename, strerror(errno));
+ pg_log_error("could not set permissions on directory \"%s\": %m",
+ filename);
#endif
}
else if (copybuf[156] == '2')
@@ -1586,18 +1530,15 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
mapped_tblspc_path = get_tablespace_mapping(©buf[157]);
if (symlink(mapped_tblspc_path, filename) != 0)
{
- fprintf(stderr,
- _("%s: could not create symbolic link from \"%s\" to \"%s\": %s\n"),
- progname, filename, mapped_tblspc_path,
- strerror(errno));
+ pg_log_error("could not create symbolic link from \"%s\" to \"%s\": %m",
+ filename, mapped_tblspc_path);
exit(1);
}
}
else
{
- fprintf(stderr,
- _("%s: unrecognized link indicator \"%c\"\n"),
- progname, copybuf[156]);
+ pg_log_error("unrecognized link indicator \"%c\"",
+ copybuf[156]);
exit(1);
}
continue; /* directory or link handled */
@@ -1609,15 +1550,14 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
file = fopen(filename, "wb");
if (!file)
{
- fprintf(stderr, _("%s: could not create file \"%s\": %s\n"),
- progname, filename, strerror(errno));
+ pg_log_error("could not create file \"%s\": %m", filename);
exit(1);
}
#ifndef WIN32
if (chmod(filename, (mode_t) filemode))
- fprintf(stderr, _("%s: could not set permissions on file \"%s\": %s\n"),
- progname, filename, strerror(errno));
+ pg_log_error("could not set permissions on file \"%s\": %m",
+ filename);
#endif
if (current_len_left == 0)
@@ -1649,8 +1589,7 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
if (fwrite(copybuf, r, 1, file) != 1)
{
- fprintf(stderr, _("%s: could not write to file \"%s\": %s\n"),
- progname, filename, strerror(errno));
+ pg_log_error("could not write to file \"%s\": %m", filename);
exit(1);
}
totaldone += r;
@@ -1674,9 +1613,7 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
if (file != NULL)
{
- fprintf(stderr,
- _("%s: COPY stream ended before last file was finished\n"),
- progname);
+ pg_log_error("COPY stream ended before last file was finished");
exit(1);
}
@@ -1703,7 +1640,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;
@@ -1723,7 +1660,7 @@ GenerateRecoveryConf(PGconn *conn)
recoveryconfcontents = createPQExpBuffer();
if (!recoveryconfcontents)
{
- fprintf(stderr, _("%s: out of memory\n"), progname);
+ pg_log_error("out of memory");
exit(1);
}
@@ -1737,7 +1674,7 @@ GenerateRecoveryConf(PGconn *conn)
connOptions = PQconninfo(conn);
if (connOptions == NULL)
{
- fprintf(stderr, _("%s: out of memory\n"), progname);
+ pg_log_error("out of memory");
exit(1);
}
@@ -1788,7 +1725,7 @@ GenerateRecoveryConf(PGconn *conn)
if (PQExpBufferBroken(recoveryconfcontents) ||
PQExpBufferDataBroken(conninfo_buf))
{
- fprintf(stderr, _("%s: out of memory\n"), progname);
+ pg_log_error("out of memory");
exit(1);
}
@@ -1821,16 +1758,13 @@ WriteRecoveryConf(void)
cf = fopen(filename, is_recovery_guc_supported ? "a" : "w");
if (cf == NULL)
{
- fprintf(stderr, _("%s: could not open file \"%s\": %s\n"),
- progname, filename, strerror(errno));
+ pg_log_error("could not open file \"%s\": %m", filename);
exit(1);
}
if (fwrite(recoveryconfcontents->data, recoveryconfcontents->len, 1, cf) != 1)
{
- fprintf(stderr,
- _("%s: could not write to file \"%s\": %s\n"),
- progname, filename, strerror(errno));
+ pg_log_error("could not write to file \"%s\": %m", filename);
exit(1);
}
@@ -1842,7 +1776,7 @@ WriteRecoveryConf(void)
cf = fopen(filename, "w");
if (cf == NULL)
{
- fprintf(stderr, _("%s: could not create file \"%s\": %s\n"), progname, filename, strerror(errno));
+ pg_log_error("could not create file \"%s\": %m", filename);
exit(1);
}
@@ -1883,8 +1817,8 @@ BaseBackup(void)
{
const char *serverver = PQparameterStatus(conn, "server_version");
- fprintf(stderr, _("%s: incompatible server version %s\n"),
- progname, serverver ? serverver : "'unknown'");
+ pg_log_error("incompatible server version %s",
+ serverver ? serverver : "'unknown'");
exit(1);
}
@@ -1898,7 +1832,7 @@ BaseBackup(void)
* Error message already written in CheckServerVersionForStreaming(),
* but add a hint about using -X none.
*/
- fprintf(stderr, _("HINT: use -X none or -X fetch to disable log streaming\n"));
+ pg_log_info("HINT: use -X none or -X fetch to disable log streaming");
exit(1);
}
@@ -1923,9 +1857,7 @@ BaseBackup(void)
maxrate_clause = psprintf("MAX_RATE %u", maxrate);
if (verbose)
- fprintf(stderr,
- _("%s: initiating base backup, waiting for checkpoint to complete\n"),
- progname);
+ pg_log_info("initiating base backup, waiting for checkpoint to complete");
if (showprogress && !verbose)
{
@@ -1949,8 +1881,8 @@ BaseBackup(void)
if (PQsendQuery(conn, basebkp) == 0)
{
- fprintf(stderr, _("%s: could not send replication command \"%s\": %s"),
- progname, "BASE_BACKUP", PQerrorMessage(conn));
+ pg_log_error("could not send replication command \"%s\": %s",
+ "BASE_BACKUP", PQerrorMessage(conn));
exit(1);
}
@@ -1960,22 +1892,21 @@ BaseBackup(void)
res = PQgetResult(conn);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- fprintf(stderr, _("%s: could not initiate base backup: %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("could not initiate base backup: %s",
+ PQerrorMessage(conn));
exit(1);
}
if (PQntuples(res) != 1)
{
- fprintf(stderr,
- _("%s: server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields\n"),
- progname, PQntuples(res), PQnfields(res), 1, 2);
+ pg_log_error("server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields",
+ PQntuples(res), PQnfields(res), 1, 2);
exit(1);
}
strlcpy(xlogstart, PQgetvalue(res, 0, 0), sizeof(xlogstart));
if (verbose)
- fprintf(stderr, _("%s: checkpoint completed\n"), progname);
+ pg_log_info("checkpoint completed");
/*
* 9.3 and later sends the TLI of the starting point. With older servers,
@@ -1990,8 +1921,8 @@ BaseBackup(void)
MemSet(xlogend, 0, sizeof(xlogend));
if (verbose && includewal != NO_WAL)
- fprintf(stderr, _("%s: write-ahead log start point: %s on timeline %u\n"),
- progname, xlogstart, starttli);
+ pg_log_info("write-ahead log start point: %s on timeline %u",
+ xlogstart, starttli);
/*
* Get the header
@@ -1999,13 +1930,13 @@ BaseBackup(void)
res = PQgetResult(conn);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- fprintf(stderr, _("%s: could not get backup header: %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("could not get backup header: %s",
+ PQerrorMessage(conn));
exit(1);
}
if (PQntuples(res) < 1)
{
- fprintf(stderr, _("%s: no data returned from server\n"), progname);
+ pg_log_error("no data returned from server");
exit(1);
}
@@ -2036,9 +1967,8 @@ BaseBackup(void)
*/
if (format == 't' && strcmp(basedir, "-") == 0 && PQntuples(res) > 1)
{
- fprintf(stderr,
- _("%s: can only write single tablespace to stdout, database has %d\n"),
- progname, PQntuples(res));
+ pg_log_error("can only write single tablespace to stdout, database has %d",
+ PQntuples(res));
exit(1);
}
@@ -2049,8 +1979,7 @@ BaseBackup(void)
if (includewal == STREAM_WAL)
{
if (verbose)
- fprintf(stderr, _("%s: starting background WAL receiver\n"),
- progname);
+ pg_log_info("starting background WAL receiver");
StartLogStreamer(xlogstart, starttli, sysidentifier);
}
@@ -2080,21 +2009,18 @@ BaseBackup(void)
res = PQgetResult(conn);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
- fprintf(stderr,
- _("%s: could not get write-ahead log end position from server: %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("could not get write-ahead log end position from server: %s",
+ PQerrorMessage(conn));
exit(1);
}
if (PQntuples(res) != 1)
{
- fprintf(stderr,
- _("%s: no write-ahead log end position returned from server\n"),
- progname);
+ pg_log_error("no write-ahead log end position returned from server");
exit(1);
}
strlcpy(xlogend, PQgetvalue(res, 0, 0), sizeof(xlogend));
if (verbose && includewal != NO_WAL)
- fprintf(stderr, _("%s: write-ahead log end point: %s\n"), progname, xlogend);
+ pg_log_info("write-ahead log end point: %s", xlogend);
PQclear(res);
res = PQgetResult(conn);
@@ -2105,14 +2031,13 @@ BaseBackup(void)
if (sqlstate &&
strcmp(sqlstate, ERRCODE_DATA_CORRUPTED) == 0)
{
- fprintf(stderr, _("%s: checksum error occurred\n"),
- progname);
+ pg_log_error("checksum error occurred");
checksum_failure = true;
}
else
{
- fprintf(stderr, _("%s: final receive failed: %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("final receive failed: %s",
+ PQerrorMessage(conn));
}
exit(1);
}
@@ -2135,15 +2060,12 @@ BaseBackup(void)
#endif
if (verbose)
- fprintf(stderr,
- _("%s: waiting for background process to finish streaming ...\n"), progname);
+ pg_log_info("waiting for background process to finish streaming ...");
#ifndef WIN32
if (write(bgpipe[1], xlogend, strlen(xlogend)) != strlen(xlogend))
{
- fprintf(stderr,
- _("%s: could not send command to background pipe: %s\n"),
- progname, strerror(errno));
+ pg_log_info("could not send command to background pipe: %m");
exit(1);
}
@@ -2151,20 +2073,17 @@ BaseBackup(void)
r = waitpid(bgchild, &status, 0);
if (r == (pid_t) -1)
{
- fprintf(stderr, _("%s: could not wait for child process: %s\n"),
- progname, strerror(errno));
+ pg_log_error("could not wait for child process: %m");
exit(1);
}
if (r != bgchild)
{
- fprintf(stderr, _("%s: child %d died, expected %d\n"),
- progname, (int) r, (int) bgchild);
+ pg_log_error("child %d died, expected %d", (int) r, (int) bgchild);
exit(1);
}
if (status != 0)
{
- fprintf(stderr, "%s: %s\n",
- progname, wait_result_to_str(status));
+ pg_log_error("%s", wait_result_to_str(status));
exit(1);
}
/* Exited normally, we're happy! */
@@ -2177,9 +2096,8 @@ BaseBackup(void)
*/
if (sscanf(xlogend, "%X/%X", &hi, &lo) != 2)
{
- fprintf(stderr,
- _("%s: could not parse write-ahead log location \"%s\"\n"),
- progname, xlogend);
+ pg_log_error("could not parse write-ahead log location \"%s\"",
+ xlogend);
exit(1);
}
xlogendptr = ((uint64) hi) << 32 | lo;
@@ -2190,21 +2108,19 @@ BaseBackup(void)
WAIT_OBJECT_0)
{
_dosmaperr(GetLastError());
- fprintf(stderr, _("%s: could not wait for child thread: %s\n"),
- progname, strerror(errno));
+ pg_log_error("could not wait for child thread: %m");
exit(1);
}
if (GetExitCodeThread((HANDLE) bgchild_handle, &status) == 0)
{
_dosmaperr(GetLastError());
- fprintf(stderr, _("%s: could not get child thread exit status: %s\n"),
- progname, strerror(errno));
+ pg_log_error("could not get child thread exit status: %m");
exit(1);
}
if (status != 0)
{
- fprintf(stderr, _("%s: child thread exited with error %u\n"),
- progname, (unsigned int) status);
+ pg_log_error("child thread exited with error %u",
+ (unsigned int) status);
exit(1);
}
/* Exited normally, we're happy */
@@ -2231,21 +2147,20 @@ BaseBackup(void)
if (do_sync)
{
if (verbose)
- fprintf(stderr,
- _("%s: syncing data to disk ...\n"), progname);
+ pg_log_info("syncing data to disk ...");
if (format == 't')
{
if (strcmp(basedir, "-") != 0)
- (void) fsync_fname(basedir, true, progname);
+ (void) fsync_fname(basedir, true);
}
else
{
- (void) fsync_pgdata(basedir, progname, serverVersion);
+ (void) fsync_pgdata(basedir, serverVersion);
}
}
if (verbose)
- fprintf(stderr, _("%s: base backup completed\n"), progname);
+ pg_log_info("base backup completed");
}
@@ -2287,6 +2202,7 @@ main(int argc, char **argv)
int option_index;
+ pg_logging_init(argv[0]);
progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_basebackup"));
@@ -2325,9 +2241,8 @@ main(int argc, char **argv)
format = 't';
else
{
- fprintf(stderr,
- _("%s: invalid output format \"%s\", must be \"plain\" or \"tar\"\n"),
- progname, optarg);
+ pg_log_error("invalid output format \"%s\", must be \"plain\" or \"tar\"\n",
+ optarg);
exit(1);
}
break;
@@ -2370,9 +2285,8 @@ main(int argc, char **argv)
}
else
{
- fprintf(stderr,
- _("%s: invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"\n"),
- progname, optarg);
+ pg_log_error("invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"",
+ optarg);
exit(1);
}
break;
@@ -2399,8 +2313,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\"\n", optarg);
exit(1);
}
break;
@@ -2411,8 +2324,8 @@ main(int argc, char **argv)
fastcheckpoint = false;
else
{
- fprintf(stderr, _("%s: invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"\n"),
- progname, optarg);
+ pg_log_error("invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"",
+ optarg);
exit(1);
}
break;
@@ -2438,8 +2351,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;
@@ -2468,9 +2380,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);
@@ -2481,7 +2392,7 @@ main(int argc, char **argv)
*/
if (basedir == NULL)
{
- 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);
@@ -2492,9 +2403,7 @@ main(int argc, char **argv)
*/
if (format == 'p' && compresslevel != 0)
{
- fprintf(stderr,
- _("%s: only tar mode backups can be compressed\n"),
- progname);
+ pg_log_error("only tar mode backups can be compressed");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@@ -2502,9 +2411,7 @@ main(int argc, char **argv)
if (format == 't' && includewal == STREAM_WAL && strcmp(basedir, "-") == 0)
{
- fprintf(stderr,
- _("%s: cannot stream write-ahead logs in tar mode to stdout\n"),
- progname);
+ pg_log_error("cannot stream write-ahead logs in tar mode to stdout");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@@ -2512,9 +2419,7 @@ main(int argc, char **argv)
if (replication_slot && includewal != STREAM_WAL)
{
- fprintf(stderr,
- _("%s: replication slots can only be used with WAL streaming\n"),
- progname);
+ pg_log_error("replication slots can only be used with WAL streaming");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@@ -2524,9 +2429,7 @@ main(int argc, char **argv)
{
if (replication_slot)
{
- fprintf(stderr,
- _("%s: --no-slot cannot be used with slot name\n"),
- progname);
+ pg_log_error("--no-slot cannot be used with slot name");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@@ -2538,9 +2441,8 @@ main(int argc, char **argv)
{
if (!replication_slot)
{
- fprintf(stderr,
- _("%s: %s needs a slot to be specified using --slot\n"),
- progname, "--create-slot");
+ pg_log_error("%s needs a slot to be specified using --slot",
+ "--create-slot");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@@ -2548,9 +2450,7 @@ main(int argc, char **argv)
if (no_slot)
{
- fprintf(stderr,
- _("%s: --create-slot and --no-slot are incompatible options\n"),
- progname);
+ pg_log_error("--create-slot and --no-slot are incompatible options");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@@ -2561,9 +2461,7 @@ main(int argc, char **argv)
{
if (format != 'p')
{
- fprintf(stderr,
- _("%s: WAL directory location can only be specified in plain mode\n"),
- progname);
+ pg_log_error("WAL directory location can only be specified in plain mode");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@@ -2573,8 +2471,7 @@ main(int argc, char **argv)
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");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@@ -2584,9 +2481,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
@@ -2640,12 +2535,11 @@ main(int argc, char **argv)
#ifdef HAVE_SYMLINK
if (symlink(xlog_dir, linkloc) != 0)
{
- fprintf(stderr, _("%s: could not create symbolic link \"%s\": %s\n"),
- progname, linkloc, strerror(errno));
+ pg_log_error("could not create symbolic link \"%s\": %m", linkloc);
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
free(linkloc);
diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c
index aa114f1563d..9e4d296129c 100644
--- a/src/bin/pg_basebackup/pg_receivewal.c
+++ b/src/bin/pg_basebackup/pg_receivewal.c
@@ -20,6 +20,7 @@
#include
#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);
}
}
diff --git a/src/bin/pg_basebackup/pg_recvlogical.c b/src/bin/pg_basebackup/pg_recvlogical.c
index 10429a529d9..3c95f231a2a 100644
--- a/src/bin/pg_basebackup/pg_recvlogical.c
+++ b/src/bin/pg_basebackup/pg_recvlogical.c
@@ -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);
}
diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c
index 692d13716e4..0ff9aa19a9e 100644
--- a/src/bin/pg_basebackup/receivelog.c
+++ b/src/bin/pg_basebackup/receivelog.c
@@ -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(©buf[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;
diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c
index 7e86830ad88..ab2e55d6950 100644
--- a/src/bin/pg_basebackup/streamutil.c
+++ b/src/bin/pg_basebackup/streamutil.c
@@ -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);
diff --git a/src/bin/pg_basebackup/walmethods.c b/src/bin/pg_basebackup/walmethods.c
index 165b3a1e896..83b520898be 100644
--- a/src/bin/pg_basebackup/walmethods.c
+++ b/src/bin/pg_basebackup/walmethods.c
@@ -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;
}
diff --git a/src/bin/pg_checksums/Makefile b/src/bin/pg_checksums/Makefile
index 278b7a0f2ec..13a25f5e334 100644
--- a/src/bin/pg_checksums/Makefile
+++ b/src/bin/pg_checksums/Makefile
@@ -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
diff --git a/src/bin/pg_checksums/nls.mk b/src/bin/pg_checksums/nls.mk
index 2748b18ef72..372e8894729 100644
--- a/src/bin/pg_checksums/nls.mk
+++ b/src/bin/pg_checksums/nls.mk
@@ -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)
diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c
index 5c185ebed84..c7d26397f1d 100644
--- a/src/bin/pg_checksums/pg_checksums.c
+++ b/src/bin/pg_checksums/pg_checksums.c
@@ -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);
diff --git a/src/bin/pg_controldata/Makefile b/src/bin/pg_controldata/Makefile
index 2d5c5621318..4d9c1370fe7 100644
--- a/src/bin/pg_controldata/Makefile
+++ b/src/bin/pg_controldata/Makefile
@@ -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
diff --git a/src/bin/pg_controldata/pg_controldata.c b/src/bin/pg_controldata/pg_controldata.c
index 9a17d0f9c0f..a674f52f0b8 100644
--- a/src/bin/pg_controldata/pg_controldata.c
+++ b/src/bin/pg_controldata/pg_controldata.c
@@ -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"
diff --git a/src/bin/pg_ctl/Makefile b/src/bin/pg_ctl/Makefile
index 83cbf97ed88..b931b14a3f5 100644
--- a/src/bin/pg_ctl/Makefile
+++ b/src/bin/pg_ctl/Makefile
@@ -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
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index c82a702ffa6..febb076ee6f 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -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);
diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c
index 249706fe57c..5958f42a847 100644
--- a/src/bin/pg_dump/common.c
+++ b/src/bin/pg_dump/common.c
@@ -22,6 +22,7 @@
#include
#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;
diff --git a/src/bin/pg_dump/compress_io.c b/src/bin/pg_dump/compress_io.c
index d904ec62ad1..a0d7644a8ad 100644
--- a/src/bin/pg_dump/compress_io.c
+++ b/src/bin/pg_dump/compress_io.c
@@ -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
diff --git a/src/bin/pg_dump/nls.mk b/src/bin/pg_dump/nls.mk
index 37234717cb6..8a53ad08ddb 100644
--- a/src/bin/pg_dump/nls.mk
+++ b/src/bin/pg_dump/nls.mk
@@ -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
diff --git a/src/bin/pg_dump/parallel.c b/src/bin/pg_dump/parallel.c
index 41aa78a9533..3dfdae3a579 100644
--- a/src/bin/pg_dump/parallel.c
+++ b/src/bin/pg_dump/parallel.c
@@ -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;
diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index 6131cdda96c..1a75cd00cd9 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -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)
diff --git a/src/bin/pg_dump/pg_backup_archiver.h b/src/bin/pg_dump/pg_backup_archiver.h
index 2015b735ae3..fe72d5b13bc 100644
--- a/src/bin/pg_dump/pg_backup_archiver.h
+++ b/src/bin/pg_dump/pg_backup_archiver.h
@@ -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
diff --git a/src/bin/pg_dump/pg_backup_custom.c b/src/bin/pg_dump/pg_backup_custom.c
index 96f44e88b11..5641d5d20fc 100644
--- a/src/bin/pg_dump/pg_backup_custom.c
+++ b/src/bin/pg_dump/pg_backup_custom.c
@@ -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
diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c
index 5e32ee8a5b0..1d636dac19d 100644
--- a/src/bin/pg_dump/pg_backup_db.c
+++ b/src/bin/pg_dump/pg_backup_db.c
@@ -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;
diff --git a/src/bin/pg_dump/pg_backup_directory.c b/src/bin/pg_dump/pg_backup_directory.c
index e6261252c7f..70eca82c914 100644
--- a/src/bin/pg_dump/pg_backup_directory.c
+++ b/src/bin/pg_dump/pg_backup_directory.c
@@ -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, "/");
diff --git a/src/bin/pg_dump/pg_backup_null.c b/src/bin/pg_dump/pg_backup_null.c
index 62f6e624f0b..f33f7ba421b 100644
--- a/src/bin/pg_dump/pg_backup_null.c
+++ b/src/bin/pg_dump/pg_backup_null.c
@@ -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)
diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c
index 407a56d8d4f..b52593c3c0c 100644
--- a/src/bin/pg_dump/pg_backup_tar.c
+++ b/src/bin/pg_dump/pg_backup_tar.c
@@ -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);
}
diff --git a/src/bin/pg_dump/pg_backup_utils.c b/src/bin/pg_dump/pg_backup_utils.c
index 1bdce68ff9b..6f87c6d6847 100644
--- a/src/bin/pg_dump/pg_backup_utils.c
+++ b/src/bin/pg_dump/pg_backup_utils.c
@@ -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++;
diff --git a/src/bin/pg_dump/pg_backup_utils.h b/src/bin/pg_dump/pg_backup_utils.h
index 7dbf3c9febd..c47c19af6c1 100644
--- a/src/bin/pg_dump/pg_backup_utils.h
+++ b/src/bin/pg_dump/pg_backup_utils.h
@@ -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 */
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 2a9e8538c62..452f30760bb 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -63,6 +63,7 @@
#include "pg_backup_utils.h"
#include "pg_dump.h"
#include "fe_utils/connect.h"
+#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h"
@@ -92,8 +93,6 @@ typedef enum OidOptions
} OidOptions;
/* global decls */
-bool g_verbose; /* User wants verbose narration of our
- * activities. */
static bool dosync = true; /* Issue fsync() to make dump durable on disk. */
/* subquery used to convert user ID (eg, datdba) to user name */
@@ -316,6 +315,7 @@ main(int argc, char **argv)
char *endptr;
RestoreOptions *ropt;
Archive *fout; /* the script file */
+ bool g_verbose = false;
const char *dumpencoding = NULL;
const char *dumpsnapshot = NULL;
char *use_role = NULL;
@@ -396,6 +396,8 @@ main(int argc, char **argv)
{NULL, 0, NULL, 0}
};
+ pg_logging_init(argv[0]);
+ pg_logging_set_level(PG_LOG_WARNING);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_dump"));
/*
@@ -404,8 +406,6 @@ main(int argc, char **argv)
*/
init_parallel_dump_utils();
- g_verbose = false;
-
strcpy(g_comment_start, "-- ");
g_comment_end[0] = '\0';
strcpy(g_opaque_type, "opaque");
@@ -521,6 +521,7 @@ main(int argc, char **argv)
case 'v': /* verbose */
g_verbose = true;
+ pg_logging_set_level(PG_LOG_INFO);
break;
case 'w':
@@ -539,7 +540,7 @@ main(int argc, char **argv)
compressLevel = atoi(optarg);
if (compressLevel < 0 || compressLevel > 9)
{
- write_msg(NULL, "compression level must be in range 0..9\n");
+ pg_log_error("compression level must be in range 0..9");
exit_nicely(1);
}
break;
@@ -577,7 +578,7 @@ main(int argc, char **argv)
extra_float_digits = atoi(optarg);
if (extra_float_digits < -15 || extra_float_digits > 3)
{
- write_msg(NULL, "extra_float_digits must be in range -15..3\n");
+ pg_log_error("extra_float_digits must be in range -15..3");
exit_nicely(1);
}
break;
@@ -600,7 +601,7 @@ main(int argc, char **argv)
rowsPerInsert <= 0 || rowsPerInsert > INT_MAX ||
errno == ERANGE)
{
- write_msg(NULL, "rows-per-insert must be in range %d..%d\n",
+ pg_log_error("rows-per-insert must be in range %d..%d",
1, INT_MAX);
exit_nicely(1);
}
@@ -623,8 +624,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);
@@ -644,25 +645,25 @@ main(int argc, char **argv)
if (dopt.dataOnly && dopt.schemaOnly)
{
- write_msg(NULL, "options -s/--schema-only and -a/--data-only cannot be used together\n");
+ pg_log_error("options -s/--schema-only and -a/--data-only cannot be used together");
exit_nicely(1);
}
if (dopt.dataOnly && dopt.outputClean)
{
- write_msg(NULL, "options -c/--clean and -a/--data-only cannot be used together\n");
+ pg_log_error("options -c/--clean and -a/--data-only cannot be used together");
exit_nicely(1);
}
if (dopt.if_exists && !dopt.outputClean)
- exit_horribly(NULL, "option --if-exists requires option -c/--clean\n");
+ fatal("option --if-exists requires option -c/--clean");
/*
* --inserts are already implied above if --column-inserts or
* --rows-per-insert were specified.
*/
if (dopt.do_nothing && dopt.dump_inserts == 0)
- exit_horribly(NULL, "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert or --column-inserts\n");
+ fatal("option --on-conflict-do-nothing requires option --inserts, --rows-per-insert or --column-inserts");
/* Identify archive format to emit */
archiveFormat = parseArchiveFormat(format, &archiveMode);
@@ -684,8 +685,7 @@ main(int argc, char **argv)
#ifndef HAVE_LIBZ
if (compressLevel != 0)
- write_msg(NULL, "WARNING: requested compression not available in this "
- "installation -- archive will be uncompressed\n");
+ pg_log_warning("requested compression not available in this installation -- archive will be uncompressed");
compressLevel = 0;
#endif
@@ -706,11 +706,11 @@ main(int argc, char **argv)
|| numWorkers > MAXIMUM_WAIT_OBJECTS
#endif
)
- exit_horribly(NULL, "invalid number of parallel jobs\n");
+ fatal("invalid number of parallel jobs");
/* Parallel backup only in the directory archive format so far */
if (archiveFormat != archDirectory && numWorkers > 1)
- exit_horribly(NULL, "parallel backup only supported by the directory format\n");
+ fatal("parallel backup only supported by the directory format");
/* Open the output file */
fout = CreateArchive(filename, archiveFormat, compressLevel, dosync,
@@ -725,6 +725,7 @@ main(int argc, char **argv)
/* Let the archiver know how noisy to be */
fout->verbose = g_verbose;
+
/*
* We allow the server to be back to 8.0, and up to any minor release of
* our own major version. (See also version check in pg_dumpall.c.)
@@ -764,15 +765,13 @@ main(int argc, char **argv)
/* check the version for the synchronized snapshots feature */
if (numWorkers > 1 && fout->remoteVersion < 90200
&& !dopt.no_synchronized_snapshots)
- exit_horribly(NULL,
- "Synchronized snapshots are not supported by this server version.\n"
- "Run with --no-synchronized-snapshots instead if you do not need\n"
- "synchronized snapshots.\n");
+ fatal("Synchronized snapshots are not supported by this server version.\n"
+ "Run with --no-synchronized-snapshots instead if you do not need\n"
+ "synchronized snapshots.");
/* check the version when a snapshot is explicitly specified by user */
if (dumpsnapshot && fout->remoteVersion < 90200)
- exit_horribly(NULL,
- "Exported snapshots are not supported by this server version.\n");
+ fatal("Exported snapshots are not supported by this server version.");
/*
* Find the last built-in OID, if needed (prior to 8.1)
@@ -784,8 +783,7 @@ main(int argc, char **argv)
else
g_last_builtin_oid = FirstNormalObjectId - 1;
- if (g_verbose)
- write_msg(NULL, "last built-in OID is %u\n", g_last_builtin_oid);
+ pg_log_info("last built-in OID is %u", g_last_builtin_oid);
/* Expand schema selection patterns into OID lists */
if (schema_include_patterns.head != NULL)
@@ -794,7 +792,7 @@ main(int argc, char **argv)
&schema_include_oids,
strict_names);
if (schema_include_oids.head == NULL)
- exit_horribly(NULL, "no matching schemas were found\n");
+ fatal("no matching schemas were found");
}
expand_schema_name_patterns(fout, &schema_exclude_patterns,
&schema_exclude_oids,
@@ -808,7 +806,7 @@ main(int argc, char **argv)
&table_include_oids,
strict_names);
if (table_include_oids.head == NULL)
- exit_horribly(NULL, "no matching tables were found\n");
+ fatal("no matching tables were found");
}
expand_table_name_patterns(fout, &table_exclude_patterns,
&table_exclude_oids,
@@ -1072,8 +1070,8 @@ setup_connection(Archive *AH, const char *dumpencoding,
if (dumpencoding)
{
if (PQsetClientEncoding(conn, dumpencoding) < 0)
- exit_horribly(NULL, "invalid client encoding \"%s\" specified\n",
- dumpencoding);
+ fatal("invalid client encoding \"%s\" specified",
+ dumpencoding);
}
/*
@@ -1217,10 +1215,9 @@ setup_connection(Archive *AH, const char *dumpencoding,
!dopt->no_synchronized_snapshots)
{
if (AH->isStandby && AH->remoteVersion < 100000)
- exit_horribly(NULL,
- "Synchronized snapshots on standby servers are not supported by this server version.\n"
- "Run with --no-synchronized-snapshots instead if you do not need\n"
- "synchronized snapshots.\n");
+ fatal("Synchronized snapshots on standby servers are not supported by this server version.\n"
+ "Run with --no-synchronized-snapshots instead if you do not need\n"
+ "synchronized snapshots.");
AH->sync_snapshot_id = get_synchronized_snapshot(AH);
@@ -1287,7 +1284,7 @@ parseArchiveFormat(const char *format, ArchiveMode *mode)
else if (pg_strcasecmp(format, "tar") == 0)
archiveFormat = archTar;
else
- exit_horribly(NULL, "invalid output format \"%s\" specified\n", format);
+ fatal("invalid output format \"%s\" specified", format);
return archiveFormat;
}
@@ -1325,7 +1322,7 @@ expand_schema_name_patterns(Archive *fout,
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
if (strict_names && PQntuples(res) == 0)
- exit_horribly(NULL, "no matching schemas were found for pattern \"%s\"\n", cell->val);
+ fatal("no matching schemas were found for pattern \"%s\"", cell->val);
for (i = 0; i < PQntuples(res); i++)
{
@@ -1390,7 +1387,7 @@ expand_table_name_patterns(Archive *fout,
PQclear(ExecuteSqlQueryForSingleRow(fout,
ALWAYS_SECURE_SEARCH_PATH_SQL));
if (strict_names && PQntuples(res) == 0)
- exit_horribly(NULL, "no matching tables were found for pattern \"%s\"\n", cell->val);
+ fatal("no matching tables were found for pattern \"%s\"", cell->val);
for (i = 0; i < PQntuples(res); i++)
{
@@ -1804,9 +1801,8 @@ dumpTableData_copy(Archive *fout, void *dcontext)
char *copybuf;
const char *column_list;
- if (g_verbose)
- write_msg(NULL, "dumping contents of table \"%s.%s\"\n",
- tbinfo->dobj.namespace->dobj.name, classname);
+ pg_log_info("dumping contents of table \"%s.%s\"",
+ tbinfo->dobj.namespace->dobj.name, classname);
/*
* Specify the column list explicitly so that we have no possibility of
@@ -1906,9 +1902,9 @@ dumpTableData_copy(Archive *fout, void *dcontext)
if (ret == -2)
{
/* copy data transfer failed */
- write_msg(NULL, "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed.\n", classname);
- write_msg(NULL, "Error message from server: %s", PQerrorMessage(conn));
- write_msg(NULL, "The command was: %s\n", q->data);
+ pg_log_error("Dumping the contents of table \"%s\" failed: PQgetCopyData() failed.", classname);
+ pg_log_error("Error message from server: %s", PQerrorMessage(conn));
+ pg_log_error("The command was: %s", q->data);
exit_nicely(1);
}
@@ -1916,16 +1912,16 @@ dumpTableData_copy(Archive *fout, void *dcontext)
res = PQgetResult(conn);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
- write_msg(NULL, "Dumping the contents of table \"%s\" failed: PQgetResult() failed.\n", classname);
- write_msg(NULL, "Error message from server: %s", PQerrorMessage(conn));
- write_msg(NULL, "The command was: %s\n", q->data);
+ pg_log_error("Dumping the contents of table \"%s\" failed: PQgetResult() failed.", classname);
+ pg_log_error("Error message from server: %s", PQerrorMessage(conn));
+ pg_log_error("The command was: %s", q->data);
exit_nicely(1);
}
PQclear(res);
/* Do this to ensure we've pumped libpq back to idle state */
if (PQgetResult(conn) != 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\"",
classname);
destroyPQExpBuffer(q);
@@ -2670,8 +2666,7 @@ dumpDatabase(Archive *fout)
minmxid;
char *qdatname;
- if (g_verbose)
- write_msg(NULL, "saving database definition\n");
+ pg_log_info("saving database definition");
/* Fetch the database-level properties for this database */
if (fout->remoteVersion >= 90600)
@@ -3118,8 +3113,7 @@ dumpEncoding(Archive *AH)
const char *encname = pg_encoding_to_char(AH->encoding);
PQExpBuffer qry = createPQExpBuffer();
- if (g_verbose)
- write_msg(NULL, "saving encoding = %s\n", encname);
+ pg_log_info("saving encoding = %s", encname);
appendPQExpBufferStr(qry, "SET client_encoding = ");
appendStringLiteralAH(qry, encname, AH);
@@ -3146,9 +3140,8 @@ dumpStdStrings(Archive *AH)
const char *stdstrings = AH->std_strings ? "on" : "off";
PQExpBuffer qry = createPQExpBuffer();
- if (g_verbose)
- write_msg(NULL, "saving standard_conforming_strings = %s\n",
- stdstrings);
+ pg_log_info("saving standard_conforming_strings = %s",
+ stdstrings);
appendPQExpBuffer(qry, "SET standard_conforming_strings = '%s';\n",
stdstrings);
@@ -3188,7 +3181,7 @@ dumpSearchPath(Archive *AH)
"SELECT pg_catalog.current_schemas(false)");
if (!parsePGArray(PQgetvalue(res, 0, 0), &schemanames, &nschemanames))
- exit_horribly(NULL, "could not parse result of current_schemas()\n");
+ fatal("could not parse result of current_schemas()");
/*
* We use set_config(), not a simple "SET search_path" command, because
@@ -3207,8 +3200,7 @@ dumpSearchPath(Archive *AH)
appendStringLiteralAH(qry, path->data, AH);
appendPQExpBufferStr(qry, ", false);\n");
- if (g_verbose)
- write_msg(NULL, "saving search_path = %s\n", path->data);
+ pg_log_info("saving search_path = %s", path->data);
ArchiveEntry(AH, nilCatalogId, createDumpId(),
ARCHIVE_OPTS(.tag = "SEARCHPATH",
@@ -3250,9 +3242,7 @@ getBlobs(Archive *fout)
int i_initlomacl;
int i_initrlomacl;
- /* Verbose message */
- if (g_verbose)
- write_msg(NULL, "reading large objects\n");
+ pg_log_info("reading large objects");
/* Fetch BLOB OIDs, and owner/ACL data if >= 9.0 */
if (fout->remoteVersion >= 90600)
@@ -3434,8 +3424,7 @@ dumpBlobs(Archive *fout, void *arg)
int i;
int cnt;
- if (g_verbose)
- write_msg(NULL, "saving large objects\n");
+ pg_log_info("saving large objects");
/*
* Currently, we re-fetch all BLOB OIDs using a cursor. Consider scanning
@@ -3471,7 +3460,7 @@ dumpBlobs(Archive *fout, void *arg)
/* Open the BLOB */
loFd = lo_open(conn, blobOid, INV_READ);
if (loFd == -1)
- exit_horribly(NULL, "could not open large object %u: %s",
+ fatal("could not open large object %u: %s",
blobOid, PQerrorMessage(conn));
StartBlob(fout, blobOid);
@@ -3481,7 +3470,7 @@ dumpBlobs(Archive *fout, void *arg)
{
cnt = lo_read(conn, loFd, buf, LOBBUFSIZE);
if (cnt < 0)
- exit_horribly(NULL, "error reading large object %u: %s",
+ fatal("error reading large object %u: %s",
blobOid, PQerrorMessage(conn));
WriteData(fout, buf, cnt);
@@ -3533,10 +3522,9 @@ getPolicies(Archive *fout, TableInfo tblinfo[], int numTables)
if (!(tbinfo->dobj.dump & DUMP_COMPONENT_POLICY))
continue;
- if (g_verbose)
- write_msg(NULL, "reading row security enabled for table \"%s.%s\"\n",
- tbinfo->dobj.namespace->dobj.name,
- tbinfo->dobj.name);
+ pg_log_info("reading row security enabled for table \"%s.%s\"",
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->dobj.name);
/*
* Get row security enabled information for the table. We represent
@@ -3565,10 +3553,9 @@ getPolicies(Archive *fout, TableInfo tblinfo[], int numTables)
polinfo->polwithcheck = NULL;
}
- if (g_verbose)
- write_msg(NULL, "reading policies for table \"%s.%s\"\n",
- tbinfo->dobj.namespace->dobj.name,
- tbinfo->dobj.name);
+ pg_log_info("reading policies for table \"%s.%s\"",
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->dobj.name);
resetPQExpBuffer(query);
@@ -3717,7 +3704,7 @@ dumpPolicy(Archive *fout, PolicyInfo *polinfo)
cmd = " FOR DELETE";
else
{
- write_msg(NULL, "unexpected policy command type: %c\n",
+ pg_log_error("unexpected policy command type: %c",
polinfo->polcmd);
exit_nicely(1);
}
@@ -3844,7 +3831,7 @@ getPublications(Archive *fout)
(strcmp(PQgetvalue(res, i, i_pubtruncate), "t") == 0);
if (strlen(pubinfo[i].rolname) == 0)
- write_msg(NULL, "WARNING: owner of publication \"%s\" appears to be invalid\n",
+ pg_log_warning("owner of publication \"%s\" appears to be invalid",
pubinfo[i].dobj.name);
/* Decide whether we want to dump it */
@@ -3981,10 +3968,9 @@ getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables)
if (!(tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION))
continue;
- if (g_verbose)
- write_msg(NULL, "reading publication membership for table \"%s.%s\"\n",
- tbinfo->dobj.namespace->dobj.name,
- tbinfo->dobj.name);
+ pg_log_info("reading publication membership for table \"%s.%s\"",
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->dobj.name);
resetPQExpBuffer(query);
@@ -4127,7 +4113,7 @@ getSubscriptions(Archive *fout)
PGRES_TUPLES_OK);
n = atoi(PQgetvalue(res, 0, 0));
if (n > 0)
- write_msg(NULL, "WARNING: subscriptions not dumped because current user is not a superuser\n");
+ pg_log_warning("subscriptions not dumped because current user is not a superuser");
PQclear(res);
return;
}
@@ -4181,7 +4167,7 @@ getSubscriptions(Archive *fout)
pg_strdup(PQgetvalue(res, i, i_subpublications));
if (strlen(subinfo[i].rolname) == 0)
- write_msg(NULL, "WARNING: owner of subscription \"%s\" appears to be invalid\n",
+ pg_log_warning("owner of subscription \"%s\" appears to be invalid",
subinfo[i].dobj.name);
/* Decide whether we want to dump it */
@@ -4225,8 +4211,7 @@ dumpSubscription(Archive *fout, SubscriptionInfo *subinfo)
/* Build list of quoted publications and append them to query. */
if (!parsePGArray(subinfo->subpublications, &pubnames, &npubnames))
{
- write_msg(NULL,
- "WARNING: could not parse subpublications array\n");
+ pg_log_warning("could not parse subpublications array");
if (pubnames)
free(pubnames);
pubnames = NULL;
@@ -4498,7 +4483,7 @@ binary_upgrade_extension_member(PQExpBuffer upgrade_buffer,
extobj = NULL;
}
if (extobj == NULL)
- exit_horribly(NULL, "could not find parent extension for %s %s\n",
+ fatal("could not find parent extension for %s %s",
objtype, objname);
appendPQExpBufferStr(upgrade_buffer,
@@ -4630,7 +4615,7 @@ getNamespaces(Archive *fout, int *numNamespaces)
nsinfo[i].dobj.dump &= ~DUMP_COMPONENT_ACL;
if (strlen(nsinfo[i].rolname) == 0)
- write_msg(NULL, "WARNING: owner of schema \"%s\" appears to be invalid\n",
+ pg_log_warning("owner of schema \"%s\" appears to be invalid",
nsinfo[i].dobj.name);
}
@@ -4653,7 +4638,7 @@ findNamespace(Archive *fout, Oid nsoid)
nsinfo = findNamespaceByOid(nsoid);
if (nsinfo == NULL)
- exit_horribly(NULL, "schema with OID %u does not exist\n", nsoid);
+ fatal("schema with OID %u does not exist", nsoid);
return nsinfo;
}
@@ -4978,7 +4963,7 @@ getTypes(Archive *fout, int *numTypes)
}
if (strlen(tyinfo[i].rolname) == 0)
- write_msg(NULL, "WARNING: owner of data type \"%s\" appears to be invalid\n",
+ pg_log_warning("owner of data type \"%s\" appears to be invalid",
tyinfo[i].dobj.name);
}
@@ -5063,7 +5048,7 @@ getOperators(Archive *fout, int *numOprs)
oprinfo[i].dobj.dump &= ~DUMP_COMPONENT_ACL;
if (strlen(oprinfo[i].rolname) == 0)
- write_msg(NULL, "WARNING: owner of operator \"%s\" appears to be invalid\n",
+ pg_log_warning("owner of operator \"%s\" appears to be invalid",
oprinfo[i].dobj.name);
}
@@ -5365,7 +5350,7 @@ getOpclasses(Archive *fout, int *numOpclasses)
opcinfo[i].dobj.dump &= ~DUMP_COMPONENT_ACL;
if (strlen(opcinfo[i].rolname) == 0)
- write_msg(NULL, "WARNING: owner of operator class \"%s\" appears to be invalid\n",
+ pg_log_warning("owner of operator class \"%s\" appears to be invalid",
opcinfo[i].dobj.name);
}
@@ -5449,7 +5434,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies)
opfinfo[i].dobj.dump &= ~DUMP_COMPONENT_ACL;
if (strlen(opfinfo[i].rolname) == 0)
- write_msg(NULL, "WARNING: owner of operator family \"%s\" appears to be invalid\n",
+ pg_log_warning("owner of operator family \"%s\" appears to be invalid",
opfinfo[i].dobj.name);
}
@@ -5618,7 +5603,7 @@ getAggregates(Archive *fout, int *numAggs)
atooid(PQgetvalue(res, i, i_aggnamespace)));
agginfo[i].aggfn.rolname = pg_strdup(PQgetvalue(res, i, i_rolname));
if (strlen(agginfo[i].aggfn.rolname) == 0)
- write_msg(NULL, "WARNING: owner of aggregate function \"%s\" appears to be invalid\n",
+ pg_log_warning("owner of aggregate function \"%s\" appears to be invalid",
agginfo[i].aggfn.dobj.name);
agginfo[i].aggfn.lang = InvalidOid; /* not currently interesting */
agginfo[i].aggfn.prorettype = InvalidOid; /* not saved */
@@ -5878,8 +5863,7 @@ getFuncs(Archive *fout, int *numFuncs)
finfo[i].dobj.dump &= ~DUMP_COMPONENT_ACL;
if (strlen(finfo[i].rolname) == 0)
- write_msg(NULL,
- "WARNING: owner of function \"%s\" appears to be invalid\n",
+ pg_log_warning("owner of function \"%s\" appears to be invalid",
finfo[i].dobj.name);
}
@@ -6675,7 +6659,7 @@ getTables(Archive *fout, int *numTables)
/* Emit notice if join for owner failed */
if (strlen(tblinfo[i].rolname) == 0)
- write_msg(NULL, "WARNING: owner of table \"%s\" appears to be invalid\n",
+ pg_log_warning("owner of table \"%s\" appears to be invalid",
tblinfo[i].dobj.name);
}
@@ -6717,7 +6701,7 @@ getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables)
owning_tab = findTableByOid(seqinfo->owning_tab);
if (owning_tab == NULL)
- exit_horribly(NULL, "failed sanity check, parent table with OID %u of sequence with OID %u not found\n",
+ fatal("failed sanity check, parent table with OID %u of sequence with OID %u not found",
seqinfo->owning_tab, seqinfo->dobj.catId.oid);
/*
@@ -6861,10 +6845,9 @@ getIndexes(Archive *fout, TableInfo tblinfo[], int numTables)
!tbinfo->interesting)
continue;
- if (g_verbose)
- write_msg(NULL, "reading indexes for table \"%s.%s\"\n",
- tbinfo->dobj.namespace->dobj.name,
- tbinfo->dobj.name);
+ pg_log_info("reading indexes for table \"%s.%s\"",
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->dobj.name);
/*
* The point of the messy-looking outer join is to find a constraint
@@ -7263,10 +7246,9 @@ getConstraints(Archive *fout, TableInfo tblinfo[], int numTables)
!(tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION))
continue;
- if (g_verbose)
- write_msg(NULL, "reading foreign key constraints for table \"%s.%s\"\n",
- tbinfo->dobj.namespace->dobj.name,
- tbinfo->dobj.name);
+ pg_log_info("reading foreign key constraints for table \"%s.%s\"",
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->dobj.name);
resetPQExpBuffer(query);
if (fout->remoteVersion >= 110000)
@@ -7483,7 +7465,7 @@ getRules(Archive *fout, int *numRules)
ruletableoid = atooid(PQgetvalue(res, i, i_ruletable));
ruleinfo[i].ruletable = findTableByOid(ruletableoid);
if (ruleinfo[i].ruletable == NULL)
- exit_horribly(NULL, "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found\n",
+ fatal("failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found",
ruletableoid, ruleinfo[i].dobj.catId.oid);
ruleinfo[i].dobj.namespace = ruleinfo[i].ruletable->dobj.namespace;
ruleinfo[i].dobj.dump = ruleinfo[i].ruletable->dobj.dump;
@@ -7566,10 +7548,9 @@ getTriggers(Archive *fout, TableInfo tblinfo[], int numTables)
!(tbinfo->dobj.dump & DUMP_COMPONENT_DEFINITION))
continue;
- if (g_verbose)
- write_msg(NULL, "reading triggers for table \"%s.%s\"\n",
- tbinfo->dobj.namespace->dobj.name,
- tbinfo->dobj.name);
+ pg_log_info("reading triggers for table \"%s.%s\"",
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->dobj.name);
resetPQExpBuffer(query);
if (fout->remoteVersion >= 90000)
@@ -7700,7 +7681,7 @@ getTriggers(Archive *fout, TableInfo tblinfo[], int numTables)
if (OidIsValid(tginfo[j].tgconstrrelid))
{
if (PQgetisnull(res, j, i_tgconstrrelname))
- exit_horribly(NULL, "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)\n",
+ fatal("query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)",
tginfo[j].dobj.name,
tbinfo->dobj.name,
tginfo[j].tgconstrrelid);
@@ -8255,10 +8236,9 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
* we must read the attribute names in attribute number order! because
* we will use the attnum to index into the attnames array later.
*/
- if (g_verbose)
- write_msg(NULL, "finding the columns and types of table \"%s.%s\"\n",
- tbinfo->dobj.namespace->dobj.name,
- tbinfo->dobj.name);
+ pg_log_info("finding the columns and types of table \"%s.%s\"",
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->dobj.name);
resetPQExpBuffer(q);
@@ -8392,8 +8372,7 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
for (j = 0; j < ntups; j++)
{
if (j + 1 != atoi(PQgetvalue(res, j, i_attnum)))
- exit_horribly(NULL,
- "invalid column numbering in table \"%s\"\n",
+ fatal("invalid column numbering in table \"%s\"",
tbinfo->dobj.name);
tbinfo->attnames[j] = pg_strdup(PQgetvalue(res, j, i_attname));
tbinfo->atttypnames[j] = pg_strdup(PQgetvalue(res, j, i_atttypname));
@@ -8430,10 +8409,9 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
AttrDefInfo *attrdefs;
int numDefaults;
- if (g_verbose)
- write_msg(NULL, "finding default expressions of table \"%s.%s\"\n",
- tbinfo->dobj.namespace->dobj.name,
- tbinfo->dobj.name);
+ pg_log_info("finding default expressions of table \"%s.%s\"",
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->dobj.name);
printfPQExpBuffer(q, "SELECT tableoid, oid, adnum, "
"pg_catalog.pg_get_expr(adbin, adrelid) AS adsrc "
@@ -8453,8 +8431,7 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
adnum = atoi(PQgetvalue(res, j, 2));
if (adnum <= 0 || adnum > ntups)
- exit_horribly(NULL,
- "invalid adnum value %d for table \"%s\"\n",
+ fatal("invalid adnum value %d for table \"%s\"",
adnum, tbinfo->dobj.name);
/*
@@ -8519,10 +8496,9 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
ConstraintInfo *constrs;
int numConstrs;
- if (g_verbose)
- write_msg(NULL, "finding check constraints for table \"%s.%s\"\n",
- tbinfo->dobj.namespace->dobj.name,
- tbinfo->dobj.name);
+ pg_log_info("finding check constraints for table \"%s.%s\"",
+ tbinfo->dobj.namespace->dobj.name,
+ tbinfo->dobj.name);
resetPQExpBuffer(q);
if (fout->remoteVersion >= 90200)
@@ -8569,11 +8545,11 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables)
numConstrs = PQntuples(res);
if (numConstrs != tbinfo->ncheck)
{
- write_msg(NULL, ngettext("expected %d check constraint on table \"%s\" but found %d\n",
- "expected %d check constraints on table \"%s\" but found %d\n",
- tbinfo->ncheck),
+ pg_log_error(ngettext("expected %d check constraint on table \"%s\" but found %d",
+ "expected %d check constraints on table \"%s\" but found %d",
+ tbinfo->ncheck),
tbinfo->ncheck, tbinfo->dobj.name, numConstrs);
- write_msg(NULL, "(The system catalogs might be corrupted.)\n");
+ pg_log_error("(The system catalogs might be corrupted.)");
exit_nicely(1);
}
@@ -10156,7 +10132,7 @@ dumpType(Archive *fout, TypeInfo *tyinfo)
else if (tyinfo->typtype == TYPTYPE_PSEUDO && !tyinfo->isDefined)
dumpUndefinedType(fout, tyinfo);
else
- write_msg(NULL, "WARNING: typtype of data type \"%s\" appears to be invalid\n",
+ pg_log_warning("typtype of data type \"%s\" appears to be invalid",
tyinfo->dobj.name);
}
@@ -11512,7 +11488,7 @@ format_function_arguments_old(Archive *fout,
argmode = "INOUT ";
break;
default:
- write_msg(NULL, "WARNING: bogus value in proargmodes array\n");
+ pg_log_warning("bogus value in proargmodes array");
argmode = "";
break;
}
@@ -11884,7 +11860,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
if (!parsePGArray(proallargtypes, &allargtypes, &nitems) ||
nitems < finfo->nargs)
{
- write_msg(NULL, "WARNING: could not parse proallargtypes array\n");
+ pg_log_warning("could not parse proallargtypes array");
if (allargtypes)
free(allargtypes);
allargtypes = NULL;
@@ -11900,7 +11876,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
if (!parsePGArray(proargmodes, &argmodes, &nitems) ||
nitems != nallargs)
{
- write_msg(NULL, "WARNING: could not parse proargmodes array\n");
+ pg_log_warning("could not parse proargmodes array");
if (argmodes)
free(argmodes);
argmodes = NULL;
@@ -11914,7 +11890,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
if (!parsePGArray(proargnames, &argnames, &nitems) ||
nitems != nallargs)
{
- write_msg(NULL, "WARNING: could not parse proargnames array\n");
+ pg_log_warning("could not parse proargnames array");
if (argnames)
free(argnames);
argnames = NULL;
@@ -11925,7 +11901,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
{
if (!parsePGArray(proconfig, &configitems, &nconfigitems))
{
- write_msg(NULL, "WARNING: could not parse proconfig array\n");
+ pg_log_warning("could not parse proconfig array");
if (configitems)
free(configitems);
configitems = NULL;
@@ -12005,7 +11981,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
else if (provolatile[0] == PROVOLATILE_STABLE)
appendPQExpBufferStr(q, " STABLE");
else if (provolatile[0] != PROVOLATILE_VOLATILE)
- exit_horribly(NULL, "unrecognized provolatile value for function \"%s\"\n",
+ fatal("unrecognized provolatile value for function \"%s\"",
finfo->dobj.name);
}
@@ -12055,7 +12031,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
else if (proparallel[0] == PROPARALLEL_RESTRICTED)
appendPQExpBufferStr(q, " PARALLEL RESTRICTED");
else if (proparallel[0] != PROPARALLEL_UNSAFE)
- exit_horribly(NULL, "unrecognized proparallel value for function \"%s\"\n",
+ fatal("unrecognized proparallel value for function \"%s\"",
finfo->dobj.name);
}
@@ -12188,7 +12164,7 @@ dumpCast(Archive *fout, CastInfo *cast)
{
funcInfo = findFuncByOid(cast->castfunc);
if (funcInfo == NULL)
- exit_horribly(NULL, "could not find function definition for function with OID %u\n",
+ fatal("could not find function definition for function with OID %u",
cast->castfunc);
}
@@ -12227,10 +12203,10 @@ dumpCast(Archive *fout, CastInfo *cast)
free(fsig);
}
else
- write_msg(NULL, "WARNING: bogus value in pg_cast.castfunc or pg_cast.castmethod field\n");
+ pg_log_warning("bogus value in pg_cast.castfunc or pg_cast.castmethod field");
break;
default:
- write_msg(NULL, "WARNING: bogus value in pg_cast.castmethod field\n");
+ pg_log_warning("bogus value in pg_cast.castmethod field");
}
if (cast->castcontext == 'a')
@@ -12298,14 +12274,14 @@ dumpTransform(Archive *fout, TransformInfo *transform)
{
fromsqlFuncInfo = findFuncByOid(transform->trffromsql);
if (fromsqlFuncInfo == NULL)
- exit_horribly(NULL, "could not find function definition for function with OID %u\n",
+ fatal("could not find function definition for function with OID %u",
transform->trffromsql);
}
if (OidIsValid(transform->trftosql))
{
tosqlFuncInfo = findFuncByOid(transform->trftosql);
if (tosqlFuncInfo == NULL)
- exit_horribly(NULL, "could not find function definition for function with OID %u\n",
+ fatal("could not find function definition for function with OID %u",
transform->trftosql);
}
@@ -12324,7 +12300,7 @@ dumpTransform(Archive *fout, TransformInfo *transform)
transformType, lanname);
if (!transform->trffromsql && !transform->trftosql)
- write_msg(NULL, "WARNING: bogus transform definition, at least one of trffromsql and trftosql should be nonzero\n");
+ pg_log_warning("bogus transform definition, at least one of trffromsql and trftosql should be nonzero");
if (transform->trffromsql)
{
@@ -12341,7 +12317,7 @@ dumpTransform(Archive *fout, TransformInfo *transform)
free(fsig);
}
else
- write_msg(NULL, "WARNING: bogus value in pg_transform.trffromsql field\n");
+ pg_log_warning("bogus value in pg_transform.trffromsql field");
}
if (transform->trftosql)
@@ -12362,7 +12338,7 @@ dumpTransform(Archive *fout, TransformInfo *transform)
free(fsig);
}
else
- write_msg(NULL, "WARNING: bogus value in pg_transform.trftosql field\n");
+ pg_log_warning("bogus value in pg_transform.trftosql field");
}
appendPQExpBuffer(defqry, ");\n");
@@ -12679,7 +12655,7 @@ getFormattedOperatorName(Archive *fout, const char *oproid)
oprInfo = findOprByOid(atooid(oproid));
if (oprInfo == NULL)
{
- write_msg(NULL, "WARNING: could not find operator with OID %s\n",
+ pg_log_warning("could not find operator with OID %s",
oproid);
return NULL;
}
@@ -12747,7 +12723,7 @@ dumpAccessMethod(Archive *fout, AccessMethodInfo *aminfo)
appendPQExpBuffer(q, "TYPE TABLE ");
break;
default:
- write_msg(NULL, "WARNING: invalid type \"%c\" of access method \"%s\"\n",
+ pg_log_warning("invalid type \"%c\" of access method \"%s\"",
aminfo->amtype, qamname);
destroyPQExpBuffer(q);
destroyPQExpBuffer(delq);
@@ -13502,8 +13478,7 @@ dumpCollation(Archive *fout, CollInfo *collinfo)
/* to allow dumping pg_catalog; not accepted on input */
appendPQExpBufferStr(q, "default");
else
- exit_horribly(NULL,
- "unrecognized collation provider: %s\n",
+ fatal("unrecognized collation provider: %s\n",
collprovider);
if (strcmp(PQgetvalue(res, 0, i_collisdeterministic), "f") == 0)
@@ -13975,7 +13950,7 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
if (!convertok)
{
- write_msg(NULL, "WARNING: aggregate function %s could not be dumped correctly for this database version; ignored\n",
+ pg_log_warning("aggregate function %s could not be dumped correctly for this database version; ignored",
aggsig);
if (aggfullsig)
@@ -14030,7 +14005,7 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
appendPQExpBufferStr(details, ",\n FINALFUNC_MODIFY = READ_WRITE");
break;
default:
- exit_horribly(NULL, "unrecognized aggfinalmodify value for aggregate \"%s\"\n",
+ fatal("unrecognized aggfinalmodify value for aggregate \"%s\"",
agginfo->aggfn.dobj.name);
break;
}
@@ -14086,7 +14061,7 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
appendPQExpBufferStr(details, ",\n MFINALFUNC_MODIFY = READ_WRITE");
break;
default:
- exit_horribly(NULL, "unrecognized aggmfinalmodify value for aggregate \"%s\"\n",
+ fatal("unrecognized aggmfinalmodify value for aggregate \"%s\"",
agginfo->aggfn.dobj.name);
break;
}
@@ -14111,7 +14086,7 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
else if (proparallel[0] == PROPARALLEL_RESTRICTED)
appendPQExpBufferStr(details, ",\n PARALLEL = restricted");
else if (proparallel[0] != PROPARALLEL_UNSAFE)
- exit_horribly(NULL, "unrecognized proparallel value for function \"%s\"\n",
+ fatal("unrecognized proparallel value for function \"%s\"",
agginfo->aggfn.dobj.name);
}
@@ -14810,8 +14785,7 @@ dumpDefaultACL(Archive *fout, DefaultACLInfo *daclinfo)
break;
default:
/* shouldn't get here */
- exit_horribly(NULL,
- "unrecognized object type in default privileges: %d\n",
+ fatal("unrecognized object type in default privileges: %d",
(int) daclinfo->defaclobjtype);
type = ""; /* keep compiler quiet */
}
@@ -14829,7 +14803,7 @@ dumpDefaultACL(Archive *fout, DefaultACLInfo *daclinfo)
daclinfo->defaclrole,
fout->remoteVersion,
q))
- exit_horribly(NULL, "could not parse default ACL list (%s)\n",
+ fatal("could not parse default ACL list (%s)",
daclinfo->defaclacl);
if (daclinfo->dobj.dump & DUMP_COMPONENT_ACL)
@@ -14910,8 +14884,7 @@ dumpACL(Archive *fout, CatalogId objCatId, DumpId objDumpId,
if (!buildACLCommands(name, subname, nspname, type,
initacls, initracls, owner,
"", fout->remoteVersion, sql))
- exit_horribly(NULL,
- "could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)\n",
+ fatal("could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) for object \"%s\" (%s)",
initacls, initracls, name, type);
appendPQExpBuffer(sql, "SELECT pg_catalog.binary_upgrade_set_record_init_privs(false);\n");
}
@@ -14919,8 +14892,7 @@ dumpACL(Archive *fout, CatalogId objCatId, DumpId objDumpId,
if (!buildACLCommands(name, subname, nspname, type,
acls, racls, owner,
"", fout->remoteVersion, sql))
- exit_horribly(NULL,
- "could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)\n",
+ fatal("could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s\" (%s)",
acls, racls, name, type);
if (sql->len > 0)
@@ -15422,17 +15394,17 @@ createViewAsClause(Archive *fout, TableInfo *tbinfo)
if (PQntuples(res) != 1)
{
if (PQntuples(res) < 1)
- exit_horribly(NULL, "query to obtain definition of view \"%s\" returned no data\n",
+ fatal("query to obtain definition of view \"%s\" returned no data",
tbinfo->dobj.name);
else
- exit_horribly(NULL, "query to obtain definition of view \"%s\" returned more than one definition\n",
+ fatal("query to obtain definition of view \"%s\" returned more than one definition",
tbinfo->dobj.name);
}
len = PQgetlength(res, 0, 0);
if (len == 0)
- exit_horribly(NULL, "definition of view \"%s\" appears to be empty (length zero)\n",
+ fatal("definition of view \"%s\" appears to be empty (length zero)",
tbinfo->dobj.name);
/* Strip off the trailing semicolon so that other things may follow. */
@@ -15514,8 +15486,7 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
if (tbinfo->hasoids)
- write_msg(NULL,
- "WARNING: WITH OIDS is not supported anymore (table \"%s\")\n",
+ pg_log_warning("WITH OIDS is not supported anymore (table \"%s\")",
qrelname);
if (dopt->binary_upgrade)
@@ -15642,7 +15613,7 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo)
* parent.
*/
if (tbinfo->numParents != 1)
- exit_horribly(NULL, "invalid number of parents %d for table \"%s\"\n",
+ fatal("invalid number of parents %d for table \"%s\"",
tbinfo->numParents, tbinfo->dobj.name);
appendPQExpBuffer(q, " PARTITION OF %s",
@@ -16329,7 +16300,7 @@ getAttrName(int attrnum, TableInfo *tblInfo)
case TableOidAttributeNumber:
return "tableoid";
}
- exit_horribly(NULL, "invalid column number %d for table \"%s\"\n",
+ fatal("invalid column number %d for table \"%s\"",
attrnum, tblInfo->dobj.name);
return NULL; /* keep compiler quiet */
}
@@ -16593,7 +16564,7 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
indxinfo = (IndxInfo *) findObjectByDumpId(coninfo->conindex);
if (indxinfo == NULL)
- exit_horribly(NULL, "missing index for constraint \"%s\"\n",
+ fatal("missing index for constraint \"%s\"",
coninfo->dobj.name);
if (dopt->binary_upgrade)
@@ -16813,7 +16784,7 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
}
else
{
- exit_horribly(NULL, "unrecognized constraint type: %c\n",
+ fatal("unrecognized constraint type: %c",
coninfo->contype);
}
@@ -16945,8 +16916,8 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
if (PQntuples(res) != 1)
{
- write_msg(NULL, ngettext("query to get data of sequence \"%s\" returned %d row (expected 1)\n",
- "query to get data of sequence \"%s\" returned %d rows (expected 1)\n",
+ pg_log_error(ngettext("query to get data of sequence \"%s\" returned %d row (expected 1)",
+ "query to get data of sequence \"%s\" returned %d rows (expected 1)",
PQntuples(res)),
tbinfo->dobj.name, PQntuples(res));
exit_nicely(1);
@@ -16979,7 +16950,7 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
}
else
{
- exit_horribly(NULL, "unrecognized sequence type: %s\n", seqtype);
+ fatal("unrecognized sequence type: %s", seqtype);
default_minv = default_maxv = 0; /* keep compiler quiet */
}
@@ -17100,7 +17071,7 @@ dumpSequence(Archive *fout, TableInfo *tbinfo)
TableInfo *owning_tab = findTableByOid(tbinfo->owning_tab);
if (owning_tab == NULL)
- exit_horribly(NULL, "failed sanity check, parent table with OID %u of sequence with OID %u not found\n",
+ fatal("failed sanity check, parent table with OID %u of sequence with OID %u not found",
tbinfo->owning_tab, tbinfo->dobj.catId.oid);
if (owning_tab->dobj.dump & DUMP_COMPONENT_DEFINITION)
@@ -17166,8 +17137,8 @@ dumpSequenceData(Archive *fout, TableDataInfo *tdinfo)
if (PQntuples(res) != 1)
{
- write_msg(NULL, ngettext("query to get data of sequence \"%s\" returned %d row (expected 1)\n",
- "query to get data of sequence \"%s\" returned %d rows (expected 1)\n",
+ pg_log_error(ngettext("query to get data of sequence \"%s\" returned %d row (expected 1)",
+ "query to get data of sequence \"%s\" returned %d rows (expected 1)",
PQntuples(res)),
tbinfo->dobj.name, PQntuples(res));
exit_nicely(1);
@@ -17263,7 +17234,7 @@ dumpTrigger(Archive *fout, TriggerInfo *tginfo)
appendPQExpBufferStr(query, "INSTEAD OF");
else
{
- write_msg(NULL, "unexpected tgtype value: %d\n", tginfo->tgtype);
+ pg_log_error("unexpected tgtype value: %d", tginfo->tgtype);
exit_nicely(1);
}
@@ -17337,7 +17308,7 @@ dumpTrigger(Archive *fout, TriggerInfo *tginfo)
if (p + tlen >= tgargs + lentgargs)
{
/* hm, not found before end of bytea value... */
- write_msg(NULL, "invalid argument string (%s) for trigger \"%s\" on table \"%s\"\n",
+ pg_log_error("invalid argument string (%s) for trigger \"%s\" on table \"%s\"",
tginfo->tgargs,
tginfo->dobj.name,
tbinfo->dobj.name);
@@ -17566,7 +17537,7 @@ dumpRule(Archive *fout, RuleInfo *rinfo)
if (PQntuples(res) != 1)
{
- write_msg(NULL, "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned\n",
+ pg_log_error("query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned",
rinfo->dobj.name, tbinfo->dobj.name);
exit_nicely(1);
}
@@ -17728,7 +17699,7 @@ getExtensionMembership(Archive *fout, ExtensionInfo extinfo[],
if (ext == NULL)
{
/* shouldn't happen */
- fprintf(stderr, "could not find referenced extension %u\n", extId);
+ pg_log_warning("could not find referenced extension %u", extId);
continue;
}
@@ -17940,8 +17911,7 @@ getDependencies(Archive *fout)
DumpableObject *dobj,
*refdobj;
- if (g_verbose)
- write_msg(NULL, "reading dependency data\n");
+ pg_log_info("reading dependency data");
query = createPQExpBuffer();
@@ -17996,7 +17966,7 @@ getDependencies(Archive *fout)
if (dobj == NULL)
{
#ifdef NOT_USED
- fprintf(stderr, "no referencing object %u %u\n",
+ pg_log_warning("no referencing object %u %u",
objId.tableoid, objId.oid);
#endif
continue;
@@ -18007,7 +17977,7 @@ getDependencies(Archive *fout)
if (refdobj == NULL)
{
#ifdef NOT_USED
- fprintf(stderr, "no referenced object %u %u\n",
+ pg_log_warning("no referenced object %u %u",
refobjId.tableoid, refobjId.oid);
#endif
continue;
@@ -18375,5 +18345,5 @@ appendReloptionsArrayAH(PQExpBuffer buffer, const char *reloptions,
res = appendReloptionsArray(buffer, reloptions, prefix, fout->encoding,
fout->std_strings);
if (!res)
- write_msg(NULL, "WARNING: could not parse reloptions array\n");
+ pg_log_warning("could not parse reloptions array");
}
diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h
index a72e3eb27c5..4f9ebb4904d 100644
--- a/src/bin/pg_dump/pg_dump.h
+++ b/src/bin/pg_dump/pg_dump.h
@@ -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];
diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c
index 3a4f6e77547..80641cd79a2 100644
--- a/src/bin/pg_dump/pg_dump_sort.c
+++ b/src/bin/pg_dump/pg_dump_sort.c
@@ -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)
diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c
index a86965e6702..3244a527f62 100644
--- a/src/bin/pg_dump/pg_dumpall.c
+++ b/src/bin/pg_dump/pg_dumpall.c
@@ -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);
}
diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c
index 428e040acb0..0a7eb46f5bd 100644
--- a/src/bin/pg_dump/pg_restore.c
+++ b/src/bin/pg_dump/pg_restore.c
@@ -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;
diff --git a/src/bin/pg_dump/t/001_basic.pl b/src/bin/pg_dump/t/001_basic.pl
index 3a58f9b8cee..3f8d4392cd7 100644
--- a/src/bin/pg_dump/t/001_basic.pl
+++ b/src/bin/pg_dump/t/001_basic.pl
@@ -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');
diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl
index a69375056d2..5721882b3b2 100644
--- a/src/bin/pg_dump/t/002_pg_dump.pl
+++ b/src/bin/pg_dump/t/002_pg_dump.pl
@@ -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
diff --git a/src/bin/pg_resetwal/Makefile b/src/bin/pg_resetwal/Makefile
index 2a3835691fd..09ede1efd2a 100644
--- a/src/bin/pg_resetwal/Makefile
+++ b/src/bin/pg_resetwal/Makefile
@@ -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
diff --git a/src/bin/pg_resetwal/nls.mk b/src/bin/pg_resetwal/nls.mk
index 82ec4f743c1..cc40875b482 100644
--- a/src/bin/pg_resetwal/nls.mk
+++ b/src/bin/pg_resetwal/nls.mk
@@ -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)
diff --git a/src/bin/pg_resetwal/pg_resetwal.c b/src/bin/pg_resetwal/pg_resetwal.c
index 67fc646befb..82a8ec993de 100644
--- a/src/bin/pg_resetwal/pg_resetwal.c
+++ b/src/bin/pg_resetwal/pg_resetwal.c
@@ -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);
}
diff --git a/src/bin/pg_resetwal/t/002_corrupted.pl b/src/bin/pg_resetwal/t/002_corrupted.pl
index 0022dcb8ffb..f9940d7fc5d 100644
--- a/src/bin/pg_resetwal/t/002_corrupted.pl
+++ b/src/bin/pg_resetwal/t/002_corrupted.pl
@@ -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');
diff --git a/src/bin/pg_rewind/Makefile b/src/bin/pg_rewind/Makefile
index 04f3b8f5200..019e19986eb 100644
--- a/src/bin/pg_rewind/Makefile
+++ b/src/bin/pg_rewind/Makefile
@@ -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/%
diff --git a/src/bin/pg_rewind/copy_fetch.c b/src/bin/pg_rewind/copy_fetch.c
index a283405f6c0..3fd0404ddfb 100644
--- a/src/bin/pg_rewind/copy_fetch.c
+++ b/src/bin/pg_rewind/copy_fetch.c
@@ -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);
}
/*
diff --git a/src/bin/pg_rewind/datapagemap.c b/src/bin/pg_rewind/datapagemap.c
index 6262f1f8707..fc70fe57062 100644
--- a/src/bin/pg_rewind/datapagemap.c
+++ b/src/bin/pg_rewind/datapagemap.c
@@ -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);
}
diff --git a/src/bin/pg_rewind/file_ops.c b/src/bin/pg_rewind/file_ops.c
index bbdcbe44ac9..e442f935555 100644
--- a/src/bin/pg_rewind/file_ops.c
+++ b/src/bin/pg_rewind/file_ops.c
@@ -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);
diff --git a/src/bin/pg_rewind/filemap.c b/src/bin/pg_rewind/filemap.c
index 1c82acb8daa..63d0baee745 100644
--- a/src/bin/pg_rewind/filemap.c
+++ b/src/bin/pg_rewind/filemap.c
@@ -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)
diff --git a/src/bin/pg_rewind/libpq_fetch.c b/src/bin/pg_rewind/libpq_fetch.c
index d06e2774325..11ec045b8ec 100644
--- a/src/bin/pg_rewind/libpq_fetch.c
+++ b/src/bin/pg_rewind/libpq_fetch.c
@@ -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;
diff --git a/src/bin/pg_rewind/logging.c b/src/bin/pg_rewind/logging.c
index 572a7599375..8169f739eef 100644
--- a/src/bin/pg_rewind/logging.c
+++ b/src/bin/pg_rewind/logging.c
@@ -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");
}
diff --git a/src/bin/pg_rewind/logging.h b/src/bin/pg_rewind/logging.h
index 5c031e18215..81e17ac1f2c 100644
--- a/src/bin/pg_rewind/logging.h
+++ b/src/bin/pg_rewind/logging.h
@@ -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 */
diff --git a/src/bin/pg_rewind/nls.mk b/src/bin/pg_rewind/nls.mk
index 2fb63bead8e..58c9ede548d 100644
--- a/src/bin/pg_rewind/nls.mk
+++ b/src/bin/pg_rewind/nls.mk
@@ -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
diff --git a/src/bin/pg_rewind/parsexlog.c b/src/bin/pg_rewind/parsexlog.c
index e19c265cbb0..7709b96e008 100644
--- a/src/bin/pg_rewind/parsexlog.c
+++ b/src/bin/pg_rewind/parsexlog.c
@@ -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);
}
diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c
index 3dcadb9b40a..b7e6aca97fa 100644
--- a/src/bin/pg_rewind/pg_rewind.c
+++ b/src/bin/pg_rewind/pg_rewind.c
@@ -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);
}
diff --git a/src/bin/pg_rewind/pg_rewind.h b/src/bin/pg_rewind/pg_rewind.h
index 83b2898b8ba..f2cc2800aa4 100644
--- a/src/bin/pg_rewind/pg_rewind.h
+++ b/src/bin/pg_rewind/pg_rewind.h
@@ -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;
diff --git a/src/bin/pg_rewind/timeline.c b/src/bin/pg_rewind/timeline.c
index 1d343de52b2..12b19b353c2 100644
--- a/src/bin/pg_rewind/timeline.c
+++ b/src/bin/pg_rewind/timeline.c
@@ -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);
}
diff --git a/src/bin/pg_test_fsync/Makefile b/src/bin/pg_test_fsync/Makefile
index 90496df566d..769daecf2b1 100644
--- a/src/bin/pg_test_fsync/Makefile
+++ b/src/bin/pg_test_fsync/Makefile
@@ -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
diff --git a/src/bin/pg_test_fsync/pg_test_fsync.c b/src/bin/pg_test_fsync/pg_test_fsync.c
index e6f7ef85579..f7021017429 100644
--- a/src/bin/pg_test_fsync/pg_test_fsync.c
+++ b/src/bin/pg_test_fsync/pg_test_fsync.c
@@ -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);
-}
diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c
index 92d8940a9f2..0b304bbd56a 100644
--- a/src/bin/pg_upgrade/pg_upgrade.c
+++ b/src/bin/pg_upgrade/pg_upgrade.c
@@ -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);
diff --git a/src/bin/pg_waldump/Makefile b/src/bin/pg_waldump/Makefile
index f5957bd75a6..bfe9498b800 100644
--- a/src/bin/pg_waldump/Makefile
+++ b/src/bin/pg_waldump/Makefile
@@ -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/%
diff --git a/src/bin/pg_waldump/nls.mk b/src/bin/pg_waldump/nls.mk
index c618f931454..2ee2da79015 100644
--- a/src/bin/pg_waldump/nls.mk
+++ b/src/bin/pg_waldump/nls.mk
@@ -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
diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c
index 1e5379eb3e0..e106fb2ed1e 100644
--- a/src/bin/pg_waldump/pg_waldump.c
+++ b/src/bin/pg_waldump/pg_waldump.c
@@ -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;
}
diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c
index ac132298087..93e2d350e73 100644
--- a/src/bin/pgbench/pgbench.c
+++ b/src/bin/pgbench/pgbench.c
@@ -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')
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index ab259c473a9..72188b7f3ef 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -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);
}
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index 82511e34ac3..bd284446f8d 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -19,6 +19,7 @@
#include
#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;
diff --git a/src/bin/psql/common.h b/src/bin/psql/common.h
index 1f2a4bf1ae7..4739b8ee339 100644
--- a/src/bin/psql/common.h
+++ b/src/bin/psql/common.h
@@ -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;
diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c
index 18a8c8eebb5..def177693ed 100644
--- a/src/bin/psql/copy.c
+++ b/src/bin/psql/copy.c
@@ -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;
}
diff --git a/src/bin/psql/crosstabview.c b/src/bin/psql/crosstabview.c
index fb77ce70334..6afd3e0939c 100644
--- a/src/bin/psql/crosstabview.c
+++ b/src/bin/psql/crosstabview.c
@@ -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;
}
}
diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c
index f94a7a9c30a..036810303a6 100644
--- a/src/bin/psql/describe.c
+++ b/src/bin/psql/describe.c
@@ -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;
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
index 6fc4ebab1e8..eb3a0f36d94 100644
--- a/src/bin/psql/help.c
+++ b/src/bin/psql/help.c
@@ -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);
}
}
diff --git a/src/bin/psql/input.c b/src/bin/psql/input.c
index 0830b7bb095..93c0d4c49e4 100644
--- a/src/bin/psql/input.c
+++ b/src/bin/psql/input.c
@@ -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
}
diff --git a/src/bin/psql/large_obj.c b/src/bin/psql/large_obj.c
index 20473934412..c12f4326e32 100644
--- a/src/bin/psql/large_obj.c
+++ b/src/bin/psql/large_obj.c
@@ -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);
}
diff --git a/src/bin/psql/mainloop.c b/src/bin/psql/mainloop.c
index 481d012fb08..3ae447041fa 100644
--- a/src/bin/psql/mainloop.c
+++ b/src/bin/psql/mainloop.c
@@ -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;
}
diff --git a/src/bin/psql/nls.mk b/src/bin/psql/nls.mk
index e355f219b98..2e707f441ce 100644
--- a/src/bin/psql/nls.mk
+++ b/src/bin/psql/nls.mk
@@ -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)
diff --git a/src/bin/psql/psqlscanslash.l b/src/bin/psql/psqlscanslash.l
index 1514aa74d35..f7818e6e603 100644
--- a/src/bin/psql/psqlscanslash.l
+++ b/src/bin/psql/psqlscanslash.l
@@ -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;
}
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index e1c0754a554..ac82087445e 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -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);
}
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index d6d8fd02f5a..d34bf86fc20 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -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);
diff --git a/src/bin/psql/variables.c b/src/bin/psql/variables.c
index 72fddf256c3..5d47d5a8ab0 100644
--- a/src/bin/psql/variables.c
+++ b/src/bin/psql/variables.c
@@ -10,6 +10,8 @@
#include "common.h"
#include "variables.h"
+#include "fe_utils/logging.h"
+
/*
* Check whether a variable's name is allowed.
@@ -136,7 +138,7 @@ ParseVariableBool(const char *value, const char *name, bool *result)
{
/* string is not recognized; don't clobber *result */
if (name)
- psql_error("unrecognized value \"%s\" for \"%s\": Boolean expected\n",
+ pg_log_error("unrecognized value \"%s\" for \"%s\": Boolean expected",
value, name);
valid = false;
}
@@ -173,7 +175,7 @@ ParseVariableNum(const char *value, const char *name, int *result)
{
/* string is not recognized; don't clobber *result */
if (name)
- psql_error("invalid value \"%s\" for \"%s\": integer expected\n",
+ pg_log_error("invalid value \"%s\" for \"%s\": integer expected",
value, name);
return false;
}
@@ -221,7 +223,7 @@ SetVariable(VariableSpace space, const char *name, const char *value)
/* Deletion of non-existent variable is not an error */
if (!value)
return true;
- psql_error("invalid variable name: \"%s\"\n", name);
+ pg_log_error("invalid variable name: \"%s\"", name);
return false;
}
@@ -390,6 +392,7 @@ DeleteVariable(VariableSpace space, const char *name)
void
PsqlVarEnumError(const char *name, const char *value, const char *suggestions)
{
- psql_error("unrecognized value \"%s\" for \"%s\"\nAvailable values are: %s.\n",
+ pg_log_error("unrecognized value \"%s\" for \"%s\"\n"
+ "Available values are: %s.",
value, name, suggestions);
}
diff --git a/src/bin/psql/variables.h b/src/bin/psql/variables.h
index 9dc2b5e6ca4..c7e509eeeed 100644
--- a/src/bin/psql/variables.h
+++ b/src/bin/psql/variables.h
@@ -21,7 +21,7 @@
* An assign hook function is called before any attempted assignment, with the
* proposed new value of the variable (or with NULL, if an \unset is being
* attempted). If it returns false, the assignment doesn't occur --- it
- * should print an error message with psql_error() to tell the user why.
+ * should print an error message with pg_log_error() to tell the user why.
*
* When an assign hook function is installed with SetVariableHooks(), it is
* called with the variable's current value (or with NULL, if it wasn't set
diff --git a/src/bin/scripts/clusterdb.c b/src/bin/scripts/clusterdb.c
index cc6efce5960..dd0ba68864d 100644
--- a/src/bin/scripts/clusterdb.c
+++ b/src/bin/scripts/clusterdb.c
@@ -11,6 +11,7 @@
#include "postgres_fe.h"
#include "common.h"
+#include "fe_utils/logging.h"
#include "fe_utils/simple_list.h"
#include "fe_utils/string_utils.h"
@@ -62,6 +63,7 @@ main(int argc, char *argv[])
bool verbose = false;
SimpleStringList tables = {NULL, NULL};
+ pg_logging_init(argv[0]);
progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
@@ -125,8 +127,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);
}
@@ -137,15 +139,13 @@ main(int argc, char *argv[])
{
if (dbname)
{
- fprintf(stderr, _("%s: cannot cluster all databases and a specific one at the same time\n"),
- progname);
+ pg_log_error("cannot cluster all databases and a specific one at the same time");
exit(1);
}
if (tables.head != NULL)
{
- fprintf(stderr, _("%s: cannot cluster specific table(s) in all databases\n"),
- progname);
+ pg_log_error("cannot cluster specific table(s) in all databases");
exit(1);
}
@@ -213,11 +213,11 @@ cluster_one_database(const char *dbname, bool verbose, const char *table,
if (!executeMaintenanceCommand(conn, sql.data, echo))
{
if (table)
- fprintf(stderr, _("%s: clustering of table \"%s\" in database \"%s\" failed: %s"),
- progname, table, PQdb(conn), PQerrorMessage(conn));
+ pg_log_error("clustering of table \"%s\" in database \"%s\" failed: %s",
+ table, PQdb(conn), PQerrorMessage(conn));
else
- fprintf(stderr, _("%s: clustering of database \"%s\" failed: %s"),
- progname, PQdb(conn), PQerrorMessage(conn));
+ pg_log_error("clustering of database \"%s\" failed: %s",
+ PQdb(conn), PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
diff --git a/src/bin/scripts/common.c b/src/bin/scripts/common.c
index 7139b7c6672..a661556ba91 100644
--- a/src/bin/scripts/common.c
+++ b/src/bin/scripts/common.c
@@ -19,6 +19,7 @@
#include "common.h"
#include "fe_utils/connect.h"
+#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h"
@@ -113,8 +114,8 @@ connectDatabase(const char *dbname, const char *pghost,
if (!conn)
{
- fprintf(stderr, _("%s: could not connect to database %s: out of memory\n"),
- progname, dbname);
+ pg_log_error("could not connect to database %s: out of memory",
+ dbname);
exit(1);
}
@@ -140,8 +141,8 @@ connectDatabase(const char *dbname, const char *pghost,
PQfinish(conn);
return NULL;
}
- 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(1);
}
@@ -193,10 +194,8 @@ executeQuery(PGconn *conn, const char *query, const char *progname, bool echo)
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_info("query was: %s", query);
PQfinish(conn);
exit(1);
}
@@ -221,10 +220,8 @@ executeCommand(PGconn *conn, const char *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_info("query was: %s", query);
PQfinish(conn);
exit(1);
}
@@ -347,11 +344,10 @@ appendQualifiedRelation(PQExpBuffer buf, const char *spec,
ntups = PQntuples(res);
if (ntups != 1)
{
- fprintf(stderr,
- ngettext("%s: query returned %d row instead of one: %s\n",
- "%s: query returned %d rows instead of one: %s\n",
- ntups),
- progname, ntups, sql.data);
+ pg_log_error(ngettext("query returned %d row instead of one: %s",
+ "query returned %d rows instead of one: %s",
+ ntups),
+ ntups, sql.data);
PQfinish(conn);
exit(1);
}
diff --git a/src/bin/scripts/createdb.c b/src/bin/scripts/createdb.c
index b40eea4365e..e4b497859b5 100644
--- a/src/bin/scripts/createdb.c
+++ b/src/bin/scripts/createdb.c
@@ -12,6 +12,7 @@
#include "postgres_fe.h"
#include "common.h"
+#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h"
@@ -64,6 +65,7 @@ main(int argc, char *argv[])
PGconn *conn;
PGresult *result;
+ pg_logging_init(argv[0]);
progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
@@ -133,8 +135,8 @@ main(int argc, char *argv[])
comment = argv[optind + 1];
break;
default:
- 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]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
}
@@ -143,14 +145,12 @@ main(int argc, char *argv[])
{
if (lc_ctype)
{
- fprintf(stderr, _("%s: only one of --locale and --lc-ctype can be specified\n"),
- progname);
+ pg_log_error("only one of --locale and --lc-ctype can be specified");
exit(1);
}
if (lc_collate)
{
- fprintf(stderr, _("%s: only one of --locale and --lc-collate can be specified\n"),
- progname);
+ pg_log_error("only one of --locale and --lc-collate can be specified");
exit(1);
}
lc_ctype = locale;
@@ -161,8 +161,7 @@ main(int argc, char *argv[])
{
if (pg_char_to_encoding(encoding) < 0)
{
- fprintf(stderr, _("%s: \"%s\" is not a valid encoding name\n"),
- progname, encoding);
+ pg_log_error("\"%s\" is not a valid encoding name", encoding);
exit(1);
}
}
@@ -210,8 +209,7 @@ main(int argc, char *argv[])
if (PQresultStatus(result) != PGRES_COMMAND_OK)
{
- fprintf(stderr, _("%s: database creation failed: %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("database creation failed: %s", PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
@@ -230,8 +228,8 @@ main(int argc, char *argv[])
if (PQresultStatus(result) != PGRES_COMMAND_OK)
{
- fprintf(stderr, _("%s: comment creation failed (database was created): %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("comment creation failed (database was created): %s",
+ PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
diff --git a/src/bin/scripts/createuser.c b/src/bin/scripts/createuser.c
index ae546c70fbd..6db0dbf2a37 100644
--- a/src/bin/scripts/createuser.c
+++ b/src/bin/scripts/createuser.c
@@ -12,6 +12,7 @@
#include "postgres_fe.h"
#include "common.h"
+#include "fe_utils/logging.h"
#include "fe_utils/simple_list.h"
#include "fe_utils/string_utils.h"
@@ -81,6 +82,7 @@ main(int argc, char *argv[])
PGconn *conn;
PGresult *result;
+ pg_logging_init(argv[0]);
progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
@@ -176,8 +178,8 @@ main(int argc, char *argv[])
newuser = argv[optind];
break;
default:
- fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
- progname, argv[optind + 1]);
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind + 1]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
}
@@ -269,8 +271,8 @@ main(int argc, char *argv[])
NULL);
if (!encrypted_password)
{
- fprintf(stderr, _("%s: password encryption failed: %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("password encryption failed: %s",
+ PQerrorMessage(conn));
exit(1);
}
appendStringLiteralConn(&sql, encrypted_password, conn);
@@ -324,8 +326,7 @@ main(int argc, char *argv[])
if (PQresultStatus(result) != PGRES_COMMAND_OK)
{
- fprintf(stderr, _("%s: creation of new role failed: %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("creation of new role failed: %s", PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
diff --git a/src/bin/scripts/dropdb.c b/src/bin/scripts/dropdb.c
index df7823df991..42a9bd46860 100644
--- a/src/bin/scripts/dropdb.c
+++ b/src/bin/scripts/dropdb.c
@@ -12,6 +12,7 @@
#include "postgres_fe.h"
#include "common.h"
+#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h"
@@ -54,6 +55,7 @@ main(int argc, char *argv[])
PGconn *conn;
PGresult *result;
+ pg_logging_init(argv[0]);
progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
@@ -99,15 +101,15 @@ main(int argc, char *argv[])
switch (argc - optind)
{
case 0:
- fprintf(stderr, _("%s: missing required argument database name\n"), progname);
+ pg_log_error("missing required argument database name");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
case 1:
dbname = argv[optind];
break;
default:
- fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
- progname, argv[optind + 1]);
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind + 1]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
}
@@ -137,8 +139,7 @@ main(int argc, char *argv[])
result = PQexec(conn, sql.data);
if (PQresultStatus(result) != PGRES_COMMAND_OK)
{
- fprintf(stderr, _("%s: database removal failed: %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("database removal failed: %s", PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
diff --git a/src/bin/scripts/dropuser.c b/src/bin/scripts/dropuser.c
index 62971131c54..831243815a3 100644
--- a/src/bin/scripts/dropuser.c
+++ b/src/bin/scripts/dropuser.c
@@ -12,6 +12,7 @@
#include "postgres_fe.h"
#include "common.h"
+#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h"
@@ -53,6 +54,7 @@ main(int argc, char *argv[])
PGconn *conn;
PGresult *result;
+ pg_logging_init(argv[0]);
progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
@@ -100,8 +102,8 @@ main(int argc, char *argv[])
dropuser = argv[optind];
break;
default:
- fprintf(stderr, _("%s: too many command-line arguments (first is \"%s\")\n"),
- progname, argv[optind + 1]);
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind + 1]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
}
@@ -116,7 +118,7 @@ main(int argc, char *argv[])
}
else
{
- fprintf(stderr, _("%s: missing required argument role name\n"), progname);
+ pg_log_error("missing required argument role name");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
exit(1);
}
@@ -142,8 +144,8 @@ main(int argc, char *argv[])
if (PQresultStatus(result) != PGRES_COMMAND_OK)
{
- fprintf(stderr, _("%s: removal of role \"%s\" failed: %s"),
- progname, dropuser, PQerrorMessage(conn));
+ pg_log_error("removal of role \"%s\" failed: %s",
+ dropuser, PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
diff --git a/src/bin/scripts/nls.mk b/src/bin/scripts/nls.mk
index 4038cdb3b69..2c99a6a4618 100644
--- a/src/bin/scripts/nls.mk
+++ b/src/bin/scripts/nls.mk
@@ -1,11 +1,13 @@
# src/bin/scripts/nls.mk
CATALOG_NAME = pgscripts
AVAIL_LANGUAGES = cs de es fr he it ja ko pl pt_BR ru sv tr zh_CN
-GETTEXT_FILES = createdb.c createuser.c \
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ createdb.c createuser.c \
dropdb.c dropuser.c \
clusterdb.c vacuumdb.c reindexdb.c \
pg_isready.c \
common.c \
../../fe_utils/print.c \
../../common/fe_memutils.c ../../common/username.c
-GETTEXT_TRIGGERS = simple_prompt yesno_prompt
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt yesno_prompt
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/scripts/pg_isready.c b/src/bin/scripts/pg_isready.c
index 26b21dcbb07..fe15507caf7 100644
--- a/src/bin/scripts/pg_isready.c
+++ b/src/bin/scripts/pg_isready.c
@@ -11,6 +11,7 @@
#include "postgres_fe.h"
#include "common.h"
+#include "fe_utils/logging.h"
#define DEFAULT_CONNECT_TIMEOUT "3"
@@ -63,6 +64,7 @@ main(int argc, char **argv)
{NULL, 0, NULL, 0}
};
+ pg_logging_init(argv[0]);
progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, progname, help);
@@ -102,8 +104,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);
/*
@@ -139,7 +141,7 @@ main(int argc, char **argv)
opts = PQconninfoParse(pgdbname, &errmsg);
if (opts == NULL)
{
- fprintf(stderr, _("%s: %s"), progname, errmsg);
+ pg_log_error("%s", errmsg);
exit(PQPING_NO_ATTEMPT);
}
}
@@ -147,7 +149,7 @@ main(int argc, char **argv)
defs = PQconndefaults();
if (defs == NULL)
{
- fprintf(stderr, _("%s: could not fetch default options\n"), progname);
+ pg_log_error("could not fetch default options");
exit(PQPING_NO_ATTEMPT);
}
diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c
index 438500cb08a..d6f3efd313d 100644
--- a/src/bin/scripts/reindexdb.c
+++ b/src/bin/scripts/reindexdb.c
@@ -11,6 +11,7 @@
#include "postgres_fe.h"
#include "common.h"
+#include "fe_utils/logging.h"
#include "fe_utils/simple_list.h"
#include "fe_utils/string_utils.h"
@@ -75,6 +76,7 @@ main(int argc, char *argv[])
SimpleStringList tables = {NULL, NULL};
SimpleStringList schemas = {NULL, NULL};
+ pg_logging_init(argv[0]);
progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
@@ -151,8 +153,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);
}
@@ -163,27 +165,27 @@ main(int argc, char *argv[])
{
if (dbname)
{
- fprintf(stderr, _("%s: cannot reindex all databases and a specific one at the same time\n"), progname);
+ pg_log_error("cannot reindex all databases and a specific one at the same time");
exit(1);
}
if (syscatalog)
{
- fprintf(stderr, _("%s: cannot reindex all databases and system catalogs at the same time\n"), progname);
+ pg_log_error("cannot reindex all databases and system catalogs at the same time");
exit(1);
}
if (schemas.head != NULL)
{
- fprintf(stderr, _("%s: cannot reindex specific schema(s) in all databases\n"), progname);
+ pg_log_error("cannot reindex specific schema(s) in all databases");
exit(1);
}
if (tables.head != NULL)
{
- fprintf(stderr, _("%s: cannot reindex specific table(s) in all databases\n"), progname);
+ pg_log_error("cannot reindex specific table(s) in all databases");
exit(1);
}
if (indexes.head != NULL)
{
- fprintf(stderr, _("%s: cannot reindex specific index(es) in all databases\n"), progname);
+ pg_log_error("cannot reindex specific index(es) in all databases");
exit(1);
}
@@ -194,17 +196,17 @@ main(int argc, char *argv[])
{
if (schemas.head != NULL)
{
- fprintf(stderr, _("%s: cannot reindex specific schema(s) and system catalogs at the same time\n"), progname);
+ pg_log_error("cannot reindex specific schema(s) and system catalogs at the same time");
exit(1);
}
if (tables.head != NULL)
{
- fprintf(stderr, _("%s: cannot reindex specific table(s) and system catalogs at the same time\n"), progname);
+ pg_log_error("cannot reindex specific table(s) and system catalogs at the same time");
exit(1);
}
if (indexes.head != NULL)
{
- fprintf(stderr, _("%s: cannot reindex specific index(es) and system catalogs at the same time\n"), progname);
+ pg_log_error("cannot reindex specific index(es) and system catalogs at the same time");
exit(1);
}
@@ -293,8 +295,8 @@ reindex_one_database(const char *name, const char *dbname, const char *type,
if (concurrently && PQserverVersion(conn) < 120000)
{
PQfinish(conn);
- fprintf(stderr, _("%s: cannot use the \"%s\" option on server versions older than PostgreSQL %s\n"),
- progname, "concurrently", "12");
+ pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL %s",
+ "concurrently", "12");
exit(1);
}
@@ -321,17 +323,17 @@ reindex_one_database(const char *name, const char *dbname, const char *type,
if (!executeMaintenanceCommand(conn, sql.data, echo))
{
if (strcmp(type, "TABLE") == 0)
- fprintf(stderr, _("%s: reindexing of table \"%s\" in database \"%s\" failed: %s"),
- progname, name, PQdb(conn), PQerrorMessage(conn));
+ pg_log_error("reindexing of table \"%s\" in database \"%s\" failed: %s",
+ name, PQdb(conn), PQerrorMessage(conn));
if (strcmp(type, "INDEX") == 0)
- fprintf(stderr, _("%s: reindexing of index \"%s\" in database \"%s\" failed: %s"),
- progname, name, PQdb(conn), PQerrorMessage(conn));
+ pg_log_error("reindexing of index \"%s\" in database \"%s\" failed: %s",
+ name, PQdb(conn), PQerrorMessage(conn));
if (strcmp(type, "SCHEMA") == 0)
- fprintf(stderr, _("%s: reindexing of schema \"%s\" in database \"%s\" failed: %s"),
- progname, name, PQdb(conn), PQerrorMessage(conn));
+ pg_log_error("reindexing of schema \"%s\" in database \"%s\" failed: %s",
+ name, PQdb(conn), PQerrorMessage(conn));
else
- fprintf(stderr, _("%s: reindexing of database \"%s\" failed: %s"),
- progname, PQdb(conn), PQerrorMessage(conn));
+ pg_log_error("reindexing of database \"%s\" failed: %s",
+ PQdb(conn), PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
@@ -407,8 +409,8 @@ reindex_system_catalogs(const char *dbname, const char *host, const char *port,
if (!executeMaintenanceCommand(conn, sql.data, echo))
{
- fprintf(stderr, _("%s: reindexing of system catalogs failed: %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("reindexing of system catalogs failed: %s",
+ PQerrorMessage(conn));
PQfinish(conn);
exit(1);
}
diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c
index 5ac41ea757b..25ff19e0a1d 100644
--- a/src/bin/scripts/vacuumdb.c
+++ b/src/bin/scripts/vacuumdb.c
@@ -20,6 +20,7 @@
#include "common.h"
#include "fe_utils/connect.h"
+#include "fe_utils/logging.h"
#include "fe_utils/simple_list.h"
#include "fe_utils/string_utils.h"
@@ -141,8 +142,8 @@ main(int argc, char *argv[])
/* initialize options to all false */
memset(&vacopts, 0, sizeof(vacopts));
+ pg_logging_init(argv[0]);
progname = get_progname(argv[0]);
-
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, "vacuumdb", help);
@@ -203,14 +204,13 @@ main(int argc, char *argv[])
concurrentCons = atoi(optarg);
if (concurrentCons <= 0)
{
- fprintf(stderr, _("%s: number of parallel jobs must be at least 1\n"),
- progname);
+ pg_log_error("number of parallel jobs must be at least 1");
exit(1);
}
if (concurrentCons > FD_SETSIZE - 1)
{
- fprintf(stderr, _("%s: too many parallel jobs requested (maximum: %d)\n"),
- progname, FD_SETSIZE - 1);
+ pg_log_error("too many parallel jobs requested (maximum: %d)",
+ FD_SETSIZE - 1);
exit(1);
}
break;
@@ -230,8 +230,7 @@ main(int argc, char *argv[])
vacopts.min_xid_age = atoi(optarg);
if (vacopts.min_xid_age <= 0)
{
- fprintf(stderr, _("%s: minimum transaction ID age must be at least 1\n"),
- progname);
+ pg_log_error("minimum transaction ID age must be at least 1");
exit(1);
}
break;
@@ -239,8 +238,7 @@ main(int argc, char *argv[])
vacopts.min_mxid_age = atoi(optarg);
if (vacopts.min_mxid_age <= 0)
{
- fprintf(stderr, _("%s: minimum multixact ID age must be at least 1\n"),
- progname);
+ pg_log_error("minimum multixact ID age must be at least 1");
exit(1);
}
break;
@@ -262,8 +260,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);
}
@@ -272,20 +270,20 @@ main(int argc, char *argv[])
{
if (vacopts.full)
{
- fprintf(stderr, _("%s: cannot use the \"%s\" option when performing only analyze\n"),
- progname, "full");
+ pg_log_error("cannot use the \"%s\" option when performing only analyze",
+ "full");
exit(1);
}
if (vacopts.freeze)
{
- fprintf(stderr, _("%s: cannot use the \"%s\" option when performing only analyze\n"),
- progname, "freeze");
+ pg_log_error("cannot use the \"%s\" option when performing only analyze",
+ "freeze");
exit(1);
}
if (vacopts.disable_page_skipping)
{
- fprintf(stderr, _("%s: cannot use the \"%s\" option when performing only analyze\n"),
- progname, "disable-page-skipping");
+ pg_log_error("cannot use the \"%s\" option when performing only analyze",
+ "disable-page-skipping");
exit(1);
}
/* allow 'and_analyze' with 'analyze_only' */
@@ -301,14 +299,12 @@ main(int argc, char *argv[])
{
if (dbname)
{
- fprintf(stderr, _("%s: cannot vacuum all databases and a specific one at the same time\n"),
- progname);
+ pg_log_error("cannot vacuum all databases and a specific one at the same time");
exit(1);
}
if (tables.head != NULL)
{
- fprintf(stderr, _("%s: cannot vacuum specific table(s) in all databases\n"),
- progname);
+ pg_log_error("cannot vacuum specific table(s) in all databases");
exit(1);
}
@@ -413,30 +409,30 @@ vacuum_one_database(const char *dbname, vacuumingOptions *vacopts,
if (vacopts->disable_page_skipping && PQserverVersion(conn) < 90600)
{
PQfinish(conn);
- fprintf(stderr, _("%s: cannot use the \"%s\" option on server versions older than PostgreSQL 9.6\n"),
- progname, "disable-page-skipping");
+ pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL 9.6",
+ "disable-page-skipping");
exit(1);
}
if (vacopts->skip_locked && PQserverVersion(conn) < 120000)
{
PQfinish(conn);
- fprintf(stderr, _("%s: cannot use the \"%s\" option on server versions older than PostgreSQL 12\n"),
- progname, "skip-locked");
+ pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL 12",
+ "skip-locked");
exit(1);
}
if (vacopts->min_xid_age != 0 && PQserverVersion(conn) < 90600)
{
- fprintf(stderr, _("%s: cannot use the \"%s\" option on server versions older than PostgreSQL 9.6\n"),
- progname, "--min-xid-age");
+ pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL 9.6",
+ "--min-xid-age");
exit(1);
}
if (vacopts->min_mxid_age != 0 && PQserverVersion(conn) < 90600)
{
- fprintf(stderr, _("%s: cannot use the \"%s\" option on server versions older than PostgreSQL 9.6\n"),
- progname, "--min-mxid-age");
+ pg_log_error("cannot use the \"%s\" option on server versions older than PostgreSQL 9.6",
+ "--min-mxid-age");
exit(1);
}
@@ -940,12 +936,11 @@ run_vacuum_command(PGconn *conn, const char *sql, bool echo,
if (!status)
{
if (table)
- fprintf(stderr,
- _("%s: vacuuming of table \"%s\" in database \"%s\" failed: %s"),
- progname, table, PQdb(conn), PQerrorMessage(conn));
+ pg_log_error("vacuuming of table \"%s\" in database \"%s\" failed: %s",
+ table, PQdb(conn), PQerrorMessage(conn));
else
- fprintf(stderr, _("%s: vacuuming of database \"%s\" failed: %s"),
- progname, PQdb(conn), PQerrorMessage(conn));
+ pg_log_error("vacuuming of database \"%s\" failed: %s",
+ PQdb(conn), PQerrorMessage(conn));
if (!async)
{
@@ -1079,8 +1074,8 @@ ProcessQueryResult(PGconn *conn, PGresult *result, const char *progname)
{
char *sqlState = PQresultErrorField(result, PG_DIAG_SQLSTATE);
- fprintf(stderr, _("%s: vacuuming of database \"%s\" failed: %s"),
- progname, PQdb(conn), PQerrorMessage(conn));
+ pg_log_error("vacuuming of database \"%s\" failed: %s",
+ PQdb(conn), PQerrorMessage(conn));
if (sqlState && strcmp(sqlState, ERRCODE_UNDEFINED_TABLE) != 0)
{
diff --git a/src/common/controldata_utils.c b/src/common/controldata_utils.c
index 567281349e0..efca14ba544 100644
--- a/src/common/controldata_utils.c
+++ b/src/common/controldata_utils.c
@@ -28,6 +28,9 @@
#include "catalog/pg_control.h"
#include "common/controldata_utils.h"
#include "common/file_perm.h"
+#ifdef FRONTEND
+#include "fe_utils/logging.h"
+#endif
#include "port/pg_crc32c.h"
#ifndef FRONTEND
@@ -45,7 +48,7 @@
* file data is correct.
*/
ControlFileData *
-get_controlfile(const char *DataDir, const char *progname, bool *crc_ok_p)
+get_controlfile(const char *DataDir, bool *crc_ok_p)
{
ControlFileData *ControlFile;
int fd;
@@ -67,8 +70,8 @@ get_controlfile(const char *DataDir, const char *progname, bool *crc_ok_p)
#else
if ((fd = open(ControlFilePath, O_RDONLY | PG_BINARY, 0)) == -1)
{
- fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"),
- progname, ControlFilePath, strerror(errno));
+ pg_log_fatal("could not open file \"%s\" for reading: %m",
+ ControlFilePath);
exit(EXIT_FAILURE);
}
#endif
@@ -83,8 +86,7 @@ get_controlfile(const char *DataDir, const char *progname, bool *crc_ok_p)
errmsg("could not read file \"%s\": %m", ControlFilePath)));
#else
{
- fprintf(stderr, _("%s: could not read file \"%s\": %s\n"),
- progname, ControlFilePath, strerror(errno));
+ pg_log_fatal("could not read file \"%s\": %m", ControlFilePath);
exit(EXIT_FAILURE);
}
#endif
@@ -96,8 +98,8 @@ get_controlfile(const char *DataDir, const char *progname, bool *crc_ok_p)
ControlFilePath, r, sizeof(ControlFileData))));
#else
{
- fprintf(stderr, _("%s: could not read file \"%s\": read %d of %zu\n"),
- progname, ControlFilePath, r, sizeof(ControlFileData));
+ pg_log_fatal("could not read file \"%s\": read %d of %zu",
+ ControlFilePath, r, sizeof(ControlFileData));
exit(EXIT_FAILURE);
}
#endif
@@ -112,8 +114,7 @@ get_controlfile(const char *DataDir, const char *progname, bool *crc_ok_p)
#else
if (close(fd))
{
- fprintf(stderr, _("%s: could not close file \"%s\": %s\n"),
- progname, ControlFilePath, strerror(errno));
+ pg_log_fatal("could not close file \"%s\": %m", ControlFilePath);
exit(EXIT_FAILURE);
}
#endif
@@ -133,10 +134,10 @@ get_controlfile(const char *DataDir, const char *progname, bool *crc_ok_p)
#ifndef FRONTEND
elog(ERROR, _("byte ordering mismatch"));
#else
- printf(_("WARNING: possible byte ordering mismatch\n"
- "The byte ordering used to store the pg_control file might not match the one\n"
- "used by this program. In that case the results below would be incorrect, and\n"
- "the PostgreSQL installation would be incompatible with this data directory.\n"));
+ pg_log_warning("possible byte ordering mismatch\n"
+ "The byte ordering used to store the pg_control file might not match the one\n"
+ "used by this program. In that case the results below would be incorrect, and\n"
+ "the PostgreSQL installation would be incompatible with this data directory.");
#endif
return ControlFile;
@@ -152,7 +153,7 @@ get_controlfile(const char *DataDir, const char *progname, bool *crc_ok_p)
* routine in the backend.
*/
void
-update_controlfile(const char *DataDir, const char *progname,
+update_controlfile(const char *DataDir,
ControlFileData *ControlFile, bool do_sync)
{
int fd;
@@ -199,8 +200,7 @@ update_controlfile(const char *DataDir, const char *progname,
if ((fd = open(ControlFilePath, O_WRONLY | PG_BINARY,
pg_file_create_mode)) == -1)
{
- fprintf(stderr, _("%s: could not open file \"%s\": %s\n"),
- progname, ControlFilePath, strerror(errno));
+ pg_log_fatal("could not open file \"%s\": %m", ControlFilePath);
exit(EXIT_FAILURE);
}
#endif
@@ -221,8 +221,7 @@ update_controlfile(const char *DataDir, const char *progname,
errmsg("could not write file \"%s\": %m",
ControlFilePath)));
#else
- fprintf(stderr, _("%s: could not write \"%s\": %s\n"),
- progname, ControlFilePath, strerror(errno));
+ pg_log_fatal("could not write file \"%s\": %m", ControlFilePath);
exit(EXIT_FAILURE);
#endif
}
@@ -243,8 +242,7 @@ update_controlfile(const char *DataDir, const char *progname,
#else
if (fsync(fd) != 0)
{
- fprintf(stderr, _("%s: could not fsync file \"%s\": %s\n"),
- progname, ControlFilePath, strerror(errno));
+ pg_log_fatal("could not fsync file \"%s\": %m", ControlFilePath);
exit(EXIT_FAILURE);
}
#endif
@@ -258,8 +256,7 @@ update_controlfile(const char *DataDir, const char *progname,
errmsg("could not close file \"%s\": %m",
ControlFilePath)));
#else
- fprintf(stderr, _("%s: could not close file \"%s\": %s\n"),
- progname, ControlFilePath, strerror(errno));
+ pg_log_fatal("could not close file \"%s\": %m", ControlFilePath);
exit(EXIT_FAILURE);
#endif
}
diff --git a/src/common/file_utils.c b/src/common/file_utils.c
index c25713d0e50..a43c82b4b44 100644
--- a/src/common/file_utils.c
+++ b/src/common/file_utils.c
@@ -20,6 +20,7 @@
#include
#include "common/file_utils.h"
+#include "fe_utils/logging.h"
/* Define PG_FLUSH_DATA_WORKS if we have an implementation for pg_flush_data */
@@ -35,12 +36,11 @@
#define MINIMUM_VERSION_FOR_PG_WAL 100000
#ifdef PG_FLUSH_DATA_WORKS
-static int pre_sync_fname(const char *fname, bool isdir,
- const char *progname);
+static int pre_sync_fname(const char *fname, bool isdir);
#endif
static void walkdir(const char *path,
- int (*action) (const char *fname, bool isdir, const char *progname),
- bool process_symlinks, const char *progname);
+ int (*action) (const char *fname, bool isdir),
+ bool process_symlinks);
/*
* Issue fsync recursively on PGDATA and all its contents.
@@ -56,7 +56,6 @@ static void walkdir(const char *path,
*/
void
fsync_pgdata(const char *pg_data,
- const char *progname,
int serverVersion)
{
bool xlog_is_symlink;
@@ -79,8 +78,7 @@ fsync_pgdata(const char *pg_data,
struct stat st;
if (lstat(pg_wal, &st) < 0)
- fprintf(stderr, _("%s: could not stat file \"%s\": %s\n"),
- progname, pg_wal, strerror(errno));
+ pg_log_error("could not stat file \"%s\": %m", pg_wal);
else if (S_ISLNK(st.st_mode))
xlog_is_symlink = true;
}
@@ -94,10 +92,10 @@ fsync_pgdata(const char *pg_data,
* directory and its contents.
*/
#ifdef PG_FLUSH_DATA_WORKS
- walkdir(pg_data, pre_sync_fname, false, progname);
+ walkdir(pg_data, pre_sync_fname, false);
if (xlog_is_symlink)
- walkdir(pg_wal, pre_sync_fname, false, progname);
- walkdir(pg_tblspc, pre_sync_fname, true, progname);
+ walkdir(pg_wal, pre_sync_fname, false);
+ walkdir(pg_tblspc, pre_sync_fname, true);
#endif
/*
@@ -109,10 +107,10 @@ fsync_pgdata(const char *pg_data,
* in pg_tblspc, they'll get fsync'd twice. That's not an expected case
* so we don't worry about optimizing it.
*/
- walkdir(pg_data, fsync_fname, false, progname);
+ walkdir(pg_data, fsync_fname, false);
if (xlog_is_symlink)
- walkdir(pg_wal, fsync_fname, false, progname);
- walkdir(pg_tblspc, fsync_fname, true, progname);
+ walkdir(pg_wal, fsync_fname, false);
+ walkdir(pg_tblspc, fsync_fname, true);
}
/*
@@ -121,17 +119,17 @@ fsync_pgdata(const char *pg_data,
* This is a convenient wrapper on top of walkdir().
*/
void
-fsync_dir_recurse(const char *dir, const char *progname)
+fsync_dir_recurse(const char *dir)
{
/*
* If possible, hint to the kernel that we're soon going to fsync the data
* directory and its contents.
*/
#ifdef PG_FLUSH_DATA_WORKS
- walkdir(dir, pre_sync_fname, false, progname);
+ walkdir(dir, pre_sync_fname, false);
#endif
- walkdir(dir, fsync_fname, false, progname);
+ walkdir(dir, fsync_fname, false);
}
/*
@@ -150,8 +148,8 @@ fsync_dir_recurse(const char *dir, const char *progname)
*/
static void
walkdir(const char *path,
- int (*action) (const char *fname, bool isdir, const char *progname),
- bool process_symlinks, const char *progname)
+ int (*action) (const char *fname, bool isdir),
+ bool process_symlinks)
{
DIR *dir;
struct dirent *de;
@@ -159,8 +157,7 @@ walkdir(const char *path,
dir = opendir(path);
if (dir == NULL)
{
- fprintf(stderr, _("%s: could not open directory \"%s\": %s\n"),
- progname, path, strerror(errno));
+ pg_log_error("could not open directory \"%s\": %m", path);
return;
}
@@ -183,20 +180,18 @@ walkdir(const char *path,
if (sret < 0)
{
- fprintf(stderr, _("%s: could not stat file \"%s\": %s\n"),
- progname, subpath, strerror(errno));
+ pg_log_error("could not stat file \"%s\": %m", subpath);
continue;
}
if (S_ISREG(fst.st_mode))
- (*action) (subpath, false, progname);
+ (*action) (subpath, false);
else if (S_ISDIR(fst.st_mode))
- walkdir(subpath, action, false, progname);
+ walkdir(subpath, action, false);
}
if (errno)
- fprintf(stderr, _("%s: could not read directory \"%s\": %s\n"),
- progname, path, strerror(errno));
+ pg_log_error("could not read directory \"%s\": %m", path);
(void) closedir(dir);
@@ -206,7 +201,7 @@ walkdir(const char *path,
* synced. Recent versions of ext4 have made the window much wider but
* it's been an issue for ext3 and other filesystems in the past.
*/
- (*action) (path, true, progname);
+ (*action) (path, true);
}
/*
@@ -218,7 +213,7 @@ walkdir(const char *path,
#ifdef PG_FLUSH_DATA_WORKS
static int
-pre_sync_fname(const char *fname, bool isdir, const char *progname)
+pre_sync_fname(const char *fname, bool isdir)
{
int fd;
@@ -228,8 +223,7 @@ pre_sync_fname(const char *fname, bool isdir, const char *progname)
{
if (errno == EACCES || (isdir && errno == EISDIR))
return 0;
- fprintf(stderr, _("%s: could not open file \"%s\": %s\n"),
- progname, fname, strerror(errno));
+ pg_log_error("could not open file \"%s\": %m", fname);
return -1;
}
@@ -260,7 +254,7 @@ pre_sync_fname(const char *fname, bool isdir, const char *progname)
* other errors non-fatally.
*/
int
-fsync_fname(const char *fname, bool isdir, const char *progname)
+fsync_fname(const char *fname, bool isdir)
{
int fd;
int flags;
@@ -288,8 +282,7 @@ fsync_fname(const char *fname, bool isdir, const char *progname)
{
if (errno == EACCES || (isdir && errno == EISDIR))
return 0;
- fprintf(stderr, _("%s: could not open file \"%s\": %s\n"),
- progname, fname, strerror(errno));
+ pg_log_error("could not open file \"%s\": %m", fname);
return -1;
}
@@ -301,8 +294,7 @@ fsync_fname(const char *fname, bool isdir, const char *progname)
*/
if (returncode != 0 && !(isdir && (errno == EBADF || errno == EINVAL)))
{
- fprintf(stderr, _("%s: could not fsync file \"%s\": %s\n"),
- progname, fname, strerror(errno));
+ pg_log_error("could not fsync file \"%s\": %m", fname);
(void) close(fd);
return -1;
}
@@ -318,7 +310,7 @@ fsync_fname(const char *fname, bool isdir, const char *progname)
* an OS crash or power failure.
*/
int
-fsync_parent_path(const char *fname, const char *progname)
+fsync_parent_path(const char *fname)
{
char parentpath[MAXPGPATH];
@@ -333,7 +325,7 @@ fsync_parent_path(const char *fname, const char *progname)
if (strlen(parentpath) == 0)
strlcpy(parentpath, ".", MAXPGPATH);
- if (fsync_fname(parentpath, true, progname) != 0)
+ if (fsync_fname(parentpath, true) != 0)
return -1;
return 0;
@@ -345,7 +337,7 @@ fsync_parent_path(const char *fname, const char *progname)
* Wrapper around rename, similar to the backend version.
*/
int
-durable_rename(const char *oldfile, const char *newfile, const char *progname)
+durable_rename(const char *oldfile, const char *newfile)
{
int fd;
@@ -356,7 +348,7 @@ durable_rename(const char *oldfile, const char *newfile, const char *progname)
* because it's then guaranteed that either source or target file exists
* after a crash.
*/
- if (fsync_fname(oldfile, false, progname) != 0)
+ if (fsync_fname(oldfile, false) != 0)
return -1;
fd = open(newfile, PG_BINARY | O_RDWR, 0);
@@ -364,8 +356,7 @@ durable_rename(const char *oldfile, const char *newfile, const char *progname)
{
if (errno != ENOENT)
{
- fprintf(stderr, _("%s: could not open file \"%s\": %s\n"),
- progname, newfile, strerror(errno));
+ pg_log_error("could not open file \"%s\": %m", newfile);
return -1;
}
}
@@ -373,8 +364,7 @@ durable_rename(const char *oldfile, const char *newfile, const char *progname)
{
if (fsync(fd) != 0)
{
- fprintf(stderr, _("%s: could not fsync file \"%s\": %s\n"),
- progname, newfile, strerror(errno));
+ pg_log_error("could not fsync file \"%s\": %m", newfile);
close(fd);
return -1;
}
@@ -384,8 +374,8 @@ durable_rename(const char *oldfile, const char *newfile, const char *progname)
/* Time to do the real deal... */
if (rename(oldfile, newfile) != 0)
{
- fprintf(stderr, _("%s: could not rename file \"%s\" to \"%s\": %s\n"),
- progname, oldfile, newfile, strerror(errno));
+ pg_log_error("could not rename file \"%s\" to \"%s\": %m",
+ oldfile, newfile);
return -1;
}
@@ -393,10 +383,10 @@ durable_rename(const char *oldfile, const char *newfile, const char *progname)
* To guarantee renaming the file is persistent, fsync the file with its
* new name, and its containing directory.
*/
- if (fsync_fname(newfile, false, progname) != 0)
+ if (fsync_fname(newfile, false) != 0)
return -1;
- if (fsync_parent_path(newfile, progname) != 0)
+ if (fsync_parent_path(newfile) != 0)
return -1;
return 0;
diff --git a/src/common/pgfnames.c b/src/common/pgfnames.c
index f9e0a69be04..95b17e47d89 100644
--- a/src/common/pgfnames.c
+++ b/src/common/pgfnames.c
@@ -20,6 +20,12 @@
#include
+#ifndef FRONTEND
+#define pg_log_warning(...) elog(WARNING, __VA_ARGS__)
+#else
+#include "fe_utils/logging.h"
+#endif
+
/*
* pgfnames
*
@@ -39,12 +45,7 @@ pgfnames(const char *path)
dir = opendir(path);
if (dir == NULL)
{
-#ifndef FRONTEND
- elog(WARNING, "could not open directory \"%s\": %m", path);
-#else
- fprintf(stderr, _("could not open directory \"%s\": %s\n"),
- path, strerror(errno));
-#endif
+ pg_log_warning("could not open directory \"%s\": %m", path);
return NULL;
}
@@ -65,26 +66,12 @@ pgfnames(const char *path)
}
if (errno)
- {
-#ifndef FRONTEND
- elog(WARNING, "could not read directory \"%s\": %m", path);
-#else
- fprintf(stderr, _("could not read directory \"%s\": %s\n"),
- path, strerror(errno));
-#endif
- }
+ pg_log_warning("could not read directory \"%s\": %m", path);
filenames[numnames] = NULL;
if (closedir(dir))
- {
-#ifndef FRONTEND
- elog(WARNING, "could not close directory \"%s\": %m", path);
-#else
- fprintf(stderr, _("could not close directory \"%s\": %s\n"),
- path, strerror(errno));
-#endif
- }
+ pg_log_warning("could not close directory \"%s\": %m", path);
return filenames;
}
diff --git a/src/common/restricted_token.c b/src/common/restricted_token.c
index c4ccc0e55c6..3f57ff8b40b 100644
--- a/src/common/restricted_token.c
+++ b/src/common/restricted_token.c
@@ -21,6 +21,7 @@
#include "postgres_fe.h"
#include "common/restricted_token.h"
+#include "fe_utils/logging.h"
#ifdef WIN32
@@ -43,7 +44,7 @@ typedef BOOL (WINAPI * __CreateRestrictedToken) (HANDLE, DWORD, DWORD, PSID_AND_
* NOT execute anything.
*/
HANDLE
-CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, const char *progname)
+CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo)
{
BOOL b;
STARTUPINFO si;
@@ -65,7 +66,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, const char
if (_CreateRestrictedToken == NULL)
{
- fprintf(stderr, _("%s: WARNING: cannot create restricted tokens on this platform\n"), progname);
+ pg_log_warning("cannot create restricted tokens on this platform");
if (Advapi32Handle != NULL)
FreeLibrary(Advapi32Handle);
return 0;
@@ -74,7 +75,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, const char
/* Open the current token to use as a base for the restricted one */
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &origToken))
{
- fprintf(stderr, _("%s: could not open process token: error code %lu\n"), progname, GetLastError());
+ pg_log_error("could not open process token: error code %lu", GetLastError());
return 0;
}
@@ -87,8 +88,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, const char
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_POWER_USERS, 0, 0, 0, 0, 0,
0, &dropSids[1].Sid))
{
- fprintf(stderr, _("%s: could not allocate SIDs: error code %lu\n"),
- progname, GetLastError());
+ pg_log_error("could not allocate SIDs: error code %lu", GetLastError());
return 0;
}
@@ -107,8 +107,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, const char
if (!b)
{
- fprintf(stderr, _("%s: could not create restricted token: error code %lu\n"),
- progname, GetLastError());
+ pg_log_error("could not create restricted token: error code %lu", GetLastError());
return 0;
}
@@ -129,7 +128,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, const char
processInfo))
{
- fprintf(stderr, _("%s: could not start process for command \"%s\": error code %lu\n"), progname, cmd, GetLastError());
+ pg_log_error("could not start process for command \"%s\": error code %lu", cmd, GetLastError());
return 0;
}
@@ -143,7 +142,7 @@ CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, const char
* On other platforms do nothing.
*/
void
-get_restricted_token(const char *progname)
+get_restricted_token(void)
{
#ifdef WIN32
HANDLE restrictedToken;
@@ -165,9 +164,9 @@ get_restricted_token(const char *progname)
putenv("PG_RESTRICT_EXEC=1");
- if ((restrictedToken = CreateRestrictedProcess(cmdline, &pi, progname)) == 0)
+ if ((restrictedToken = CreateRestrictedProcess(cmdline, &pi)) == 0)
{
- fprintf(stderr, _("%s: could not re-execute with restricted token: error code %lu\n"), progname, GetLastError());
+ pg_log_error("could not re-execute with restricted token: error code %lu", GetLastError());
}
else
{
@@ -183,7 +182,7 @@ get_restricted_token(const char *progname)
if (!GetExitCodeProcess(pi.hProcess, &x))
{
- fprintf(stderr, _("%s: could not get exit code from subprocess: error code %lu\n"), progname, GetLastError());
+ pg_log_error("could not get exit code from subprocess: error code %lu", GetLastError());
exit(1);
}
exit(x);
diff --git a/src/common/rmtree.c b/src/common/rmtree.c
index 57164d45d67..3052d013ee9 100644
--- a/src/common/rmtree.c
+++ b/src/common/rmtree.c
@@ -20,6 +20,12 @@
#include
#include
+#ifndef FRONTEND
+#define pg_log_warning(...) elog(WARNING, __VA_ARGS__)
+#else
+#include "fe_utils/logging.h"
+#endif
+
/*
* rmtree
@@ -70,13 +76,8 @@ rmtree(const char *path, bool rmtopdir)
{
if (errno != ENOENT)
{
-#ifndef FRONTEND
- elog(WARNING, "could not stat file or directory \"%s\": %m",
+ pg_log_warning("could not stat file or directory \"%s\": %m",
pathbuf);
-#else
- fprintf(stderr, _("could not stat file or directory \"%s\": %s\n"),
- pathbuf, strerror(errno));
-#endif
result = false;
}
continue;
@@ -97,13 +98,8 @@ rmtree(const char *path, bool rmtopdir)
{
if (errno != ENOENT)
{
-#ifndef FRONTEND
- elog(WARNING, "could not remove file or directory \"%s\": %m",
+ pg_log_warning("could not remove file or directory \"%s\": %m",
pathbuf);
-#else
- fprintf(stderr, _("could not remove file or directory \"%s\": %s\n"),
- pathbuf, strerror(errno));
-#endif
result = false;
}
}
@@ -114,13 +110,8 @@ rmtree(const char *path, bool rmtopdir)
{
if (rmdir(path) != 0)
{
-#ifndef FRONTEND
- elog(WARNING, "could not remove file or directory \"%s\": %m",
+ pg_log_warning("could not remove file or directory \"%s\": %m",
path);
-#else
- fprintf(stderr, _("could not remove file or directory \"%s\": %s\n"),
- path, strerror(errno));
-#endif
result = false;
}
}
diff --git a/src/fe_utils/Makefile b/src/fe_utils/Makefile
index 7d738003237..960ecf0b6ab 100644
--- a/src/fe_utils/Makefile
+++ b/src/fe_utils/Makefile
@@ -19,7 +19,7 @@ include $(top_builddir)/src/Makefile.global
override CPPFLAGS := -DFRONTEND -I$(libpq_srcdir) $(CPPFLAGS)
-OBJS = mbprint.o print.o psqlscan.o simple_list.o string_utils.o conditional.o
+OBJS = logging.o mbprint.o print.o psqlscan.o simple_list.o string_utils.o conditional.o
all: libpgfeutils.a
diff --git a/src/fe_utils/logging.c b/src/fe_utils/logging.c
new file mode 100644
index 00000000000..2f571ae3c98
--- /dev/null
+++ b/src/fe_utils/logging.c
@@ -0,0 +1,228 @@
+/*-------------------------------------------------------------------------
+ * Logging framework for frontend programs
+ *
+ * Copyright (c) 2018, PostgreSQL Global Development Group
+ *
+ * src/fe_utils/logging.c
+ *
+ *-------------------------------------------------------------------------
+ */
+#include "postgres_fe.h"
+
+#include
+
+#include "fe_utils/logging.h"
+
+static const char *progname;
+
+enum pg_log_level __pg_log_level;
+static int log_flags;
+void (*log_pre_callback)(void);
+void (*log_locus_callback)(const char **, uint64 *);
+
+static const char *sgr_error = NULL;
+static const char *sgr_warning = NULL;
+static const char *sgr_locus = NULL;
+
+#define SGR_ERROR_DEFAULT "01;31"
+#define SGR_WARNING_DEFAULT "01;35"
+#define SGR_LOCUS_DEFAULT "01"
+
+#define ANSI_ESCAPE_FMT "\x1b[%sm"
+#define ANSI_ESCAPE_RESET "\x1b[0m"
+
+/*
+ * This should be called before any output happens.
+ */
+void
+pg_logging_init(const char *argv0)
+{
+ const char *pg_color_env = getenv("PG_COLOR");
+ bool log_color = false;
+
+ /* usually the default, but not on Windows */
+ setvbuf(stderr, NULL, _IONBF, 0);
+
+ progname = get_progname(argv0);
+ __pg_log_level = PG_LOG_INFO;
+
+ if (pg_color_env)
+ {
+ if (strcmp(pg_color_env, "always") == 0 ||
+ (strcmp(pg_color_env, "auto") == 0 && isatty(fileno(stderr))))
+ log_color = true;
+ }
+
+ if (log_color)
+ {
+ const char *pg_colors_env = getenv("PG_COLORS");
+
+ if (pg_colors_env)
+ {
+ char *colors = strdup(pg_colors_env);
+
+ if (colors)
+ {
+ for (char *token = strtok(colors, ":"); token; token = strtok(NULL, ":"))
+ {
+ char *e = strchr(token, '=');
+
+ if (e)
+ {
+ char *name;
+ char *value;
+
+ *e = '\0';
+ name = token;
+ value = e + 1;
+
+ if (strcmp(name, "error") == 0)
+ sgr_error = strdup(value);
+ if (strcmp(name, "warning") == 0)
+ sgr_warning = strdup(value);
+ if (strcmp(name, "locus") == 0)
+ sgr_locus = strdup(value);
+ }
+ }
+
+ free(colors);
+ }
+ }
+ else
+ {
+ sgr_error = SGR_ERROR_DEFAULT;
+ sgr_warning = SGR_WARNING_DEFAULT;
+ sgr_locus = SGR_LOCUS_DEFAULT;
+ }
+ }
+}
+
+void
+pg_logging_config(int new_flags)
+{
+ log_flags = new_flags;
+}
+
+void
+pg_logging_set_level(enum pg_log_level new_level)
+{
+ __pg_log_level = new_level;
+}
+
+void
+pg_logging_set_pre_callback(void (*cb)(void))
+{
+ log_pre_callback = cb;
+}
+
+void
+pg_logging_set_locus_callback(void (*cb)(const char **filename, uint64 *lineno))
+{
+ log_locus_callback = cb;
+}
+
+void
+pg_log_generic(enum pg_log_level level, const char * pg_restrict fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ pg_log_generic_v(level, fmt, ap);
+ va_end(ap);
+}
+
+void
+pg_log_generic_v(enum pg_log_level level, const char * pg_restrict fmt, va_list ap)
+{
+ int save_errno = errno;
+ const char *filename = NULL;
+ uint64 lineno = 0;
+ va_list ap2;
+ size_t required_len;
+ char *buf;
+
+ Assert(progname);
+ Assert(level);
+ Assert(fmt);
+ Assert(fmt[strlen(fmt) - 1] != '\n');
+
+ fflush(stdout);
+ if (log_pre_callback)
+ log_pre_callback();
+
+ if (log_locus_callback)
+ log_locus_callback(&filename, &lineno);
+
+ fmt = _(fmt);
+
+ if (!(log_flags & PG_LOG_FLAG_TERSE) || filename)
+ {
+ if (sgr_locus)
+ fprintf(stderr, ANSI_ESCAPE_FMT, sgr_locus);
+ if (!(log_flags & PG_LOG_FLAG_TERSE))
+ fprintf(stderr, "%s:", progname);
+ if (filename)
+ {
+ fprintf(stderr, "%s:", filename);
+ if (lineno > 0)
+ fprintf(stderr, UINT64_FORMAT ":", lineno);
+ }
+ fprintf(stderr, " ");
+ if (sgr_locus)
+ fprintf(stderr, ANSI_ESCAPE_RESET);
+ }
+
+ if (!(log_flags & PG_LOG_FLAG_TERSE))
+ {
+ switch (level)
+ {
+ case PG_LOG_FATAL:
+ if (sgr_error)
+ fprintf(stderr, ANSI_ESCAPE_FMT, sgr_error);
+ fprintf(stderr, _("fatal: "));
+ if (sgr_error)
+ fprintf(stderr, ANSI_ESCAPE_RESET);
+ break;
+ case PG_LOG_ERROR:
+ if (sgr_error)
+ fprintf(stderr, ANSI_ESCAPE_FMT, sgr_error);
+ fprintf(stderr, _("error: "));
+ if (sgr_error)
+ fprintf(stderr, ANSI_ESCAPE_RESET);
+ break;
+ case PG_LOG_WARNING:
+ if (sgr_warning)
+ fprintf(stderr, ANSI_ESCAPE_FMT, sgr_warning);
+ fprintf(stderr, _("warning: "));
+ if (sgr_warning)
+ fprintf(stderr, ANSI_ESCAPE_RESET);
+ break;
+ default:
+ break;
+ }
+ }
+
+ errno = save_errno;
+
+ va_copy(ap2, ap);
+ required_len = vsnprintf(NULL, 0, fmt, ap2) + 1;
+ va_end(ap2);
+
+ buf = pg_malloc_extended(required_len, MCXT_ALLOC_NO_OOM);
+
+ if (!buf)
+ {
+ /* memory trouble, just print what we can and get out of here */
+ vfprintf(stderr, fmt, ap);
+ return;
+ }
+
+ vsnprintf(buf, required_len, fmt, ap);
+
+ /* strip one newline, for PQerrorMessage() */
+ if (buf[required_len - 2] == '\n')
+ buf[required_len - 2] = '\0';
+
+ fprintf(stderr, "%s\n", buf);
+ free(buf);
+}
diff --git a/src/fe_utils/psqlscan.l b/src/fe_utils/psqlscan.l
index b31527b94f4..850754ea952 100644
--- a/src/fe_utils/psqlscan.l
+++ b/src/fe_utils/psqlscan.l
@@ -34,6 +34,7 @@
*/
#include "postgres_fe.h"
+#include "fe_utils/logging.h"
#include "fe_utils/psqlscan.h"
#include "libpq-fe.h"
@@ -725,7 +726,7 @@ other .
if (psqlscan_var_is_current_source(cur_state, varname))
{
/* Recursive expansion --- don't go there */
- cur_state->callbacks->write_error("skipping recursive expansion of variable \"%s\"\n",
+ pg_log_warning("skipping recursive expansion of variable \"%s\"",
varname);
/* Instead copy the string as is */
ECHO;
diff --git a/src/include/common/controldata_utils.h b/src/include/common/controldata_utils.h
index 750ba651649..c5ef9c369be 100644
--- a/src/include/common/controldata_utils.h
+++ b/src/include/common/controldata_utils.h
@@ -12,10 +12,8 @@
#include "catalog/pg_control.h"
-extern ControlFileData *get_controlfile(const char *DataDir,
- const char *progname,
- bool *crc_ok_p);
-extern void update_controlfile(const char *DataDir, const char *progname,
+extern ControlFileData *get_controlfile(const char *DataDir, bool *crc_ok_p);
+extern void update_controlfile(const char *DataDir,
ControlFileData *ControlFile, bool do_sync);
#endif /* COMMON_CONTROLDATA_UTILS_H */
diff --git a/src/include/common/file_utils.h b/src/include/common/file_utils.h
index b1f1a3a1c15..5cb1fd3a00b 100644
--- a/src/include/common/file_utils.h
+++ b/src/include/common/file_utils.h
@@ -15,13 +15,10 @@
#ifndef FILE_UTILS_H
#define FILE_UTILS_H
-extern int fsync_fname(const char *fname, bool isdir,
- const char *progname);
-extern void fsync_pgdata(const char *pg_data, const char *progname,
- int serverVersion);
-extern void fsync_dir_recurse(const char *dir, const char *progname);
-extern int durable_rename(const char *oldfile, const char *newfile,
- const char *progname);
-extern int fsync_parent_path(const char *fname, const char *progname);
+extern int fsync_fname(const char *fname, bool isdir);
+extern void fsync_pgdata(const char *pg_data, int serverVersion);
+extern void fsync_dir_recurse(const char *dir);
+extern int durable_rename(const char *oldfile, const char *newfile);
+extern int fsync_parent_path(const char *fname);
#endif /* FILE_UTILS_H */
diff --git a/src/include/common/restricted_token.h b/src/include/common/restricted_token.h
index d71499d07ed..078385c6a3f 100644
--- a/src/include/common/restricted_token.h
+++ b/src/include/common/restricted_token.h
@@ -14,11 +14,11 @@
* On Windows make sure that we are running with a restricted token,
* On other platforms do nothing.
*/
-void get_restricted_token(const char *progname);
+void get_restricted_token(void);
#ifdef WIN32
/* Create a restricted token and execute the specified process with it. */
-HANDLE CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo, const char *progname);
+HANDLE CreateRestrictedProcess(char *cmd, PROCESS_INFORMATION *processInfo);
#endif
#endif /* COMMON_RESTRICTED_TOKEN_H */
diff --git a/src/include/fe_utils/logging.h b/src/include/fe_utils/logging.h
new file mode 100644
index 00000000000..b5f0ddc8347
--- /dev/null
+++ b/src/include/fe_utils/logging.h
@@ -0,0 +1,95 @@
+/*-------------------------------------------------------------------------
+ * Logging framework for frontend programs
+ *
+ * Copyright (c) 2018, PostgreSQL Global Development Group
+ *
+ * src/include/fe_utils/logging.h
+ *
+ *-------------------------------------------------------------------------
+ */
+#ifndef FE_UTILS_LOGGING_H
+#define FE_UTILS_LOGGING_H
+
+/*
+ * Log levels are informational only. They do not affect program flow.
+ */
+enum pg_log_level
+{
+ /*
+ * Not initialized yet
+ */
+ PG_LOG_NOTSET = 0,
+
+ /*
+ * Low level messages that are normally off by default.
+ */
+ PG_LOG_DEBUG,
+
+ /*
+ * Any program messages that go to stderr, shown by default. (The
+ * program's normal output should go to stdout and not use the logging
+ * system.)
+ */
+ PG_LOG_INFO,
+
+ /*
+ * Warnings and "almost" errors, depends on the program
+ */
+ PG_LOG_WARNING,
+
+ /*
+ * Errors
+ */
+ PG_LOG_ERROR,
+
+ /*
+ * Severe errors that cause program termination. (One-shot programs may
+ * chose to label even fatal errors as merely "errors". The distinction
+ * is up to the program.)
+ */
+ PG_LOG_FATAL,
+
+ /*
+ * Turn all logging off.
+ */
+ PG_LOG_OFF,
+};
+
+extern enum pg_log_level __pg_log_level;
+
+/*
+ * Kind of a hack to be able to produce the psql output exactly as required by
+ * the regression tests.
+ */
+#define PG_LOG_FLAG_TERSE 1
+
+void pg_logging_init(const char *argv0);
+void pg_logging_config(int new_flags);
+void pg_logging_set_level(enum pg_log_level new_level);
+void pg_logging_set_pre_callback(void (*cb)(void));
+void pg_logging_set_locus_callback(void (*cb)(const char **filename, uint64 *lineno));
+
+void pg_log_generic(enum pg_log_level level, const char * pg_restrict fmt, ...) pg_attribute_printf(2, 3);
+void pg_log_generic_v(enum pg_log_level level, const char * pg_restrict fmt, va_list ap) pg_attribute_printf(2, 0);
+
+#define pg_log_fatal(...) do { \
+ if (likely(__pg_log_level <= PG_LOG_FATAL)) pg_log_generic(PG_LOG_FATAL, __VA_ARGS__); \
+ } while(0)
+
+#define pg_log_error(...) do { \
+ if (likely(__pg_log_level <= PG_LOG_ERROR)) pg_log_generic(PG_LOG_ERROR, __VA_ARGS__); \
+ } while(0)
+
+#define pg_log_warning(...) do { \
+ if (likely(__pg_log_level <= PG_LOG_WARNING)) pg_log_generic(PG_LOG_WARNING, __VA_ARGS__); \
+ } while(0)
+
+#define pg_log_info(...) do { \
+ if (likely(__pg_log_level <= PG_LOG_INFO)) pg_log_generic(PG_LOG_INFO, __VA_ARGS__); \
+ } while(0)
+
+#define pg_log_debug(...) do { \
+ if (unlikely(__pg_log_level <= PG_LOG_DEBUG)) pg_log_generic(PG_LOG_DEBUG, __VA_ARGS__); \
+ } while(0)
+
+#endif /* FE_UTILS_LOGGING_H */
diff --git a/src/include/fe_utils/psqlscan.h b/src/include/fe_utils/psqlscan.h
index 1cf5b2e7fa4..c3a1d581171 100644
--- a/src/include/fe_utils/psqlscan.h
+++ b/src/include/fe_utils/psqlscan.h
@@ -64,13 +64,6 @@ typedef struct PsqlScanCallbacks
/* This pointer can be NULL if no variable substitution is wanted */
char *(*get_variable) (const char *varname, PsqlScanQuoteType quote,
void *passthrough);
- /* Print an error message someplace appropriate */
- /* (very old gcc versions don't support attributes on function pointers) */
-#if defined(__GNUC__) && __GNUC__ < 4
- void (*write_error) (const char *fmt,...);
-#else
- void (*write_error) (const char *fmt,...) pg_attribute_printf(1, 2);
-#endif
} PsqlScanCallbacks;
diff --git a/src/interfaces/ecpg/test/Makefile b/src/interfaces/ecpg/test/Makefile
index be53b7b94dc..e6d6f80eef0 100644
--- a/src/interfaces/ecpg/test/Makefile
+++ b/src/interfaces/ecpg/test/Makefile
@@ -15,6 +15,8 @@ override CPPFLAGS := \
'-DDLSUFFIX="$(DLSUFFIX)"' \
$(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils
+
# default encoding for regression tests
ENCODING = SQL_ASCII
diff --git a/src/nls-global.mk b/src/nls-global.mk
index aa4058f7663..797e0dd683d 100644
--- a/src/nls-global.mk
+++ b/src/nls-global.mk
@@ -67,6 +67,14 @@ BACKEND_COMMON_GETTEXT_FLAGS = \
errhint:1:c-format \
errcontext:1:c-format
+FRONTEND_COMMON_GETTEXT_FILES = $(top_srcdir)/src/fe_utils/logging.c
+
+FRONTEND_COMMON_GETTEXT_TRIGGERS = \
+ pg_log_fatal pg_log_error pg_log_warning pg_log_info pg_log_generic:2 pg_log_generic_v:2
+
+FRONTEND_COMMON_GETTEXT_FLAGS = \
+ pg_log_fatal:1:c-format pg_log_error:1:c-format pg_log_warning:1:c-format pg_log_info:1:c-format pg_log_generic:2:c-format pg_log_generic_v:2:c-format
+
all-po: $(MO_FILES)
diff --git a/src/test/isolation/Makefile b/src/test/isolation/Makefile
index c3c8280ea23..fbbbca05c51 100644
--- a/src/test/isolation/Makefile
+++ b/src/test/isolation/Makefile
@@ -10,6 +10,7 @@ top_builddir = ../../..
include $(top_builddir)/src/Makefile.global
override CPPFLAGS := -I$(srcdir) -I$(libpq_srcdir) -I$(srcdir)/../regress $(CPPFLAGS)
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils
OBJS = specparse.o isolationtester.o $(WIN32RES)
@@ -31,7 +32,7 @@ pg_regress.o: | submake-regress
pg_isolation_regress$(X): isolation_main.o pg_regress.o $(WIN32RES)
$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@
-isolationtester$(X): $(OBJS) | submake-libpq submake-libpgport
+isolationtester$(X): $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils
$(CC) $(CFLAGS) $^ $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@
distprep: specparse.c specscanner.c
diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm
index ce59401cefa..a164cdbd8ca 100644
--- a/src/test/perl/TestLib.pm
+++ b/src/test/perl/TestLib.pm
@@ -73,6 +73,7 @@ BEGIN
delete $ENV{PGUSER};
delete $ENV{PGPORT};
delete $ENV{PGHOST};
+ delete $ENV{PG_COLOR};
$ENV{PGAPPNAME} = basename($0);
diff --git a/src/test/regress/GNUmakefile b/src/test/regress/GNUmakefile
index a24cfd4e016..38fd25e5699 100644
--- a/src/test/regress/GNUmakefile
+++ b/src/test/regress/GNUmakefile
@@ -23,6 +23,8 @@ ifdef MAX_CONNECTIONS
MAXCONNOPT += --max-connections=$(MAX_CONNECTIONS)
endif
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils
+
# stuff to pass into build of pg_regress
EXTRADEFS = '-DHOST_TUPLE="$(host_tuple)"' \
'-DSHELLPROG="$(SHELL)"' \
@@ -36,7 +38,7 @@ EXTRADEFS = '-DHOST_TUPLE="$(host_tuple)"' \
all: pg_regress$(X)
-pg_regress$(X): pg_regress.o pg_regress_main.o $(WIN32RES) | submake-libpgport
+pg_regress$(X): pg_regress.o pg_regress_main.o $(WIN32RES) | submake-libpgport submake-libpgfeutils
$(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@
# dependencies ensure that path changes propagate
diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
index 8111d95b1ea..189abbbdf37 100644
--- a/src/test/regress/pg_regress.c
+++ b/src/test/regress/pg_regress.c
@@ -33,6 +33,7 @@
#include "common/restricted_token.h"
#include "common/username.h"
+#include "fe_utils/logging.h"
#include "getopt_long.h"
#include "libpq/pqcomm.h" /* needed for UNIXSOCK_PATH() */
#include "pg_config_paths.h"
@@ -1174,7 +1175,7 @@ spawn_process(const char *cmdline)
cmdline2 = psprintf("cmd /c \"%s\"", cmdline);
if ((restrictedToken =
- CreateRestrictedProcess(cmdline2, &pi, progname)) == 0)
+ CreateRestrictedProcess(cmdline2, &pi)) == 0)
exit(2);
CloseHandle(pi.hThread);
@@ -2095,10 +2096,11 @@ regression_main(int argc, char *argv[], init_function ifunc, test_function tfunc
char buf[MAXPGPATH * 4];
char buf2[MAXPGPATH * 4];
+ pg_logging_init(argv[0]);
progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_regress"));
- get_restricted_token(progname);
+ get_restricted_token();
atexit(stop_postmaster);
diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index 726f2ba1671..c0c6ff6751f 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -141,7 +141,7 @@ sub mkvcbuild
our @pgcommonbkndfiles = @pgcommonallfiles;
our @pgfeutilsfiles = qw(
- conditional.c mbprint.c print.c psqlscan.l psqlscan.c simple_list.c string_utils.c);
+ conditional.c logging.c mbprint.c print.c psqlscan.l psqlscan.c simple_list.c string_utils.c);
$libpgport = $solution->AddProject('libpgport', 'lib', 'misc');
$libpgport->AddDefine('FRONTEND');
@@ -311,7 +311,7 @@ sub mkvcbuild
$pgregress_ecpg->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
$pgregress_ecpg->AddLibrary('ws2_32.lib');
$pgregress_ecpg->AddDirResourceFile('src/interfaces/ecpg/test');
- $pgregress_ecpg->AddReference($libpgcommon, $libpgport);
+ $pgregress_ecpg->AddReference($libpgfeutils, $libpgcommon, $libpgport);
my $isolation_tester =
$solution->AddProject('isolationtester', 'exe', 'misc');
@@ -337,7 +337,7 @@ sub mkvcbuild
$pgregress_isolation->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
$pgregress_isolation->AddLibrary('ws2_32.lib');
$pgregress_isolation->AddDirResourceFile('src/test/isolation');
- $pgregress_isolation->AddReference($libpgcommon, $libpgport);
+ $pgregress_isolation->AddReference($libpgfeutils, $libpgcommon, $libpgport);
# src/bin
my $D;
@@ -816,7 +816,7 @@ sub mkvcbuild
$pgregress->AddDefine('HOST_TUPLE="i686-pc-win32vc"');
$pgregress->AddLibrary('ws2_32.lib');
$pgregress->AddDirResourceFile('src/test/regress');
- $pgregress->AddReference($libpgcommon, $libpgport);
+ $pgregress->AddReference($libpgfeutils, $libpgcommon, $libpgport);
# fix up pg_waldump once it's been set up
# files symlinked on Unix are copied on windows