aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2012-12-07 12:26:13 -0500
committerBruce Momjian <bruce@momjian.us>2012-12-07 12:26:13 -0500
commit6dd9584507199a6222ff2d6a40028bba69c9175e (patch)
tree1f11890ce362f76b866c429fca6ea87a763da707
parentef754fb51b8a40c3b3dc0f3cc42f62eff77649db (diff)
downloadpostgresql-6dd9584507199a6222ff2d6a40028bba69c9175e.tar.gz
postgresql-6dd9584507199a6222ff2d6a40028bba69c9175e.zip
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.
-rw-r--r--contrib/pg_upgrade/dump.c2
-rw-r--r--contrib/pg_upgrade/pg_upgrade.c2
-rw-r--r--contrib/pg_upgrade/pg_upgrade.h4
-rw-r--r--contrib/pg_upgrade/relfilenode.c2
-rw-r--r--contrib/pg_upgrade/util.c40
5 files changed, 30 insertions, 20 deletions
diff --git a/contrib/pg_upgrade/dump.c b/contrib/pg_upgrade/dump.c
index 2c1b65b2552..f35852b5f0f 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 63df52996d5..2d4b6787f8c 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 d98103508b5..972e8e95e9c 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 14e66df5000..5fec5ad29a1 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 0c1ecccaa7a..d84da1ddb2a 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));