Commit b859d94c authored by Andrew Dunstan's avatar Andrew Dunstan

Provide pg_amcheck with an --install-missing option

This will install amcheck in the database if not present. The default
schema is for the extension is pg_catalog, but this can be overridden by
providing a value for the option.

Mark Dilger, slightly editorialized by me.

(rather divergent)
Discussion: https://postgr.es/m/bdc0f7c2-09e3-ee57-8471-569dfb509234@dunslane.net
parent aa271209
...@@ -217,6 +217,23 @@ PostgreSQL documentation ...@@ -217,6 +217,23 @@ PostgreSQL documentation
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><option>--install-missing</option></term>
<term><option>--install-missing=<replaceable class="parameter">schema</replaceable></option></term>
<listitem>
<para>
Install any missing extensions that are required to check the
database(s). If not yet installed, each extension's objects will be
installed into the given
<replaceable class="parameter">schema</replaceable>, or if not specified
into schema <literal>pg_catalog</literal>.
</para>
<para>
At present, the only required extension is <xref linkend="amcheck"/>.
</para>
</listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><option>-j <replaceable class="parameter">num</replaceable></option></term> <term><option>-j <replaceable class="parameter">num</replaceable></option></term>
<term><option>--jobs=<replaceable class="parameter">num</replaceable></option></term> <term><option>--jobs=<replaceable class="parameter">num</replaceable></option></term>
......
...@@ -61,6 +61,13 @@ typedef struct AmcheckOptions ...@@ -61,6 +61,13 @@ typedef struct AmcheckOptions
bool show_progress; bool show_progress;
int jobs; int jobs;
/*
* Whether to install missing extensions, and optionally the name of the
* schema in which to install the extension's objects.
*/
bool install_missing;
char *install_schema;
/* Objects to check or not to check, as lists of PatternInfo structs. */ /* Objects to check or not to check, as lists of PatternInfo structs. */
PatternInfoArray include; PatternInfoArray include;
PatternInfoArray exclude; PatternInfoArray exclude;
...@@ -109,6 +116,8 @@ static AmcheckOptions opts = { ...@@ -109,6 +116,8 @@ static AmcheckOptions opts = {
.strict_names = true, .strict_names = true,
.show_progress = false, .show_progress = false,
.jobs = 1, .jobs = 1,
.install_missing = false,
.install_schema = "pg_catalog",
.include = {NULL, 0}, .include = {NULL, 0},
.exclude = {NULL, 0}, .exclude = {NULL, 0},
.excludetbl = false, .excludetbl = false,
...@@ -259,6 +268,7 @@ main(int argc, char *argv[]) ...@@ -259,6 +268,7 @@ main(int argc, char *argv[])
{"no-strict-names", no_argument, NULL, 10}, {"no-strict-names", no_argument, NULL, 10},
{"heapallindexed", no_argument, NULL, 11}, {"heapallindexed", no_argument, NULL, 11},
{"parent-check", no_argument, NULL, 12}, {"parent-check", no_argument, NULL, 12},
{"install-missing", optional_argument, NULL, 13},
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
}; };
...@@ -435,6 +445,11 @@ main(int argc, char *argv[]) ...@@ -435,6 +445,11 @@ main(int argc, char *argv[])
case 12: case 12:
opts.parent_check = true; opts.parent_check = true;
break; break;
case 13:
opts.install_missing = true;
if (optarg)
opts.install_schema = pg_strdup(optarg);
break;
default: default:
fprintf(stderr, fprintf(stderr,
_("Try \"%s --help\" for more information.\n"), _("Try \"%s --help\" for more information.\n"),
...@@ -543,6 +558,29 @@ main(int argc, char *argv[]) ...@@ -543,6 +558,29 @@ main(int argc, char *argv[])
conn = connectDatabase(&cparams, progname, opts.echo, false, true); conn = connectDatabase(&cparams, progname, opts.echo, false, true);
} }
/*
* Optionally install amcheck if not already installed in this
* database.
*/
if (opts.install_missing)
{
char *schema;
char *install_sql;
/*
* Must re-escape the schema name for each database, as the
* escaping rules may change.
*/
schema = PQescapeIdentifier(conn, opts.install_schema,
strlen(opts.install_schema));
install_sql = psprintf("CREATE EXTENSION IF NOT EXISTS amcheck WITH SCHEMA %s",
schema);
executeCommand(conn, install_sql, opts.echo);
pfree(install_sql);
pfree(schema);
}
/* /*
* Verify that amcheck is installed for this next database. User * Verify that amcheck is installed for this next database. User
* error could result in a database not having amcheck that should * error could result in a database not having amcheck that should
...@@ -1153,6 +1191,7 @@ help(const char *progname) ...@@ -1153,6 +1191,7 @@ help(const char *progname)
printf(_(" -V, --version output version information, then exit\n")); printf(_(" -V, --version output version information, then exit\n"));
printf(_(" -P, --progress show progress information\n")); printf(_(" -P, --progress show progress information\n"));
printf(_(" -?, --help show this help, then exit\n")); printf(_(" -?, --help show this help, then exit\n"));
printf(_(" --install-missing install missing extensions\n"));
printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL); printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment