]> granicus.if.org Git - postgresql/blobdiff - contrib/pg_upgrade/option.c
Update copyright for 2014
[postgresql] / contrib / pg_upgrade / option.c
index aee8d3d15374ed15ec45a1aa93d3ec5f862d0f85..79b59ee17d25f7a3fd2d77b19d1d8374f681e036 100644 (file)
@@ -3,7 +3,7 @@
  *
  *     options functions
  *
- *     Copyright (c) 2010-2013, PostgreSQL Global Development Group
+ *     Copyright (c) 2010-2014, PostgreSQL Global Development Group
  *     contrib/pg_upgrade/option.c
  */
 
@@ -25,6 +25,7 @@
 static void usage(void);
 static void check_required_directory(char **dirpath, char **configpath,
                                   char *envVarName, char *cmdLineOption, char *description);
+#define FIX_DEFAULT_READ_ONLY "-c default_transaction_read_only=false"
 
 
 UserOpts       user_opts;
@@ -48,7 +49,7 @@ parseCommandLine(int argc, char *argv[])
                {"old-port", required_argument, NULL, 'p'},
                {"new-port", required_argument, NULL, 'P'},
 
-               {"user", required_argument, NULL, 'u'},
+               {"username", required_argument, NULL, 'U'},
                {"check", no_argument, NULL, 'c'},
                {"link", no_argument, NULL, 'k'},
                {"retain", no_argument, NULL, 'r'},
