diff options
author | Magnus Hagander <magnus@hagander.net> | 2013-01-17 11:24:47 +0100 |
---|---|---|
committer | Magnus Hagander <magnus@hagander.net> | 2013-01-17 11:24:47 +0100 |
commit | f3af53441ed0b306692a1cc31003a84d1b5b3cf7 (patch) | |
tree | d21b2e0fd1885497eabb8fd294e652cf856b4ad0 /src | |
parent | 36bdfa52a0780d2fcbb48665ab7ca98a13593fdf (diff) | |
download | postgresql-f3af53441ed0b306692a1cc31003a84d1b5b3cf7.tar.gz postgresql-f3af53441ed0b306692a1cc31003a84d1b5b3cf7.zip |
Support multiple -t/--table arguments for more commands
On top of the previous support in pg_dump, add support to specify
multiple tables (by using the -t option multiple times) to
pg_restore, clsuterdb, reindexdb and vacuumdb.
Josh Kupershmidt, reviewed by Karl O. Pinc
Diffstat (limited to 'src')
-rw-r--r-- | src/bin/pg_dump/common.c | 31 | ||||
-rw-r--r-- | src/bin/pg_dump/dumputils.c | 33 | ||||
-rw-r--r-- | src/bin/pg_dump/dumputils.h | 17 | ||||
-rw-r--r-- | src/bin/pg_dump/pg_backup.h | 3 | ||||
-rw-r--r-- | src/bin/pg_dump/pg_backup_archiver.c | 2 | ||||
-rw-r--r-- | src/bin/pg_dump/pg_dump.h | 13 | ||||
-rw-r--r-- | src/bin/pg_dump/pg_restore.c | 4 | ||||
-rw-r--r-- | src/bin/scripts/Makefile | 2 | ||||
-rw-r--r-- | src/bin/scripts/clusterdb.c | 29 | ||||
-rw-r--r-- | src/bin/scripts/reindexdb.c | 58 | ||||
-rw-r--r-- | src/bin/scripts/vacuumdb.c | 34 |
11 files changed, 138 insertions, 88 deletions
diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c index 99a3fe31f85..706b9a75e3b 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 80bc0c81782..7ca0c60f3e5 100644 --- a/src/bin/pg_dump/dumputils.c +++ b/src/bin/pg_dump/dumputils.c @@ -17,6 +17,7 @@ #include <ctype.h> #include "dumputils.h" +#include "dumpmem.h" #include "parser/keywords.h" @@ -1352,3 +1353,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 ac7480c1e53..a4b351d03ca 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 3b49395ecbc..473670ddd37 100644 --- a/src/bin/pg_dump/pg_backup.h +++ b/src/bin/pg_dump/pg_backup.h @@ -26,6 +26,7 @@ #include "postgres_fe.h" #include "pg_dump.h" +#include "dumputils.h" #include "libpq-fe.h" @@ -125,9 +126,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 1fead285e96..a810efd3bb9 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 3b2cde78307..b6dc856600f 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 @@ -533,9 +522,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 49d799b9530..45b8b587e41 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 602c2623c39..ea4841159d7 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 414c8c974d0..0ac213d3c31 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,21 @@ 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 +266,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 ffd8a4e3d31..342e4c94d1a 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,28 @@ 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 +345,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 9bfb462e861..e4dde1fc9bf 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,25 @@ 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 +364,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")); |