@ -18,6 +18,7 @@
# include <string.h>
const char * progname ;
char * connection_string = NULL ;
char * dbhost = NULL ;
char * dbuser = NULL ;
char * dbport = NULL ;
@ -34,31 +35,67 @@ PGconn *
GetConnection ( void )
{
PGconn * tmpconn ;
int argcount = 4 ; /* dbname, replication, fallback_app_name,
* password */
int argcount = 7 ; /* dbname, replication, fallback_app_name,
* host , user , port , password */
int i ;
const char * * keywords ;
const char * * values ;
char * password = NULL ;
const char * tmpparam ;
PQconninfoOption * conn_opts = NULL ;
PQconninfoOption * conn_opt ;
char * err_msg = NULL ;
/*
* Merge the connection info inputs given in form of connection string ,
* options and default values ( dbname = replication , replication = true ,
* etc . )
*/
i = 0 ;
if ( connection_string )
{
conn_opts = PQconninfoParse ( connection_string , & err_msg ) ;
if ( conn_opts = = NULL )
{
fprintf ( stderr , " %s: %s \n " , progname , err_msg ) ;
return NULL ;
}
for ( conn_opt = conn_opts ; conn_opt - > keyword ! = NULL ; conn_opt + + )
{
if ( conn_opt - > val ! = NULL & & conn_opt - > val [ 0 ] ! = ' \0 ' )
argcount + + ;
}
keywords = pg_malloc0 ( ( argcount + 1 ) * sizeof ( * keywords ) ) ;
values = pg_malloc0 ( ( argcount + 1 ) * sizeof ( * values ) ) ;
for ( conn_opt = conn_opts ; conn_opt - > keyword ! = NULL ; conn_opt + + )
{
if ( conn_opt - > val ! = NULL & & conn_opt - > val [ 0 ] ! = ' \0 ' )
{
keywords [ i ] = conn_opt - > keyword ;
values [ i ] = conn_opt - > val ;
i + + ;
}
}
}
else
{
keywords = pg_malloc0 ( ( argcount + 1 ) * sizeof ( * keywords ) ) ;
values = pg_malloc0 ( ( argcount + 1 ) * sizeof ( * values ) ) ;
}
keywords [ i ] = " dbname " ;
values [ i ] = " replication " ;
i + + ;
keywords [ i ] = " replication " ;
values [ i ] = " true " ;
i + + ;
keywords [ i ] = " fallback_application_name " ;
values [ i ] = progname ;
i + + ;
if ( dbhost )
argcount + + ;
if ( dbuser )
argcount + + ;
if ( dbport )
argcount + + ;
keywords = pg_malloc0 ( ( argcount + 1 ) * sizeof ( * keywords ) ) ;
values = pg_malloc0 ( ( argcount + 1 ) * sizeof ( * values ) ) ;
keywords [ 0 ] = " dbname " ;
values [ 0 ] = " replication " ;
keywords [ 1 ] = " replication " ;
values [ 1 ] = " true " ;
keywords [ 2 ] = " fallback_application_name " ;
values [ 2 ] = progname ;
i = 3 ;
if ( dbhost )
{
keywords [ i ] = " host " ;
@ -90,15 +127,15 @@ GetConnection(void)
* meaning this is the call for a second session to the same
* database , so just forcibly reuse that password .
*/
keywords [ argcount - 1 ] = " password " ;
values [ argcount - 1 ] = dbpassword ;
keywords [ i ] = " password " ;
values [ i ] = dbpassword ;
dbgetpassword = - 1 ; /* Don't try again if this fails */
}
else if ( dbgetpassword = = 1 )
{
password = simple_prompt ( _ ( " Password: " ) , 100 , false ) ;
keywords [ argcount - 1 ] = " password " ;
values [ argcount - 1 ] = password ;
keywords [ i ] = " password " ;
values [ i ] = password ;
}
tmpconn = PQconnectdbParams ( keywords , values , true ) ;
@ -130,12 +167,16 @@ GetConnection(void)
PQfinish ( tmpconn ) ;
free ( values ) ;
free ( keywords ) ;
if ( conn_opts )
PQconninfoFree ( conn_opts ) ;
return NULL ;
}
/* Connection ok! */
free ( values ) ;
free ( keywords ) ;
if ( conn_opts )
PQconninfoFree ( conn_opts ) ;
/*
* Ensure we have the same value of integer timestamps as the server