Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Use correct path separator for Windows builtin commands.
authorAndrew Dunstan <andrew@dunslane.net>
Mon, 3 Sep 2012 22:11:17 +0000 (18:11 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Mon, 3 Sep 2012 22:11:17 +0000 (18:11 -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 6a3a5f39d95f42d9be7e075fd9daf5b5b12c4dcf..5699c66019f5c1197b41148a59109c84d54fb3b0 100644 (file)
@@ -22,6 +22,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)
 {
@@ -453,7 +482,7 @@ create_script_for_old_cluster_deletion(
 #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++)
@@ -470,14 +499,17 @@ create_script_for_old_cluster_deletion(
            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 < new_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
@@ -487,7 +519,8 @@ create_script_for_old_cluster_deletion(
             * 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 40f03d666f337867a5dcb53ff756a94d4cba5df1..51a04473a645d43078cd36b3a00deb3ca563c29b 100644 (file)
@@ -38,6 +38,7 @@
 #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"
@@ -46,6 +47,7 @@
 #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"