]> granicus.if.org Git - postgresql/commitdiff
Use correct path separator for Windows builtin commands.
authorAndrew Dunstan <andrew@dunslane.net>
Mon, 3 Sep 2012 22:06:47 +0000 (18:06 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Mon, 3 Sep 2012 22:06:47 +0000 (18:06 -0400)
pg_upgrade produces a platform-specific script to remove the old
directory, but on Windows it has not been making sure that the
paths it writes as arguments for rmdir and del use the backslash
path separator, which will cause these scripts to fail.

The fix is backpatched to Release 9.0.

contrib/pg_upgrade/check.c
contrib/pg_upgrade/pg_upgrade.h

index efb080befd4355e68981b35dc32e9b954e10810b..d965fa815779b419b0eaae790b1a93e31a87151d 100644 (file)
@@ -23,6 +23,35 @@ static void check_for_reg_data_type_usage(ClusterInfo *cluster);
 static void get_bin_version(ClusterInfo *cluster);
 
 
+/*
+ * fix_path_separator
+ * For non-Windows, just return the argument.
+ * For Windows convert any forward slash to a backslash
+ * such as is suitable for arguments to builtin commands 
+ * like RMDIR and DEL.
+ */
+static char *fix_path_separator(char *path)
+{
+#ifdef WIN32
+
+       char *result;
+       char *c;
+
+       result = pg_strdup(path);
+
+       for (c = result; *c != '\0'; c++)
+               if (*c == '/')
+                       *c = '\\';
+
+       return result;
+
+#else
+
+       return path;
+
+#endif
+}
+
 void
 output_check_banner(bool *live_check)
 {
@@ -544,7 +573,7 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
 #endif
 
        /* delete old cluster's default tablespace */
-       fprintf(script, RMDIR_CMD " %s\n", old_cluster.pgdata);
+       fprintf(script, RMDIR_CMD " %s\n", fix_path_separator(old_cluster.pgdata));
 
        /* delete old cluster's alternate tablespaces */
        for (tblnum = 0; tblnum < os_info.num_tablespaces; tblnum++)
@@ -561,14 +590,17 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
                        fprintf(script, "\n");
                        /* remove PG_VERSION? */
                        if (GET_MAJOR_VERSION(old_cluster.major_version) <= 804)
-                               fprintf(script, RM_CMD " %s%s/PG_VERSION\n",
-                                os_info.tablespaces[tblnum], old_cluster.tablespace_suffix);
+                               fprintf(script, RM_CMD " %s%s%cPG_VERSION\n",
+                                               fix_path_separator(os_info.tablespaces[tblnum]), 
+                                               fix_path_separator(old_cluster.tablespace_suffix),
+                                               PATH_SEPARATOR);
 
                        for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++)
                        {
-                               fprintf(script, RMDIR_CMD " %s%s/%d\n",
-                                 os_info.tablespaces[tblnum], old_cluster.tablespace_suffix,
-                                               old_cluster.dbarr.dbs[dbnum].db_oid);
+                               fprintf(script, RMDIR_CMD " %s%s%c%d\n",
+                                               fix_path_separator(os_info.tablespaces[tblnum]),
+                                               fix_path_separator(old_cluster.tablespace_suffix),
+                                               PATH_SEPARATOR, old_cluster.dbarr.dbs[dbnum].db_oid);
                        }
                }
                else
@@ -578,7 +610,8 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name)
                         * or a version-specific subdirectory.
                         */
                        fprintf(script, RMDIR_CMD " %s%s\n",
-                                os_info.tablespaces[tblnum], old_cluster.tablespace_suffix);
+                                       fix_path_separator(os_info.tablespaces[tblnum]), 
+                                       fix_path_separator(old_cluster.tablespace_suffix));
        }
 
        fclose(script);
index 7b19d916fff7201e0be1f60de865329c2c98061e..b57da53d63e526a3116bb963ecd6c601919ad96e 100644 (file)
@@ -72,6 +72,7 @@ extern char *output_files[];
 #define pg_copy_file           copy_file
 #define pg_mv_file                     rename
 #define pg_link_file           link
+#define PATH_SEPARATOR      '/'
 #define RM_CMD                         "rm -f"
 #define RMDIR_CMD                      "rm -rf"
 #define SCRIPT_EXT                     "sh"
@@ -81,6 +82,7 @@ extern char *output_files[];
 #define pg_mv_file                     pgrename
 #define pg_link_file           win32_pghardlink
 #define sleep(x)                       Sleep(x * 1000)
+#define PATH_SEPARATOR      '\\'
 #define RM_CMD                         "DEL /q"
 #define RMDIR_CMD                      "RMDIR /s/q"
 #define SCRIPT_EXT                     "bat"