|
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); |
|