aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMagnus Hagander <magnus@hagander.net>2013-01-17 11:24:47 +0100
committerMagnus Hagander <magnus@hagander.net>2013-01-17 11:24:47 +0100
commitf3af53441ed0b306692a1cc31003a84d1b5b3cf7 (patch)
treed21b2e0fd1885497eabb8fd294e652cf856b4ad0 /src
parent36bdfa52a0780d2fcbb48665ab7ca98a13593fdf (diff)
downloadpostgresql-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.c31
-rw-r--r--src/bin/pg_dump/dumputils.c33
-rw-r--r--src/bin/pg_dump/dumputils.h17
-rw-r--r--src/bin/pg_dump/pg_backup.h3
-rw-r--r--src/bin/pg_dump/pg_backup_archiver.c2
-rw-r--r--src/bin/pg_dump/pg_dump.h13
-rw-r--r--src/bin/pg_dump/pg_restore.c4
-rw-r--r--src/bin/scripts/Makefile2
-rw-r--r--src/bin/scripts/clusterdb.c29
-rw-r--r--src/bin/scripts/reindexdb.c58
-rw-r--r--src/bin/scripts/vacuumdb.c34
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"));