diff options
| author | Andrew Dunstan <andrew@dunslane.net> | 2012-09-03 18:14:06 -0400 |
|---|---|---|
| committer | Andrew Dunstan <andrew@dunslane.net> | 2012-09-03 18:14:06 -0400 |
| commit | 4397c51816cbb918fc3aebc474dd53bc231502b9 (patch) | |
| tree | 2fb5f66d8a58394b9651c02af562a429b35a1ee7 /contrib/pg_upgrade/check.c | |
| parent | 1da2a610d7e791e93fcf835855badaeb11196bdd (diff) | |
Use correct path separator for Windows builtin commands.
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.
Diffstat (limited to 'contrib/pg_upgrade/check.c')
| -rw-r--r-- | contrib/pg_upgrade/check.c | 47 |
1 files changed, 40 insertions, 7 deletions
diff --git a/contrib/pg_upgrade/check.c b/contrib/pg_upgrade/check.c index d5d6bedb68e..453b0078996 100644 --- a/contrib/pg_upgrade/check.c +++ b/contrib/pg_upgrade/check.c @@ -19,6 +19,35 @@ static void check_for_isn_and_int8_passing_mismatch(migratorContext *ctx, static void check_for_reg_data_type_usage(migratorContext *ctx, Cluster whichCluster); +/* + * 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(migratorContext *ctx, bool *live_check) { @@ -402,7 +431,7 @@ create_script_for_old_cluster_deletion(migratorContext *ctx, #endif /* delete old cluster's default tablespace */ - fprintf(script, RMDIR_CMD " %s\n", ctx->old.pgdata); + fprintf(script, RMDIR_CMD " %s\n", fix_path_separator(ctx->old.pgdata)); /* delete old cluster's alternate tablespaces */ for (tblnum = 0; tblnum < ctx->num_tablespaces; tblnum++) @@ -419,14 +448,17 @@ create_script_for_old_cluster_deletion(migratorContext *ctx, fprintf(script, "\n"); /* remove PG_VERSION? */ if (GET_MAJOR_VERSION(ctx->old.major_version) <= 804) - fprintf(script, RM_CMD " %s%s/PG_VERSION\n", - ctx->tablespaces[tblnum], ctx->old.tablespace_suffix); + fprintf(script, RM_CMD " %s%s%cPG_VERSION\n", + fix_path_separator(ctx->tablespaces[tblnum]), + fix_path_separator(ctx->old.tablespace_suffix), + PATH_SEPARATOR); for (dbnum = 0; dbnum < ctx->new.dbarr.ndbs; dbnum++) { - fprintf(script, RMDIR_CMD " %s%s/%d\n", - ctx->tablespaces[tblnum], ctx->old.tablespace_suffix, - ctx->old.dbarr.dbs[dbnum].db_oid); + fprintf(script, RMDIR_CMD " %s%s%c%d\n", + fix_path_separator(ctx->tablespaces[tblnum]), + fix_path_separator(ctx->old.tablespace_suffix), + PATH_SEPARATOR, ctx->old.dbarr.dbs[dbnum].db_oid); } } else @@ -436,7 +468,8 @@ create_script_for_old_cluster_deletion(migratorContext *ctx, * or a version-specific subdirectory. */ fprintf(script, RMDIR_CMD " %s%s\n", - ctx->tablespaces[tblnum], ctx->old.tablespace_suffix); + fix_path_separator(ctx->tablespaces[tblnum]), + fix_path_separator(ctx->old.tablespace_suffix)); } fclose(script); |
