From b6e4c8f255aacea1c6b27536f3d76dee8d87b4e1 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Fri, 27 Feb 2009 09:30:21 +0000 Subject: [PATCH] Equip the programs installed by contrib with proper --help and --version options and normally formatted help output. --- contrib/oid2name/oid2name.c | 73 +++++++++++++++++-------- contrib/pg_standby/pg_standby.c | 96 ++++++++++++++++++++------------- contrib/pgbench/pgbench.c | 63 +++++++++++++++++++--- contrib/vacuumlo/vacuumlo.c | 40 +++++++++----- doc/src/sgml/pgstandby.sgml | 9 +--- 5 files changed, 195 insertions(+), 86 deletions(-) diff --git a/contrib/oid2name/oid2name.c b/contrib/oid2name/oid2name.c index 0e59cc3afd..7b9046bb18 100644 --- a/contrib/oid2name/oid2name.c +++ b/contrib/oid2name/oid2name.c @@ -5,7 +5,7 @@ * Originally by * B. Palmer, bpalmer@crimelabs.net 1-17-2001 * - * $PostgreSQL: pgsql/contrib/oid2name/oid2name.c,v 1.34 2009/02/25 13:24:40 petere Exp $ + * $PostgreSQL: pgsql/contrib/oid2name/oid2name.c,v 1.35 2009/02/27 09:30:21 petere Exp $ */ #include "postgres_fe.h" @@ -47,6 +47,7 @@ struct options }; /* function prototypes */ +static void help(const char *progname); void get_opts(int, char **, struct options *); void *myalloc(size_t size); char *mystrdup(const char *str); @@ -64,6 +65,9 @@ void get_opts(int argc, char **argv, struct options * my_opts) { int c; + const char *progname; + + progname = get_progname(argv[0]); /* set the defaults */ my_opts->quiet = false; @@ -77,8 +81,22 @@ get_opts(int argc, char **argv, struct options * my_opts) my_opts->port = NULL; my_opts->username = NULL; + if (argc > 1) + { + if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) + { + help(progname); + exit(0); + } + if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0) + { + puts("oid2name (PostgreSQL) " PG_VERSION); + exit(0); + } + } + /* get opts */ - while ((c = getopt(argc, argv, "H:p:U:d:t:o:f:qSxish?")) != -1) + while ((c = getopt(argc, argv, "H:p:U:d:t:o:f:qSxish")) != -1) { switch (c) { @@ -142,31 +160,44 @@ get_opts(int argc, char **argv, struct options * my_opts) my_opts->tablespaces = true; break; - /* help! (ugly in code for easier editing) */ - case '?': case 'h': - fprintf(stderr, - "Usage: oid2name [-s|-d database] [-S][-i][-q][-x] [-t table|-o oid|-f file] ...\n" - " default action show all database Oids\n" - " -d database database to connect to\n" - " -s show all tablespaces\n" - " -S show system objects too\n" - " -i show indexes and sequences too\n" - " -x extended (show additional columns)\n" - " -q quiet (don't show headers)\n" - " -t show info for table named
\n" - " -o show info for table with Oid \n" - " -f show info for table with filenode \n" - " -H host connect to remote host\n" - " -p port host port to connect to\n" - " -U username username to connect with\n" - ); - exit(1); + help(progname); + exit(0); break; + + default: + fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); + exit(1); } } } +static void +help(const char *progname) +{ + printf("%s helps examining the file structure used by PostgreSQL.\n\n" + "Usage:\n" + " %s [OPTIONS]...\n" + "\nOptions:\n" + " -d DBNAME database to connect to\n" + " -f FILENODE show info for table with given file node\n" + " -H HOSTNAME database server host or socket directory\n" + " -i show indexes and sequences too\n" + " -o OID show info for table with given OID\n" + " -p PORT database server port number\n" + " -q quiet (don't show headers)\n" + " -s show all tablespaces\n" + " -S show system objects too\n" + " -t TABLE show info for named table\n" + " -U NAME connect as specified database user\n" + " -x extended (show additional columns)\n" + " --help show this help, then exit\n" + " --version output version information, then exit\n" + "\nThe default action is to show all database OIDs.\n\n" + "Report bugs to .\n", + progname, progname); +} + void * myalloc(size_t size) { diff --git a/contrib/pg_standby/pg_standby.c b/contrib/pg_standby/pg_standby.c index fe8b234650..eef2e112f3 100644 --- a/contrib/pg_standby/pg_standby.c +++ b/contrib/pg_standby/pg_standby.c @@ -1,5 +1,5 @@ /* - * $PostgreSQL: pgsql/contrib/pg_standby/pg_standby.c,v 1.17 2009/01/06 17:27:06 tgl Exp $ + * $PostgreSQL: pgsql/contrib/pg_standby/pg_standby.c,v 1.18 2009/02/27 09:30:21 petere Exp $ * * * pg_standby.c @@ -42,6 +42,8 @@ int getopt(int argc, char *const argv[], const char *optstring); extern char *optarg; extern int optind; +const char *progname; + /* Options and defaults */ int sleeptime = 5; /* amount of time to sleep between file checks */ int waittime = -1; /* how long we have been waiting, -1 no wait @@ -146,7 +148,7 @@ CustomizableInitialize(void) */ if (stat(archiveLocation, &stat_buf) != 0) { - fprintf(stderr, "pg_standby: archiveLocation \"%s\" does not exist\n", archiveLocation); + fprintf(stderr, "%s: archiveLocation \"%s\" does not exist\n", progname, archiveLocation); fflush(stderr); exit(2); } @@ -261,8 +263,8 @@ CustomizableCleanupPriorWALFiles(void) rc = unlink(WALFilePath); if (rc != 0) { - fprintf(stderr, "\npg_standby: ERROR failed to remove \"%s\": %s", - WALFilePath, strerror(errno)); + fprintf(stderr, "\n%s: ERROR failed to remove \"%s\": %s", + progname, WALFilePath, strerror(errno)); break; } } @@ -271,7 +273,7 @@ CustomizableCleanupPriorWALFiles(void) fprintf(stderr, "\n"); } else - fprintf(stderr, "pg_standby: archiveLocation \"%s\" open error\n", archiveLocation); + fprintf(stderr, "%s: archiveLocation \"%s\" open error\n", progname, archiveLocation); closedir(xldir); fflush(stderr); @@ -430,23 +432,29 @@ RestoreWALFileForRecovery(void) static void usage(void) { - fprintf(stderr, "\npg_standby allows Warm Standby servers to be configured\n"); - fprintf(stderr, "Usage:\n"); - fprintf(stderr, " pg_standby [OPTION]... ARCHIVELOCATION NEXTWALFILE XLOGFILEPATH [RESTARTWALFILE]\n"); - fprintf(stderr, " note space between ARCHIVELOCATION and NEXTWALFILE\n"); - fprintf(stderr, "with main intended use as a restore_command in the recovery.conf\n"); - fprintf(stderr, " restore_command = 'pg_standby [OPTION]... ARCHIVELOCATION %%f %%p %%r'\n"); - fprintf(stderr, "e.g. restore_command = 'pg_standby -l /mnt/server/archiverdir %%f %%p %%r'\n"); - fprintf(stderr, "\nOptions:\n"); - fprintf(stderr, " -c copies file from archive (default)\n"); - fprintf(stderr, " -d generate lots of debugging output (testing only)\n"); - fprintf(stderr, " -k NUMFILESTOKEEP if RESTARTWALFILE not used, removes files prior to limit (0 keeps all)\n"); - fprintf(stderr, " -l links into archive (leaves file in archive)\n"); - fprintf(stderr, " -r MAXRETRIES max number of times to retry, with progressive wait (default=3)\n"); - fprintf(stderr, " -s SLEEPTIME seconds to wait between file checks (min=1, max=60, default=5)\n"); - fprintf(stderr, " -t TRIGGERFILE defines a trigger file to initiate failover (no default)\n"); - fprintf(stderr, " -w MAXWAITTIME max seconds to wait for a file (0=no limit)(default=0)\n"); - fflush(stderr); + printf("%s allows PostgreSQL warm standby servers to be configured.\n\n", progname); + printf("Usage:\n"); + printf(" %s [OPTION]... ARCHIVELOCATION NEXTWALFILE XLOGFILEPATH [RESTARTWALFILE]\n", progname); + printf("\n" + "with main intended use as a restore_command in the recovery.conf:\n" + " restore_command = 'pg_standby [OPTION]... ARCHIVELOCATION %%f %%p %%r'\n" + "e.g.\n" + " restore_command = 'pg_standby -l /mnt/server/archiverdir %%f %%p %%r'\n"); + printf("\nOptions:\n"); + printf(" -c copies file from archive (default)\n"); + printf(" -d generate lots of debugging output (testing only)\n"); + printf(" -k NUMFILESTOKEEP if RESTARTWALFILE not used, removes files prior to limit\n" + " (0 keeps all)\n"); + printf(" -l links into archive (leaves file in archive)\n"); + printf(" -r MAXRETRIES max number of times to retry, with progressive wait\n" + " (default=3)\n"); + printf(" -s SLEEPTIME seconds to wait between file checks (min=1, max=60,\n" + " default=5)\n"); + printf(" -t TRIGGERFILE defines a trigger file to initiate failover (no default)\n"); + printf(" -w MAXWAITTIME max seconds to wait for a file (0=no limit) (default=0)\n"); + printf(" --help show this help, then exit\n"); + printf(" --version output version information, then exit\n"); + printf("\nReport bugs to .\n"); } static void @@ -461,6 +469,22 @@ main(int argc, char **argv) { int c; + progname = get_progname(argv[0]); + + if (argc > 1) + { + if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) + { + usage(); + exit(0); + } + if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0) + { + puts("pg_standby (PostgreSQL) " PG_VERSION); + exit(0); + } + } + (void) signal(SIGINT, sighandler); (void) signal(SIGQUIT, sighandler); @@ -478,8 +502,7 @@ main(int argc, char **argv) keepfiles = atoi(optarg); if (keepfiles < 0) { - fprintf(stderr, "usage: pg_standby -k keepfiles must be >= 0\n"); - usage(); + fprintf(stderr, "%s: -k keepfiles must be >= 0\n", progname); exit(2); } break; @@ -490,8 +513,7 @@ main(int argc, char **argv) maxretries = atoi(optarg); if (maxretries < 0) { - fprintf(stderr, "usage: pg_standby -r maxretries must be >= 0\n"); - usage(); + fprintf(stderr, "%s: -r maxretries must be >= 0\n", progname); exit(2); } break; @@ -499,8 +521,7 @@ main(int argc, char **argv) sleeptime = atoi(optarg); if (sleeptime <= 0 || sleeptime > 60) { - fprintf(stderr, "usage: pg_standby -s sleeptime incorrectly set\n"); - usage(); + fprintf(stderr, "%s: -s sleeptime incorrectly set\n", progname); exit(2); } break; @@ -513,13 +534,12 @@ main(int argc, char **argv) maxwaittime = atoi(optarg); if (maxwaittime < 0) { - fprintf(stderr, "usage: pg_standby -w maxwaittime incorrectly set\n"); - usage(); + fprintf(stderr, "%s: -w maxwaittime incorrectly set\n", progname); exit(2); } break; default: - usage(); + fprintf(stderr, "Try \"%s --help\" for more information.\n", progname); exit(2); break; } @@ -530,7 +550,7 @@ main(int argc, char **argv) */ if (argc == 1) { - usage(); + fprintf(stderr, "%s: not enough command-line arguments\n", progname); exit(2); } @@ -547,8 +567,8 @@ main(int argc, char **argv) } else { - fprintf(stderr, "pg_standby: must specify archiveLocation\n"); - usage(); + fprintf(stderr, "%s: must specify archive location\n", progname); + fprintf(stderr, "Try \"%s --help\" for more information.\n", progname); exit(2); } @@ -559,8 +579,8 @@ main(int argc, char **argv) } else { - fprintf(stderr, "pg_standby: use %%f to specify nextWALFileName\n"); - usage(); + fprintf(stderr, "%s: use %%f to specify nextWALFileName\n", progname); + fprintf(stderr, "Try \"%s --help\" for more information.\n", progname); exit(2); } @@ -571,8 +591,8 @@ main(int argc, char **argv) } else { - fprintf(stderr, "pg_standby: use %%p to specify xlogFilePath\n"); - usage(); + fprintf(stderr, "%s: use %%p to specify xlogFilePath\n", progname); + fprintf(stderr, "Try \"%s --help\" for more information.\n", progname); exit(2); } diff --git a/contrib/pgbench/pgbench.c b/contrib/pgbench/pgbench.c index 4cc7b8b19e..fc77a852d2 100644 --- a/contrib/pgbench/pgbench.c +++ b/contrib/pgbench/pgbench.c @@ -4,7 +4,7 @@ * A simple benchmark program for PostgreSQL * Originally written by Tatsuo Ishii and enhanced by many contributors. * - * $PostgreSQL: pgsql/contrib/pgbench/pgbench.c,v 1.84 2009/02/25 13:24:40 petere Exp $ + * $PostgreSQL: pgsql/contrib/pgbench/pgbench.c,v 1.85 2009/02/27 09:30:21 petere Exp $ * Copyright (c) 2000-2009, PostgreSQL Global Development Group * ALL RIGHTS RESERVED; * @@ -250,10 +250,41 @@ diffTime(struct timeval *t1, struct timeval *t2, struct timeval *result) } static void -usage(void) +usage(const char *progname) { - fprintf(stderr, "usage: pgbench [-h hostname][-p port][-c nclients][-t ntransactions | -T duration][-s scaling_factor][-D varname=value][-n][-C][-v][-S][-N][-M querymode][-f filename][-l][-U login][-d][dbname]\n"); - fprintf(stderr, "(initialize mode): pgbench -i [-h hostname][-p port][-s scaling_factor] [-F fillfactor] [-U login][-d][dbname]\n"); + printf("%s is a benchmarking tool for PostgreSQL.\n\n" + "Usage:\n" + " %s [OPTIONS]... [DBNAME]\n" + "\nInitialization options:\n" + " -i invokes initialization mode\n" + " -F NUM fill factor\n" + " -s NUM scaling factor\n" + "\nBenchmarking options:\n" + " -c NUM number of concurrent database clients (default: 1)\n" + " -C establish new connection for each transaction\n" + " -D VARNAME=VALUE\n" + " define variable for use by custom script\n" + " -f FILENAME read transaction script from FILENAME\n" + " -l write transaction times to log file\n" + " -M {simple|extended|prepared}\n" + " protocol for submitting queries to server (default: simple)\n" + " -n do not run VACUUM before tests\n" + " -N do not update tables \"tellers\" and \"branches\"\n" + " -s NUM report scale factor in output\n" + " -S perform SELECT-only transactions\n" + " -t NUM number of transactions each client runs (default: 10)\n" + " -T NUM duration of benchmark test in seconds\n" + " -v vacuum all four standard tables before tests\n" + "\nCommon options:\n" + " -d print debugging output\n" + " -h HOSTNAME database server host or socket directory\n" + " -p PORT database server port number\n" + " -U USERNAME connect as specified database user\n" + " --help show this help, then exit\n" + " --version output version information, then exit\n" + "\n" + "Report bugs to .\n", + progname, progname); } /* random number generator: uniform distribution from min to max inclusive */ @@ -1499,6 +1530,24 @@ main(int argc, char **argv) char val[64]; + const char *progname; + + progname = get_progname(argv[0]); + + if (argc > 1) + { + if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) + { + usage(progname); + exit(0); + } + if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0) + { + puts("pgbench (PostgreSQL) " PG_VERSION); + exit(0); + } + } + #ifdef WIN32 /* stderr is buffered on Win32. */ setvbuf(stderr, NULL, _IONBF, 0); @@ -1652,7 +1701,7 @@ main(int argc, char **argv) case 'M': if (num_files > 0) { - fprintf(stderr, "querymode(-M) should be specifiled before transaction scripts(-f)\n"); + fprintf(stderr, "query mode (-M) should be specifiled before transaction scripts (-f)\n"); exit(1); } for (querymode = 0; querymode < NUM_QUERYMODE; querymode++) @@ -1660,12 +1709,12 @@ main(int argc, char **argv) break; if (querymode >= NUM_QUERYMODE) { - fprintf(stderr, "invalid querymode(-M): %s\n", optarg); + fprintf(stderr, "invalid query mode (-M): %s\n", optarg); exit(1); } break; default: - usage(); + fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); break; } diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c index 37a6c229ac..b26b42cf7a 100644 --- a/contrib/vacuumlo/vacuumlo.c +++ b/contrib/vacuumlo/vacuumlo.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/contrib/vacuumlo/vacuumlo.c,v 1.40 2009/02/26 16:02:37 petere Exp $ + * $PostgreSQL: pgsql/contrib/vacuumlo/vacuumlo.c,v 1.41 2009/02/27 09:30:21 petere Exp $ * *------------------------------------------------------------------------- */ @@ -51,7 +51,7 @@ struct _param }; int vacuumlo(char *, struct _param *); -void usage(void); +void usage(const char *progname); @@ -307,10 +307,10 @@ vacuumlo(char *database, struct _param * param) } void -usage(void) +usage(const char *progname) { - printf("vacuumlo removes unreferenced large objects from databases.\n\n"); - printf("Usage:\n vacuumlo [OPTION]... DBNAME...\n\n"); + printf("%s removes unreferenced large objects from databases.\n\n", progname); + printf("Usage:\n %s [OPTION]... DBNAME...\n\n", progname); printf("Options:\n"); printf(" -h HOSTNAME database server host or socket directory\n"); printf(" -n don't remove large objects, just show what would be done\n"); @@ -319,7 +319,10 @@ usage(void) printf(" -w never prompt for password\n"); printf(" -W force password prompt\n"); printf(" -v write a lot of progress messages\n"); + printf(" --help show this help, then exit\n"); + printf(" --version output version information, then exit\n"); printf("\n"); + printf("Report bugs to .\n"); } @@ -330,6 +333,9 @@ main(int argc, char **argv) struct _param param; int c; int port; + const char *progname; + + progname = get_progname(argv[0]); /* Parameter handling */ param.pg_user = NULL; @@ -339,20 +345,30 @@ main(int argc, char **argv) param.verbose = 0; param.dry_run = 0; + if (argc > 1) + { + if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) + { + usage(progname); + exit(0); + } + if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0) + { + puts("vacuumlo (PostgreSQL) " PG_VERSION); + exit(0); + } + } + while (1) { - c = getopt(argc, argv, "?h:U:p:vnwW"); + c = getopt(argc, argv, "h:U:p:vnwW"); if (c == -1) break; switch (c) { case '?': - if (optopt == '?') - { - usage(); - exit(0); - } + fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname); exit(1); case ':': exit(1); @@ -376,7 +392,7 @@ main(int argc, char **argv) port = strtol(optarg, NULL, 10); if ((port < 1) || (port > 65535)) { - fprintf(stderr, "[%s]: invalid port number '%s'\n", argv[0], optarg); + fprintf(stderr, "%s: invalid port number: %s\n", progname, optarg); exit(1); } param.pg_port = strdup(optarg); diff --git a/doc/src/sgml/pgstandby.sgml b/doc/src/sgml/pgstandby.sgml index 2b8aad7824..6b381c69ac 100644 --- a/doc/src/sgml/pgstandby.sgml +++ b/doc/src/sgml/pgstandby.sgml @@ -1,4 +1,4 @@ - + pg_standby @@ -199,13 +199,6 @@ pg_standby option ... archiv
- - - --help is not supported since - pg_standby is not intended for interactive use, - except during development and testing. - -