Hi,

The attached patch adds an -a / --appname command line switch to pg_basebackup, pg_receivewal and pg_recvlogical.

This is useful when f.ex. pg_receivewal needs to connect as a synchronous client (synchronous_standby_names),

pg_receivewal -h myhost -p 5432 -S replica1 -a replica1 --synchronous -D /wal

I'll add the patch to the CommitFest for discussion, as there is overlap with the -d switch.

Best regards,
 Jesper
>From 3aee659423137a547ed178a1dab34fe3caf30702 Mon Sep 17 00:00:00 2001
From: jesperpedersen <jesper.peder...@redhat.com>
Date: Thu, 31 Oct 2019 08:34:41 -0400
Subject: [PATCH] Add an -a / --appname command line switch to control the
 application_name property.

Author: Jesper Pedersen <jesper.peder...@redhat.com>
---
 doc/src/sgml/ref/pg_basebackup.sgml    | 11 +++++++++++
 doc/src/sgml/ref/pg_receivewal.sgml    | 11 +++++++++++
 doc/src/sgml/ref/pg_recvlogical.sgml   | 11 +++++++++++
 src/bin/pg_basebackup/pg_basebackup.c  |  7 ++++++-
 src/bin/pg_basebackup/pg_receivewal.c  |  7 ++++++-
 src/bin/pg_basebackup/pg_recvlogical.c |  7 ++++++-
 src/bin/pg_basebackup/streamutil.c     |  7 +++++++
 src/bin/pg_basebackup/streamutil.h     |  1 +
 8 files changed, 59 insertions(+), 3 deletions(-)

diff --git a/doc/src/sgml/ref/pg_basebackup.sgml b/doc/src/sgml/ref/pg_basebackup.sgml
index fc9e222f8d..28b5dee206 100644
--- a/doc/src/sgml/ref/pg_basebackup.sgml
+++ b/doc/src/sgml/ref/pg_basebackup.sgml
@@ -543,6 +543,17 @@ PostgreSQL documentation
     The following command-line options control the database connection parameters.
 
     <variablelist>
+     <varlistentry>
+      <term><option>-a <replaceable class="parameter">application_name</replaceable></option></term>
+      <term><option>--appname=<replaceable class="parameter">application_name</replaceable></option></term>
+      <listitem>
+       <para>
+        Specifies the application name used to connect to the server.
+        See <xref linkend="libpq-paramkeywords"/> for more information.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><option>-d <replaceable class="parameter">connstr</replaceable></option></term>
       <term><option>--dbname=<replaceable class="parameter">connstr</replaceable></option></term>
diff --git a/doc/src/sgml/ref/pg_receivewal.sgml b/doc/src/sgml/ref/pg_receivewal.sgml
index 177e9211c0..0957e0a9f5 100644
--- a/doc/src/sgml/ref/pg_receivewal.sgml
+++ b/doc/src/sgml/ref/pg_receivewal.sgml
@@ -248,6 +248,17 @@ PostgreSQL documentation
     The following command-line options control the database connection parameters.
 
     <variablelist>
+     <varlistentry>
+      <term><option>-a <replaceable class="parameter">application_name</replaceable></option></term>
+      <term><option>--appname=<replaceable class="parameter">application_name</replaceable></option></term>
+      <listitem>
+       <para>
+        Specifies the application name used to connect to the server.
+        See <xref linkend="libpq-paramkeywords"/> for more information.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><option>-d <replaceable class="parameter">connstr</replaceable></option></term>
       <term><option>--dbname=<replaceable class="parameter">connstr</replaceable></option></term>
diff --git a/doc/src/sgml/ref/pg_recvlogical.sgml b/doc/src/sgml/ref/pg_recvlogical.sgml
index 4c79f90414..b2d9b35362 100644
--- a/doc/src/sgml/ref/pg_recvlogical.sgml
+++ b/doc/src/sgml/ref/pg_recvlogical.sgml
@@ -272,6 +272,17 @@ PostgreSQL documentation
     The following command-line options control the database connection parameters.
 
     <variablelist>
