diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c index 342e4c9..a36a016 100644 --- a/src/bin/scripts/reindexdb.c +++ b/src/bin/scripts/reindexdb.c @@ -18,12 +18,12 @@ static void reindex_one_database(const char *name, const char *dbname, const char *type, const char *host, const char *port, const char *username, enum trivalue prompt_password, const char *progname, - bool echo); + bool echo, bool concurrently); static void reindex_all_databases(const char *maintenance_db, const char *host, const char *port, const char *username, enum trivalue prompt_password, const char *progname, bool echo, - bool quiet); + bool quiet, bool concurrently); static void reindex_system_catalogs(const char *dbname, const char *host, const char *port, const char *username, enum trivalue prompt_password, @@ -46,6 +46,7 @@ main(int argc, char *argv[]) {"system", no_argument, NULL, 's'}, {"table", required_argument, NULL, 't'}, {"index", required_argument, NULL, 'i'}, + {"concurrently", no_argument, NULL, 'c'}, {"maintenance-db", required_argument, NULL, 2}, {NULL, 0, NULL, 0} }; @@ -64,6 +65,7 @@ main(int argc, char *argv[]) bool alldb = false; bool echo = false; bool quiet = false; + bool concurrently = false; SimpleStringList indexes = {NULL, NULL}; SimpleStringList tables = {NULL, NULL}; @@ -73,7 +75,7 @@ main(int argc, char *argv[]) handle_help_version_opts(argc, argv, "reindexdb", help); /* process command-line options */ - while ((c = getopt_long(argc, argv, "h:p:U:wWeqd:ast:i:", long_options, &optindex)) != -1) + while ((c = getopt_long(argc, argv, "h:p:U:wWeqd:ast:i:c", long_options, &optindex)) != -1) { switch (c) { @@ -113,6 +115,9 @@ main(int argc, char *argv[]) case 'i': simple_string_list_append(&indexes, optarg); break; + case 'c': + concurrently = true; + break; case 2: maintenance_db = pg_strdup(optarg); break; @@ -166,7 +171,8 @@ main(int argc, char *argv[]) } reindex_all_databases(maintenance_db, host, port, username, - prompt_password, progname, echo, quiet); + prompt_password, progname, echo, quiet, + concurrently); } else if (syscatalog) { @@ -180,6 +186,11 @@ main(int argc, char *argv[]) fprintf(stderr, _("%s: cannot reindex specific index(es) and system catalogs at the same time\n"), progname); exit(1); } + if (concurrently) + { + fprintf(stderr, _("%s: cannot reindex concurrently system catalogs\n"), progname); + exit(1); + } if (dbname == NULL) { @@ -213,7 +224,8 @@ main(int argc, char *argv[]) for (cell = indexes.head; cell; cell = cell->next) { reindex_one_database(cell->val, dbname, "INDEX", host, port, - username, prompt_password, progname, echo); + username, prompt_password, progname, echo, + concurrently); } } if (tables.head != NULL) @@ -223,13 +235,15 @@ main(int argc, char *argv[]) for (cell = tables.head; cell; cell = cell->next) { reindex_one_database(cell->val, dbname, "TABLE", host, port, - username, prompt_password, progname, echo); + username, prompt_password, progname, echo, + concurrently); } } /* 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); + username, prompt_password, progname, echo, + concurrently); } exit(0); @@ -238,7 +252,8 @@ main(int argc, char *argv[]) static void reindex_one_database(const char *name, const char *dbname, const char *type, const char *host, const char *port, const char *username, - enum trivalue prompt_password, const char *progname, bool echo) + enum trivalue prompt_password, const char *progname, bool echo, + bool concurrently) { PQExpBufferData sql; @@ -246,13 +261,12 @@ reindex_one_database(const char *name, const char *dbname, const char *type, initPQExpBuffer(&sql); - appendPQExpBuffer(&sql, "REINDEX"); - if (strcmp(type, "TABLE") == 0) - appendPQExpBuffer(&sql, " TABLE %s", name); - else if (strcmp(type, "INDEX") == 0) - appendPQExpBuffer(&sql, " INDEX %s", name); - else if (strcmp(type, "DATABASE") == 0) - appendPQExpBuffer(&sql, " DATABASE %s", fmtId(name)); + appendPQExpBuffer(&sql, "REINDEX %s", type); + if (concurrently) + appendPQExpBuffer(&sql, " CONCURRENTLY"); + + appendPQExpBuffer(&sql, " %s", + strcmp(type, "DATABASE") == 0 ? fmtId(name) : name); appendPQExpBuffer(&sql, ";\n"); conn = connectDatabase(dbname, host, port, username, prompt_password, @@ -281,7 +295,8 @@ static void reindex_all_databases(const char *maintenance_db, const char *host, const char *port, const char *username, enum trivalue prompt_password, - const char *progname, bool echo, bool quiet) + const char *progname, bool echo, bool quiet, + bool concurrently) { PGconn *conn; PGresult *result; @@ -303,7 +318,7 @@ reindex_all_databases(const char *maintenance_db, } reindex_one_database(dbname, dbname, "DATABASE", host, port, username, - prompt_password, progname, echo); + prompt_password, progname, echo, concurrently); } PQclear(result); @@ -343,6 +358,7 @@ help(const char *progname) printf(_(" %s [OPTION]... [DBNAME]\n"), progname); printf(_("\nOptions:\n")); printf(_(" -a, --all reindex all databases\n")); + printf(_(" -c, --concurrently reindex concurrently\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(es) only\n"));