<term><literal>\watch [ <replaceable class="parameter">seconds</replaceable> ]</literal></term>
<listitem>
<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
- 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>
</listitem>
</varlistentry>
do_watch(PQExpBuffer query_buf, long sleep)
{
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)
{
*/
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 (;;)
{
- int res;
time_t timer;
+ char asctimebuf[64];
long i;
/*
- * Prepare title for output. XXX would it be better to use the time
- * of completion of the command?
+ * Prepare title for output. Note that we intentionally include a
+ * 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);
- snprintf(title, sizeof(title), _("Watch every %lds\t%s"),
- sleep, asctime(localtime(&timer)));
+ strlcpy(asctimebuf, asctime(localtime(&timer)), sizeof(asctimebuf));
+ /* 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;
/* Run the query and print out the results */
* PSQLexecWatch handles the case where we can no longer repeat the
* query, and returns 0 or -1.
*/
- if (res == 0)
+ if (res <= 0)
break;
- if (res == -1)
- return false;
/*
* Set up cancellation of 'watch' via SIGINT. We redo this each time
sigint_interrupt_enabled = false;
}
- return true;
+ pg_free(title);
+ return (res >= 0);
}
/*