summaryrefslogtreecommitdiff
path: root/contrib/pg_upgrade
diff options
context:
space:
mode:
authorBruce Momjian2012-12-07 17:26:13 +0000
committerBruce Momjian2012-12-07 17:26:13 +0000
commit6dd9584507199a6222ff2d6a40028bba69c9175e (patch)
tree1f11890ce362f76b866c429fca6ea87a763da707 /contrib/pg_upgrade
parentef754fb51b8a40c3b3dc0f3cc42f62eff77649db (diff)
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.
Diffstat (limited to 'contrib/pg_upgrade')
-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));