@@ -82,8 +83,7 @@ parseCommandLine(int argc, char *argv[])
 
        if (argc > 1)
        {
-               if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0 ||
-                       strcmp(argv[1], "-?") == 0)
+               if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
                {
                        usage();
                        exit(0);
@@ -97,12 +97,12 @@ parseCommandLine(int argc, char *argv[])
 
        /* Allow help and version to be run as root, so do the test here. */
        if (os_user_effective_id == 0)
-               pg_log(PG_FATAL, "%s: cannot be run as root\n", os_info.progname);
+               pg_fatal("%s: cannot be run as root\n", os_info.progname);
 
        if ((log_opts.internal = fopen_priv(INTERNAL_LOG_FILE, "a")) == NULL)
-               pg_log(PG_FATAL, "cannot write to log file %s\n", INTERNAL_LOG_FILE);
+               pg_fatal("cannot write to log file %s\n", INTERNAL_LOG_FILE);
 
-       while ((option = getopt_long(argc, argv, "d:D:b:B:cj:ko:O:p:P:ru:v",
+       while ((option = getopt_long(argc, argv, "d:D:b:B:cj:ko:O:p:P:rU:v",
                                                                 long_options, &optindex)) != -1)
        {
                switch (option)
@@ -153,7 +153,7 @@ parseCommandLine(int argc, char *argv[])
                        case 'p':
                                if ((old_cluster.port = atoi(optarg)) <= 0)
                                {
-                                       pg_log(PG_FATAL, "invalid old port number\n");
+                                       pg_fatal("invalid old port number\n");
                                        exit(1);
                                }
                                break;
@@ -161,7 +161,7 @@ parseCommandLine(int argc, char *argv[])
                        case 'P':
                                if ((new_cluster.port = atoi(optarg)) <= 0)
                                {
-                                       pg_log(PG_FATAL, "invalid new port number\n");
+                                       pg_fatal("invalid new port number\n");
                                        exit(1);
                                }
                                break;
@@ -170,9 +170,10 @@ parseCommandLine(int argc, char *argv[])
                                log_opts.retain = true;
                                break;
 
-                       case 'u':
+                       case 'U':
                                pg_free(os_info.user);
                                os_info.user = pg_strdup(optarg);
+                               os_info.user_specified = true;
 
                                /*
                                 * Push the user name into the environment so pre-9.1
@@ -187,8 +188,7 @@ parseCommandLine(int argc, char *argv[])
                                break;
 
                        default:
-                               pg_log(PG_FATAL,
-                                          "Try \"%s --help\" for more information.\n",
+                               pg_fatal("Try \"%s --help\" for more information.\n",
                                           os_info.progname);
                                break;
                }
@@ -198,7 +198,7 @@ parseCommandLine(int argc, char *argv[])
        for (filename = output_files; *filename != NULL; filename++)
        {
                if ((fp = fopen_priv(*filename, "a")) == NULL)
-                       pg_log(PG_FATAL, "cannot write to log file %s\n", *filename);
+                       pg_fatal("cannot write to log file %s\n", *filename);
 
                /* Start with newline because we might be appending to a file. */
                fprintf(fp, "\n"
@@ -209,6 +209,17 @@ parseCommandLine(int argc, char *argv[])
                fclose(fp);
        }
 
+       /* Turn off read-only mode;  add prefix to PGOPTIONS? */
+       if (getenv("PGOPTIONS"))
+       {
+               char *pgoptions = psprintf("%s %s", FIX_DEFAULT_READ_ONLY,
+                                                                       getenv("PGOPTIONS"));
+               pg_putenv("PGOPTIONS", pgoptions);
+               pfree(pgoptions);
+       }
+       else
+               pg_putenv("PGOPTIONS", FIX_DEFAULT_READ_ONLY);
+
        /* Get values from env if not already set */
        check_required_directory(&old_cluster.bindir, NULL, "PGBINOLD", "-b",
                                                         "old cluster binaries reside");
@@ -229,22 +240,22 @@ usage(void)
   pg_upgrade [OPTION]...\n\
 \n\
 Options:\n\
-  -b, --old-bindir=OLDBINDIR    old cluster executable directory\n\
-  -B, --new-bindir=NEWBINDIR    new cluster executable directory\n\
+  -b, --old-bindir=BINDIR      old cluster executable directory\n\
+  -B, --new-bindir=BINDIR       new cluster executable directory\n\
   -c, --check                   check clusters only, don't change any data\n\
-  -d, --old-datadir=OLDDATADIR  old cluster data directory\n\
-  -D, --new-datadir=NEWDATADIR  new cluster data directory\n\
+  -d, --old-datadir=DATADIR     old cluster data directory\n\
+  -D, --new-datadir=DATADIR     new cluster data directory\n\
   -j, --jobs                    number of simultaneous processes or threads to use\n\
   -k, --link                    link instead of copying files to new cluster\n\
   -o, --old-options=OPTIONS     old cluster options to pass to the server\n\
   -O, --new-options=OPTIONS     new cluster options to pass to the server\n\
-  -p, --old-port=OLDPORT        old cluster port number (default %d)\n\
-  -P, --new-port=NEWPORT        new cluster port number (default %d)\n\
+  -p, --old-port=PORT           old cluster port number (default %d)\n\
+  -P, --new-port=PORT           new cluster port number (default %d)\n\
   -r, --retain                  retain SQL and log files after success\n\
-  -u, --user=NAME               cluster superuser (default \"%s\")\n\
+  -U, --username=NAME           cluster superuser (default \"%s\")\n\
   -v, --verbose                 enable verbose internal logging\n\
   -V, --version                 display version information, then exit\n\
-  -?, -h, --help                show this help, then exit\n\
+  -?, --help                    show this help, then exit\n\
 \n\
 Before running pg_upgrade you must:\n\
   create a new database cluster (using the new version of initdb)\n\
@@ -252,10 +263,10 @@ Before running pg_upgrade you must:\n\
   shutdown the postmaster servicing the new cluster\n\
 \n\
 When you run pg_upgrade, you must provide the following information:\n\
-  the data directory for the old cluster  (-d OLDDATADIR)\n\
-  the data directory for the new cluster  (-D NEWDATADIR)\n\
-  the \"bin\" directory for the old version (-b OLDBINDIR)\n\
-  the \"bin\" directory for the new version (-B NEWBINDIR)\n\
+  the data directory for the old cluster  (-d DATADIR)\n\
+  the data directory for the new cluster  (-D DATADIR)\n\
+  the \"bin\" directory for the old version (-b BINDIR)\n\
+  the \"bin\" directory for the new version (-B BINDIR)\n\
 \n\
 For example:\n\
   pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n\
@@ -308,14 +319,14 @@ check_required_directory(char **dirpath, char **configpath,
                                *configpath = pg_strdup(envVar);
                }
                else
-                       pg_log(PG_FATAL, "You must identify the directory where the %s.\n"
+                       pg_fatal("You must identify the directory where the %s.\n"
                                   "Please use the %s command-line option or the %s environment variable.\n",
                                   description, cmdLineOption, envVarName);
        }
 
        /*
-        * Trim off any trailing path separators because we construct paths
-        * by appending to this path.
+        * Trim off any trailing path separators because we construct paths by
+        * appending to this path.
         */
 #ifndef WIN32
        if ((*dirpath)[strlen(*dirpath) - 1] == '/')
@@ -371,7 +382,7 @@ adjust_data_dir(ClusterInfo *cluster)
 
        if ((output = popen(cmd, "r")) == NULL ||
                fgets(cmd_output, sizeof(cmd_output), output) == NULL)
-               pg_log(PG_FATAL, "Could not get data directory using %s: %s\n",
+               pg_fatal("Could not get data directory using %s: %s\n",
                           cmd, getErrorText(errno));
 
        pclose(output);
@@ -398,10 +409,10 @@ void
 get_sock_dir(ClusterInfo *cluster, bool live_check)
 {
 #ifdef HAVE_UNIX_SOCKETS
+
        /*
-        *      sockdir and port were added to postmaster.pid in PG 9.1.
-        *      Pre-9.1 cannot process pg_ctl -w for sockets in non-default
-        *      locations.
+        * sockdir and port were added to postmaster.pid in PG 9.1. Pre-9.1 cannot
+        * process pg_ctl -w for sockets in non-default locations.
         */
        if (GET_MAJOR_VERSION(cluster->major_version) >= 901)
        {
@@ -410,31 +421,33 @@ get_sock_dir(ClusterInfo *cluster, bool live_check)
                        /* Use the current directory for the socket */
                        cluster->sockdir = pg_malloc(MAXPGPATH);
                        if (!getcwd(cluster->sockdir, MAXPGPATH))
-                               pg_log(PG_FATAL, "cannot find current directory\n");
+                               pg_fatal("cannot find current directory\n");
                }
                else
                {
                        /*
-                        *      If we are doing a live check, we will use the old cluster's Unix
-                        *      domain socket directory so we can connect to the live server.
+                        * If we are doing a live check, we will use the old cluster's
+                        * Unix domain socket directory so we can connect to the live
+                        * server.
                         */
                        unsigned short orig_port = cluster->port;
-                       char            filename[MAXPGPATH], line[MAXPGPATH];
-                       FILE            *fp;
+                       char            filename[MAXPGPATH],
+                                               line[MAXPGPATH];
+                       FILE       *fp;
                        int                     lineno;
-       
+
                        snprintf(filename, sizeof(filename), "%s/postmaster.pid",
                                         cluster->pgdata);
                        if ((fp = fopen(filename, "r")) == NULL)
-                               pg_log(PG_FATAL, "Cannot open file %s: %m\n", filename);
-       
+                               pg_fatal("Cannot open file %s: %m\n", filename);
+
                        for (lineno = 1;
-                                lineno <= Max(LOCK_FILE_LINE_PORT, LOCK_FILE_LINE_SOCKET_DIR);
+                          lineno <= Max(LOCK_FILE_LINE_PORT, LOCK_FILE_LINE_SOCKET_DIR);
                                 lineno++)
                        {
                                if (fgets(line, sizeof(line), fp) == NULL)
-                                       pg_log(PG_FATAL, "Cannot read line %d from %s: %m\n", lineno, filename);
-       
+                                       pg_fatal("Cannot read line %d from %s: %m\n", lineno, filename);
+
                                /* potentially overwrite user-supplied value */
                                if (lineno == LOCK_FILE_LINE_PORT)
                                        sscanf(line, "%hu", &old_cluster.port);
@@ -446,18 +459,21 @@ get_sock_dir(ClusterInfo *cluster, bool live_check)
                                }
                        }
                        fclose(fp);
-       
+
                        /* warn of port number correction */
                        if (orig_port != DEF_PGUPORT && old_cluster.port != orig_port)
                                pg_log(PG_WARNING, "User-supplied old port number %hu corrected to %hu\n",
-                               orig_port, cluster->port);
+                                          orig_port, cluster->port);
                }
        }
        else
-               /* Can't get sockdir and pg_ctl -w can't use a non-default, use default */
-               cluster->sockdir = NULL;
 
-#else /* !HAVE_UNIX_SOCKETS */
+               /*
+                * Can't get sockdir and pg_ctl -w can't use a non-default, use
+                * default
+                */
+               cluster->sockdir = NULL;
+#else                                                  /* !HAVE_UNIX_SOCKETS */
        cluster->sockdir = NULL;
 #endif
 }