From 6dd9584507199a6222ff2d6a40028bba69c9175e Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Fri, 7 Dec 2012 12:26:13 -0500 Subject: [PATCH] Improve pg_upgrade's status display Pg_upgrade displays file names during copy and database names during dump/restore. Andrew Dunstan identified three bugs: * long file names were being truncated to 60 _leading_ characters, which often do not change for long file names * file names were truncated to 60 characters in log files * carriage returns were being output to log files This commit fixes these --- it prints 60 _trailing_ characters to the status display, and full path names without carriage returns to log files. It also suppresses status output to the log file unless verbose mode is used. --- contrib/pg_upgrade/dump.c | 2 +- contrib/pg_upgrade/pg_upgrade.c | 2 +- contrib/pg_upgrade/pg_upgrade.h | 4 ++-- contrib/pg_upgrade/relfilenode.c | 2 +- contrib/pg_upgrade/util.c | 40 ++++++++++++++++++++------------ 5 files changed, 30 insertions(+), 20 deletions(-) diff --git a/contrib/pg_upgrade/dump.c b/contrib/pg_upgrade/dump.c index 2c1b65b255..f35852b5f0 100644 --- a/contrib/pg_upgrade/dump.c +++ b/contrib/pg_upgrade/dump.c @@ -36,7 +36,7 @@ generate_old_dump(void) char file_name[MAXPGPATH]; DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum]; - pg_log(PG_REPORT, OVERWRITE_MESSAGE, old_db->db_name); + pg_log(PG_STATUS, "%s", old_db->db_name); snprintf(file_name, sizeof(file_name), DB_DUMP_FILE_MASK, old_db->db_oid); exec_prog(RESTORE_LOG_FILE, NULL, true, diff --git a/contrib/pg_upgrade/pg_upgrade.c b/contrib/pg_upgrade/pg_upgrade.c index 63df52996d..2d4b6787f8 100644 --- a/contrib/pg_upgrade/pg_upgrade.c +++ b/contrib/pg_upgrade/pg_upgrade.c @@ -310,7 +310,7 @@ create_new_objects(void) char file_name[MAXPGPATH]; DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum]; - pg_log(PG_REPORT, OVERWRITE_MESSAGE, old_db->db_name); + pg_log(PG_STATUS, "%s", old_db->db_name); snprintf(file_name, sizeof(file_name), DB_DUMP_FILE_MASK, old_db->db_oid); /* diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h index d98103508b..972e8e95e9 100644 --- a/contrib/pg_upgrade/pg_upgrade.h +++ b/contrib/pg_upgrade/pg_upgrade.h @@ -24,9 +24,8 @@ #define MIGRATOR_API_VERSION 1 -#define MESSAGE_WIDTH "60" +#define MESSAGE_WIDTH 60 -#define OVERWRITE_MESSAGE " %-" MESSAGE_WIDTH "." MESSAGE_WIDTH "s\r" #define GET_MAJOR_VERSION(v) ((v) / 100) /* contains both global db information and CREATE DATABASE commands */ @@ -208,6 +207,7 @@ typedef enum typedef enum { PG_VERBOSE, + PG_STATUS, PG_REPORT, PG_WARNING, PG_FATAL diff --git a/contrib/pg_upgrade/relfilenode.c b/contrib/pg_upgrade/relfilenode.c index 14e66df500..5fec5ad29a 100644 --- a/contrib/pg_upgrade/relfilenode.c +++ b/contrib/pg_upgrade/relfilenode.c @@ -213,7 +213,7 @@ transfer_relfile(pageCnvCtx *pageConverter, FileNameMap *map, unlink(new_file); /* Copying files might take some time, so give feedback. */ - pg_log(PG_REPORT, OVERWRITE_MESSAGE, old_file); + pg_log(PG_STATUS, "%s", old_file); if ((user_opts.transfer_mode == TRANSFER_MODE_LINK) && (pageConverter != NULL)) pg_log(PG_FATAL, "This upgrade requires page-by-page conversion, " diff --git a/contrib/pg_upgrade/util.c b/contrib/pg_upgrade/util.c index 0c1ecccaa7..d84da1ddb2 100644 --- a/contrib/pg_upgrade/util.c +++ b/contrib/pg_upgrade/util.c @@ -75,7 +75,8 @@ prep_status(const char *fmt,...) if (strlen(message) > 0 && message[strlen(message) - 1] == '\n') pg_log(PG_REPORT, "%s", message); else - pg_log(PG_REPORT, "%-" MESSAGE_WIDTH "s", message); + /* trim strings that don't end in a newline */ + pg_log(PG_REPORT, "%-*s", MESSAGE_WIDTH, message); } @@ -89,22 +90,16 @@ pg_log(eLogType type, char *fmt,...) vsnprintf(message, sizeof(message), fmt, args); va_end(args); - /* PG_VERBOSE is only output in verbose mode */ + /* PG_VERBOSE and PG_STATUS are only output in verbose mode */ /* fopen() on log_opts.internal might have failed, so check it */ - if ((type != PG_VERBOSE || log_opts.verbose) && log_opts.internal != NULL) + if (((type != PG_VERBOSE && type != PG_STATUS) || log_opts.verbose) && + log_opts.internal != NULL) { - /* - * There's nothing much we can do about it if fwrite fails, but some - * platforms declare fwrite with warn_unused_result. Do a little - * dance with casting to void to shut up the compiler in such cases. - */ - size_t rc; - - rc = fwrite(message, strlen(message), 1, log_opts.internal); - /* if we are using OVERWRITE_MESSAGE, add newline to log file */ - if (strchr(message, '\r') != NULL) - rc = fwrite("\n", 1, 1, log_opts.internal); - (void) rc; + if (type == PG_STATUS) + /* status messages need two leading spaces and a newline */ + fprintf(log_opts.internal, " %s\n", message); + else + fprintf(log_opts.internal, "%s", message); fflush(log_opts.internal); } @@ -115,6 +110,21 @@ pg_log(eLogType type, char *fmt,...) printf("%s", _(message)); break; + case PG_STATUS: + /* for output to a display, do leading truncation and append \r */ + if (isatty(fileno(stdout))) + /* -2 because we use a 2-space indent */ + printf(" %s%-*.*s\r", + /* prefix with "..." if we do leading truncation */ + strlen(message) <= MESSAGE_WIDTH - 2 ? "" : "...", + MESSAGE_WIDTH - 2, MESSAGE_WIDTH - 2, + /* optional leading truncation */ + strlen(message) <= MESSAGE_WIDTH - 2 ? message : + message + strlen(message) - MESSAGE_WIDTH + 3 + 2); + else + printf(" %s\n", _(message)); + break; + case PG_REPORT: case PG_WARNING: printf("%s", _(message)); -- 2.39.5