vacuumdb: Move some variables to the vacuumingOptions struct.
authorNathan Bossart <nathan@postgresql.org>
Tue, 9 Dec 2025 19:34:22 +0000 (13:34 -0600)
committerNathan Bossart <nathan@postgresql.org>
Tue, 9 Dec 2025 19:34:22 +0000 (13:34 -0600)
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

src/bin/scripts/vacuumdb.c
src/bin/scripts/vacuuming.c
src/bin/scripts/vacuuming.h

index e117dac2242262e53cfac6471771c2b61bd4671e..6783c84363714a9878d7b7a677cebfed6ea288c4 100644 (file)
@@ -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);
 }
 
index 9f44cae02ae7afe0f522b1f2e07f503077e397b4..4f665c9f7d618a8254d447bc1075a5a2465bc677 100644 (file)
@@ -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;
index 49f968b32e55fb6a8add8d1bcf64ca6edffce124..90db4fa1a640ea3d8abb5487a2cce14740751d75 100644 (file)
@@ -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);