pg_isready_con_str_v3.diff
application/octet-stream
Filename: pg_isready_con_str_v3.diff
Type: application/octet-stream
Part: 0
Patch
Format: unified
Series: patch v3
| File | + | − |
|---|---|---|
| src/bin/scripts/pg_isready.c | 0 | 0 |
diff --git a/src/bin/scripts/pg_isready.c b/src/bin/scripts/pg_isready.c
new file mode 100644
index 4ba257d..96be545
*** a/src/bin/scripts/pg_isready.c
--- b/src/bin/scripts/pg_isready.c
***************
*** 14,42 ****
#define DEFAULT_CONNECT_TIMEOUT "3"
! static void
! help(const char *progname);
int
main(int argc, char **argv)
{
! int c,optindex,opt_index = 2;
!
const char *progname;
!
! const char *pghost = NULL;
! const char *pgport = NULL;
! const char *pguser = NULL;
! const char *pgdbname = NULL;
! const char *connect_timeout = DEFAULT_CONNECT_TIMEOUT;
!
! const char *keywords[7] = { NULL };
! const char *values[7] = { NULL };
!
bool quiet = false;
-
PGPing rv;
! PQconninfoOption *connect_options, *conn_opt_ptr;
/*
* We accept user and database as options to avoid
--- 14,34 ----
#define DEFAULT_CONNECT_TIMEOUT "3"
! static void help(const char *progname);
! static char *get_conn_option(PQconninfoOption *conninfo, const char *keyword);
! static bool set_conn_option(PQconninfoOption *conninfo, const char *keyword, const char *value);
! static char *get_conn_str(PQconninfoOption *conninfo);
! static void copy_conn_options(PQconninfoOption *conninfo_dest, PQconninfoOption *conninfo_src);
int
main(int argc, char **argv)
{
! int c;
const char *progname;
! char *conninfo_str, *pghost, *pgport;
bool quiet = false;
PGPing rv;
! PQconninfoOption *connect_options, *dbname_opts;
/*
* We accept user and database as options to avoid
*************** main(int argc, char **argv)
*** 57,83 ****
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, progname, help);
! while ((c = getopt_long(argc, argv, "d:h:p:qt:U:V", long_options, &optindex)) != -1)
{
switch (c)
{
case 'd':
! pgdbname = pg_strdup(optarg);
break;
case 'h':
! pghost = pg_strdup(optarg);
break;
case 'p':
! pgport = pg_strdup(optarg);
break;
case 'q':
quiet = true;
break;
case 't':
! connect_timeout = pg_strdup(optarg);
break;
case 'U':
! pguser = pg_strdup(optarg);
break;
default:
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
--- 49,88 ----
set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pgscripts"));
handle_help_version_opts(argc, argv, progname, help);
! connect_options = PQconndefaults();
! set_conn_option(connect_options, "connect_timeout", DEFAULT_CONNECT_TIMEOUT);
! set_conn_option(connect_options, "fallback_application_name", progname);
! if (!get_conn_option(connect_options, "host"))
! set_conn_option(connect_options, "host", DEFAULT_PGSOCKET_DIR);
!
! while ((c = getopt_long(argc, argv, "d:h:p:qt:U:V", long_options, NULL)) != -1)
{
switch (c)
{
case 'd':
! dbname_opts = PQconninfoParse(optarg, NULL);
! if (dbname_opts)
! {
! copy_conn_options(connect_options, dbname_opts);
! PQconninfoFree(dbname_opts);
! }
! else
! set_conn_option(connect_options, "dbname", optarg);
break;
case 'h':
! set_conn_option(connect_options, "host", optarg);
break;
case 'p':
! set_conn_option(connect_options, "port", optarg);
break;
case 'q':
quiet = true;
break;
case 't':
! set_conn_option(connect_options, "connect_timeout", optarg);
break;
case 'U':
! set_conn_option(connect_options, "user", optarg);
break;
default:
fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
*************** main(int argc, char **argv)
*** 101,165 ****
exit(PQPING_NO_ATTEMPT);
}
! /*
! * Set connection options
! */
!
! keywords[0] = "connect_timeout";
! values[0] = connect_timeout;
! keywords[1] = "fallback_application_name";
! values[1] = progname;
! if (pguser)
! {
! keywords[opt_index] = "user";
! values[opt_index] = pguser;
! opt_index++;
! }
! if (pgdbname)
! {
! keywords[opt_index] = "dbname";
! values[opt_index] = pgdbname;
! opt_index++;
! }
!
! /*
! * Get the default host and port so we can display them in our output
! */
! connect_options = PQconndefaults();
! conn_opt_ptr = connect_options;
! while (conn_opt_ptr->keyword)
! {
! if (strncmp(conn_opt_ptr->keyword, "host", 5) == 0)
! {
! if (pghost)
! {
! keywords[opt_index] = conn_opt_ptr->keyword;
! values[opt_index] = pghost;
! opt_index++;
! }
! else if (conn_opt_ptr->val)
! pghost = conn_opt_ptr->val;
! else
! pghost = DEFAULT_PGSOCKET_DIR;
! }
! else if (strncmp(conn_opt_ptr->keyword, "port", 5) == 0)
! {
! if (pgport)
! {
! keywords[opt_index] = conn_opt_ptr->keyword;
! values[opt_index] = pgport;
! opt_index++;
! }
! else if (conn_opt_ptr->val)
! pgport = conn_opt_ptr->val;
! }
! conn_opt_ptr++;
! }
!
! rv = PQpingParams(keywords, values, 1);
if (!quiet)
{
printf("%s:%s - ", pghost, pgport);
switch (rv)
--- 106,119 ----
exit(PQPING_NO_ATTEMPT);
}
! conninfo_str = get_conn_str(connect_options);
! rv = PQping(conninfo_str);
! free(conninfo_str);
if (!quiet)
{
+ pghost = get_conn_option(connect_options, "host");
+ pgport = get_conn_option(connect_options, "port");
printf("%s:%s - ", pghost, pgport);
switch (rv)
*************** help(const char *progname)
*** 206,208 ****
--- 160,222 ----
printf(_(" -U, --username=USERNAME database username\n"));
printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n"));
}
+
+ static char *
+ get_conn_option(PQconninfoOption *conninfo, const char *keyword)
+ {
+ PQconninfoOption *opts;
+
+ for (opts = conninfo; opts->keyword; opts++)
+ if (strcmp(opts->keyword, keyword) == 0)
+ return opts->val;
+
+ return NULL;
+ }
+
+ static bool
+ set_conn_option(PQconninfoOption *conninfo, const char *keyword, const char *value)
+ {
+ PQconninfoOption *opts;
+
+ for (opts = conninfo; opts->keyword; opts++)
+ if (strcmp(opts->keyword, keyword) == 0)
+ {
+ if (opts->val)
+ free(opts->val);
+ if (value)
+ opts->val = pg_strdup(value);
+ return true;
+ }
+
+ return false;
+ }
+
+ static char *
+ get_conn_str(PQconninfoOption *conninfo)
+ {
+ PQconninfoOption *opts;
+ size_t buf_size = 0, count = 0;
+ char *conn_string;
+
+ for (opts = conninfo; opts->keyword; opts++)
+ if ((opts->val) && (strlen(opts->val) > 0))
+ buf_size += strlen(opts->keyword) + strlen(opts->val) + 2;
+
+ conn_string = pg_malloc0(buf_size);
+
+ for (opts = conninfo; opts->keyword; opts++)
+ if ((opts->val) && (strlen(opts->val) > 0))
+ count += snprintf(conn_string + count, buf_size - count, "%s%s=%s", (count > 0 ? " " : ""), opts->keyword, opts->val);
+
+ return conn_string;
+ }
+
+ static void
+ copy_conn_options(PQconninfoOption *conninfo_dest, PQconninfoOption *conninfo_src)
+ {
+ PQconninfoOption *opts;
+
+ for (opts = conninfo_src; opts->keyword; opts++)
+ if (opts->val)
+ set_conn_option(conninfo_dest, opts->keyword, opts->val);
+ }