*** a/src/bin/scripts/clusterdb.c --- b/src/bin/scripts/clusterdb.c *************** *** 203,209 **** cluster_one_database(const char *dbname, bool verbose, const char *table, appendPQExpBuffer(&sql, " %s", table); appendPQExpBufferChar(&sql, ';'); ! conn = connectDatabase(dbname, host, port, username, prompt_password, progname, false); if (!executeMaintenanceCommand(conn, sql.data, echo)) { --- 203,209 ---- appendPQExpBuffer(&sql, " %s", table); appendPQExpBufferChar(&sql, ';'); ! conn = connectDatabase(dbname, host, port, username, NULL, prompt_password, progname, false); if (!executeMaintenanceCommand(conn, sql.data, echo)) { *** a/src/bin/scripts/common.c --- b/src/bin/scripts/common.c *************** *** 54,70 **** handle_help_version_opts(int argc, char *argv[], /* * Make a database connection with the given parameters. An * interactive password prompt is automatically issued if required. */ PGconn * connectDatabase(const char *dbname, const char *pghost, const char *pgport, ! const char *pguser, enum trivalue prompt_password, const char *progname, bool fail_ok) { PGconn *conn; ! char *password = NULL; bool new_pass; ! if (prompt_password == TRI_YES) password = simple_prompt("Password: ", 100, false); /* --- 54,71 ---- /* * Make a database connection with the given parameters. An * interactive password prompt is automatically issued if required. + * Caller has to free the password if the output returns a password. */ PGconn * connectDatabase(const char *dbname, const char *pghost, const char *pgport, ! const char *pguser, char **saved_password, enum trivalue prompt_password, const char *progname, bool fail_ok) { PGconn *conn; ! char *password = saved_password ? *saved_password : NULL; bool new_pass; ! if (prompt_password == TRI_YES && password == NULL) password = simple_prompt("Password: ", 100, false); /* *************** *** 116,122 **** connectDatabase(const char *dbname, const char *pghost, const char *pgport, } } while (new_pass); ! if (password) free(password); /* check to see that the backend connection was successfully made */ --- 117,129 ---- } } while (new_pass); ! /* ! * save the password for future reference, ! * in case if caller requests it. ! */ ! if (saved_password) ! *saved_password = password; ! else if (password) free(password); /* check to see that the backend connection was successfully made */ *************** *** 149,162 **** connectMaintenanceDatabase(const char *maintenance_db, const char *pghost, /* If a maintenance database name was specified, just connect to it. */ if (maintenance_db) return connectDatabase(maintenance_db, pghost, pgport, pguser, ! prompt_password, progname, false); /* Otherwise, try postgres first and then template1. */ ! conn = connectDatabase("postgres", pghost, pgport, pguser, prompt_password, progname, true); if (!conn) conn = connectDatabase("template1", pghost, pgport, pguser, ! prompt_password, progname, false); return conn; } --- 156,169 ---- /* If a maintenance database name was specified, just connect to it. */ if (maintenance_db) return connectDatabase(maintenance_db, pghost, pgport, pguser, ! NULL, prompt_password, progname, false); /* Otherwise, try postgres first and then template1. */ ! conn = connectDatabase("postgres", pghost, pgport, pguser, NULL, prompt_password, progname, true); if (!conn) conn = connectDatabase("template1", pghost, pgport, pguser, ! NULL, prompt_password, progname, false); return conn; } *** a/src/bin/scripts/common.h --- b/src/bin/scripts/common.h *************** *** 30,36 **** extern void handle_help_version_opts(int argc, char *argv[], help_handler hlp); extern PGconn *connectDatabase(const char *dbname, const char *pghost, ! const char *pgport, const char *pguser, enum trivalue prompt_password, const char *progname, bool fail_ok); --- 30,36 ---- help_handler hlp); extern PGconn *connectDatabase(const char *dbname, const char *pghost, ! const char *pgport, const char *pguser, char **saved_password, enum trivalue prompt_password, const char *progname, bool fail_ok); *** a/src/bin/scripts/createlang.c --- b/src/bin/scripts/createlang.c *************** *** 140,146 **** main(int argc, char *argv[]) printQueryOpt popt; static const bool translate_columns[] = {false, true}; ! conn = connectDatabase(dbname, host, port, username, prompt_password, progname, false); printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", " --- 140,146 ---- printQueryOpt popt; static const bool translate_columns[] = {false, true}; ! conn = connectDatabase(dbname, host, port, username, NULL, prompt_password, progname, false); printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", " *************** *** 180,186 **** main(int argc, char *argv[]) if (*p >= 'A' && *p <= 'Z') *p += ('a' - 'A'); ! conn = connectDatabase(dbname, host, port, username, prompt_password, progname, false); /* --- 180,186 ---- if (*p >= 'A' && *p <= 'Z') *p += ('a' - 'A'); ! conn = connectDatabase(dbname, host, port, username, NULL, prompt_password, progname, false); /* *** a/src/bin/scripts/createuser.c --- b/src/bin/scripts/createuser.c *************** *** 250,256 **** main(int argc, char *argv[]) if (login == 0) login = TRI_YES; ! conn = connectDatabase("postgres", host, port, username, prompt_password, progname, false); initPQExpBuffer(&sql); --- 250,256 ---- if (login == 0) login = TRI_YES; ! conn = connectDatabase("postgres", host, port, username, NULL, prompt_password, progname, false); initPQExpBuffer(&sql); *** a/src/bin/scripts/droplang.c --- b/src/bin/scripts/droplang.c *************** *** 139,145 **** main(int argc, char *argv[]) printQueryOpt popt; static const bool translate_columns[] = {false, true}; ! conn = connectDatabase(dbname, host, port, username, prompt_password, progname, false); printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", " --- 139,145 ---- printQueryOpt popt; static const bool translate_columns[] = {false, true}; ! conn = connectDatabase(dbname, host, port, username, NULL, prompt_password, progname, false); printfPQExpBuffer(&sql, "SELECT lanname as \"%s\", " *************** *** 181,187 **** main(int argc, char *argv[]) if (*p >= 'A' && *p <= 'Z') *p += ('a' - 'A'); ! conn = connectDatabase(dbname, host, port, username, prompt_password, progname, false); /* --- 181,187 ---- if (*p >= 'A' && *p <= 'Z') *p += ('a' - 'A'); ! conn = connectDatabase(dbname, host, port, username, NULL, prompt_password, progname, false); /* *** a/src/bin/scripts/dropuser.c --- b/src/bin/scripts/dropuser.c *************** *** 128,134 **** main(int argc, char *argv[]) appendPQExpBuffer(&sql, "DROP ROLE %s%s;", (if_exists ? "IF EXISTS " : ""), fmtId(dropuser)); ! conn = connectDatabase("postgres", host, port, username, prompt_password, progname, false); if (echo) --- 128,134 ---- appendPQExpBuffer(&sql, "DROP ROLE %s%s;", (if_exists ? "IF EXISTS " : ""), fmtId(dropuser)); ! conn = connectDatabase("postgres", host, port, username, NULL, prompt_password, progname, false); if (echo) *** a/src/bin/scripts/reindexdb.c --- b/src/bin/scripts/reindexdb.c *************** *** 297,303 **** reindex_one_database(const char *name, const char *dbname, const char *type, appendPQExpBuffer(&sql, " DATABASE %s", fmtId(name)); appendPQExpBufferChar(&sql, ';'); ! conn = connectDatabase(dbname, host, port, username, prompt_password, progname, false); if (!executeMaintenanceCommand(conn, sql.data, echo)) --- 297,303 ---- appendPQExpBuffer(&sql, " DATABASE %s", fmtId(name)); appendPQExpBufferChar(&sql, ';'); ! conn = connectDatabase(dbname, host, port, username, NULL, prompt_password, progname, false); if (!executeMaintenanceCommand(conn, sql.data, echo)) *************** *** 372,378 **** reindex_system_catalogs(const char *dbname, const char *host, const char *port, appendPQExpBuffer(&sql, " SYSTEM %s;", dbname); ! conn = connectDatabase(dbname, host, port, username, prompt_password, progname, false); if (!executeMaintenanceCommand(conn, sql.data, echo)) { --- 372,378 ---- appendPQExpBuffer(&sql, " SYSTEM %s;", dbname); ! conn = connectDatabase(dbname, host, port, username, NULL, prompt_password, progname, false); if (!executeMaintenanceCommand(conn, sql.data, echo)) { *** a/src/bin/scripts/vacuumdb.c --- b/src/bin/scripts/vacuumdb.c *************** *** 341,346 **** vacuum_one_database(const char *dbname, vacuumingOptions *vacopts, --- 341,347 ---- int i; bool failed = false; bool parallel = concurrentCons > 1; + char *saved_password = NULL; const char *stage_commands[] = { "SET default_statistics_target=1; SET vacuum_cost_delay=0;", "SET default_statistics_target=10; RESET vacuum_cost_delay;", *************** *** 365,371 **** vacuum_one_database(const char *dbname, vacuumingOptions *vacopts, fflush(stdout); } ! conn = connectDatabase(dbname, host, port, username, prompt_password, progname, false); initPQExpBuffer(&sql); --- 366,372 ---- fflush(stdout); } ! conn = connectDatabase(dbname, host, port, username, &saved_password, prompt_password, progname, false); initPQExpBuffer(&sql); *************** *** 426,437 **** vacuum_one_database(const char *dbname, vacuumingOptions *vacopts, { for (i = 1; i < concurrentCons; i++) { ! conn = connectDatabase(dbname, host, port, username, prompt_password, progname, false); init_slot(slots + i, conn); } } /* * Prepare all the connections to run the appropriate analyze stage, if * caller requested that mode. --- 427,442 ---- { for (i = 1; i < concurrentCons; i++) { ! conn = connectDatabase(dbname, host, port, username, &saved_password, prompt_password, progname, false); init_slot(slots + i, conn); } } + /* Free up the saved password after it's use */ + if (saved_password) + free(saved_password); + /* * Prepare all the connections to run the appropriate analyze stage, if * caller requested that mode.