diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 5c906e4..ad8e370 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -68,7 +68,8 @@ static backslashResult exec_command_C(PsqlScanState scan_state, bool active_bran static backslashResult exec_command_connect(PsqlScanState scan_state, bool active_branch); static backslashResult exec_command_cd(PsqlScanState scan_state, bool active_branch, const char *cmd); -static backslashResult exec_command_conninfo(PsqlScanState scan_state, bool active_branch); +static backslashResult exec_command_conninfo(PsqlScanState scan_state, bool active_branch, + const char *cmd); static backslashResult exec_command_copy(PsqlScanState scan_state, bool active_branch); static backslashResult exec_command_copyright(PsqlScanState scan_state, bool active_branch); static backslashResult exec_command_crosstabview(PsqlScanState scan_state, bool active_branch); @@ -317,8 +318,8 @@ exec_command(const char *cmd, status = exec_command_connect(scan_state, active_branch); else if (strcmp(cmd, "cd") == 0) status = exec_command_cd(scan_state, active_branch, cmd); - else if (strcmp(cmd, "conninfo") == 0) - status = exec_command_conninfo(scan_state, active_branch); + else if (strcmp(cmd, "conninfo") == 0 || strcmp(cmd, "conninfo+") == 0) + status = exec_command_conninfo(scan_state, active_branch, cmd); else if (pg_strcasecmp(cmd, "copy") == 0) status = exec_command_copy(scan_state, active_branch); else if (strcmp(cmd, "copyright") == 0) @@ -643,47 +644,74 @@ exec_command_cd(PsqlScanState scan_state, bool active_branch, const char *cmd) } /* - * \conninfo -- display information about the current connection + * \conninfo, \conninfo+ -- display information about the current connection */ static backslashResult -exec_command_conninfo(PsqlScanState scan_state, bool active_branch) +exec_command_conninfo(PsqlScanState scan_state, bool active_branch, const char *cmd) { + bool success = true; + if (active_branch) { char *db = PQdb(pset.db); + char *pattern; + bool show_verbose; - if (db == NULL) - printf(_("You are currently not connected to a database.\n")); - else + pattern = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, true); + + show_verbose = strchr(cmd, '+') ? true : false; + + /* + * \conninfo+ + */ + if (show_verbose) { - char *host = PQhost(pset.db); - char *hostaddr = PQhostaddr(pset.db); + success = listConnectionInformation(pattern, show_verbose); + free(pattern); + printSSLInfo(); + printGSSInfo(); + } - if (is_unixsock_path(host)) - { - /* hostaddr overrides host */ - if (hostaddr && *hostaddr) - printf(_("You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"), - db, PQuser(pset.db), hostaddr, PQport(pset.db)); - else - printf(_("You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"), - db, PQuser(pset.db), host, PQport(pset.db)); - } + /* + * \conninfo + */ + else + { + if (db == NULL) + printf(_("You are currently not connected to a database.\n")); else { - if (hostaddr && *hostaddr && strcmp(host, hostaddr) != 0) - printf(_("You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"), - db, PQuser(pset.db), host, hostaddr, PQport(pset.db)); + char *host = PQhost(pset.db); + char *hostaddr = PQhostaddr(pset.db); + + if (is_unixsock_path(host)) + { + /* hostaddr overrides host */ + if (hostaddr && *hostaddr) + printf(_("You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n"), + db, PQuser(pset.db), hostaddr, PQport(pset.db)); + else + printf(_("You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n"), + db, PQuser(pset.db), host, PQport(pset.db)); + } else - printf(_("You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"), - db, PQuser(pset.db), host, PQport(pset.db)); + { + if (hostaddr && *hostaddr && strcmp(host, hostaddr) != 0) + printf(_("You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n"), + db, PQuser(pset.db), host, hostaddr, PQport(pset.db)); + else + printf(_("You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n"), + db, PQuser(pset.db), host, PQport(pset.db)); + } + printSSLInfo(); + printGSSInfo(); } - printSSLInfo(); - printGSSInfo(); } } + else + ignore_slash_options(scan_state); - return PSQL_CMD_SKIP_LINE; + return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR; } /* diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index b6a4eb1..a84da54 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -901,6 +901,50 @@ error_return: return false; } +/* + * listConnectionInformation + * + * for \conninfo+ + */ +bool +listConnectionInformation(const char *pattern, bool verbose) +{ + PGresult *res; + PQExpBufferData buf; + printQueryOpt myopt = pset.popt; + + initPQExpBuffer(&buf); + + printfPQExpBuffer(&buf, + "SELECT\n" + "\"Attribute\",\n" + "\"Value\"\n" + "FROM\n" + "(\n" + "VALUES\n" + "('Database',pg_catalog.current_database()),\n" + "('User',pg_catalog.current_user()),\n" + "('Server Version',pg_catalog.current_setting('server_version')),\n" + "('Server Address',NULLIF(pg_catalog.inet_server_addr()::text,'')),\n" + "('Server Port',pg_catalog.current_setting('port')),\n" + "('Client Address',NULLIF(pg_catalog.inet_client_addr()::text,'')),\n" + "('Client Port',NULLIF(pg_catalog.inet_client_port()::text,'')),\n" + "('Session PID',pg_catalog.pg_backend_pid()::text)\n" + ") AS tab(\"Attribute\",\"Value\");"); + + res = PSQLexec(buf.data); + termPQExpBuffer(&buf); + if (!res) + return false; + + myopt.title = _("Current Connection Information"); + myopt.translate_header = true; + + printQuery(res, &myopt, pset.queryFout, false, pset.logfile); + + PQclear(res); + return true; +} /* * listAllDbs diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h index 273f974..b638c71 100644 --- a/src/bin/psql/describe.h +++ b/src/bin/psql/describe.h @@ -149,4 +149,7 @@ extern bool listOpFamilyFunctions(const char *access_method_pattern, /* \dl or \lo_list */ extern bool listLargeObjects(bool verbose); +/* \conninfo */ +extern bool listConnectionInformation(const char *pattern, bool verbose); + #endif /* DESCRIBE_H */ diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index 4e79a81..2c5426d 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -310,7 +310,7 @@ slashUsage(unsigned short int pager) else HELP0(" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n"); - HELP0(" \\conninfo display information about current connection\n"); + HELP0(" \\conninfo[+] display information about current connection\n"); HELP0(" \\encoding [ENCODING] show or set client encoding\n"); HELP0(" \\password [USERNAME] securely change the password for a user\n"); HELP0("\n");