The attached patch enables psql to copy binary data in and out.

Regards,
Andreas
Index: src/bin/psql/copy.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/bin/psql/copy.c,v
retrieving revision 1.60
diff -u -r1.60 copy.c
--- src/bin/psql/copy.c 5 Mar 2006 15:58:51 -0000       1.60
+++ src/bin/psql/copy.c 25 May 2006 15:17:58 -0000
@@ -284,9 +284,10 @@
 
                        fetch_next = true;
 
-                       /* someday allow BINARY here */
                        if (pg_strcasecmp(token, "oids") == 0)
                                result->oids = true;
+                       else if (pg_strcasecmp(token, "binary") == 0)
+                               result->binary = true;
                        else if (pg_strcasecmp(token, "csv") == 0)
                                result->csv_mode = true;
                        else if (pg_strcasecmp(token, "header") == 0)
@@ -442,8 +443,6 @@
        initPQExpBuffer(&query);
 
        printfPQExpBuffer(&query, "COPY ");
-       if (options->binary)
-               appendPQExpBuffer(&query, "BINARY ");
 
        appendPQExpBuffer(&query, "%s ", options->table);
 
@@ -480,6 +479,9 @@
                        appendPQExpBuffer(&query, " WITH NULL AS '%s'", 
options->null);
        }
 
+       if (options->binary)
+               appendPQExpBuffer(&query, " BINARY");
+
        if (options->csv_mode)
                appendPQExpBuffer(&query, " CSV");
 
@@ -622,7 +624,7 @@
 
                if (buf)
                {
-                       fputs(buf, copystream);
+                       fwrite(buf, 1, ret, copystream);
                        PQfreemem(buf);
                }
        }
@@ -686,6 +688,21 @@
        else
                prompt = NULL;
 
+       if (!prompt)
+       {
+           int buflen;
+
+               while ((buflen = fread(buf, 1, COPYBUFSIZ, copystream)) > 0)
+               {
+                       if (PQputCopyData(conn, buf, buflen) <= 0)
+                       {
+                               OK = false;
+                               copydone = true;
+                               break;
+                       }
+               }
+       }
+       else
        while (!copydone)
        {                                                       /* for each 
input line ... */
                if (prompt)
---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
       subscribe-nomail command to [EMAIL PROTECTED] so that your
       message can get through to the mailing list cleanly

Reply via email to