reuse_vacuumdb_all_password.patch

application/octet-stream

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

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);
  }