+      <varlistentry>
+       <term><option>-a <replaceable class="parameter">application_name</replaceable></option></term>
+       <term><option>--appname=<replaceable class="parameter">application_name</replaceable></option></term>
+       <listitem>
+        <para>
+         Specifies the application name used to connect to the server.
+         See <xref linkend="libpq-paramkeywords"/> for more information.
+        </para>
+       </listitem>
+      </varlistentry>
+
       <varlistentry>
        <term><option>-d <replaceable>database</replaceable></option></term>
        <term><option>--dbname=<replaceable>database</replaceable></option></term>
diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c
index a9d162a7da..237945f879 100644
--- a/src/bin/pg_basebackup/pg_basebackup.c
+++ b/src/bin/pg_basebackup/pg_basebackup.c
@@ -351,6 +351,7 @@ usage(void)
 			 "                         do not verify checksums\n"));
 	printf(_("  -?, --help             show this help, then exit\n"));
 	printf(_("\nConnection options:\n"));
+	printf(_("  -a, --appname=NAME     application name\n"));
 	printf(_("  -d, --dbname=CONNSTR   connection string\n"));
 	printf(_("  -h, --host=HOSTNAME    database server host or socket directory\n"));
 	printf(_("  -p, --port=PORT        database server port number\n"));
@@ -2031,6 +2032,7 @@ main(int argc, char **argv)
 		{"label", required_argument, NULL, 'l'},
 		{"no-clean", no_argument, NULL, 'n'},
 		{"no-sync", no_argument, NULL, 'N'},
+		{"appname", required_argument, NULL, 'a'},
 		{"dbname", required_argument, NULL, 'd'},
 		{"host", required_argument, NULL, 'h'},
 		{"port", required_argument, NULL, 'p'},
@@ -2070,7 +2072,7 @@ main(int argc, char **argv)
 
 	atexit(cleanup_directories_atexit);
 
