1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-05 07:21:24 +03:00

Improve header output from psql's \watch command.

Include the \pset title string if there is one, and shorten the prefab
part of the header to be "timestamp (every Ns)".  Per suggestion by
David Johnston.

Michael Paquier and Tom Lane
This commit is contained in:
Tom Lane
2016-03-21 18:18:13 -04:00
parent 92b7902deb
commit dea2b5960a
2 changed files with 35 additions and 12 deletions

View File

@ -2673,9 +2673,11 @@ testdb=&gt; <userinput>\setenv LESS -imx4F</userinput>
<term><literal>\watch [ <replaceable class="parameter">seconds</replaceable> ]</literal></term> <term><literal>\watch [ <replaceable class="parameter">seconds</replaceable> ]</literal></term>
<listitem> <listitem>
<para> <para>
Repeatedly execute the current query buffer (like <literal>\g</>) Repeatedly execute the current query buffer (as <literal>\g</> does)
until interrupted or the query fails. Wait the specified number of until interrupted or the query fails. Wait the specified number of
seconds (default 2) between executions. seconds (default 2) between executions. Each query result is
displayed with a header that includes the <literal>\pset title</>
string (if any), the time as of query start, and the delay interval.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View File

@ -3020,7 +3020,10 @@ static bool
do_watch(PQExpBuffer query_buf, long sleep) do_watch(PQExpBuffer query_buf, long sleep)
{ {
printQueryOpt myopt = pset.popt; printQueryOpt myopt = pset.popt;
char title[50]; const char *user_title;
char *title;
int title_len;
int res = 0;
if (!query_buf || query_buf->len <= 0) if (!query_buf || query_buf->len <= 0)
{ {
@ -3034,19 +3037,38 @@ do_watch(PQExpBuffer query_buf, long sleep)
*/ */
myopt.topt.pager = 0; myopt.topt.pager = 0;
/*
* If there's a title in the user configuration, make sure we have room
* for it in the title buffer.
*/
user_title = myopt.title;
title_len = (user_title ? strlen(user_title) : 0) + 100;
title = pg_malloc(title_len);
for (;;) for (;;)
{ {
int res;
time_t timer; time_t timer;
char asctimebuf[64];
long i; long i;
/* /*
* Prepare title for output. XXX would it be better to use the time * Prepare title for output. Note that we intentionally include a
* of completion of the command? * newline at the end of the title; this is somewhat historical but it
* makes for reasonably nicely formatted output in simple cases.
*/ */
timer = time(NULL); timer = time(NULL);
snprintf(title, sizeof(title), _("Watch every %lds\t%s"), strlcpy(asctimebuf, asctime(localtime(&timer)), sizeof(asctimebuf));
sleep, asctime(localtime(&timer))); /* strip trailing newline from asctime's output */
i = strlen(asctimebuf);
while (i > 0 && asctimebuf[--i] == '\n')
asctimebuf[i] = '\0';
if (user_title)
snprintf(title, title_len, _("%s\t%s (every %lds)\n"),
user_title, asctimebuf, sleep);
else
snprintf(title, title_len, _("%s (every %lds)\n"),
asctimebuf, sleep);
myopt.title = title; myopt.title = title;
/* Run the query and print out the results */ /* Run the query and print out the results */
@ -3056,10 +3078,8 @@ do_watch(PQExpBuffer query_buf, long sleep)
* PSQLexecWatch handles the case where we can no longer repeat the * PSQLexecWatch handles the case where we can no longer repeat the
* query, and returns 0 or -1. * query, and returns 0 or -1.
*/ */
if (res == 0) if (res <= 0)
break; break;
if (res == -1)
return false;
/* /*
* Set up cancellation of 'watch' via SIGINT. We redo this each time * Set up cancellation of 'watch' via SIGINT. We redo this each time
@ -3084,7 +3104,8 @@ do_watch(PQExpBuffer query_buf, long sleep)
sigint_interrupt_enabled = false; sigint_interrupt_enabled = false;
} }
return true; pg_free(title);
return (res >= 0);
} }
/* /*