Add make_native_path() because Win32 COPY is an internal CMD.EXE command
authorBruce Momjian <bruce@momjian.us>
Thu, 12 Aug 2004 18:32:52 +0000 (18:32 +0000)
committerBruce Momjian <bruce@momjian.us>
Thu, 12 Aug 2004 18:32:52 +0000 (18:32 +0000)
and doesn't process forward slashes in the same way as external
commands.  Quoting the first argument to COPY does not convert forward
to backward slashes, but COPY does properly process quoted forward
slashes in the second argument.

Win32 COPY works with quoted forward slashes in the first argument only if the
current directory is the same as the directory of the first argument.

src/backend/access/transam/xlog.c
src/backend/utils/misc/postgresql.conf.sample
src/include/port.h
src/port/path.c

index 32ade5d7590f31b66716542d59888337c8ca7709..3c23f0fc292fcdb9fd750c8294b374292cf858f4 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.159 2004/08/11 04:07:15 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.160 2004/08/12 18:32:25 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1962,17 +1962,20 @@ RestoreArchivedFile(char *path, const char *xlogfname,
                    /* %p: full path of target file */
                    sp++;
                    StrNCpy(dp, xlogpath, endp-dp);
-#ifndef WIN32
+                   /*
+                    *  make_native_path() is required because COPY is an internal
+                    *  CMD.EXE command and doesn't process forward slashes in the
+                    *  same way as external commands.  Quoting the first argument
+                    *  to COPY does not convert forward to backward slashes, but
+                    *  COPY does properly process quoted forward slashes in the
+                    *  second argument.
+                    *
+                    *  COPY works with quoted forward slashes in the first argument
+                    *  only if the current directory is the same as the directory
+                    *  of the first argument.
+                    */
+                   make_native_path(dp);
                    dp += strlen(dp);
-#else
-                   /* On Windows, change / to \ in the substituted path */
-                   while (*dp)
-                   {
-                       if (*dp == '/')
-                           *dp = '\\';
-                       dp++;
-                   }
-#endif
                    break;
                case 'f':
                    /* %f: filename of desired file */
index 09ccdb2fb82972f7ea249a90962aec456ddcaeb7..28463c6ae9b4990bf320e39b6e85ffde767c1b5b 100644 (file)
 # - Archiving -
 
 #archive_command = ''      # command to use to archive a logfile segment
-
+#
 # If archive_command is '' then archiving is disabled.  Otherwise, set it
-# to a command to copy a file to the proper place.  A simplistic example
-# is 'cp %p /mnt/server/archivedir/%f'.  Any %p in the string is replaced
-# by the absolute path of the file to archive, while any %f is replaced by
-# the file name only.  NOTE: it is important for the command to return
-# zero exit status if and only if it succeeded.
+# to a command to copy a file to the proper place.  Any %p in the string 
+# is replaced by the absolute path of the file to archive, while any %f is 
+# replaced by the file name only.  NOTE: it is important for the command to 
+# return zero exit status only if it succeeds.
+#
+# Examples:
+#  archive_command = 'cp "%p" /mnt/server/archivedir/"%f"'
+#  archive_command = 'copy "%p" /mnt/server/archivedir/"%f"'  # Win32
+
 
 #---------------------------------------------------------------------------
 # QUERY TUNING
index 013243cc279d157708278a1cb6363a6db3725183..2091b8ec3499f61a6c6f442f336e53535b820c40 100644 (file)
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/port.h,v 1.51 2004/08/09 02:12:51 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/port.h,v 1.52 2004/08/12 18:32:43 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -39,6 +39,7 @@ extern char *last_dir_separator(const char *filename);
 extern char *first_path_separator(const char *filename);
 
 extern void canonicalize_path(char *path);
+extern void make_native_path(char *path);
 extern const char *get_progname(const char *argv0);
 extern void get_share_path(const char *my_exec_path, char *ret_path);
 extern void get_etc_path(const char *my_exec_path, char *ret_path);
index 040c8a6eb721cec3104ea57d34f1c0cd26d9b18b..2a7428d0ba64ee349f94f33d3ca6878af23ec328 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/port/path.c,v 1.27 2004/08/09 20:20:46 tgl Exp $
+ *   $PostgreSQL: pgsql/src/port/path.c,v 1.28 2004/08/12 18:32:52 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -87,6 +87,23 @@ last_dir_separator(const char *filename)
 }
 
 
+/*
+ * make_native_path
+ * On WIN32, change / to \ in the path.
+ */
+void
+make_native_path(char *filename)
+{
+#ifdef WIN32
+   char *p;
+   
+   for (p = filename; *p; p++)
+       if (*p == '/')
+           *p = '\\';
+#endif
+}
+
+
 /*
  * Make all paths look like Unix
  */