-	while ((c = getopt_long(argc, argv, "CD:F:r:RS:T:X:l:nNzZ:d:c:h:p:U:s:wWkvP",
+	while ((c = getopt_long(argc, argv, "CD:F:r:RS:T:X:l:nNzZ:a:d:c:h:p:U:s:wWkvP",
 							long_options, &option_index)) != -1)
 	{
 		switch (c)
@@ -2176,6 +2178,9 @@ main(int argc, char **argv)
 					exit(1);
 				}
 				break;
+			case 'a':
+				application_name = pg_strdup(optarg);
+				break;
 			case 'd':
 				connection_string = pg_strdup(optarg);
 				break;
diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c
index c0c8747982..863dcdb161 100644
--- a/src/bin/pg_basebackup/pg_receivewal.c
+++ b/src/bin/pg_basebackup/pg_receivewal.c
@@ -93,6 +93,7 @@ usage(void)
 	printf(_("  -Z, --compress=0-9     compress logs with given compression level\n"));
 	printf(_("  -?, --help             show this help, then exit\n"));
 	printf(_("\nConnection options:\n"));
+	printf(_("  -a, --appname=NAME     application name\n"));
 	printf(_("  -d, --dbname=CONNSTR   connection string\n"));
 	printf(_("  -h, --host=HOSTNAME    database server host or socket directory\n"));
 	printf(_("  -p, --port=PORT        database server port number\n"));
@@ -470,6 +471,7 @@ main(int argc, char **argv)
 		{"help", no_argument, NULL, '?'},
 		{"version", no_argument, NULL, 'V'},
 		{"directory", required_argument, NULL, 'D'},
+		{"appname", required_argument, NULL, 'a'},
 		{"dbname", required_argument, NULL, 'd'},
 		{"endpos", required_argument, NULL, 'E'},
 		{"host", required_argument, NULL, 'h'},
@@ -516,7 +518,7 @@ main(int argc, char **argv)
 		}
 	}
 
-	while ((c = getopt_long(argc, argv, "D:d:E:h:p:U:s:S:nwWvZ:",
+	while ((c = getopt_long(argc, argv, "D:a:d:E:h:p:U:s:S:nwWvZ:",
 							long_options, &option_index)) != -1)
 	{
 		switch (c)
@@ -524,6 +526,9 @@ main(int argc, char **argv)
 			case 'D':
 				basedir = pg_strdup(optarg);
 				break;
+			case 'a':
+				application_name = pg_strdup(optarg);
+				break;
 			case 'd':
 				connection_string = pg_strdup(optarg);
 				break;
diff --git a/src/bin/pg_basebackup/pg_recvlogical.c b/src/bin/pg_basebackup/pg_recvlogical.c
index 12a3505226..badb2b7052 100644
--- a/src/bin/pg_basebackup/pg_recvlogical.c
+++ b/src/bin/pg_basebackup/pg_recvlogical.c
@@ -97,6 +97,7 @@ usage(void)
 	printf(_("  -V, --version          output version information, then exit\n"));
 	printf(_("  -?, --help             show this help, then exit\n"));
 	printf(_("\nConnection options:\n"));
+	printf(_("  -a, --appname=NAME     application name\n"));
 	printf(_("  -d, --dbname=DBNAME    database to connect to\n"));
 	printf(_("  -h, --host=HOSTNAME    database server host or socket directory\n"));
 	printf(_("  -p, --port=PORT        database server port number\n"));
@@ -654,6 +655,7 @@ main(int argc, char **argv)
 		{"version", no_argument, NULL, 'V'},
 		{"help", no_argument, NULL, '?'},
 /* connection options */
+		{"appname", required_argument, NULL, 'a'},
 		{"dbname", required_argument, NULL, 'd'},
 		{"host", required_argument, NULL, 'h'},
 		{"port", required_argument, NULL, 'p'},
@@ -699,7 +701,7 @@ main(int argc, char **argv)
 		}
 	}
 
-	while ((c = getopt_long(argc, argv, "E:f:F:nvd:h:p:U:wWI:o:P:s:S:",
+	while ((c = getopt_long(argc, argv, "E:f:F:nva:d:h:p:U:wWI:o:P:s:S:",
 							long_options, &option_index)) != -1)
 	{
 		switch (c)
@@ -723,6 +725,9 @@ main(int argc, char **argv)
 				verbose++;
 				break;
 /* connection options */
+			case 'a':
+				application_name = pg_strdup(optarg);
+				break;
 			case 'd':
 				dbname = pg_strdup(optarg);
 				break;
diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c
index 94d1a12b9b..1130212c5d 100644
--- a/src/bin/pg_basebackup/streamutil.c
+++ b/src/bin/pg_basebackup/streamutil.c
@@ -43,6 +43,7 @@ static bool RetrieveDataDirCreatePerm(PGconn *conn);
 #define MINIMUM_VERSION_FOR_GROUP_ACCESS 110000
 
 const char *progname;
+char	   *application_name = NULL;
 char	   *connection_string = NULL;
 char	   *dbhost = NULL;
 char	   *dbuser = NULL;
@@ -130,6 +131,12 @@ GetConnection(void)
 	values[i] = progname;
 	i++;
 
+	if (application_name)
+	{
+		keywords[i] = "application_name";
+		values[i] = application_name;
+		i++;
+	}
 	if (dbhost)
 	{
 		keywords[i] = "host";
diff --git a/src/bin/pg_basebackup/streamutil.h b/src/bin/pg_basebackup/streamutil.h
index a756eee262..a0166315bc 100644
--- a/src/bin/pg_basebackup/streamutil.h
+++ b/src/bin/pg_basebackup/streamutil.h
@@ -18,6 +18,7 @@
 #include "datatype/timestamp.h"
 
 extern const char *progname;
+extern char *application_name;
 extern char *connection_string;
 extern char *dbhost;
 extern char *dbuser;
-- 
2.21.0

Reply via email to