|
3 | 3 | *
|
4 | 4 | * Copyright (c) 2000-2003, PostgreSQL Global Development Group
|
5 | 5 | *
|
6 |
| - * $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.51 2004/08/1314:47:23 tgl Exp $ |
| 6 | + * $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.52 2004/08/1322:59:29 tgl Exp $ |
7 | 7 | */
|
8 | 8 | #include"postgres_fe.h"
|
9 | 9 | #include"copy.h"
|
@@ -663,6 +663,7 @@ handleCopyIn(PGconn *conn, FILE *copystream)
|
663 | 663 | boolcopydone= false;
|
664 | 664 | boolfirstload;
|
665 | 665 | boollinedone;
|
| 666 | +boolsaw_cr= false; |
666 | 667 | charcopybuf[COPYBUFSIZ];
|
667 | 668 | char*s;
|
668 | 669 | intbufleft;
|
@@ -695,38 +696,56 @@ handleCopyIn(PGconn *conn, FILE *copystream)
|
695 | 696 |
|
696 | 697 | while (!linedone)
|
697 | 698 | {/* for each bufferload in line ... */
|
| 699 | +/* Fetch string until \n, EOF, or buffer full */ |
698 | 700 | s=copybuf;
|
699 | 701 | for (bufleft=COPYBUFSIZ-1;bufleft>0;bufleft--)
|
700 | 702 | {
|
701 | 703 | c=getc(copystream);
|
702 |
| -if (c=='\n'||c==EOF) |
| 704 | +if (c==EOF) |
703 | 705 | {
|
704 | 706 | linedone= true;
|
705 | 707 | break;
|
706 | 708 | }
|
707 | 709 | *s++=c;
|
| 710 | +if (c=='\n') |
| 711 | +{ |
| 712 | +linedone= true; |
| 713 | +break; |
| 714 | +} |
| 715 | +if (c=='\r') |
| 716 | +saw_cr= true; |
708 | 717 | }
|
709 | 718 | *s='\0';
|
| 719 | +/* EOF with empty line-so-far? */ |
710 | 720 | if (c==EOF&&s==copybuf&&firstload)
|
711 | 721 | {
|
712 |
| -PQputline(conn,"\\."); |
| 722 | +/* |
| 723 | + * We are guessing a little bit as to the right line-ending |
| 724 | + * here... |
| 725 | + */ |
| 726 | +if (saw_cr) |
| 727 | +PQputline(conn,"\\.\r\n"); |
| 728 | +else |
| 729 | +PQputline(conn,"\\.\n"); |
713 | 730 | copydone= true;
|
714 | 731 | if (pset.cur_cmd_interactive)
|
715 | 732 | puts("\\.");
|
716 | 733 | break;
|
717 | 734 | }
|
| 735 | +/* No, so pass the data to the backend */ |
718 | 736 | PQputline(conn,copybuf);
|
| 737 | +/* Check for line consisting only of \. */ |
719 | 738 | if (firstload)
|
720 | 739 | {
|
721 |
| -if (!strcmp(copybuf,"\\.")) |
| 740 | +if (strcmp(copybuf,"\\.\n")==0|| |
| 741 | +strcmp(copybuf,"\\.\r\n")==0) |
722 | 742 | {
|
723 | 743 | copydone= true;
|
724 | 744 | break;
|
725 | 745 | }
|
726 | 746 | firstload= false;
|
727 | 747 | }
|
728 | 748 | }
|
729 |
| -PQputline(conn,"\n"); |
730 | 749 | linecount++;
|
731 | 750 | }
|
732 | 751 | ret= !PQendcopy(conn);
|
|