From 84be67181aab22ea8723ba0625ee690223cd8785 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Fri, 1 Sep 2017 12:23:16 -0400 Subject: [PATCH] pg_dumpall: Add a -E flag to set the encoding, like pg_dump has. Michael Paquier, reviewed by Fabien Coelho Discussion: http://postgr.es/m/CAB7nPqQcYWmrm2n-dVaMUhYPKFU_DxQwPuUGuC4ZF+8B=dS5xQ@mail.gmail.com --- doc/src/sgml/ref/pg_dumpall.sgml | 13 +++++++++++++ src/bin/pg_dump/pg_dumpall.c | 24 +++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/doc/src/sgml/ref/pg_dumpall.sgml b/doc/src/sgml/ref/pg_dumpall.sgml index f8a2521743f..1dba702ad95 100644 --- a/doc/src/sgml/ref/pg_dumpall.sgml +++ b/doc/src/sgml/ref/pg_dumpall.sgml @@ -99,6 +99,19 @@ PostgreSQL documentation + + + + + + Create the dump in the specified character set encoding. By default, + the dump is created in the database encoding. (Another way to get the + same result is to set the PGCLIENTENCODING environment + variable to the desired dump encoding.) + + + + diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 806b537e64f..41c5ff89b75 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -97,6 +97,7 @@ main(int argc, char *argv[]) static struct option long_options[] = { {"data-only", no_argument, NULL, 'a'}, {"clean", no_argument, NULL, 'c'}, + {"encoding", required_argument, NULL, 'E'}, {"file", required_argument, NULL, 'f'}, {"globals-only", no_argument, NULL, 'g'}, {"host", required_argument, NULL, 'h'}, @@ -147,6 +148,7 @@ main(int argc, char *argv[]) char *pguser = NULL; char *pgdb = NULL; char *use_role = NULL; + const char *dumpencoding = NULL; trivalue prompt_password = TRI_DEFAULT; bool data_only = false; bool globals_only = false; @@ -204,7 +206,7 @@ main(int argc, char *argv[]) pgdumpopts = createPQExpBuffer(); - while ((c = getopt_long(argc, argv, "acd:f:gh:l:oOp:rsS:tU:vwWx", long_options, &optindex)) != -1) + while ((c = getopt_long(argc, argv, "acd:E:f:gh:l:oOp:rsS:tU:vwWx", long_options, &optindex)) != -1) { switch (c) { @@ -221,6 +223,12 @@ main(int argc, char *argv[]) connstr = pg_strdup(optarg); break; + case 'E': + dumpencoding = pg_strdup(optarg); + appendPQExpBufferStr(pgdumpopts, " -E "); + appendShellString(pgdumpopts, optarg); + break; + case 'f': filename = pg_strdup(optarg); appendPQExpBufferStr(pgdumpopts, " -f "); @@ -453,6 +461,19 @@ main(int argc, char *argv[]) else OPF = stdout; + /* + * Set the client encoding if requested. + */ + if (dumpencoding) + { + if (PQsetClientEncoding(conn, dumpencoding) < 0) + { + fprintf(stderr, _("%s: invalid client encoding \"%s\" specified\n"), + progname, dumpencoding); + exit_nicely(1); + } + } + /* * Get the active encoding and the standard_conforming_strings setting, so * we know how to escape strings. @@ -588,6 +609,7 @@ help(void) printf(_("\nOptions controlling the output content:\n")); printf(_(" -a, --data-only dump only the data, not the schema\n")); printf(_(" -c, --clean clean (drop) databases before recreating\n")); + printf(_(" -E, --encoding=ENCODING dump the data in encoding ENCODING\n")); printf(_(" -g, --globals-only dump only global objects, no databases\n")); printf(_(" -o, --oids include OIDs in dump\n")); printf(_(" -O, --no-owner skip restoration of object ownership\n"));