mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-27 08:39:28 +08:00
Fix psql's COPY support to deal with \r\n line endings.
Andrew Dunstan, some further hacking by Tom Lane.
This commit is contained in:
parent
2193121fa9
commit
b681bf9323
@ -3,7 +3,7 @@
|
||||
*
|
||||
* Copyright (c) 2000-2003, PostgreSQL Global Development Group
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.51 2004/08/13 14:47:23 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.52 2004/08/13 22:59:29 tgl Exp $
|
||||
*/
|
||||
#include "postgres_fe.h"
|
||||
#include "copy.h"
|
||||
@ -663,6 +663,7 @@ handleCopyIn(PGconn *conn, FILE *copystream)
|
||||
bool copydone = false;
|
||||
bool firstload;
|
||||
bool linedone;
|
||||
bool saw_cr = false;
|
||||
char copybuf[COPYBUFSIZ];
|
||||
char *s;
|
||||
int bufleft;
|
||||
@ -695,30 +696,49 @@ handleCopyIn(PGconn *conn, FILE *copystream)
|
||||
|
||||
while (!linedone)
|
||||
{ /* for each bufferload in line ... */
|
||||
/* Fetch string until \n, EOF, or buffer full */
|
||||
s = copybuf;
|
||||
for (bufleft = COPYBUFSIZ - 1; bufleft > 0; bufleft--)
|
||||
{
|
||||
c = getc(copystream);
|
||||
if (c == '\n' || c == EOF)
|
||||
if (c == EOF)
|
||||
{
|
||||
linedone = true;
|
||||
break;
|
||||
}
|
||||
*s++ = c;
|
||||
if (c == '\n')
|
||||
{
|
||||
linedone = true;
|
||||
break;
|
||||
}
|
||||
if (c == '\r')
|
||||
saw_cr = true;
|
||||
}
|
||||
*s = '\0';
|
||||
/* EOF with empty line-so-far? */
|
||||
if (c == EOF && s == copybuf && firstload)
|
||||
{
|
||||
PQputline(conn, "\\.");
|
||||
/*
|
||||
* We are guessing a little bit as to the right line-ending
|
||||
* here...
|
||||
*/
|
||||
if (saw_cr)
|
||||
PQputline(conn, "\\.\r\n");
|
||||
else
|
||||
PQputline(conn, "\\.\n");
|
||||
copydone = true;
|
||||
if (pset.cur_cmd_interactive)
|
||||
puts("\\.");
|
||||
break;
|
||||
}
|
||||
/* No, so pass the data to the backend */
|
||||
PQputline(conn, copybuf);
|
||||
/* Check for line consisting only of \. */
|
||||
if (firstload)
|
||||
{
|
||||
if (!strcmp(copybuf, "\\."))
|
||||
if (strcmp(copybuf, "\\.\n") == 0 ||
|
||||
strcmp(copybuf, "\\.\r\n") == 0)
|
||||
{
|
||||
copydone = true;
|
||||
break;
|
||||
@ -726,7 +746,6 @@ handleCopyIn(PGconn *conn, FILE *copystream)
|
||||
firstload = false;
|
||||
}
|
||||
}
|
||||
PQputline(conn, "\n");
|
||||
linecount++;
|
||||
}
|
||||
ret = !PQendcopy(conn);
|
||||
|
Loading…
Reference in New Issue
Block a user