mirror of
https://github.com/postgres/postgres.git
synced 2025-12-10 14:22:35 +03:00
vacuumdb: Move some variables to the vacuumingOptions struct.
Presently, the "echo" and "quiet" variables are carted around to various functions, which is a bit tedious. To simplify things, this commit moves them into the vacuumingOptions struct and removes the related function parameters. While at it, remove some redundant initialization code in vacuumdb's main() function. This is preparatory work for a follow-up commit that will add a --dry-run option to vacuumdb. Reviewed-by: Corey Huinker <corey.huinker@gmail.com> Reviewed-by: Kirill Reshke <reshkekirill@gmail.com> Reviewed-by: Chao Li <li.evan.chao@gmail.com> Discussion: https://postgr.es/m/CADkLM%3DckHkX7Of5SrK7g0LokPUwJ%3Dkk8JU1GXGF5pZ1eBVr0%3DQ%40mail.gmail.com
This commit is contained in:
@@ -68,8 +68,6 @@ main(int argc, char *argv[])
|
||||
const char *dbname = NULL;
|
||||
const char *maintenance_db = NULL;
|
||||
ConnParams cparams;
|
||||
bool echo = false;
|
||||
bool quiet = false;
|
||||
vacuumingOptions vacopts;
|
||||
SimpleStringList objects = {NULL, NULL};
|
||||
int concurrentCons = 1;
|
||||
@@ -78,11 +76,7 @@ main(int argc, char *argv[])
|
||||
|
||||
/* initialize options */
|
||||
memset(&vacopts, 0, sizeof(vacopts));
|
||||
vacopts.objfilter = 0; /* no filter */
|
||||
vacopts.parallel_workers = -1;
|
||||
vacopts.buffer_usage_limit = NULL;
|
||||
vacopts.no_index_cleanup = false;
|
||||
vacopts.force_index_cleanup = false;
|
||||
vacopts.do_truncate = true;
|
||||
vacopts.process_main = true;
|
||||
vacopts.process_toast = true;
|
||||
@@ -110,7 +104,7 @@ main(int argc, char *argv[])
|
||||
dbname = pg_strdup(optarg);
|
||||
break;
|
||||
case 'e':
|
||||
echo = true;
|
||||
vacopts.echo = true;
|
||||
break;
|
||||
case 'f':
|
||||
vacopts.full = true;
|
||||
@@ -143,7 +137,7 @@ main(int argc, char *argv[])
|
||||
exit(1);
|
||||
break;
|
||||
case 'q':
|
||||
quiet = true;
|
||||
vacopts.quiet = true;
|
||||
break;
|
||||
case 't':
|
||||
vacopts.objfilter |= OBJFILTER_TABLE;
|
||||
@@ -312,7 +306,7 @@ main(int argc, char *argv[])
|
||||
ret = vacuuming_main(&cparams, dbname, maintenance_db, &vacopts,
|
||||
&objects, tbl_count,
|
||||
concurrentCons,
|
||||
progname, echo, quiet);
|
||||
progname);
|
||||
exit(ret);
|
||||
}
|
||||
|
||||
|
||||
@@ -30,21 +30,20 @@ static int vacuum_one_database(ConnParams *cparams,
|
||||
SimpleStringList *objects,
|
||||
SimpleStringList **found_objs,
|
||||
int concurrentCons,
|
||||
const char *progname, bool echo, bool quiet);
|
||||
const char *progname);
|
||||
static int vacuum_all_databases(ConnParams *cparams,
|
||||
vacuumingOptions *vacopts,
|
||||
SimpleStringList *objects,
|
||||
int concurrentCons,
|
||||
const char *progname, bool echo, bool quiet);
|
||||
const char *progname);
|
||||
static SimpleStringList *retrieve_objects(PGconn *conn,
|
||||
vacuumingOptions *vacopts,
|
||||
SimpleStringList *objects,
|
||||
bool echo);
|
||||
SimpleStringList *objects);
|
||||
static void free_retrieved_objects(SimpleStringList *list);
|
||||
static void prepare_vacuum_command(PGconn *conn, PQExpBuffer sql,
|
||||
vacuumingOptions *vacopts, const char *table);
|
||||
static void run_vacuum_command(PGconn *conn, const char *sql, bool echo,
|
||||
const char *table);
|
||||
static void run_vacuum_command(PGconn *conn, vacuumingOptions *vacopts,
|
||||
const char *sql, const char *table);
|
||||
|
||||
/*
|
||||
* Executes vacuum/analyze as indicated. Returns 0 if the plan is carried
|
||||
@@ -56,7 +55,7 @@ vacuuming_main(ConnParams *cparams, const char *dbname,
|
||||
const char *maintenance_db, vacuumingOptions *vacopts,
|
||||
SimpleStringList *objects,
|
||||
unsigned int tbl_count, int concurrentCons,
|
||||
const char *progname, bool echo, bool quiet)
|
||||
const char *progname)
|
||||
{
|
||||
setup_cancel_handler(NULL);
|
||||
|
||||
@@ -71,7 +70,7 @@ vacuuming_main(ConnParams *cparams, const char *dbname,
|
||||
return vacuum_all_databases(cparams, vacopts,
|
||||
objects,
|
||||
concurrentCons,
|
||||
progname, echo, quiet);
|
||||
progname);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -100,7 +99,7 @@ vacuuming_main(ConnParams *cparams, const char *dbname,
|
||||
objects,
|
||||
vacopts->missing_stats_only ? &found_objs : NULL,
|
||||
concurrentCons,
|
||||
progname, echo, quiet);
|
||||
progname);
|
||||
if (ret != 0)
|
||||
{
|
||||
free_retrieved_objects(found_objs);
|
||||
@@ -116,7 +115,7 @@ vacuuming_main(ConnParams *cparams, const char *dbname,
|
||||
ANALYZE_NO_STAGE,
|
||||
objects, NULL,
|
||||
concurrentCons,
|
||||
progname, echo, quiet);
|
||||
progname);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -167,7 +166,7 @@ vacuum_one_database(ConnParams *cparams,
|
||||
SimpleStringList *objects,
|
||||
SimpleStringList **found_objs,
|
||||
int concurrentCons,
|
||||
const char *progname, bool echo, bool quiet)
|
||||
const char *progname)
|
||||
{
|
||||
PQExpBufferData sql;
|
||||
PGconn *conn;
|
||||
@@ -192,7 +191,7 @@ vacuum_one_database(ConnParams *cparams,
|
||||
Assert(stage == ANALYZE_NO_STAGE ||
|
||||
(stage >= 0 && stage < ANALYZE_NUM_STAGES));
|
||||
|
||||
conn = connectDatabase(cparams, progname, echo, false, true);
|
||||
conn = connectDatabase(cparams, progname, vacopts->echo, false, true);
|
||||
|
||||
if (vacopts->disable_page_skipping && PQserverVersion(conn) < 90600)
|
||||
{
|
||||
@@ -281,7 +280,7 @@ vacuum_one_database(ConnParams *cparams,
|
||||
/* skip_database_stats is used automatically if server supports it */
|
||||
vacopts->skip_database_stats = (PQserverVersion(conn) >= 160000);
|
||||
|
||||
if (!quiet)
|
||||
if (!vacopts->quiet)
|
||||
{
|
||||
if (vacopts->mode == MODE_ANALYZE_IN_STAGES)
|
||||
printf(_("%s: processing database \"%s\": %s\n"),
|
||||
@@ -302,7 +301,7 @@ vacuum_one_database(ConnParams *cparams,
|
||||
retobjs = *found_objs;
|
||||
else
|
||||
{
|
||||
retobjs = retrieve_objects(conn, vacopts, objects, echo);
|
||||
retobjs = retrieve_objects(conn, vacopts, objects);
|
||||
if (found_objs)
|
||||
*found_objs = retobjs;
|
||||
else
|
||||
@@ -341,7 +340,7 @@ vacuum_one_database(ConnParams *cparams,
|
||||
if (vacopts->mode == MODE_ANALYZE_IN_STAGES)
|
||||
{
|
||||
initcmd = stage_commands[stage];
|
||||
executeCommand(conn, initcmd, echo);
|
||||
executeCommand(conn, initcmd, vacopts->echo);
|
||||
}
|
||||
else
|
||||
initcmd = NULL;
|
||||
@@ -351,7 +350,8 @@ vacuum_one_database(ConnParams *cparams,
|
||||
* for the first slot. If not in parallel mode, the first slot in the
|
||||
* array contains the connection.
|
||||
*/
|
||||
sa = ParallelSlotsSetup(concurrentCons, cparams, progname, echo, initcmd);
|
||||
sa = ParallelSlotsSetup(concurrentCons, cparams, progname,
|
||||
vacopts->echo, initcmd);
|
||||
ParallelSlotsAdoptConn(sa, conn);
|
||||
|
||||
initPQExpBuffer(&sql);
|
||||
@@ -383,8 +383,7 @@ vacuum_one_database(ConnParams *cparams,
|
||||
* through ParallelSlotsGetIdle.
|
||||
*/
|
||||
ParallelSlotSetHandler(free_slot, TableCommandResultHandler, NULL);
|
||||
run_vacuum_command(free_slot->connection, sql.data,
|
||||
echo, tabname);
|
||||
run_vacuum_command(free_slot->connection, vacopts, sql.data, tabname);
|
||||
|
||||
cell = cell->next;
|
||||
} while (cell != NULL);
|
||||
@@ -408,7 +407,7 @@ vacuum_one_database(ConnParams *cparams,
|
||||
}
|
||||
|
||||
ParallelSlotSetHandler(free_slot, TableCommandResultHandler, NULL);
|
||||
run_vacuum_command(free_slot->connection, cmd, echo, NULL);
|
||||
run_vacuum_command(free_slot->connection, vacopts, cmd, NULL);
|
||||
|
||||
if (!ParallelSlotsWaitCompletion(sa))
|
||||
ret = EXIT_FAILURE; /* error already reported by handler */
|
||||
@@ -436,17 +435,17 @@ vacuum_all_databases(ConnParams *cparams,
|
||||
vacuumingOptions *vacopts,
|
||||
SimpleStringList *objects,
|
||||
int concurrentCons,
|
||||
const char *progname, bool echo, bool quiet)
|
||||
const char *progname)
|
||||
{
|
||||
int ret = EXIT_SUCCESS;
|
||||
PGconn *conn;
|
||||
PGresult *result;
|
||||
int numdbs;
|
||||
|
||||
conn = connectMaintenanceDatabase(cparams, progname, echo);
|
||||
conn = connectMaintenanceDatabase(cparams, progname, vacopts->echo);
|
||||
result = executeQuery(conn,
|
||||
"SELECT datname FROM pg_database WHERE datallowconn AND datconnlimit <> -2 ORDER BY 1;",
|
||||
echo);
|
||||
vacopts->echo);
|
||||
numdbs = PQntuples(result);
|
||||
PQfinish(conn);
|
||||
|
||||
@@ -474,7 +473,7 @@ vacuum_all_databases(ConnParams *cparams,
|
||||
objects,
|
||||
vacopts->missing_stats_only ? &found_objs[i] : NULL,
|
||||
concurrentCons,
|
||||
progname, echo, quiet);
|
||||
progname);
|
||||
if (ret != EXIT_SUCCESS)
|
||||
break;
|
||||
}
|
||||
@@ -499,7 +498,7 @@ vacuum_all_databases(ConnParams *cparams,
|
||||
objects,
|
||||
NULL,
|
||||
concurrentCons,
|
||||
progname, echo, quiet);
|
||||
progname);
|
||||
if (ret != EXIT_SUCCESS)
|
||||
break;
|
||||
}
|
||||
@@ -524,7 +523,7 @@ vacuum_all_databases(ConnParams *cparams,
|
||||
*/
|
||||
static SimpleStringList *
|
||||
retrieve_objects(PGconn *conn, vacuumingOptions *vacopts,
|
||||
SimpleStringList *objects, bool echo)
|
||||
SimpleStringList *objects)
|
||||
{
|
||||
PQExpBufferData buf;
|
||||
PQExpBufferData catalog_query;
|
||||
@@ -776,10 +775,10 @@ retrieve_objects(PGconn *conn, vacuumingOptions *vacopts,
|
||||
* query for consistency with table lookups done elsewhere by the user.
|
||||
*/
|
||||
appendPQExpBufferStr(&catalog_query, " ORDER BY c.relpages DESC;");
|
||||
executeCommand(conn, "RESET search_path;", echo);
|
||||
res = executeQuery(conn, catalog_query.data, echo);
|
||||
executeCommand(conn, "RESET search_path;", vacopts->echo);
|
||||
res = executeQuery(conn, catalog_query.data, vacopts->echo);
|
||||
termPQExpBuffer(&catalog_query);
|
||||
PQclear(executeQuery(conn, ALWAYS_SECURE_SEARCH_PATH_SQL, echo));
|
||||
PQclear(executeQuery(conn, ALWAYS_SECURE_SEARCH_PATH_SQL, vacopts->echo));
|
||||
|
||||
/*
|
||||
* Build qualified identifiers for each table, including the column list
|
||||
@@ -1001,12 +1000,12 @@ prepare_vacuum_command(PGconn *conn, PQExpBuffer sql,
|
||||
* Any errors during command execution are reported to stderr.
|
||||
*/
|
||||
static void
|
||||
run_vacuum_command(PGconn *conn, const char *sql, bool echo,
|
||||
const char *table)
|
||||
run_vacuum_command(PGconn *conn, vacuumingOptions *vacopts,
|
||||
const char *sql, const char *table)
|
||||
{
|
||||
bool status;
|
||||
|
||||
if (echo)
|
||||
if (vacopts->echo)
|
||||
printf("%s\n", sql);
|
||||
|
||||
status = PQsendQuery(conn, sql) == 1;
|
||||
|
||||
@@ -51,6 +51,8 @@ typedef struct vacuumingOptions
|
||||
bool skip_database_stats;
|
||||
char *buffer_usage_limit;
|
||||
bool missing_stats_only;
|
||||
bool echo;
|
||||
bool quiet;
|
||||
} vacuumingOptions;
|
||||
|
||||
/* Valid values for vacuumingOptions->objfilter */
|
||||
@@ -65,7 +67,7 @@ extern int vacuuming_main(ConnParams *cparams, const char *dbname,
|
||||
SimpleStringList *objects,
|
||||
unsigned int tbl_count,
|
||||
int concurrentCons,
|
||||
const char *progname, bool echo, bool quiet);
|
||||
const char *progname);
|
||||
|
||||
extern char *escape_quotes(const char *src);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user