aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/copy.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-05-08 18:16:37 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-05-08 18:16:37 +0000
commitc0a8c3ac13f84602a46ba25b9a2fd5427514f61a (patch)
treef321719251471a05a768117f35010d28076f938a /src/backend/commands/copy.c
parent5e7a5c9511b65d483639dd3f7dfab7b9e92c3433 (diff)
downloadpostgresql-c0a8c3ac13f84602a46ba25b9a2fd5427514f61a.tar.gz
postgresql-c0a8c3ac13f84602a46ba25b9a2fd5427514f61a.zip
Update 3.0 protocol support to match recent agreements about how to
handle multiple 'formats' for data I/O. Restructure CommandDest and DestReceiver stuff one more time (it's finally starting to look a bit clean though). Code now matches latest 3.0 protocol document as far as message formats go --- but there is no support for binary I/O yet.
Diffstat (limited to 'src/backend/commands/copy.c')
-rw-r--r--src/backend/commands/copy.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index ec6e771aedc..93d4b8406e8 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.197 2003/04/25 02:28:22 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.198 2003/05/08 18:16:36 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -125,8 +125,8 @@ static int server_encoding;
/*
* Internal communications functions
*/
-static void SendCopyBegin(bool binary);
-static void ReceiveCopyBegin(bool binary);
+static void SendCopyBegin(bool binary, int natts);
+static void ReceiveCopyBegin(bool binary, int natts);
static void SendCopyEnd(bool binary);
static void CopySendData(void *databuf, int datasize);
static void CopySendString(const char *str);
@@ -143,15 +143,20 @@ static void CopyDonePeek(int c, bool pickup);
* in past protocol redesigns.
*/
static void
-SendCopyBegin(bool binary)
+SendCopyBegin(bool binary, int natts)
{
if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3)
{
/* new way */
StringInfoData buf;
+ int16 format = (binary ? 1 : 0);
+ int i;
pq_beginmessage(&buf, 'H');
- pq_sendbyte(&buf, binary ? 1 : 0);
+ pq_sendbyte(&buf, format); /* overall format */
+ pq_sendint(&buf, natts, 2);
+ for (i = 0; i < natts; i++)
+ pq_sendint(&buf, format, 2); /* per-column formats */
pq_endmessage(&buf);
copy_dest = COPY_NEW_FE;
copy_msgbuf = makeStringInfo();
@@ -179,15 +184,20 @@ SendCopyBegin(bool binary)
}
static void
-ReceiveCopyBegin(bool binary)
+ReceiveCopyBegin(bool binary, int natts)
{
if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3)
{
/* new way */
StringInfoData buf;
+ int16 format = (binary ? 1 : 0);
+ int i;
pq_beginmessage(&buf, 'G');
- pq_sendbyte(&buf, binary ? 1 : 0);
+ pq_sendbyte(&buf, format); /* overall format */
+ pq_sendint(&buf, natts, 2);
+ for (i = 0; i < natts; i++)
+ pq_sendint(&buf, format, 2); /* per-column formats */
pq_endmessage(&buf);
copy_dest = COPY_NEW_FE;
copy_msgbuf = makeStringInfo();
@@ -682,7 +692,7 @@ DoCopy(const CopyStmt *stmt)
if (pipe)
{
if (IsUnderPostmaster)
- ReceiveCopyBegin(binary);
+ ReceiveCopyBegin(binary, length(attnumlist));
else
copy_file = stdin;
}
@@ -724,7 +734,7 @@ DoCopy(const CopyStmt *stmt)
if (pipe)
{
if (IsUnderPostmaster)
- SendCopyBegin(binary);
+ SendCopyBegin(binary, length(attnumlist));
else
copy_file = stdout;
}