Improve pg_upgrade's status display
authorBruce Momjian <bruce@momjian.us>
Fri, 7 Dec 2012 17:26:13 +0000 (12:26 -0500)
committerBruce Momjian <bruce@momjian.us>
Fri, 7 Dec 2012 17:26:13 +0000 (12:26 -0500)
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
contrib/pg_upgrade/pg_upgrade.c
contrib/pg_upgrade/pg_upgrade.h
contrib/pg_upgrade/relfilenode.c
contrib/pg_upgrade/util.c

index 2c1b65b2552d09ce53cef5d0a580acf463c4cef5..f35852b5f0f23b9a65475bdff050c9e6865d9270 100644 (file)
@@ -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,
index 63df52996d5bd5c723cd1abd84a9df8d414e4e1b..2d4b6787f8cbe4c021f104bb916706554fe8fb01 100644 (file)
@@ -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);
 
        /*
index d98103508b56276590c3ccae1e55929296afe6b2..972e8e95e9cf12deb499d8cecca2e43ec200a800 100644 (file)
@@ -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
index 14e66df50006c731af34044b614bf119e6a99df8..5fec5ad29a114a238d9c0ca9c920b1596d598150 100644 (file)
@@ -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, "
index 0c1ecccaa7a7d0dd643b079d88dbb79265a5992c..d84da1ddb2ae781eae50cdf7da42b353708a2e1a 100644 (file)
@@ -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));