reuse_password_for_vacuum_db_v2.patch

application/octet-stream

Filename: reuse_password_for_vacuum_db_v2.patch
Type: application/octet-stream
Part: 0
Message: Re: BUG #13741: vacuumdb does not accept valid password

Patch

Format: context
Series: patch v2
File+
src/bin/scripts/clusterdb.c 1 0
src/bin/scripts/common.c 14 0
src/bin/scripts/common.h 1 0
src/bin/scripts/createlang.c 2 0
src/bin/scripts/createuser.c 1 0
src/bin/scripts/droplang.c 2 0
src/bin/scripts/dropuser.c 1 0
src/bin/scripts/reindexdb.c 2 0
src/bin/scripts/vacuumdb.c 7 0
*** 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.