diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index 71acb35..414ae20 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -100,6 +100,7 @@ static HeapTuple get_tuple_of_interest(Relation rel, int *pkattnums, int pknumat static Relation get_rel_from_relname(text *relname_text, LOCKMODE lockmode, AclMode aclmode); static char *generate_relation_name(Relation rel); static void dblink_connstr_check(const char *connstr); +static char *dblink_connstr_append(const char *connstr); static void dblink_security_check(PGconn *conn, remoteConn *rconn); static void dblink_res_error(const char *conname, PGresult *res, const char *dblink_context_msg, bool fail); static char *get_connect_string(const char *servername); @@ -255,6 +256,12 @@ dblink_connect(PG_FUNCTION_ARGS) /* check password in connection string if not superuser */ dblink_connstr_check(connstr); + + /* check if fallback_application_name doesn't exist then append + * fallback_application_name='dblink' + */ + connstr = dblink_connstr_append(connstr); + conn = PQconnectdb(connstr); if (PQstatus(conn) == CONNECTION_BAD) @@ -2524,6 +2531,53 @@ dblink_connstr_check(const char *connstr) } } + +/* + * To append fallback_application_name in connection string if it + * doesn't exist. + * This is to ensure that incase connection string + * doesn't contain application_name, fallback_application_name 'dblink' + * can be used to display as application_name at appropriate places. + */ +static char * +dblink_connstr_append(const char *connstr) +{ + PQconninfoOption *options; + PQconninfoOption *option; + bool connstr_has_fallback_appname = false; + + options = PQconninfoParse(connstr, NULL); + if (options) + { + for (option = options; option->keyword != NULL; option++) + { + if (strcmp(option->keyword, "fallback_application_name") == 0) + { + if (option->val != NULL && option->val[0] != '\0') + { + connstr_has_fallback_appname = true; + break; + } + } + } + PQconninfoFree(options); + } + + if (!connstr_has_fallback_appname) + { + StringInfo buf = makeStringInfo(); + + appendStringInfo(buf, "%s ", connstr); + appendStringInfo(buf, "%s='%s' ", "fallback_application_name", "dblink"); + + return buf->data; + } + + return connstr; +} + + + static void dblink_res_error(const char *conname, PGresult *res, const char *dblink_context_msg, bool fail) { diff --git a/contrib/oid2name/oid2name.c b/contrib/oid2name/oid2name.c index c7ba1bd..4b3db40 100644 --- a/contrib/oid2name/oid2name.c +++ b/contrib/oid2name/oid2name.c @@ -44,6 +44,7 @@ struct options char *hostname; char *port; char *username; + char *progname; }; /* function prototypes */ @@ -80,6 +81,7 @@ get_opts(int argc, char **argv, struct options * my_opts) my_opts->hostname = NULL; my_opts->port = NULL; my_opts->username = NULL; + my_opts->progname = progname; if (argc > 1) { @@ -308,14 +310,32 @@ sql_conn(struct options * my_opts) */ do { +#define PARAMS_ARRAY_SIZE 7 + + const char **keywords = myalloc(PARAMS_ARRAY_SIZE * sizeof(*keywords)); + const char **values = myalloc(PARAMS_ARRAY_SIZE * sizeof(*values)); + + keywords[0] = "host"; + values[0] = my_opts->hostname; + keywords[1] = "port"; + values[1] = my_opts->port; + keywords[2] = "user"; + values[2] = my_opts->username; + keywords[3] = "password"; + values[3] = password; + keywords[4] = "dbname"; + values[4] = my_opts->dbname; + keywords[5] = "fallback_application_name"; + values[5] = my_opts->progname; + keywords[6] = NULL; + values[6] = NULL; + new_pass = false; - conn = PQsetdbLogin(my_opts->hostname, - my_opts->port, - NULL, /* options */ - NULL, /* tty */ - my_opts->dbname, - my_opts->username, - password); + conn = PQconnectdbParams(keywords, values, true); + + free(keywords); + free(values); + if (!conn) { fprintf(stderr, "%s: could not connect to database %s\n", diff --git a/contrib/pgbench/pgbench.c b/contrib/pgbench/pgbench.c index b0e6991..cfdf0f6 100644 --- a/contrib/pgbench/pgbench.c +++ b/contrib/pgbench/pgbench.c @@ -146,10 +146,9 @@ int main_pid; /* main process id used in log filename */ char *pghost = ""; char *pgport = ""; -char *pgoptions = NULL; -char *pgtty = NULL; char *login = NULL; char *dbName; +const char *progname; volatile bool timer_exceeded = false; /* flag from signal handler */ @@ -334,7 +333,7 @@ xstrdup(const char *s) static void -usage(const char *progname) +usage(void) { printf("%s is a benchmarking tool for PostgreSQL.\n\n" "Usage:\n" @@ -424,10 +423,33 @@ doConnect(void) */ do { +#define PARAMS_ARRAY_SIZE 7 + + const char **keywords = xmalloc(PARAMS_ARRAY_SIZE * sizeof(*keywords)); + const char **values = xmalloc(PARAMS_ARRAY_SIZE * sizeof(*values)); + + keywords[0] = "host"; + values[0] = pghost; + keywords[1] = "port"; + values[1] = pgport; + keywords[2] = "user"; + values[2] = login; + keywords[3] = "password"; + values[3] = password; + keywords[4] = "dbname"; + values[4] = dbName; + keywords[5] = "fallback_application_name"; + values[5] = progname; + keywords[6] = NULL; + values[6] = NULL; + new_pass = false; - conn = PQsetdbLogin(pghost, pgport, pgoptions, pgtty, dbName, - login, password); + conn = PQconnectdbParams(keywords, values, true); + + free(keywords); + free(values); + if (!conn) { fprintf(stderr, "Connection to database \"%s\" failed\n", @@ -1877,15 +1899,13 @@ main(int argc, char **argv) char val[64]; - const char *progname; - progname = get_progname(argv[0]); if (argc > 1) { if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) { - usage(progname); + usage(); exit(0); } if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)