summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Eisentraut2019-04-01 12:24:37 +0000
committerPeter Eisentraut2019-04-01 18:01:35 +0000
commitcc8d41511721d25d557fc02a46c053c0a602fed0 (patch)
treed2f92acac085be1b9cc4756260c7a4f83d1b0041
parentb4cc19ab01ffe6a72a915b21aa41536de80923f5 (diff)
Unified logging system for command-line programs
This unifies the various ad hoc logging (message printing, error printing) systems used throughout the command-line programs. Features: - Program name is automatically prefixed. - Message string does not end with newline. This removes a common source of inconsistencies and omissions. - Additionally, a final newline is automatically stripped, simplifying use of PQerrorMessage() etc., another common source of mistakes. - I converted error message strings to use %m where possible. - As a result of the above several points, more translatable message strings can be shared between different components and between frontends and backend, without gratuitous punctuation or whitespace differences. - There is support for setting a "log level". This is not meant to be user-facing, but can be used internally to implement debug or verbose modes. - Lazy argument evaluation, so no significant overhead if logging at some level is disabled. - Some color in the messages, similar to gcc and clang. Set PG_COLOR=auto to try it out. Some colors are predefined, but can be customized by setting PG_COLORS. - Common files (common/, fe_utils/, etc.) can handle logging much more simply by just using one API without worrying too much about the context of the calling program, requiring callbacks, or having to pass "progname" around everywhere. - Some programs called setvbuf() to make sure that stderr is unbuffered, even on Windows. But not all programs did that. This is now done centrally. Soft goals: - Reduces vertical space use and visual complexity of error reporting in the source code. - Encourages more deliberate classification of messages. For example, in some cases it wasn't clear without analyzing the surrounding code whether a message was meant as an error or just an info. - Concepts and terms are vaguely aligned with popular logging frameworks such as log4j and Python logging. This is all just about printing stuff out. Nothing affects program flow (e.g., fatal exits). The uses are just too varied to do that. Some existing code had wrappers that do some kind of print-and-exit, and I adapted those. I tried to keep the output mostly the same, but there is a lot of historical baggage to unwind and special cases to consider, and I might not always have succeeded. One significant change is that pg_rewind used to write all error messages to stdout. That is now changed to stderr. Reviewed-by: Donald Dong <[email protected]> Reviewed-by: Arthur Zakirov <[email protected]> Discussion: https://www.postgresql.org/message-id/flat/[email protected]
-rw-r--r--doc/src/sgml/ref/clusterdb.sgml11
-rw-r--r--doc/src/sgml/ref/createdb.sgml11
-rw-r--r--doc/src/sgml/ref/createuser.sgml11
-rw-r--r--doc/src/sgml/ref/dropdb.sgml11
-rw-r--r--doc/src/sgml/ref/dropuser.sgml11
-rw-r--r--doc/src/sgml/ref/initdb.sgml11
-rw-r--r--doc/src/sgml/ref/pg_basebackup.sgml6
-rw-r--r--doc/src/sgml/ref/pg_checksums.sgml11
-rw-r--r--doc/src/sgml/ref/pg_controldata.sgml11
-rw-r--r--doc/src/sgml/ref/pg_dump.sgml11
-rw-r--r--doc/src/sgml/ref/pg_dumpall.sgml11
-rw-r--r--doc/src/sgml/ref/pg_isready.sgml7
-rw-r--r--doc/src/sgml/ref/pg_receivewal.sgml6
-rw-r--r--doc/src/sgml/ref/pg_recvlogical.sgml7
-rw-r--r--doc/src/sgml/ref/pg_resetwal.sgml17
-rw-r--r--doc/src/sgml/ref/pg_restore.sgml11
-rw-r--r--doc/src/sgml/ref/pg_rewind.sgml7
-rw-r--r--doc/src/sgml/ref/pg_waldump.sgml26
-rw-r--r--doc/src/sgml/ref/psql-ref.sgml11
-rw-r--r--doc/src/sgml/ref/reindexdb.sgml11
-rw-r--r--doc/src/sgml/ref/vacuumdb.sgml11
-rw-r--r--src/backend/access/transam/xlog.c2
-rw-r--r--src/backend/utils/misc/pg_controldata.c8
-rw-r--r--src/bin/initdb/initdb.c266
-rw-r--r--src/bin/initdb/nls.mk5
-rw-r--r--src/bin/pg_archivecleanup/Makefile4
-rw-r--r--src/bin/pg_archivecleanup/nls.mk4
-rw-r--r--src/bin/pg_archivecleanup/pg_archivecleanup.c53
-rw-r--r--src/bin/pg_basebackup/nls.mk5
-rw-r--r--src/bin/pg_basebackup/pg_basebackup.c412
-rw-r--r--src/bin/pg_basebackup/pg_receivewal.c122
-rw-r--r--src/bin/pg_basebackup/pg_recvlogical.c147
-rw-r--r--src/bin/pg_basebackup/receivelog.c204
-rw-r--r--src/bin/pg_basebackup/streamutil.c97
-rw-r--r--src/bin/pg_basebackup/walmethods.c16
-rw-r--r--src/bin/pg_checksums/Makefile4
-rw-r--r--src/bin/pg_checksums/nls.mk4
-rw-r--r--src/bin/pg_checksums/pg_checksums.c72
-rw-r--r--src/bin/pg_controldata/Makefile4
-rw-r--r--src/bin/pg_controldata/pg_controldata.c11
-rw-r--r--src/bin/pg_ctl/Makefile4
-rw-r--r--src/bin/pg_ctl/pg_ctl.c8
-rw-r--r--src/bin/pg_dump/common.c124
-rw-r--r--src/bin/pg_dump/compress_io.c46
-rw-r--r--src/bin/pg_dump/nls.mk16
-rw-r--r--src/bin/pg_dump/parallel.c62
-rw-r--r--src/bin/pg_dump/pg_backup_archiver.c250
-rw-r--r--src/bin/pg_dump/pg_backup_archiver.h15
-rw-r--r--src/bin/pg_dump/pg_backup_custom.c94
-rw-r--r--src/bin/pg_dump/pg_backup_db.c55
-rw-r--r--src/bin/pg_dump/pg_backup_directory.c72
-rw-r--r--src/bin/pg_dump/pg_backup_null.c4
-rw-r--r--src/bin/pg_dump/pg_backup_tar.c88
-rw-r--r--src/bin/pg_dump/pg_backup_utils.c58
-rw-r--r--src/bin/pg_dump/pg_backup_utils.h6
-rw-r--r--src/bin/pg_dump/pg_dump.c334
-rw-r--r--src/bin/pg_dump/pg_dump.h1
-rw-r--r--src/bin/pg_dump/pg_dump_sort.c26
-rw-r--r--src/bin/pg_dump/pg_dumpall.c125
-rw-r--r--src/bin/pg_dump/pg_restore.c36
-rw-r--r--src/bin/pg_dump/t/001_basic.pl54
-rw-r--r--src/bin/pg_dump/t/002_pg_dump.pl24
-rw-r--r--src/bin/pg_resetwal/Makefile4
-rw-r--r--src/bin/pg_resetwal/nls.mk4
-rw-r--r--src/bin/pg_resetwal/pg_resetwal.c175
-rw-r--r--src/bin/pg_resetwal/t/002_corrupted.pl4
-rw-r--r--src/bin/pg_rewind/Makefile4
-rw-r--r--src/bin/pg_rewind/copy_fetch.c38
-rw-r--r--src/bin/pg_rewind/datapagemap.c5
-rw-r--r--src/bin/pg_rewind/file_ops.c60
-rw-r--r--src/bin/pg_rewind/filemap.c34
-rw-r--r--src/bin/pg_rewind/libpq_fetch.c37
-rw-r--r--src/bin/pg_rewind/logging.c73
-rw-r--r--src/bin/pg_rewind/logging.h18
-rw-r--r--src/bin/pg_rewind/nls.mk7
-rw-r--r--src/bin/pg_rewind/parsexlog.c33
-rw-r--r--src/bin/pg_rewind/pg_rewind.c85
-rw-r--r--src/bin/pg_rewind/pg_rewind.h1
-rw-r--r--src/bin/pg_rewind/timeline.c17
-rw-r--r--src/bin/pg_test_fsync/Makefile4
-rw-r--r--src/bin/pg_test_fsync/pg_test_fsync.c19
-rw-r--r--src/bin/pg_upgrade/pg_upgrade.c4
-rw-r--r--src/bin/pg_waldump/Makefile3
-rw-r--r--src/bin/pg_waldump/nls.mk6
-rw-r--r--src/bin/pg_waldump/pg_waldump.c71
-rw-r--r--src/bin/pgbench/pgbench.c23
-rw-r--r--src/bin/psql/command.c157
-rw-r--r--src/bin/psql/common.c81
-rw-r--r--src/bin/psql/common.h2
-rw-r--r--src/bin/psql/copy.c42
-rw-r--r--src/bin/psql/crosstabview.c19
-rw-r--r--src/bin/psql/describe.c75
-rw-r--r--src/bin/psql/help.c3
-rw-r--r--src/bin/psql/input.c15
-rw-r--r--src/bin/psql/large_obj.c15
-rw-r--r--src/bin/psql/mainloop.c14
-rw-r--r--src/bin/psql/nls.mk8
-rw-r--r--src/bin/psql/psqlscanslash.l11
-rw-r--r--src/bin/psql/startup.c50
-rw-r--r--src/bin/psql/tab-complete.c2
-rw-r--r--src/bin/psql/variables.c11
-rw-r--r--src/bin/psql/variables.h2
-rw-r--r--src/bin/scripts/clusterdb.c20
-rw-r--r--src/bin/scripts/common.c30
-rw-r--r--src/bin/scripts/createdb.c22
-rw-r--r--src/bin/scripts/createuser.c13
-rw-r--r--src/bin/scripts/dropdb.c11
-rw-r--r--src/bin/scripts/dropuser.c12
-rw-r--r--src/bin/scripts/nls.mk6
-rw-r--r--src/bin/scripts/pg_isready.c10
-rw-r--r--src/bin/scripts/reindexdb.c46
-rw-r--r--src/bin/scripts/vacuumdb.c67
-rw-r--r--src/common/controldata_utils.c41
-rw-r--r--src/common/file_utils.c84
-rw-r--r--src/common/pgfnames.c31
-rw-r--r--src/common/restricted_token.c23
-rw-r--r--src/common/rmtree.c27
-rw-r--r--src/fe_utils/Makefile2
-rw-r--r--src/fe_utils/logging.c228
-rw-r--r--src/fe_utils/psqlscan.l3
-rw-r--r--src/include/common/controldata_utils.h6
-rw-r--r--src/include/common/file_utils.h13
-rw-r--r--src/include/common/restricted_token.h4
-rw-r--r--src/include/fe_utils/logging.h95
-rw-r--r--src/include/fe_utils/psqlscan.h7
-rw-r--r--src/interfaces/ecpg/test/Makefile2
-rw-r--r--src/nls-global.mk8
-rw-r--r--src/test/isolation/Makefile3
-rw-r--r--src/test/perl/TestLib.pm1
-rw-r--r--src/test/regress/GNUmakefile4
-rw-r--r--src/test/regress/pg_regress.c6
-rw-r--r--src/tools/msvc/Mkvcbuild.pm8
132 files changed, 2555 insertions, 2686 deletions
diff --git a/doc/src/sgml/ref/clusterdb.sgml b/doc/src/sgml/ref/clusterdb.sgml
index ed343dd7da..b25845ffc6 100644
--- a/doc/src/sgml/ref/clusterdb.sgml
+++ b/doc/src/sgml/ref/clusterdb.sgml
@@ -274,6 +274,17 @@ PostgreSQL documentation
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
<para>
diff --git a/doc/src/sgml/ref/createdb.sgml b/doc/src/sgml/ref/createdb.sgml
index 2658efeb1a..8fc8128bf9 100644
--- a/doc/src/sgml/ref/createdb.sgml
+++ b/doc/src/sgml/ref/createdb.sgml
@@ -322,6 +322,17 @@ PostgreSQL documentation
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
<para>
diff --git a/doc/src/sgml/ref/createuser.sgml b/doc/src/sgml/ref/createuser.sgml
index 22ee99f2cc..abe25f17d0 100644
--- a/doc/src/sgml/ref/createuser.sgml
+++ b/doc/src/sgml/ref/createuser.sgml
@@ -400,6 +400,17 @@ PostgreSQL documentation
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
<para>
diff --git a/doc/src/sgml/ref/dropdb.sgml b/doc/src/sgml/ref/dropdb.sgml
index 38f38f01ce..3fbdb33716 100644
--- a/doc/src/sgml/ref/dropdb.sgml
+++ b/doc/src/sgml/ref/dropdb.sgml
@@ -228,6 +228,17 @@ PostgreSQL documentation
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
<para>
diff --git a/doc/src/sgml/ref/dropuser.sgml b/doc/src/sgml/ref/dropuser.sgml
index 3d4e4b37b3..72bb7e8535 100644
--- a/doc/src/sgml/ref/dropuser.sgml
+++ b/doc/src/sgml/ref/dropuser.sgml
@@ -220,6 +220,17 @@ PostgreSQL documentation
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
<para>
diff --git a/doc/src/sgml/ref/initdb.sgml b/doc/src/sgml/ref/initdb.sgml
index 84fb37c293..7f32310308 100644
--- a/doc/src/sgml/ref/initdb.sgml
+++ b/doc/src/sgml/ref/initdb.sgml
@@ -462,6 +462,17 @@ PostgreSQL documentation
</varlistentry>
<varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><envar>TZ</envar></term>
<listitem>
diff --git a/doc/src/sgml/ref/pg_basebackup.sgml b/doc/src/sgml/ref/pg_basebackup.sgml
index c4f3950e5b..dd6bce57d2 100644
--- a/doc/src/sgml/ref/pg_basebackup.sgml
+++ b/doc/src/sgml/ref/pg_basebackup.sgml
@@ -687,6 +687,12 @@ PostgreSQL documentation
(see <xref linkend="libpq-envars"/>).
</para>
+ <para>
+ The environment variable <envar>PG_COLOR</envar> specifies whether to use
+ color in diagnostics messages. Possible values are
+ <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
</refsect1>
<refsect1>
diff --git a/doc/src/sgml/ref/pg_checksums.sgml b/doc/src/sgml/ref/pg_checksums.sgml
index 70339eaec9..d93793da5d 100644
--- a/doc/src/sgml/ref/pg_checksums.sgml
+++ b/doc/src/sgml/ref/pg_checksums.sgml
@@ -173,6 +173,17 @@ PostgreSQL documentation
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
</refsect1>
diff --git a/doc/src/sgml/ref/pg_controldata.sgml b/doc/src/sgml/ref/pg_controldata.sgml
index 32081e9b91..abac59aa50 100644
--- a/doc/src/sgml/ref/pg_controldata.sgml
+++ b/doc/src/sgml/ref/pg_controldata.sgml
@@ -68,6 +68,17 @@ PostgreSQL documentation
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
</refsect1>
</refentry>
diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml
index e0e65f9c21..8fa2314347 100644
--- a/doc/src/sgml/ref/pg_dump.sgml
+++ b/doc/src/sgml/ref/pg_dump.sgml
@@ -1224,6 +1224,17 @@ PostgreSQL documentation
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
<para>
diff --git a/doc/src/sgml/ref/pg_dumpall.sgml b/doc/src/sgml/ref/pg_dumpall.sgml
index e3676cf811..24c8c031d6 100644
--- a/doc/src/sgml/ref/pg_dumpall.sgml
+++ b/doc/src/sgml/ref/pg_dumpall.sgml
@@ -695,6 +695,17 @@ PostgreSQL documentation
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
<para>
diff --git a/doc/src/sgml/ref/pg_isready.sgml b/doc/src/sgml/ref/pg_isready.sgml
index 9567b57ebe..68447b5093 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 <application>libpq</application>
(see <xref linkend="libpq-envars"/>).
</para>
+
+ <para>
+ The environment variable <envar>PG_COLOR</envar> specifies whether to use
+ color in diagnostics messages. Possible values are
+ <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
</refsect1>
<refsect1 id="app-pg-isready-notes">
diff --git a/doc/src/sgml/ref/pg_receivewal.sgml b/doc/src/sgml/ref/pg_receivewal.sgml
index a18ddd4bff..0506120c00 100644
--- a/doc/src/sgml/ref/pg_receivewal.sgml
+++ b/doc/src/sgml/ref/pg_receivewal.sgml
@@ -408,6 +408,12 @@ PostgreSQL documentation
(see <xref linkend="libpq-envars"/>).
</para>
+ <para>
+ The environment variable <envar>PG_COLOR</envar> specifies whether to use
+ color in diagnostics messages. Possible values are
+ <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
</refsect1>
<refsect1>
diff --git a/doc/src/sgml/ref/pg_recvlogical.sgml b/doc/src/sgml/ref/pg_recvlogical.sgml
index 141c5cddce..4c79f90414 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 <application>libpq</application>
(see <xref linkend="libpq-envars"/>).
</para>
+
+ <para>
+ The environment variable <envar>PG_COLOR</envar> specifies whether to use
+ color in diagnostics messages. Possible values are
+ <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
</refsect1>
<refsect1>
diff --git a/doc/src/sgml/ref/pg_resetwal.sgml b/doc/src/sgml/ref/pg_resetwal.sgml
index 3f885bdd62..8a9e22d050 100644
--- a/doc/src/sgml/ref/pg_resetwal.sgml
+++ b/doc/src/sgml/ref/pg_resetwal.sgml
@@ -321,6 +321,23 @@ PostgreSQL documentation
</refsect1>
<refsect1>
+ <title>Environment</title>
+
+ <variablelist>
+ <varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
<title>Notes</title>
<para>
diff --git a/doc/src/sgml/ref/pg_restore.sgml b/doc/src/sgml/ref/pg_restore.sgml
index 725acb192c..cf369a0f3b 100644
--- a/doc/src/sgml/ref/pg_restore.sgml
+++ b/doc/src/sgml/ref/pg_restore.sgml
@@ -822,6 +822,17 @@
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
<para>
diff --git a/doc/src/sgml/ref/pg_rewind.sgml b/doc/src/sgml/ref/pg_rewind.sgml
index 53a64ee29e..d98406c420 100644
--- a/doc/src/sgml/ref/pg_rewind.sgml
+++ b/doc/src/sgml/ref/pg_rewind.sgml
@@ -234,6 +234,13 @@ PostgreSQL documentation
<application>pg_rewind</application> also uses the environment variables
supported by <application>libpq</application> (see <xref linkend="libpq-envars"/>).
</para>
+
+ <para>
+ The environment variable <envar>PG_COLOR</envar> specifies whether to use
+ color in diagnostics messages. Possible values are
+ <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
</refsect1>
<refsect1>
diff --git a/doc/src/sgml/ref/pg_waldump.sgml b/doc/src/sgml/ref/pg_waldump.sgml
index 389c314ef3..329c10e430 100644
--- a/doc/src/sgml/ref/pg_waldump.sgml
+++ b/doc/src/sgml/ref/pg_waldump.sgml
@@ -207,6 +207,32 @@ PostgreSQL documentation
</refsect1>
<refsect1>
+ <title>Environment</title>
+
+ <variablelist>
+ <varlistentry>
+ <term><envar>PGDATA</envar></term>
+ <listitem>
+ <para>
+ Data directory; see also the <option>-p</option> option.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </refsect1>
+
+ <refsect1>
<title>Notes</title>
<para>
Can give wrong results when the server is running.
diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml
index 1b5d82ed8e..b29e7547c6 100644
--- a/doc/src/sgml/ref/psql-ref.sgml
+++ b/doc/src/sgml/ref/psql-ref.sgml
@@ -4334,6 +4334,17 @@ $endif
</varlistentry>
<varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
<term><envar>PSQL_EDITOR</envar></term>
<term><envar>EDITOR</envar></term>
<term><envar>VISUAL</envar></term>
diff --git a/doc/src/sgml/ref/reindexdb.sgml b/doc/src/sgml/ref/reindexdb.sgml
index cdfac3fe4f..25b5a72770 100644
--- a/doc/src/sgml/ref/reindexdb.sgml
+++ b/doc/src/sgml/ref/reindexdb.sgml
@@ -352,6 +352,17 @@ PostgreSQL documentation
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
<para>
diff --git a/doc/src/sgml/ref/vacuumdb.sgml b/doc/src/sgml/ref/vacuumdb.sgml
index 41c7f3df79..47d93456f8 100644
--- a/doc/src/sgml/ref/vacuumdb.sgml
+++ b/doc/src/sgml/ref/vacuumdb.sgml
@@ -451,6 +451,17 @@ PostgreSQL documentation
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><envar>PG_COLOR</envar></term>
+ <listitem>
+ <para>
+ Specifies whether to use color in diagnostics messages. Possible values
+ are <literal>always</literal>, <literal>auto</literal>,
+ <literal>never</literal>.
+ </para>
+ </listitem>
+ </varlistentry>
</variablelist>
<para>
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 9840a55c10..a181e33dd4 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 e675c33c54..b42921800b 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 4886090132..09b59c8324 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 b0ce62980a..803388d4c7 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 c5bf99db0f..14e834677b 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 2cd81d32a7..c2d625c52f 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 4c3a2de045..b297f210df 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 f7694343fc..fece5551bd 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 916371232b..1a735b8046 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(&copybuf[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 aa114f1563..9e4d296129 100644
--- a/src/bin/pg_basebackup/pg_receivewal.c
+++ b/src/bin/pg_basebackup/pg_receivewal.c
@@ -20,6 +20,7 @@
#include <unistd.h>
#include "common/file_perm.h"
+#include "fe_utils/logging.h"
#include "libpq-fe.h"
#include "access/xlog_internal.h"
#include "getopt_long.h"
@@ -114,16 +115,16 @@ stop_streaming(XLogRecPtr xlogpos, uint32 timeline, bool segment_finished)
/* we assume that we get called once at the end of each segment */
if (verbose && segment_finished)
- fprintf(stderr, _("%s: finished segment at %X/%X (timeline %u)\n"),
- progname, (uint32) (xlogpos >> 32), (uint32) xlogpos,
- timeline);
+ pg_log_info("finished segment at %X/%X (timeline %u)",
+ (uint32) (xlogpos >> 32), (uint32) xlogpos,
+ timeline);
if (!XLogRecPtrIsInvalid(endpos) && endpos < xlogpos)
{
if (verbose)
- fprintf(stderr, _("%s: stopped log streaming at %X/%X (timeline %u)\n"),
- progname, (uint32) (xlogpos >> 32), (uint32) xlogpos,
- timeline);
+ pg_log_info("stopped log streaming at %X/%X (timeline %u)",
+ (uint32) (xlogpos >> 32), (uint32) xlogpos,
+ timeline);
time_to_stop = true;
return true;
}
@@ -137,9 +138,9 @@ stop_streaming(XLogRecPtr xlogpos, uint32 timeline, bool segment_finished)
* timeline, but it's close enough for reporting purposes.
*/
if (verbose && prevtimeline != 0 && prevtimeline != timeline)
- fprintf(stderr, _("%s: switched to timeline %u at %X/%X\n"),
- progname, timeline,
- (uint32) (prevpos >> 32), (uint32) prevpos);
+ pg_log_info("switched to timeline %u at %X/%X",
+ timeline,
+ (uint32) (prevpos >> 32), (uint32) prevpos);
prevtimeline = timeline;
prevpos = xlogpos;
@@ -147,8 +148,7 @@ stop_streaming(XLogRecPtr xlogpos, uint32 timeline, bool segment_finished)
if (time_to_stop)
{
if (verbose)
- fprintf(stderr, _("%s: received interrupt signal, exiting\n"),
- progname);
+ pg_log_info("received interrupt signal, exiting");
return true;
}
return false;
@@ -167,8 +167,7 @@ get_destination_dir(char *dest_folder)
dir = opendir(dest_folder);
if (dir == NULL)
{
- fprintf(stderr, _("%s: could not open directory \"%s\": %s\n"),
- progname, basedir, strerror(errno));
+ pg_log_error("could not open directory \"%s\": %m", basedir);
exit(1);
}
@@ -185,8 +184,7 @@ close_destination_dir(DIR *dest_dir, char *dest_folder)
Assert(dest_dir != NULL && dest_folder != NULL);
if (closedir(dest_dir))
{
- fprintf(stderr, _("%s: could not close directory \"%s\": %s\n"),
- progname, dest_folder, strerror(errno));
+ pg_log_error("could not close directory \"%s\": %m", dest_folder);
exit(1);
}
}
@@ -266,16 +264,14 @@ FindStreamingStart(uint32 *tli)
snprintf(fullpath, sizeof(fullpath), "%s/%s", basedir, dirent->d_name);
if (stat(fullpath, &statbuf) != 0)
{
- fprintf(stderr, _("%s: could not stat file \"%s\": %s\n"),
- progname, fullpath, strerror(errno));
+ pg_log_error("could not stat file \"%s\": %m", fullpath);
exit(1);
}
if (statbuf.st_size != WalSegSz)
{
- fprintf(stderr,
- _("%s: segment file \"%s\" has incorrect size %d, skipping\n"),
- progname, dirent->d_name, (int) statbuf.st_size);
+ pg_log_warning("segment file \"%s\" has incorrect size %d, skipping",
+ dirent->d_name, (int) statbuf.st_size);
continue;
}
}
@@ -292,25 +288,25 @@ FindStreamingStart(uint32 *tli)
fd = open(fullpath, O_RDONLY | PG_BINARY, 0);
if (fd < 0)
{
- fprintf(stderr, _("%s: could not open compressed file \"%s\": %s\n"),
- progname, fullpath, strerror(errno));
+ pg_log_error("could not open compressed file \"%s\": %m",
+ fullpath);
exit(1);
}
if (lseek(fd, (off_t) (-4), SEEK_END) < 0)
{
- fprintf(stderr, _("%s: could not seek in compressed file \"%s\": %s\n"),
- progname, fullpath, strerror(errno));
+ pg_log_error("could not seek in compressed file \"%s\": %m",
+ fullpath);
exit(1);
}
r = read(fd, (char *) buf, sizeof(buf));
if (r != sizeof(buf))
{
if (r < 0)
- fprintf(stderr, _("%s: could not read compressed file \"%s\": %s\n"),
- progname, fullpath, strerror(errno));
+ pg_log_error("could not read compressed file \"%s\": %m",
+ fullpath);
else
- fprintf(stderr, _("%s: could not read compressed file \"%s\": read %d of %zu\n"),
- progname, fullpath, r, sizeof(buf));
+ pg_log_error("could not read compressed file \"%s\": read %d of %zu",
+ fullpath, r, sizeof(buf));
exit(1);
}
@@ -320,9 +316,8 @@ FindStreamingStart(uint32 *tli)
if (bytes_out != WalSegSz)
{
- fprintf(stderr,
- _("%s: compressed segment file \"%s\" has incorrect uncompressed size %d, skipping\n"),
- progname, dirent->d_name, bytes_out);
+ pg_log_warning("compressed segment file \"%s\" has incorrect uncompressed size %d, skipping",
+ dirent->d_name, bytes_out);
continue;
}
}
@@ -340,8 +335,7 @@ FindStreamingStart(uint32 *tli)
if (errno)
{
- fprintf(stderr, _("%s: could not read directory \"%s\": %s\n"),
- progname, basedir, strerror(errno));
+ pg_log_error("could not read directory \"%s\": %m", basedir);
exit(1);
}
@@ -426,10 +420,9 @@ StreamLog(void)
* Start the replication
*/
if (verbose)
- fprintf(stderr,
- _("%s: starting log streaming at %X/%X (timeline %u)\n"),
- progname, (uint32) (stream.startpos >> 32), (uint32) stream.startpos,
- stream.timeline);
+ pg_log_info("starting log streaming at %X/%X (timeline %u)",
+ (uint32) (stream.startpos >> 32), (uint32) stream.startpos,
+ stream.timeline);
stream.stream_stop = stop_streaming;
stream.stop_socket = PGINVALID_SOCKET;
@@ -446,9 +439,7 @@ StreamLog(void)
if (!stream.walmethod->finish())
{
- fprintf(stderr,
- _("%s: could not finish writing WAL files: %s\n"),
- progname, strerror(errno));
+ pg_log_info("could not finish writing WAL files: %m");
return;
}
@@ -508,6 +499,7 @@ main(int argc, char **argv)
uint32 hi,
lo;
+ pg_logging_init(argv[0]);
progname = get_progname(argv[0]);
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_basebackup"));
@@ -543,8 +535,7 @@ main(int argc, char **argv)
case 'p':
if (atoi(optarg) <= 0)
{
- fprintf(stderr, _("%s: invalid port number \"%s\"\n"),
- progname, optarg);
+ pg_log_error("invalid port number \"%s\"", optarg);
exit(1);
}
dbport = pg_strdup(optarg);
@@ -562,8 +553,7 @@ main(int argc, char **argv)
standby_message_timeout = atoi(optarg) * 1000;
if (standby_message_timeout < 0)
{
- fprintf(stderr, _("%s: invalid status interval \"%s\"\n"),
- progname, optarg);
+ pg_log_error("invalid status interval \"%s\"", optarg);
exit(1);
}
break;
@@ -573,9 +563,7 @@ main(int argc, char **argv)
case 'E':
if (sscanf(optarg, "%X/%X", &hi, &lo) != 2)
{
- fprintf(stderr,
- _("%s: could not parse end position \"%s\"\n"),
- progname, optarg);
+ pg_log_error("could not parse end position \"%s\"", optarg);
exit(1);
}
endpos = ((uint64) hi) << 32 | lo;
@@ -590,8 +578,7 @@ main(int argc, char **argv)
compresslevel = atoi(optarg);
if (compresslevel < 0 || compresslevel > 9)
{
- fprintf(stderr, _("%s: invalid compression level \"%s\"\n"),
- progname, optarg);
+ pg_log_error("invalid compression level \"%s\"", optarg);
exit(1);
}
break;
@@ -627,9 +614,8 @@ main(int argc, char **argv)
*/
if (optind < argc)
{
- fprintf(stderr,
- _("%s: too many command-line arguments (first is \"%s\")\n"),
- progname, argv[optind]);
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@@ -637,7 +623,7 @@ main(int argc, char **argv)
if (do_drop_slot && do_create_slot)
{
- fprintf(stderr, _("%s: cannot use --create-slot together with --drop-slot\n"), progname);
+ pg_log_error("cannot use --create-slot together with --drop-slot");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@@ -646,7 +632,7 @@ main(int argc, char **argv)
if (replication_slot == NULL && (do_drop_slot || do_create_slot))
{
/* translator: second %s is an option name */
- fprintf(stderr, _("%s: %s needs a slot to be specified using --slot\n"), progname,
+ pg_log_error("%s needs a slot to be specified using --slot",
do_drop_slot ? "--drop-slot" : "--create-slot");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
@@ -655,7 +641,7 @@ main(int argc, char **argv)
if (synchronous && !do_sync)
{
- fprintf(stderr, _("%s: cannot use --synchronous together with --no-sync\n"), progname);
+ pg_log_error("cannot use --synchronous together with --no-sync");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@@ -666,7 +652,7 @@ main(int argc, char **argv)
*/
if (basedir == NULL && !do_drop_slot && !do_create_slot)
{
- fprintf(stderr, _("%s: no target directory specified\n"), progname);
+ pg_log_error("no target directory specified");
fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
progname);
exit(1);
@@ -675,9 +661,7 @@ main(int argc, char **argv)
#ifndef HAVE_LIBZ
if (compresslevel != 0)
{
- fprintf(stderr,
- _("%s: this build does not support compression\n"),
- progname);
+ pg_log_error("this build does not support compression");
exit(1);
}
#endif
@@ -733,9 +717,8 @@ main(int argc, char **argv)
*/
if (db_name)
{
- fprintf(stderr,
- _("%s: replication connection using slot \"%s\" is unexpectedly database specific\n"),
- progname, replication_slot);
+ pg_log_error("replication connection using slot \"%s\" is unexpectedly database specific",
+ replication_slot);
exit(1);
}
@@ -745,9 +728,7 @@ main(int argc, char **argv)
if (do_drop_slot)
{
if (verbose)
- fprintf(stderr,
- _("%s: dropping replication slot \"%s\"\n"),
- progname, replication_slot);
+ pg_log_info("dropping replication slot \"%s\"", replication_slot);
if (!DropReplicationSlot(conn, replication_slot))
exit(1);
@@ -758,9 +739,7 @@ main(int argc, char **argv)
if (do_create_slot)
{
if (verbose)
- fprintf(stderr,
- _("%s: creating replication slot \"%s\"\n"),
- progname, replication_slot);
+ pg_log_info("creating replication slot \"%s\"", replication_slot);
if (!CreateReplicationSlot(conn, replication_slot, NULL, false, true, false,
slot_exists_ok))
@@ -786,15 +765,14 @@ main(int argc, char **argv)
}
else if (noloop)
{
- fprintf(stderr, _("%s: disconnected\n"), progname);
+ pg_log_error("disconnected");
exit(1);
}
else
{
- fprintf(stderr,
/* translator: check source for value for %d */
- _("%s: disconnected; waiting %d seconds to try again\n"),
- progname, RECONNECT_SLEEP_TIME);
+ pg_log_info("disconnected; waiting %d seconds to try again",
+ RECONNECT_SLEEP_TIME);
pg_usleep(RECONNECT_SLEEP_TIME * 1000000);
}
}
diff --git a/src/bin/pg_basebackup/pg_recvlogical.c b/src/bin/pg_basebackup/pg_recvlogical.c
index 10429a529d..3c95f231a2 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 692d13716e..0ff9aa19a9 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(&copybuf[1]);
@@ -1106,9 +1078,8 @@ ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
/* No file open yet */
if (xlogoff != 0)
{
- fprintf(stderr,
- _("%s: received write-ahead log record for offset %u with no file open\n"),
- progname, xlogoff);
+ pg_log_error("received write-ahead log record for offset %u with no file open",
+ xlogoff);
return false;
}
}
@@ -1117,9 +1088,8 @@ ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
/* More data in existing segment */
if (stream->walmethod->get_current_pos(walfile) != xlogoff)
{
- fprintf(stderr,
- _("%s: got WAL data offset %08x, expected %08x\n"),
- progname, xlogoff, (int) stream->walmethod->get_current_pos(walfile));
+ pg_log_error("got WAL data offset %08x, expected %08x",
+ xlogoff, (int) stream->walmethod->get_current_pos(walfile));
return false;
}
}
@@ -1152,10 +1122,9 @@ ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
if (stream->walmethod->write(walfile, copybuf + hdr_len + bytes_written,
bytes_to_write) != bytes_to_write)
{
- fprintf(stderr,
- _("%s: could not write %u bytes to WAL file \"%s\": %s\n"),
- progname, bytes_to_write, current_walfile_name,
- stream->walmethod->getlasterror());
+ pg_log_error("could not write %u bytes to WAL file \"%s\": %s",
+ bytes_to_write, current_walfile_name,
+ stream->walmethod->getlasterror());
return false;
}
@@ -1178,8 +1147,8 @@ ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len,
{
if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn))
{
- fprintf(stderr, _("%s: could not send copy-end packet: %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("could not send copy-end packet: %s",
+ PQerrorMessage(conn));
return false;
}
still_sending = false;
@@ -1218,9 +1187,8 @@ HandleEndOfCopyStream(PGconn *conn, StreamCtl *stream, char *copybuf,
{
if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn))
{
- fprintf(stderr,
- _("%s: could not send copy-end packet: %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("could not send copy-end packet: %s",
+ PQerrorMessage(conn));
PQclear(res);
return NULL;
}
@@ -1250,8 +1218,8 @@ CheckCopyStreamStop(PGconn *conn, StreamCtl *stream, XLogRecPtr blockpos,
}
if (PQputCopyEnd(conn, NULL) <= 0 || PQflush(conn))
{
- fprintf(stderr, _("%s: could not send copy-end packet: %s"),
- progname, PQerrorMessage(conn));
+ pg_log_error("could not send copy-end packet: %s",
+ PQerrorMessage(conn));
return false;
}
still_sending = false;
diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c
index 7e86830ad8..ab2e55d695 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 165b3a1e89..83b520898b 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 278b7a0f2e..13a25f5e33 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 2748b18ef7..372e889472 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 5c185ebed8..c7d26397f1 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 2d5c562131..4d9c1370fe 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 9a17d0f9c0..a674f52f0b 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 83cbf97ed8..b931b14a3f 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 c82a702ffa..febb076ee6 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 249706fe57..5958f42a84 100644
--- a/src/bin/pg_dump/common.c
+++ b/src/bin/pg_dump/common.c
@@ -22,6 +22,7 @@
#include <ctype.h>
#include "catalog/pg_class_d.h"
+#include "fe_utils/logging.h"
#include "fe_utils/string_utils.h"
@@ -120,17 +121,14 @@ getSchemaData(Archive *fout, int *numTablesPtr)
* extension membership needs to be consultable during decisions about
* whether other objects are to be dumped.
*/
- if (g_verbose)
- write_msg(NULL, "reading extensions\n");
+ pg_log_info("reading extensions");
extinfo = getExtensions(fout, &numExtensions);
extinfoindex = buildIndexArray(extinfo, numExtensions, sizeof(ExtensionInfo));
- if (g_verbose)
- write_msg(NULL, "identifying extension members\n");
+ pg_log_info("identifying extension members");
getExtensionMembership(fout, extinfo, numExtensions);
- if (g_verbose)
- write_msg(NULL, "reading schemas\n");
+ pg_log_info("reading schemas");
nspinfo = getNamespaces(fout, &numNamespaces);
nspinfoindex = buildIndexArray(nspinfo, numNamespaces, sizeof(NamespaceInfo));
@@ -140,160 +138,124 @@ getSchemaData(Archive *fout, int *numTablesPtr)
* However, we have to do getNamespaces first because the tables get
* linked to their containing namespaces during getTables.
*/
- if (g_verbose)
- write_msg(NULL, "reading user-defined tables\n");
+ pg_log_info("reading user-defined tables");
tblinfo = getTables(fout, &numTables);
tblinfoindex = buildIndexArray(tblinfo, numTables, sizeof(TableInfo));
/* Do this after we've built tblinfoindex */
getOwnedSeqs(fout, tblinfo, numTables);
- if (g_verbose)
- write_msg(NULL, "reading user-defined functions\n");
+ pg_log_info("reading user-defined functions");
funinfo = getFuncs(fout, &numFuncs);
funinfoindex = buildIndexArray(funinfo, numFuncs, sizeof(FuncInfo));
/* this must be after getTables and getFuncs */
- if (g_verbose)
- write_msg(NULL, "reading user-defined types\n");
+ pg_log_info("reading user-defined types");
typinfo = getTypes(fout, &numTypes);
typinfoindex = buildIndexArray(typinfo, numTypes, sizeof(TypeInfo));
/* this must be after getFuncs, too */
- if (g_verbose)
- write_msg(NULL, "reading procedural languages\n");
+ pg_log_info("reading procedural languages");
getProcLangs(fout, &numProcLangs);
- if (g_verbose)
- write_msg(NULL, "reading user-defined aggregate functions\n");
+ pg_log_info("reading user-defined aggregate functions");
getAggregates(fout, &numAggregates);
- if (g_verbose)
- write_msg(NULL, "reading user-defined operators\n");
+ pg_log_info("reading user-defined operators");
oprinfo = getOperators(fout, &numOperators);
oprinfoindex = buildIndexArray(oprinfo, numOperators, sizeof(OprInfo));
- if (g_verbose)
- write_msg(NULL, "reading user-defined access methods\n");
+ pg_log_info("reading user-defined access methods");
getAccessMethods(fout, &numAccessMethods);
- if (g_verbose)
- write_msg(NULL, "reading user-defined operator classes\n");
+ pg_log_info("reading user-defined operator classes");
getOpclasses(fout, &numOpclasses);
- if (g_verbose)
- write_msg(NULL, "reading user-defined operator families\n");
+ pg_log_info("reading user-defined operator families");
getOpfamilies(fout, &numOpfamilies);
- if (g_verbose)
- write_msg(NULL, "reading user-defined text search parsers\n");
+ pg_log_info("reading user-defined text search parsers");
getTSParsers(fout, &numTSParsers);
- if (g_verbose)
- write_msg(NULL, "reading user-defined text search templates\n");
+ pg_log_info("reading user-defined text search templates");
getTSTemplates(fout, &numTSTemplates);
- if (g_verbose)
- write_msg(NULL, "reading user-defined text search dictionaries\n");
+ pg_log_info("reading user-defined text search dictionaries");
getTSDictionaries(fout, &numTSDicts);
- if (g_verbose)
- write_msg(NULL, "reading user-defined text search configurations\n");
+ pg_log_info("reading user-defined text search configurations");
getTSConfigurations(fout, &numTSConfigs);
- if (g_verbose)
- write_msg(NULL, "reading user-defined foreign-data wrappers\n");
+ pg_log_info("reading user-defined foreign-data wrappers");
getForeignDataWrappers(fout, &numForeignDataWrappers);
- if (g_verbose)
- write_msg(NULL, "reading user-defined foreign servers\n");
+ pg_log_info("reading user-defined foreign servers");
getForeignServers(fout, &numForeignServers);
- if (g_verbose)
- write_msg(NULL, "reading default privileges\n");
+ pg_log_info("reading default privileges");
getDefaultACLs(fout, &numDefaultACLs);
- if (g_verbose)
- write_msg(NULL, "reading user-defined collations\n");
+ pg_log_info("reading user-defined collations");
collinfo = getCollations(fout, &numCollations);
collinfoindex = buildIndexArray(collinfo, numCollations, sizeof(CollInfo));
- if (g_verbose)
- write_msg(NULL, "reading user-defined conversions\n");
+ pg_log_info("reading user-defined conversions");
getConversions(fout, &numConversions);
- if (g_verbose)
- write_msg(NULL, "reading type casts\n");
+ pg_log_info("reading type casts");
getCasts(fout, &numCasts);
- if (g_verbose)
- write_msg(NULL, "reading transforms\n");
+ pg_log_info("reading transforms");
getTransforms(fout, &numTransforms);
- if (g_verbose)
- write_msg(NULL, "reading table inheritance information\n");
+ pg_log_info("reading table inheritance information");
inhinfo = getInherits(fout, &numInherits);
- if (g_verbose)
- write_msg(NULL, "reading event triggers\n");
+ pg_log_info("reading event triggers");
getEventTriggers(fout, &numEventTriggers);
/* Identify extension configuration tables that should be dumped */
- if (g_verbose)
- write_msg(NULL, "finding extension tables\n");
+ pg_log_info("finding extension tables");
processExtensionTables(fout, extinfo, numExtensions);
/* Link tables to parents, mark parents of target tables interesting */
- if (g_verbose)
- write_msg(NULL, "finding inheritance relationships\n");
+ pg_log_info("finding inheritance relationships");
flagInhTables(fout, tblinfo, numTables, inhinfo, numInherits);
- if (g_verbose)
- write_msg(NULL, "reading column info for interesting tables\n");
+ pg_log_info("reading column info for interesting tables");
getTableAttrs(fout, tblinfo, numTables);
- if (g_verbose)
- write_msg(NULL, "flagging inherited columns in subtables\n");
+ pg_log_info("flagging inherited columns in subtables");
flagInhAttrs(fout->dopt, tblinfo, numTables);
- if (g_verbose)
- write_msg(NULL, "reading indexes\n");
+ pg_log_info("reading indexes");
getIndexes(fout, tblinfo, numTables);
- if (g_verbose)
- write_msg(NULL, "flagging indexes in partitioned tables\n");
+ pg_log_info("flagging indexes in partitioned tables");
flagInhIndexes(fout, tblinfo, numTables);
- if (g_verbose)
- write_msg(NULL, "reading extended statistics\n");
+ pg_log_info("reading extended statistics");
getExtendedStatistics(fout);
- if (g_verbose)
- write_msg(NULL, "reading constraints\n");
+ pg_log_info("reading constraints");
getConstraints(fout, tblinfo, numTables);
- if (g_verbose)
- write_msg(NULL, "reading triggers\n");
+ pg_log_info("reading triggers");
getTriggers(fout, tblinfo, numTables);
- if (g_verbose)
- write_msg(NULL, "reading rewrite rules\n");
+ pg_log_info("reading rewrite rules");
getRules(fout, &numRules);
- if (g_verbose)
- write_msg(NULL, "reading policies\n");
+ pg_log_info("reading policies");
getPolicies(fout, tblinfo, numTables);
- if (g_verbose)
- write_msg(NULL, "reading publications\n");
+ pg_log_info("reading publications");
getPublications(fout);
- if (g_verbose)
- write_msg(NULL, "reading publication membership\n");
+ pg_log_info("reading publication membership");
getPublicationTables(fout, tblinfo, numTables);
- if (g_verbose)
- write_msg(NULL, "reading subscriptions\n");
+ pg_log_info("reading subscriptions");
getSubscriptions(fout);
*numTablesPtr = numTables;
@@ -1059,7 +1021,7 @@ findParentsByOid(TableInfo *self,
parent = findTableByOid(inhinfo[i].inhparent);
if (parent == NULL)
{
- write_msg(NULL, "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found\n",
+ pg_log_error("failed sanity check, parent OID %u of table \"%s\" (OID %u) not found",
inhinfo[i].inhparent,
self->dobj.name,
oid);
@@ -1101,7 +1063,7 @@ parseOidArray(const char *str, Oid *array, int arraysize)
{
if (argNum >= arraysize)
{
- write_msg(NULL, "could not parse numeric array \"%s\": too many numbers\n", str);
+ pg_log_error("could not parse numeric array \"%s\": too many numbers", str);
exit_nicely(1);
}
temp[j] = '\0';
@@ -1116,7 +1078,7 @@ parseOidArray(const char *str, Oid *array, int arraysize)
if (!(isdigit((unsigned char) s) || s == '-') ||
j >= sizeof(temp) - 1)
{
- write_msg(NULL, "could not parse numeric array \"%s\": invalid character in number\n", str);
+ pg_log_error("could not parse numeric array \"%s\": invalid character in number", str);
exit_nicely(1);
}
temp[j++] = s;
diff --git a/src/bin/pg_dump/compress_io.c b/src/bin/pg_dump/compress_io.c
index d904ec62ad..a0d7644a8a 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 37234717cb..8a53ad08dd 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 41aa78a953..3dfdae3a57 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 6131cdda96..1a75cd00cd 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 2015b735ae..fe72d5b13b 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 96f44e88b1..5641d5d20f 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 5e32ee8a5b..1d636dac19 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 e6261252c7..70eca82c91 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 62f6e624f0..f33f7ba421 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 407a56d8d4..b52593c3c0 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 1bdce68ff9..6f87c6d684 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 7dbf3c9feb..c47c19af6c 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 2a9e8538c6..452f30760b 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 a72e3eb27c..4f9ebb4904 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 3a4f6e7754..80641cd79a 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 a86965e670..3244a527f6 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 428e040acb..0a7eb46f5b 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 3a58f9b8ce..3f8d4392cd 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 a69375056d..5721882b3b 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 2a3835691f..09ede1efd2 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 82ec4f743c..cc40875b48 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 67fc646bef..82a8ec993d 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 0022dcb8ff..f9940d7fc5 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 04f3b8f520..019e19986e 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 a283405f6c..3fd0404ddf 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 6262f1f870..fc70fe5706 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 bbdcbe44ac..e442f93555 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 1c82acb8da..63d0baee74 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 d06e277432..11ec045b8e 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 572a759937..8169f739ee 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 5c031e1821..81e17ac1f2 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 2fb63bead8..58c9ede548 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 e19c265cbb..7709b96e00 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 3dcadb9b40..b7e6aca97f 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)