diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2012-02-09 20:15:48 +0200 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2012-02-09 20:20:15 +0200 |
commit | 169c8a911260bd5a8b6910c458afa57a1ae29627 (patch) | |
tree | bfd5b4ee2f9ab327fa19337492b36794b3f31d25 /src/bin/psql/startup.c | |
parent | dd7c84185c160bb0d95bd265182f24f1f6c21924 (diff) | |
download | postgresql-169c8a911260bd5a8b6910c458afa57a1ae29627.tar.gz postgresql-169c8a911260bd5a8b6910c458afa57a1ae29627.zip |
psql: Support zero byte field and record separators
Add new psql settings and command-line options to support setting the
field and record separators for unaligned output to a zero byte, for
easier interfacing with other shell tools.
reviewed by Abhijit Menon-Sen
Diffstat (limited to 'src/bin/psql/startup.c')
-rw-r--r-- | src/bin/psql/startup.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c index 8b1864c1066..aff57728a2a 100644 --- a/src/bin/psql/startup.c +++ b/src/bin/psql/startup.c @@ -150,10 +150,18 @@ main(int argc, char *argv[]) parse_psql_options(argc, argv, &options); - if (!pset.popt.topt.fieldSep) - pset.popt.topt.fieldSep = pg_strdup(DEFAULT_FIELD_SEP); - if (!pset.popt.topt.recordSep) - pset.popt.topt.recordSep = pg_strdup(DEFAULT_RECORD_SEP); + if (!pset.popt.topt.fieldSep.separator && + !pset.popt.topt.fieldSep.separator_zero) + { + pset.popt.topt.fieldSep.separator = pg_strdup(DEFAULT_FIELD_SEP); + pset.popt.topt.fieldSep.separator_zero = false; + } + if (!pset.popt.topt.recordSep.separator && + !pset.popt.topt.recordSep.separator_zero) + { + pset.popt.topt.recordSep.separator = pg_strdup(DEFAULT_RECORD_SEP); + pset.popt.topt.recordSep.separator_zero = false; + } if (options.username == NULL) password_prompt = pg_strdup(_("Password: ")); @@ -338,6 +346,7 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options) {"echo-hidden", no_argument, NULL, 'E'}, {"file", required_argument, NULL, 'f'}, {"field-separator", required_argument, NULL, 'F'}, + {"field-separator-zero", no_argument, NULL, 'z'}, {"host", required_argument, NULL, 'h'}, {"html", no_argument, NULL, 'H'}, {"list", no_argument, NULL, 'l'}, @@ -349,6 +358,7 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options) {"pset", required_argument, NULL, 'P'}, {"quiet", no_argument, NULL, 'q'}, {"record-separator", required_argument, NULL, 'R'}, + {"record-separator-zero", no_argument, NULL, '0'}, {"single-step", no_argument, NULL, 's'}, {"single-line", no_argument, NULL, 'S'}, {"tuples-only", no_argument, NULL, 't'}, @@ -372,7 +382,7 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options) memset(options, 0, sizeof *options); - while ((c = getopt_long(argc, argv, "aAc:d:eEf:F:h:HlL:no:p:P:qR:sStT:U:v:VwWxX?1", + while ((c = getopt_long(argc, argv, "aAc:d:eEf:F:h:HlL:no:p:P:qR:sStT:U:v:VwWxXz?01", long_options, &optindex)) != -1) { switch (c) @@ -407,7 +417,8 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options) options->action_string = optarg; break; case 'F': - pset.popt.topt.fieldSep = pg_strdup(optarg); + pset.popt.topt.fieldSep.separator = pg_strdup(optarg); + pset.popt.topt.fieldSep.separator_zero = false; break; case 'h': options->host = optarg; @@ -459,7 +470,8 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options) SetVariableBool(pset.vars, "QUIET"); break; case 'R': - pset.popt.topt.recordSep = pg_strdup(optarg); + pset.popt.topt.recordSep.separator = pg_strdup(optarg); + pset.popt.topt.recordSep.separator_zero = false; break; case 's': SetVariableBool(pset.vars, "SINGLESTEP"); @@ -521,6 +533,12 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options) case 'X': options->no_psqlrc = true; break; + case 'z': + pset.popt.topt.fieldSep.separator_zero = true; + break; + case '0': + pset.popt.topt.recordSep.separator_zero = true; + break; case '1': options->single_txn = true; break; |