diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 3f2cebf..1e6686f 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -1516,12 +1516,23 @@ exec_command(const char *cmd, OT_NORMAL, NULL, false); if (opt) - pset.timing = ParseVariableBool(opt, "\\timing"); + if (strcmp(opt,"interval") == 0) + pset.timing = PSQL_TIMING_INTERVAL; + else if (ParseVariableBool(opt, "\\timing")) + pset.timing = PSQL_TIMING_ON; + else + pset.timing = PSQL_TIMING_OFF; else - pset.timing = !pset.timing; + if (pset.timing == PSQL_TIMING_OFF) + pset.timing = PSQL_TIMING_ON; + else + pset.timing = PSQL_TIMING_OFF; + if (!pset.quiet) { - if (pset.timing) + if (pset.timing == PSQL_TIMING_INTERVAL) + puts(_("Timing is interval.")); + else if (pset.timing == PSQL_TIMING_ON) puts(_("Timing is on.")); else puts(_("Timing is off.")); diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index 2450b9c..c79843f 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -587,6 +587,47 @@ PSQLexec(const char *query) return res; } +/* + * PrintTimingInterval + * + * Output timing an interval format + */ +static void +PrintTimingInterval(double elapsed_msec) +{ + double seconds = elapsed_msec / 1000.0; + int minutes; + int hours; + int days; + + if (seconds < 60.0) + { + printf(_("Time: 00:00:%06.3f\n"), seconds); + return; + } + + minutes = (int)seconds / 60; + seconds = seconds - (60.0 * minutes); + if (minutes < 60) + { + printf(_("Time: 00:%02d:%06.3f\n"), minutes, seconds); + return; + } + + hours = minutes / 60; + minutes = minutes % 60; + + if (hours < 24) + { + printf(_("Time: %2d:%02d:%06.3f\n"), hours, minutes, seconds); + return; + } + + days = hours / 24; + hours = hours % 24; + + printf(_("Time: %d, %2d:%02d:%06.3f\n"), days, hours, minutes, seconds); +} /* * PSQLexecWatch @@ -613,7 +654,7 @@ PSQLexecWatch(const char *query, const printQueryOpt *opt) SetCancelConn(); - if (pset.timing) + if (pset.timing != PSQL_TIMING_OFF) INSTR_TIME_SET_CURRENT(before); res = PQexec(pset.db, query); @@ -626,7 +667,7 @@ PSQLexecWatch(const char *query, const printQueryOpt *opt) return 0; } - if (pset.timing) + if (pset.timing != PSQL_TIMING_OFF) { INSTR_TIME_SET_CURRENT(after); INSTR_TIME_SUBTRACT(after, before); @@ -677,7 +718,9 @@ PSQLexecWatch(const char *query, const printQueryOpt *opt) fflush(pset.queryFout); /* Possible microtiming output */ - if (pset.timing) + if (pset.timing == PSQL_TIMING_INTERVAL) + PrintTimingInterval(elapsed_msec); + else if (pset.timing == PSQL_TIMING_ON) printf(_("Time: %.3f ms\n"), elapsed_msec); return 1; @@ -1228,7 +1271,7 @@ SendQuery(const char *query) instr_time before, after; - if (pset.timing) + if (pset.timing != PSQL_TIMING_OFF) INSTR_TIME_SET_CURRENT(before); results = PQexec(pset.db, query); @@ -1237,7 +1280,7 @@ SendQuery(const char *query) ResetCancelConn(); OK = ProcessResult(&results); - if (pset.timing) + if (pset.timing != PSQL_TIMING_OFF) { INSTR_TIME_SET_CURRENT(after); INSTR_TIME_SUBTRACT(after, before); @@ -1327,7 +1370,9 @@ SendQuery(const char *query) ClearOrSaveResult(results); /* Possible microtiming output */ - if (pset.timing) + if (pset.timing == PSQL_TIMING_INTERVAL) + PrintTimingInterval(elapsed_msec); + else if (pset.timing == PSQL_TIMING_ON) printf(_("Time: %.3f ms\n"), elapsed_msec); /* check for events that may occur during query execution */ @@ -1412,7 +1457,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) my_popt.topt.stop_table = false; my_popt.topt.prior_records = 0; - if (pset.timing) + if (pset.timing != PSQL_TIMING_OFF) INSTR_TIME_SET_CURRENT(before); /* if we're not in a transaction, start one */ @@ -1440,7 +1485,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) if (!OK) goto cleanup; - if (pset.timing) + if (pset.timing != PSQL_TIMING_OFF) { INSTR_TIME_SET_CURRENT(after); INSTR_TIME_SUBTRACT(after, before); @@ -1482,13 +1527,13 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) for (;;) { - if (pset.timing) + if (pset.timing != PSQL_TIMING_OFF) INSTR_TIME_SET_CURRENT(before); /* get fetch_count tuples at a time */ results = PQexec(pset.db, fetch_cmd); - if (pset.timing) + if (pset.timing != PSQL_TIMING_OFF) { INSTR_TIME_SET_CURRENT(after); INSTR_TIME_SUBTRACT(after, before); @@ -1583,7 +1628,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec) } cleanup: - if (pset.timing) + if (pset.timing != PSQL_TIMING_OFF) INSTR_TIME_SET_CURRENT(before); /* @@ -1609,7 +1654,7 @@ cleanup: ClearOrSaveResult(results); } - if (pset.timing) + if (pset.timing != PSQL_TIMING_OFF) { INSTR_TIME_SET_CURRENT(after); INSTR_TIME_SUBTRACT(after, before); diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index 9e6d67b..1e2a229 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -45,6 +45,7 @@ */ #define ON(var) (var ? _("on") : _("off")) + void usage(unsigned short int pager) { @@ -288,8 +289,8 @@ slashUsage(unsigned short int pager) fprintf(output, _("Operating System\n")); fprintf(output, _(" \\cd [DIR] change the current working directory\n")); fprintf(output, _(" \\setenv NAME [VALUE] set or unset environment variable\n")); - fprintf(output, _(" \\timing [on|off] toggle timing of commands (currently %s)\n"), - ON(pset.timing)); + fprintf(output, _(" \\timing [on|off|interval] toggle timing of commands (currently %s)\n"), + ( (pset.timing == PSQL_TIMING_INTERVAL) ? _("interval") : ON(pset.timing))); fprintf(output, _(" \\! [COMMAND] execute command in shell or start interactive shell\n")); fprintf(output, "\n"); diff --git a/src/bin/psql/settings.h b/src/bin/psql/settings.h index 8cfe9d2..cc4e5eb 100644 --- a/src/bin/psql/settings.h +++ b/src/bin/psql/settings.h @@ -64,6 +64,13 @@ typedef enum typedef enum { + PSQL_TIMING_OFF, + PSQL_TIMING_ON, + PSQL_TIMING_INTERVAL +} PSQL_TIMING; + +typedef enum +{ hctl_none = 0, hctl_ignorespace = 1, hctl_ignoredups = 2, @@ -108,7 +115,7 @@ typedef struct _psqlSettings uint64 lineno; /* also for error reporting */ uint64 stmt_lineno; /* line number inside the current statement */ - bool timing; /* enable timing of all queries */ + PSQL_TIMING timing; /* enable timing of all queries */ FILE *logfile; /* session log file handle */