On 12/13/2012 11:02:56 PM, Josh Kupershmidt wrote: > On Thu, Dec 13, 2012 at 9:03 PM, Karl O. Pinc <k...@meme.com> wrote:
> > Sorry to be so persnickety, and unhelpful until now. > > It seemed like it should be doable, but something > > was going wrong between keyboard and chair. I guess > > I should be doing this when better rested. > > No problem, here is v5 with changed synopses. The clusterdb synopsis had tabs in it, which I understand is frowned upon in the docs. I've fixed this. It looks good to me, passes check and so forth. Attached is a v6 patch, with no tabs in docs and based off the latest head. I'm marking it ready for committer. Regards, Karl <k...@meme.com> Free Software: "You don't pay back, you pay forward." -- Robert A. Heinlein
diff --git a/doc/src/sgml/ref/clusterdb.sgml b/doc/src/sgml/ref/clusterdb.sgml index 097ea91..1316932 100644 --- a/doc/src/sgml/ref/clusterdb.sgml +++ b/doc/src/sgml/ref/clusterdb.sgml @@ -24,7 +24,17 @@ PostgreSQL documentation <command>clusterdb</command> <arg rep="repeat"><replaceable>connection-option</replaceable></arg> <group choice="opt"><arg choice="plain"><option>--verbose</option></arg><arg choice="plain"><option>-v</option></arg></group> - <arg choice="opt"><group choice="plain"><arg choice="plain"><option>--table</option></arg><arg choice="plain"><option>-t</option></arg></group> <replaceable>table</replaceable> </arg> + + <arg choice="plain" rep="repeat"> + <arg choice="opt"> + <group choice="plain"> + <arg choice="plain"><option>--table</option></arg> + <arg choice="plain"><option>-t</option></arg> + </group> + <replaceable>table</replaceable> + </arg> + </arg> + <arg choice="opt"><replaceable>dbname</replaceable></arg> </cmdsynopsis> @@ -117,6 +127,8 @@ PostgreSQL documentation <listitem> <para> Cluster <replaceable class="parameter">table</replaceable> only. + Multiple tables can be clustered by writing multiple + <option>-t</> switches. </para> </listitem> </varlistentry> diff --git a/doc/src/sgml/ref/pg_restore.sgml b/doc/src/sgml/ref/pg_restore.sgml index f4668e7..0d73294 100644 --- a/doc/src/sgml/ref/pg_restore.sgml +++ b/doc/src/sgml/ref/pg_restore.sgml @@ -400,7 +400,8 @@ <term><option>--table=<replaceable class="parameter">table</replaceable></option></term> <listitem> <para> - Restore definition and/or data of named table only. This can be + Restore definition and/or data of named table only. Multiple tables + may be specified with multiple <option>-t</> switches. This can be combined with the <option>-n</option> option to specify a schema. </para> </listitem> diff --git a/doc/src/sgml/ref/reindexdb.sgml b/doc/src/sgml/ref/reindexdb.sgml index 781012f..3ba9951 100644 --- a/doc/src/sgml/ref/reindexdb.sgml +++ b/doc/src/sgml/ref/reindexdb.sgml @@ -23,20 +23,27 @@ PostgreSQL documentation <cmdsynopsis> <command>reindexdb</command> <arg rep="repeat"><replaceable>connection-option</replaceable></arg> - <group choice="opt"> - <group choice="plain"> - <arg choice="plain"><option>--table</option></arg> - <arg choice="plain"><option>-t</option></arg> - </group> - <replaceable>table</replaceable> - </group> - <group choice="opt"> - <group choice="plain"> - <arg choice="plain"><option>--index</option></arg> - <arg choice="plain"><option>-i</option></arg> - </group> - <replaceable>index</replaceable> - </group> + + <arg choice="plain" rep="repeat"> + <arg choice="opt"> + <group choice="plain"> + <arg choice="plain"><option>--table</option></arg> + <arg choice="plain"><option>-t</option></arg> + </group> + <replaceable>table</replaceable> + </arg> + </arg> + + <arg choice="plain" rep="repeat"> + <arg choice="opt"> + <group choice="plain"> + <arg choice="plain"><option>--index</option></arg> + <arg choice="plain"><option>-i</option></arg> + </group> + <replaceable>index</replaceable> + </arg> + </arg> + <arg choice="opt"><replaceable>dbname</replaceable></arg> </cmdsynopsis> @@ -128,6 +135,8 @@ PostgreSQL documentation <listitem> <para> Recreate <replaceable class="parameter">index</replaceable> only. + Multiple indexes can be recreated by writing multiple + <option>-i</> switches. </para> </listitem> </varlistentry> @@ -158,6 +167,8 @@ PostgreSQL documentation <listitem> <para> Reindex <replaceable class="parameter">table</replaceable> only. + Multiple tables can be reindexed by writing multiple + <option>-t</> switches. </para> </listitem> </varlistentry> diff --git a/doc/src/sgml/ref/vacuumdb.sgml b/doc/src/sgml/ref/vacuumdb.sgml index c60ba44..a5216ec 100644 --- a/doc/src/sgml/ref/vacuumdb.sgml +++ b/doc/src/sgml/ref/vacuumdb.sgml @@ -24,14 +24,18 @@ PostgreSQL documentation <command>vacuumdb</command> <arg rep="repeat"><replaceable>connection-option</replaceable></arg> <arg rep="repeat"><replaceable>option</replaceable></arg> - <arg choice="opt"> - <group choice="plain"> - <arg choice="plain"><option>--table</option></arg> - <arg choice="plain"><option>-t</option></arg> - </group> - <replaceable>table</replaceable> - <arg choice="opt">( <replaceable class="parameter">column</replaceable> [,...] )</arg> + + <arg choice="plain" rep="repeat"> + <arg choice="opt"> + <group choice="plain"> + <arg choice="plain"><option>--table</option></arg> + <arg choice="plain"><option>-t</option></arg> + </group> + <replaceable>table</replaceable> + <arg choice="opt">( <replaceable class="parameter">column</replaceable> [,...] )</arg> + </arg> </arg> + <arg choice="opt"><replaceable>dbname</replaceable></arg> </cmdsynopsis> @@ -147,6 +151,8 @@ PostgreSQL documentation Clean or analyze <replaceable class="parameter">table</replaceable> only. Column names can be specified only in conjunction with the <option>--analyze</option> or <option>--analyze-only</option> options. + Multiple tables can be vacuumed by writing multiple + <option>-t</> switches. </para> <tip> <para> diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c index 611c8e3..88c07be 100644 --- a/src/bin/pg_dump/common.c +++ b/src/bin/pg_dump/common.c @@ -898,24 +898,6 @@ simple_oid_list_append(SimpleOidList *list, Oid val) list->tail = cell; } -void -simple_string_list_append(SimpleStringList *list, const char *val) -{ - SimpleStringListCell *cell; - - /* this calculation correctly accounts for the null trailing byte */ - cell = (SimpleStringListCell *) - pg_malloc(sizeof(SimpleStringListCell) + strlen(val)); - cell->next = NULL; - strcpy(cell->val, val); - - if (list->tail) - list->tail->next = cell; - else - list->head = cell; - list->tail = cell; -} - bool simple_oid_list_member(SimpleOidList *list, Oid val) { @@ -928,16 +910,3 @@ simple_oid_list_member(SimpleOidList *list, Oid val) } return false; } - -bool -simple_string_list_member(SimpleStringList *list, const char *val) -{ - SimpleStringListCell *cell; - - for (cell = list->head; cell; cell = cell->next) - { - if (strcmp(cell->val, val) == 0) - return true; - } - return false; -} diff --git a/src/bin/pg_dump/dumputils.c b/src/bin/pg_dump/dumputils.c index 91f2774..c0b10f0 100644 --- a/src/bin/pg_dump/dumputils.c +++ b/src/bin/pg_dump/dumputils.c @@ -17,7 +17,7 @@ #include <ctype.h> #include "dumputils.h" - +#include "dumpmem.h" #include "parser/keywords.h" @@ -1349,3 +1349,35 @@ exit_nicely(int code) exit(code); } + +void +simple_string_list_append(SimpleStringList *list, const char *val) +{ + SimpleStringListCell *cell; + + /* this calculation correctly accounts for the null trailing byte */ + cell = (SimpleStringListCell *) + pg_malloc(sizeof(SimpleStringListCell) + strlen(val)); + + cell->next = NULL; + strcpy(cell->val, val); + + if (list->tail) + list->tail->next = cell; + else + list->head = cell; + list->tail = cell; +} + +bool +simple_string_list_member(SimpleStringList *list, const char *val) +{ + SimpleStringListCell *cell; + + for (cell = list->head; cell; cell = cell->next) + { + if (strcmp(cell->val, val) == 0) + return true; + } + return false; +} diff --git a/src/bin/pg_dump/dumputils.h b/src/bin/pg_dump/dumputils.h index 4ef8cb3..a300e7e 100644 --- a/src/bin/pg_dump/dumputils.h +++ b/src/bin/pg_dump/dumputils.h @@ -27,6 +27,19 @@ typedef enum /* bits returned by set_dump_section */ DUMP_UNSECTIONED = 0xff } DumpSections; +typedef struct SimpleStringListCell +{ + struct SimpleStringListCell *next; + char val[1]; /* VARIABLE LENGTH FIELD */ +} SimpleStringListCell; + +typedef struct SimpleStringList +{ + SimpleStringListCell *head; + SimpleStringListCell *tail; +} SimpleStringList; + + typedef void (*on_exit_nicely_callback) (int code, void *arg); extern int quote_all_identifiers; @@ -75,4 +88,8 @@ __attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3), noreturn)); extern void on_exit_nicely(on_exit_nicely_callback function, void *arg); extern void exit_nicely(int code) __attribute__((noreturn)); +extern void simple_string_list_append(SimpleStringList *list, const char *val); +extern bool simple_string_list_member(SimpleStringList *list, const char *val); + + #endif /* DUMPUTILS_H */ diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h index 3b49395..9972e68 100644 --- a/src/bin/pg_dump/pg_backup.h +++ b/src/bin/pg_dump/pg_backup.h @@ -26,7 +26,7 @@ #include "postgres_fe.h" #include "pg_dump.h" - +#include "dumputils.h" #include "libpq-fe.h" @@ -125,9 +125,9 @@ typedef struct _restoreOptions int selTable; char *indexNames; char *functionNames; - char *tableNames; char *schemaNames; char *triggerNames; + SimpleStringList tableNames; int useDB; char *dbname; diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index 1fead28..a810efd 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -2493,7 +2493,7 @@ _tocEntryRequired(TocEntry *te, teSection curSection, RestoreOptions *ropt) { if (!ropt->selTable) return 0; - if (ropt->tableNames && strcmp(ropt->tableNames, te->tag) != 0) + if (ropt->tableNames.head != NULL && (!(simple_string_list_member(&ropt->tableNames, te->tag)))) return 0; } else if (strcmp(te->desc, "INDEX") == 0) diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 2100d43..0ab451a 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -58,17 +58,6 @@ typedef struct SimpleOidList SimpleOidListCell *tail; } SimpleOidList; -typedef struct SimpleStringListCell -{ - struct SimpleStringListCell *next; - char val[1]; /* VARIABLE LENGTH FIELD */ -} SimpleStringListCell; - -typedef struct SimpleStringList -{ - SimpleStringListCell *head; - SimpleStringListCell *tail; -} SimpleStringList; /* * The data structures used to store system catalog information. Every @@ -532,9 +521,7 @@ extern CollInfo *findCollationByOid(Oid oid); extern NamespaceInfo *findNamespaceByOid(Oid oid); extern void simple_oid_list_append(SimpleOidList *list, Oid val); -extern void simple_string_list_append(SimpleStringList *list, const char *val); extern bool simple_oid_list_member(SimpleOidList *list, Oid val); -extern bool simple_string_list_member(SimpleStringList *list, const char *val); extern void parseOidArray(const char *str, Oid *array, int arraysize); diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c index 49d799b..45b8b58 100644 --- a/src/bin/pg_dump/pg_restore.c +++ b/src/bin/pg_dump/pg_restore.c @@ -234,7 +234,7 @@ main(int argc, char **argv) case 't': /* Dump data for this table only */ opts->selTypes = 1; opts->selTable = 1; - opts->tableNames = pg_strdup(optarg); + simple_string_list_append(&opts->tableNames, optarg); break; case 'U': @@ -424,7 +424,7 @@ usage(const char *progname) printf(_(" -P, --function=NAME(args) restore named function\n")); printf(_(" -s, --schema-only restore only the schema, no data\n")); printf(_(" -S, --superuser=NAME superuser user name to use for disabling triggers\n")); - printf(_(" -t, --table=NAME restore named table\n")); + printf(_(" -t, --table=NAME restore named table(s)\n")); printf(_(" -T, --trigger=NAME restore named trigger\n")); printf(_(" -x, --no-privileges skip restoration of access privileges (grant/revoke)\n")); printf(_(" -1, --single-transaction restore as a single transaction\n")); diff --git a/src/bin/scripts/Makefile b/src/bin/scripts/Makefile index 0980b4c..d9ba29d 100644 --- a/src/bin/scripts/Makefile +++ b/src/bin/scripts/Makefile @@ -32,7 +32,7 @@ dropdb: dropdb.o common.o dumputils.o kwlookup.o keywords.o | submake-libpq droplang: droplang.o common.o print.o mbprint.o | submake-libpq dropuser: dropuser.o common.o dumputils.o kwlookup.o keywords.o | submake-libpq clusterdb: clusterdb.o common.o dumputils.o kwlookup.o keywords.o | submake-libpq -vacuumdb: vacuumdb.o common.o | submake-libpq +vacuumdb: vacuumdb.o common.o dumputils.o kwlookup.o keywords.o | submake-libpq reindexdb: reindexdb.o common.o dumputils.o kwlookup.o keywords.o | submake-libpq dumputils.c keywords.c: % : $(top_srcdir)/src/bin/pg_dump/% diff --git a/src/bin/scripts/clusterdb.c b/src/bin/scripts/clusterdb.c index 261b438..4f163ee 100644 --- a/src/bin/scripts/clusterdb.c +++ b/src/bin/scripts/clusterdb.c @@ -58,8 +58,8 @@ main(int argc, char *argv[]) bool echo = false; bool quiet = false; bool alldb = false; - char *table = NULL; bool verbose = false; + SimpleStringList tables = {NULL, NULL}; progname = get_progname(argv[0]); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts")); @@ -98,7 +98,7 @@ main(int argc, char *argv[]) alldb = true; break; case 't': - table = pg_strdup(optarg); + simple_string_list_append(&tables, optarg); break; case 'v': verbose = true; @@ -140,9 +140,10 @@ main(int argc, char *argv[]) progname); exit(1); } - if (table) + + if (tables.head != NULL) { - fprintf(stderr, _("%s: cannot cluster a specific table in all databases\n"), + fprintf(stderr, _("%s: cannot cluster specific table(s) in all databases\n"), progname); exit(1); } @@ -162,9 +163,20 @@ main(int argc, char *argv[]) dbname = get_user_name(progname); } - cluster_one_database(dbname, verbose, table, - host, port, username, prompt_password, - progname, echo); + if (tables.head != NULL) + { + SimpleStringListCell *cell; + for (cell = tables.head; cell; cell = cell->next) + { + cluster_one_database(dbname, verbose, cell->val, + host, port, username, prompt_password, + progname, echo); + } + } + else + cluster_one_database(dbname, verbose, NULL, + host, port, username, prompt_password, + progname, echo); } exit(0); @@ -253,7 +265,7 @@ help(const char *progname) printf(_(" -d, --dbname=DBNAME database to cluster\n")); printf(_(" -e, --echo show the commands being sent to the server\n")); printf(_(" -q, --quiet don't write any messages\n")); - printf(_(" -t, --table=TABLE cluster specific table only\n")); + printf(_(" -t, --table=TABLE cluster specific table(s) only\n")); printf(_(" -v, --verbose write a lot of output\n")); printf(_(" -V, --version output version information, then exit\n")); printf(_(" -?, --help show this help, then exit\n")); diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c index f61dada..6b1ca49 100644 --- a/src/bin/scripts/reindexdb.c +++ b/src/bin/scripts/reindexdb.c @@ -64,8 +64,8 @@ main(int argc, char *argv[]) bool alldb = false; bool echo = false; bool quiet = false; - const char *table = NULL; - const char *index = NULL; + SimpleStringList indexes = {NULL, NULL}; + SimpleStringList tables = {NULL, NULL}; progname = get_progname(argv[0]); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts")); @@ -108,10 +108,10 @@ main(int argc, char *argv[]) syscatalog = true; break; case 't': - table = pg_strdup(optarg); + simple_string_list_append(&tables, optarg); break; case 'i': - index = pg_strdup(optarg); + simple_string_list_append(&indexes, optarg); break; case 2: maintenance_db = pg_strdup(optarg); @@ -154,14 +154,14 @@ main(int argc, char *argv[]) fprintf(stderr, _("%s: cannot reindex all databases and system catalogs at the same time\n"), progname); exit(1); } - if (table) + if (tables.head != NULL) { - fprintf(stderr, _("%s: cannot reindex a specific table in all databases\n"), progname); + fprintf(stderr, _("%s: cannot reindex specific table(s) in all databases\n"), progname); exit(1); } - if (index) + if (indexes.head != NULL) { - fprintf(stderr, _("%s: cannot reindex a specific index in all databases\n"), progname); + fprintf(stderr, _("%s: cannot reindex specific index(es) in all databases\n"), progname); exit(1); } @@ -170,14 +170,14 @@ main(int argc, char *argv[]) } else if (syscatalog) { - if (table) + if (tables.head != NULL) { - fprintf(stderr, _("%s: cannot reindex a specific table and system catalogs at the same time\n"), progname); + fprintf(stderr, _("%s: cannot reindex specific table(s) and system catalogs at the same time\n"), progname); exit(1); } - if (index) + if (indexes.head != NULL) { - fprintf(stderr, _("%s: cannot reindex a specific index and system catalogs at the same time\n"), progname); + fprintf(stderr, _("%s: cannot reindex specific index(es) and system catalogs at the same time\n"), progname); exit(1); } @@ -206,14 +206,26 @@ main(int argc, char *argv[]) dbname = get_user_name(progname); } - if (index) - reindex_one_database(index, dbname, "INDEX", host, port, - username, prompt_password, progname, echo); - if (table) - reindex_one_database(table, dbname, "TABLE", host, port, - username, prompt_password, progname, echo); - /* reindex database only if index or table is not specified */ - if (index == NULL && table == NULL) + if (indexes.head != NULL) + { + SimpleStringListCell *cell; + for (cell = indexes.head; cell; cell = cell->next) + { + reindex_one_database(cell->val, dbname, "INDEX", host, port, + username, prompt_password, progname, echo); + } + } + if (tables.head != NULL) + { + SimpleStringListCell *cell; + for (cell = tables.head; cell; cell = cell->next) + { + reindex_one_database(cell->val, dbname, "TABLE", host, port, + username, prompt_password, progname, echo); + } + } + /* reindex database only if neither index nor table is specified */ + if (indexes.head == NULL && tables.head == NULL) reindex_one_database(dbname, dbname, "DATABASE", host, port, username, prompt_password, progname, echo); } @@ -331,10 +343,10 @@ help(const char *progname) printf(_(" -a, --all reindex all databases\n")); printf(_(" -d, --dbname=DBNAME database to reindex\n")); printf(_(" -e, --echo show the commands being sent to the server\n")); - printf(_(" -i, --index=INDEX recreate specific index only\n")); + printf(_(" -i, --index=INDEX recreate specific index(es) only\n")); printf(_(" -q, --quiet don't write any messages\n")); printf(_(" -s, --system reindex system catalogs\n")); - printf(_(" -t, --table=TABLE reindex specific table only\n")); + printf(_(" -t, --table=TABLE reindex specific table(s) only\n")); printf(_(" -V, --version output version information, then exit\n")); printf(_(" -?, --help show this help, then exit\n")); printf(_("\nConnection options:\n")); diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c index eb28ad4..dc5fcaf 100644 --- a/src/bin/scripts/vacuumdb.c +++ b/src/bin/scripts/vacuumdb.c @@ -12,6 +12,7 @@ #include "postgres_fe.h" #include "common.h" +#include "dumputils.h" static void vacuum_one_database(const char *dbname, bool full, bool verbose, @@ -68,9 +69,9 @@ main(int argc, char *argv[]) bool analyze_only = false; bool freeze = false; bool alldb = false; - char *table = NULL; bool full = false; bool verbose = false; + SimpleStringList tables = {NULL, NULL}; progname = get_progname(argv[0]); set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts")); @@ -118,7 +119,7 @@ main(int argc, char *argv[]) alldb = true; break; case 't': - table = pg_strdup(optarg); + simple_string_list_append(&tables, optarg); break; case 'f': full = true; @@ -181,9 +182,9 @@ main(int argc, char *argv[]) progname); exit(1); } - if (table) + if (tables.head != NULL) { - fprintf(stderr, _("%s: cannot vacuum a specific table in all databases\n"), + fprintf(stderr, _("%s: cannot vacuum specific table(s) in all databases\n"), progname); exit(1); } @@ -204,10 +205,24 @@ main(int argc, char *argv[]) dbname = get_user_name(progname); } - vacuum_one_database(dbname, full, verbose, and_analyze, analyze_only, - freeze, table, - host, port, username, prompt_password, - progname, echo); + if (tables.head != NULL) + { + SimpleStringListCell *cell; + for (cell = tables.head; cell; cell = cell->next) + { + vacuum_one_database(dbname, full, verbose, and_analyze, + analyze_only, + freeze, cell->val, + host, port, username, prompt_password, + progname, echo); + } + } + else + vacuum_one_database(dbname, full, verbose, and_analyze, + analyze_only, + freeze, NULL, + host, port, username, prompt_password, + progname, echo); } exit(0); @@ -348,7 +363,7 @@ help(const char *progname) printf(_(" -f, --full do full vacuuming\n")); printf(_(" -F, --freeze freeze row transaction information\n")); printf(_(" -q, --quiet don't write any messages\n")); - printf(_(" -t, --table='TABLE[(COLUMNS)]' vacuum specific table only\n")); + printf(_(" -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n")); printf(_(" -v, --verbose write a lot of output\n")); printf(_(" -V, --version output version information, then exit\n")); printf(_(" -z, --analyze update optimizer statistics\n"));
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers