/* Note: password can be carried over from a previous call */ if (param->pg_prompt == TRI_YES && !password)
password = simple_prompt("Password: ", false);
/* *Starttheconnection.Loopuntilwehaveapasswordifrequestedby *backend.
*/ do
{ #define PARAMS_ARRAY_SIZE 7
/* check to see that the backend connection was successfully made */ if (PQstatus(conn) == CONNECTION_BAD)
{
pg_log_error("%s", PQerrorMessage(conn));
PQfinish(conn); return -1;
}
if (param->verbose)
{
fprintf(stdout, "Connected to database \"%s\"\n", database); if (param->dry_run)
fprintf(stdout, "Test run: no large objects will be removed!\n");
}
res = PQexec(conn, ALWAYS_SECURE_SEARCH_PATH_SQL); if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
pg_log_error("failed to set \"search_path\": %s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn); return -1;
}
PQclear(res);
/* *FirstwecreateandpopulatetheLOtemptable
*/
buf[0] = '\0';
strcat(buf, "CREATE TEMP TABLE vacuum_l AS "); if (PQserverVersion(conn) >= 90000)
strcat(buf, "SELECT oid AS lo FROM pg_largeobject_metadata"); else
strcat(buf, "SELECT DISTINCT loid AS lo FROM pg_largeobject");
res = PQexec(conn, buf); if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
pg_log_error("failed to create temp table: %s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn); return -1;
}
PQclear(res);
/* *Now,thoseentriesremaininginvacuum_lareorphans.Delete'em. * *Wedon'twanttoruneachdeleteasanindividualtransaction,because *thecommitoverheadwouldbehigh.However,since9.0thebackendwill *acquirealockperdeletedLO,sodeletingtoomanyLOspertransaction *risksrunningoutofroomintheshared-memorylocktable.Accordingly, *wedeleteuptotransaction_limitLOspertransaction.
*/
res = PQexec(conn, "begin"); if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
pg_log_error("failed to start transaction: %s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn); return -1;
}
PQclear(res);
buf[0] = '\0';
strcat(buf, "DECLARE myportal CURSOR WITH HOLD FOR SELECT lo FROM vacuum_l");
res = PQexec(conn, buf); if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
pg_log_error("DECLARE CURSOR failed: %s", PQerrorMessage(conn));
PQclear(res);
PQfinish(conn); return -1;
}
PQclear(res);
/* *That'sallfolks!
*/
res = PQexec(conn, "commit"); if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
pg_log_error("failed to commit transaction: %s",
PQerrorMessage(conn));
PQclear(res);
PQfinish(conn); return -1;
}
PQclear(res);
PQfinish(conn);
if (param->verbose)
{ if (param->dry_run)
fprintf(stdout, "\rWould remove %ld large objects from database \"%s\".\n",
deleted, database); elseif (success)
fprintf(stdout, "\rSuccessfully removed %ld large objects from database \"%s\".\n",
deleted, database); else
fprintf(stdout, "\rRemoval from database \"%s\" failed at object %ld of %ld.\n",
database, deleted, matched);
}
return ((param->dry_run || success) ? 0 : -1);
}
staticvoid
usage(constchar *progname)
{
printf("%s removes unreferenced large objects from databases.\n\n", progname);
printf("Usage:\n %s [OPTION]... DBNAME...\n\n", progname);
printf("Options:\n");
printf(" -l, --limit=LIMIT commit after removing each LIMIT large objects\n");
printf(" -n, --dry-run don't remove large objects, just show what would be done\n");
printf(" -v, --verbose write a lot of progress messages\n");
printf(" -V, --version output version information, then exit\n");
printf(" -?, --help show this help, then exit\n");
printf("\nConnection options:\n");
printf(" -h, --host=HOSTNAME database server host or socket directory\n");
printf(" -p, --port=PORT database server port\n");
printf(" -U, --username=USERNAME user name to connect as\n");
printf(" -w, --no-password never prompt for password\n");
printf(" -W, --password force password prompt\n");
printf("\n");
printf("Report bugs to <%s>.\n", PACKAGE_BUGREPORT);
printf("%s home page: <%s>\n", PACKAGE_NAME, PACKAGE_URL);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.