static void check_for_reg_data_type_usage(ClusterInfo *cluster);
static void check_for_jsonb_9_4_usage(ClusterInfo *cluster);
static void check_for_pg_role_prefix(ClusterInfo *cluster);
-static void get_bin_version(ClusterInfo *cluster);
static char *get_canonical_locale_name(int category, const char *locale);
if (old_cluster.major_version > new_cluster.major_version)
pg_fatal("This utility cannot be used to downgrade to older major PostgreSQL versions.\n");
- /* get old and new binary versions */
- get_bin_version(&old_cluster);
- get_bin_version(&new_cluster);
-
/* Ensure binaries match the designated data directories */
if (GET_MAJOR_VERSION(old_cluster.major_version) !=
GET_MAJOR_VERSION(old_cluster.bin_version))
check_ok();
}
-static void
-get_bin_version(ClusterInfo *cluster)
-{
- char cmd[MAXPGPATH],
- cmd_output[MAX_STRING];
- FILE *output;
- int pre_dot = 0,
- post_dot = 0;
-
- snprintf(cmd, sizeof(cmd), "\"%s/pg_ctl\" --version", cluster->bindir);
-
- if ((output = popen(cmd, "r")) == NULL ||
- fgets(cmd_output, sizeof(cmd_output), output) == NULL)
- pg_fatal("could not get pg_ctl version data using %s: %s\n",
- cmd, strerror(errno));
-
- pclose(output);
-
- /* Remove trailing newline */
- if (strchr(cmd_output, '\n') != NULL)
- *strchr(cmd_output, '\n') = '\0';
-
- if (sscanf(cmd_output, "%*s %*s %d.%d", &pre_dot, &post_dot) < 1)
- pg_fatal("could not get version from %s\n", cmd);
-
- cluster->bin_version = (pre_dot * 100 + post_dot) * 100;
-}
-
/*
* get_canonical_locale_name
uint32 tli = 0;
uint32 logid = 0;
uint32 segno = 0;
+ char *resetwal_bin;
/*
pg_putenv("LC_ALL", NULL);
pg_putenv("LC_MESSAGES", "C");
+ /* pg_resetxlog has been renamed to pg_resetwal in version 10 */
+ if (GET_MAJOR_VERSION(cluster->bin_version) < 1000)
+ resetwal_bin = "pg_resetxlog\" -n";
+ else
+ resetwal_bin = "pg_resetwal\" -n";
snprintf(cmd, sizeof(cmd), "\"%s/%s \"%s\"",
cluster->bindir,
- live_check ? "pg_controldata\"" : "pg_resetwal\" -n",
+ live_check ? "pg_controldata\"" : resetwal_bin,
cluster->pgdata);
fflush(stdout);
fflush(stderr);
static void check_data_dir(ClusterInfo *cluster);
static void check_bin_dir(ClusterInfo *cluster);
+static void get_bin_version(ClusterInfo *cluster);
static void validate_exec(const char *dir, const char *cmdName);
#ifdef WIN32
#endif
+/*
+ * get_bin_version
+ *
+ * Fetch versions of binaries for cluster.
+ */
+static void
+get_bin_version(ClusterInfo *cluster)
+{
+ char cmd[MAXPGPATH],
+ cmd_output[MAX_STRING];
+ FILE *output;
+ int pre_dot = 0,
+ post_dot = 0;
+
+ snprintf(cmd, sizeof(cmd), "\"%s/pg_ctl\" --version", cluster->bindir);
+
+ if ((output = popen(cmd, "r")) == NULL ||
+ fgets(cmd_output, sizeof(cmd_output), output) == NULL)
+ pg_fatal("could not get pg_ctl version data using %s: %s\n",
+ cmd, strerror(errno));
+
+ pclose(output);
+
+ /* Remove trailing newline */
+ if (strchr(cmd_output, '\n') != NULL)
+ *strchr(cmd_output, '\n') = '\0';
+
+ if (sscanf(cmd_output, "%*s %*s %d.%d", &pre_dot, &post_dot) < 1)
+ pg_fatal("could not get version from %s\n", cmd);
+
+ cluster->bin_version = (pre_dot * 100 + post_dot) * 100;
+}
+
+
/*
* exec_prog()
* Execute an external program with stdout/stderr redirected, and report
validate_exec(cluster->bindir, "postgres");
validate_exec(cluster->bindir, "pg_ctl");
- validate_exec(cluster->bindir, "pg_resetwal");
+
+ /*
+ * Fetch the binary versions after checking for the existence of pg_ctl,
+ * this gives a correct error if the binary used itself for the version
+ * fetching is broken.
+ */
+ get_bin_version(&old_cluster);
+ get_bin_version(&new_cluster);
+
+ /* pg_resetxlog has been renamed to pg_resetwal in version 10 */
+ if (GET_MAJOR_VERSION(cluster->bin_version) < 1000)
+ validate_exec(cluster->bindir, "pg_resetxlog");
+ else
+ validate_exec(cluster->bindir, "pg_resetwal");
if (cluster == &new_cluster)
{
/* these are only needed in the new cluster */