reuse_vacuumdb_all_password.patch
application/octet-stream
Filename: reuse_vacuumdb_all_password.patch
Type: application/octet-stream
Part: 0
Patch
Format: context
| File | + | − |
|---|---|---|
| src/bin/scripts/vacuumdb.c | 36 | 0 |
*** a/src/bin/scripts/vacuumdb.c
--- b/src/bin/scripts/vacuumdb.c
***************
*** 41,48 **** static void vacuum_one_database(const char *dbname, vacuumingOptions *vacopts,
int stage,
SimpleStringList *tables,
const char *host, const char *port,
! const char *username, enum trivalue prompt_password,
! int concurrentCons,
const char *progname, bool echo, bool quiet);
static void vacuum_all_databases(vacuumingOptions *vacopts,
--- 41,48 ----
int stage,
SimpleStringList *tables,
const char *host, const char *port,
! const char *username, char **password_user,
! enum trivalue prompt_password, int concurrentCons,
const char *progname, bool echo, bool quiet);
static void vacuum_all_databases(vacuumingOptions *vacopts,
***************
*** 275,280 **** main(int argc, char *argv[])
--- 275,282 ----
}
else
{
+ char *password = NULL;
+
if (dbname == NULL)
{
if (getenv("PGDATABASE"))
***************
*** 294,300 **** main(int argc, char *argv[])
vacuum_one_database(dbname, &vacopts,
stage,
&tables,
! host, port, username, prompt_password,
concurrentCons,
progname, echo, quiet);
}
--- 296,303 ----
vacuum_one_database(dbname, &vacopts,
stage,
&tables,
! host, port, username,
! &password, prompt_password,
concurrentCons,
progname, echo, quiet);
}
***************
*** 303,311 **** main(int argc, char *argv[])
vacuum_one_database(dbname, &vacopts,
ANALYZE_NO_STAGE,
&tables,
! host, port, username, prompt_password,
concurrentCons,
progname, echo, quiet);
}
exit(0);
--- 306,319 ----
vacuum_one_database(dbname, &vacopts,
ANALYZE_NO_STAGE,
&tables,
! host, port, username,
! &password, prompt_password,
concurrentCons,
progname, echo, quiet);
+
+ /* Free the password memory in case if it supplied */
+ if (password)
+ pfree(password);
}
exit(0);
***************
*** 329,336 **** vacuum_one_database(const char *dbname, vacuumingOptions *vacopts,
int stage,
SimpleStringList *tables,
const char *host, const char *port,
! const char *username, enum trivalue prompt_password,
! int concurrentCons,
const char *progname, bool echo, bool quiet)
{
PQExpBufferData sql;
--- 337,344 ----
int stage,
SimpleStringList *tables,
const char *host, const char *port,
! const char *username, char **password_user,
! enum trivalue prompt_password, int concurrentCons,
const char *progname, bool echo, bool quiet)
{
PQExpBufferData sql;
***************
*** 354,359 **** vacuum_one_database(const char *dbname, vacuumingOptions *vacopts,
--- 362,368 ----
Assert(stage == ANALYZE_NO_STAGE ||
(stage >= 0 && stage < ANALYZE_NUM_STAGES));
+ Assert(password_user != NULL);
if (!quiet)
{
***************
*** 365,373 **** vacuum_one_database(const char *dbname, vacuumingOptions *vacopts,
fflush(stdout);
}
! conn = connectDatabase(dbname, host, port, username, NULL,
prompt_password, progname, false);
initPQExpBuffer(&sql);
/*
--- 374,392 ----
fflush(stdout);
}
! conn = connectDatabase(dbname, host, port, username, *password_user,
prompt_password, progname, false);
+ /*
+ * The following code is required to handle the case of vacuumdb --all.
+ * By the configuration, if user doesn't supply a password during the
+ * connection to the maintainance database and it may be required for
+ * the user database. So we will use this password for the rest of the
+ * connections to the server.
+ */
+ if (PQconnectionUsedPassword(conn) && (*password_user == NULL))
+ *password_user = pstrdup(PQpass(conn));
+
initPQExpBuffer(&sql);
/*
***************
*** 547,555 **** vacuum_all_databases(vacuumingOptions *vacopts,
--- 566,578 ----
PGresult *result;
int stage;
int i;
+ char *password = NULL;
conn = connectMaintenanceDatabase(maintenance_db, host, port,
username, prompt_password, progname);
+ if (PQconnectionUsedPassword(conn))
+ password = pstrdup(PQpass(conn));
+
result = executeQuery(conn,
"SELECT datname FROM pg_database WHERE datallowconn ORDER BY 1;",
progname, echo);
***************
*** 575,581 **** vacuum_all_databases(vacuumingOptions *vacopts,
vacuum_one_database(dbname, vacopts,
stage,
NULL,
! host, port, username, prompt_password,
concurrentCons,
progname, echo, quiet);
}
--- 598,605 ----
vacuum_one_database(dbname, vacopts,
stage,
NULL,
! host, port, username,
! &password, prompt_password,
concurrentCons,
progname, echo, quiet);
}
***************
*** 591,602 **** vacuum_all_databases(vacuumingOptions *vacopts,
vacuum_one_database(dbname, vacopts,
ANALYZE_NO_STAGE,
NULL,
! host, port, username, prompt_password,
concurrentCons,
progname, echo, quiet);
}
}
PQclear(result);
}
--- 615,629 ----
vacuum_one_database(dbname, vacopts,
ANALYZE_NO_STAGE,
NULL,
! host, port, username,
! &password, prompt_password,
concurrentCons,
progname, echo, quiet);
}
}
+ if (password)
+ pfree(password);
PQclear(result);
}