이 문서는 지원되지 않는 버전의 PostgreSQL 용입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 32.10. 토토 캔 결과 토토 캔 결과과 토토 캔 결과 토토 캔 결과버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

31.9. 와 토토 캔 기능copy명령

thecopy명령PostgreSQL읽거나 쓸 수있는 옵션이 있습니다 에 사용 된 네트워크 연결에libpq. 이것에 설명 된 기능 섹션에서는 응용 프로그램 이이 기능을 활용할 수 있도록합니다 복사 된 토토 캔를 공급하거나 소비함으로써.

전체 프로세스는 응용 프로그램이 먼저 발행한다는 것입니다. SQLcopy명령을 통해PQEXEC또는 동등한 함수 중 하나. 그만큼 이것에 대한 응답 (명령에 오류가없는 경우)은 A입니다.pgresult상태 코드를 갖는 객체 의pgres_copy_out또는pgres_copy_in(지정된 사본에 따라 방향). 그런 다음 응용 프로그램은 이것의 함수를 사용해야합니다 토토 캔 행을 수신하거나 전송할 섹션. 토토 캔 전송시 완료, 또 다른pgresult개체 이체의 성공 또는 실패를 나타 내기 위해 반환됩니다. 그것은 상태는pgres_command_ok성공 또는pgres_fatal_error일부 경우 문제가 발생했습니다. 이 시점에서 추가 SQL 명령은 할 수 있습니다 를 통해 발행됩니다.PQEXEC. (그렇지 않습니다 동일한 연결을 사용하여 다른 SQL 명령을 실행할 수 있습니다. 동안COPY작동 중입니다 진전.)

if aCOPY명령은를 통해 발행됩니다.PQEXEC할 수있는 문자열로 추가 명령이 포함되어 있으므로 응용 프로그램은 계속되어야합니다 를 통해 결과 가져 오기pqgetresult완료 후COPY시퀀스. 오직 언제pqgetresult반환NULL확실합니까PQEXEC명령 문자열이 완료되었으며 안전합니다 더 많은 명령을 발행합니다.

이 섹션의 기능은 다음에 만 실행해야합니다. 결과 상태 얻기pgres_copy_out또는pgres_copy_inFromPQEXEC또는pqgetresult.

apgresult객체 중 하나를 갖고 있습니다 이러한 상태 값은COPY시작중인 작동. 이것 추가 데이터는 사용되는 기능을 사용하여 사용할 수 있습니다. 쿼리 결과와 토토 캔하여 :

pqnfields

복사 할 열 (필드) 수를 반환합니다.

pqbinaryTuples

0 전체 사본 형식이 텍스트 (행)임을 나타냅니다 Newlines로 분리 된 열은 분리기로 분리됩니다 캐릭터 등). 1은 전체 사본 형식을 나타냅니다 이진. 보다PostgreSQL : 문서 : 9.2 : 토토 커뮤니티더 많은 것 정보.

pqfformat

형식 코드를 반환합니다 (텍스트의 경우 0, 이진의 경우 1) 사본 조작의 각 열과 관련이 있습니다. 그만큼 컬럼 당 형식 코드는 항상 0이됩니다 전체 복사 형식은 텍스트이지만 이진 형식은 텍스트와 이진 열 모두를 지원합니다. (그러나, 현재 구현copy, 바이너리 컬럼 만 이진 사본에 나타납니다. 그래서 컬럼 당 형식은 항상 전체 형식과 일치합니다 현재의.)

참고 :이러한 추가 토토 캔 값은 전용입니다 프로토콜 3.0을 사용할 때 사용할 수 있습니다. 프로토콜 2.0을 사용할 때 이 모든 기능은 0을 반환합니다.

31.9.1. 전송 기능COPY토토 캔

이 기능은 동안 토토 캔를 보내는 데 사용됩니다.stdin에서 복사. 언제 전화하면 그들은 실패 할 것입니다 연결이 없습니다copy_inState.

pqputcopydata

기간 동안 서버로 토토 캔를 보냅니다copy_inState.

int pqputcopydata (pgconn *conn,
                  const char *버퍼,
                  int nbytes);

전송COPY토토 캔 지정된버퍼, OF 길이nbytes, 서버. 결과는 토토 캔를 전송 한 경우 1입니다. 시도가 차단 될 것이기 때문에 전송됩니다 (이 경우는 연결이 비 차단 모드에있는 경우 가능), 또는 -1 오류가 발생한 경우. (사용PQERRORMESSAGE세부 정보를 검색하려면 반환 값은 -1입니다. 값이 0이면 기다리십시오 글을 쓰고 다시 시도하십시오.)

응용 프로그램은를 나눌 수 있습니다.COPY토토 캔 스트림이 버퍼로드로 스트림 편리한 크기. 버퍼로드 경계는 의미 론적이 없습니다 보낼 때의 중요성. 토토 캔의 내용 스트림은에서 기대하는 토토 캔 형식과 일치해야합니다.COPY명령; 보다COPY자세한 내용.

PQPUTCOPYEND

기간 동안 서버에 토토 캔 종료 표시를 보냅니다copy_inState.

int pqputcopyend (pgconn *conn,
                 const char *errormsg);

종료copy_in작동 성공적으로errormsgisNULL. 만약에errormsgNULL그런 다음copy| 줄을 가리키면서errormsg오류로 사용됩니다 메시지. (이 정확한 오류를 가정해서는 안됩니다 그러나 메시지는 서버에서 돌아올 것입니다. 서버가 이미 실패했을 수도 있습니다COPY자체 이유로. 또한 주목하십시오 사용시 강제 실패 옵션은 작동하지 않습니다. 3.0 pre-protocol 연결.)

종료 토토 캔가 전송 된 경우 결과는 1입니다. 시도가 차단 될 것이기 때문에 보내지 않은 경우 연결이 차단되지 않은 경우에만 사례가 가능합니다. 오류가 발생한 경우 모드), 또는 -1. (사용PQERRORMESSAGE세부 정보를 검색하려면 반환 값은 -1입니다. 값이 0이면 기다리십시오 글을 쓰고 다시 시도하십시오.)

성공적으로 전화 한 후pqputcopyend, Callpqgetresult최종 결과를 얻으려면 상태의 상태COPY명령. 하나 이 결과가 평소에서 사용할 수있을 때까지 기다릴 수 있습니다. 방법. 그런 다음 정상 작동으로 돌아갑니다.

31.9.2. 수신 기능copy토토 캔

이 기능은 동안 토토 캔를 수신하는 데 사용됩니다.stdout에 복사. 언제 전화하면 그들은 실패 할 것입니다 연결이 없습니다Copy_outState.

pqgetCopyData

기간 동안 서버로부터 토토 캔 수신Copy_outState.

int pqgetcopydata (pgconn *conn,
                  char ** 버퍼,
                  int async);

서버에서 다른 행의 토토 캔 행을 얻으려고합니다. 동안COPY. 토토 캔는 항상입니다 한 번에 하나의 토토 캔 행을 반환했습니다. 부분 행만 인 경우 사용 가능하면 반환되지 않습니다. a의 성공적인 반환 토토 캔 행에는 유지할 메모리 청크를 할당하는 것이 포함됩니다. 토토 캔. 그만큼버퍼매개 변수 비이어야합니다NULL. *버퍼는 할당 된 것을 가리 키도록 설정되었습니다 기억 또는null어디에서 버퍼가 반환되지 않습니다. 비NULL결과 버퍼를 사용하여 해제해야PQFREEMEM더 이상 필요하지 않은 경우.

행이 성공적으로 반환되면 반환 값 행의 토토 캔 바이트 수입니다 (이것은 항상 0보다 큽니다). 반환 된 문자열은 항상입니다 무효가 종결되었지만 이것은 아마도 유용 할 것입니다 텍스트COPY. 0의 결과 를 나타냅니다.COPY아직도 있습니다 진행 중이지만 아직 사용 가능한 행이 없습니다 (이것은 가능 가능async참). -1의 결과는임을 나타냅니다.COPY완료되었습니다. -2의 결과가 나타납니다 오류가 발생했다 (ConsultPQERRORMESSAGE이유가 있습니다).

언제asynctrue (아님 영),pqgetCopyData의지 입력 대기를 차단하지 않습니다. 이면 0을 반환합니다.COPY아직 진행 중이지만 아니요 완전한 행을 사용할 수 있습니다. (이 경우 기다립니다 읽기 준비 후 전화pqconsumeInput호출 전pqgetCopyData다시.) 언제async거짓 (0),pqgetCopyData블록 토토 캔를 사용할 수 있거나 작업이 완료 될 때까지

이후PQGETCOPYDATAreturns -1, callpqgetresult최종 결과를 얻으려면 상태의 상태COPY명령. 하나 이 결과가 평소에서 사용할 수있을 때까지 기다릴 수 있습니다. 방법. 그런 다음 정상 작동으로 돌아갑니다.

31.9.3. 에 대한 쓸모없는 기능COPY

이러한 기능은 오래된 취급 방법을 나타냅니다COPY. 그들은 여전히 ​​일하지만 그들은 잘못된 오류 처리, 불편한 방법으로 인해 더 이상 사용되지 않습니다 토토 캔 종료 감지 및 이진에 대한 지원 부족 또는 비 차단 전송.

pqgetline

새로운 문자 라인을 읽습니다 (서버에 의해 전송) 크기의 버퍼 문자열로길이.

int pqgetline (pgconn *conn,
              char *버퍼,
              int 길이);

이 함수는까지 복사합니다.길이-1 문자 버퍼에 종단 Newline을 제로 바이트로 변환합니다.pqgetline반환eof입력 끝에서 0 인 경우 0 전체 라인을 읽고 버퍼가 가득 찬 경우 1 그러나 종료 Newline은 아직 읽지 않았습니다.

신청서가 새로운 지 확인해야합니다. 라인은 두 문자로 구성됩니다\.는 서버에 가지고 있음을 나타냅니다 의 결과 보내기 완료COPY명령. 응용 프로그램이 가능하다면 이상의 줄을받습니다.길이-1 문자 길이, 관리가 필요합니다 그것이 인식하기 위해\.올바르게 선 (예를 들어 오해하지는 않습니다 터미네이터 라인에 대한 긴 토토 캔 라인의 끝).

행을 읽는다COPY토토 캔 (서버에 의해 전송) 버퍼없이 블로킹.

int pqgetLineAneCync (pgconn *conn,
                   char *버퍼,
                   int bufsize);

이 기능은와 유사합니다.pqgetline이지만 사용할 수 있습니다 읽어야하는 응용 프로그램COPY토토 캔 비동기식, 즉 차단하지 않고. 가요 발행COPY명령 및 apgres_copy_out응답, 신청서가 호출해야합니다pqconsumeInputandpqgetLineAnync토토 캔 종료까지 신호가 감지됩니다.

와 달리pqgetline,이 함수는 감지에 책임이 있습니다 토토 캔 끝.

각 호출에서a 완전한 토토 캔 행을 사용할 수 있습니다libpq의 입력 버퍼. 그렇지 않으면 아니요 나머지 행이 도착할 때까지 토토 캔가 반환됩니다. 그만큼 코피 종료 토토 캔 마커가있는 경우 함수는 -1을 반환합니다 토토 캔를 사용할 수없는 경우 인식되었거나 0 토토 캔의 바이트 수를 제공하는 양수 반환. -1이 반환되면 발신자는 다음 호출PQENDCOPY다음으로 돌아갑니다 정상 처리에.

반환 된 토토 캔는 토토 캔 행을 넘어 확장되지 않습니다 경계. 가능하면 전체 행이 하나로 반환됩니다. 시간. 그러나 발신자가 제공하는 버퍼가 서버에서 보낸 행을 보유하기 위해 작은 토토 캔 행이 반환됩니다. 텍스트 토토 캔를 사용하면 다음과 같습니다 마지막으로 반환 된 바이트가를 테스트하여 감지\ n(이진에서COPY, 실제 구문 분석COPY토토 캔 형식이 필요합니다 동등한 결정을 내립니다.) 반환 문자열은 무효가 끝나지 않습니다. (추가하려면 a 널 종료, 확실히 A를 통과하십시오.bufsize방보다 작은 하나 실제로 사용할 수 있습니다.)

pqputline

서버에 null 종결 문자열을 보냅니다. 보고 0 인 경우eof보낼 수없는 경우 문자열.

int pqputline (pgconn *conn,
              const char *string);

thecopy토토 캔 스트림이 전송합니다 일련의 전화pqputline와 동일한 형식이 있습니다 반품pqgetlineAnync, 신청서는 정확히 전송해야 할 의무가 없습니다 당 하나의 토토 캔 행pqputline전화; 부분 줄 또는 여러 줄을 보내는 것은 괜찮습니다. 전화 당.

참고 :PostgreSQL프로토콜 3.0 신청서가 명시 적으로 보내는 데 필요합니다 두 문자\.최종 서버에 완료되었음을 나타내는 줄 배상COPY토토 캔. 하는 동안 이것은 여전히 ​​작동하며 감가 상각되고 특별합니다 의 의미\.할 수 있습니다 향후 릴리스에서 제거 될 것으로 예상됩니다. 그것은 전화하기에 충분PQENDCOPY후 실제 토토 캔.

PQPUTNBYTES

서버로 널없는 문자열을 보냅니다. OK이고 0을 반환합니다.eof불가능한 경우 문자열을 보내려면.

int pqputnbytes (pgconn *conn,
                const char *버퍼,
                int nbytes);

이것은 똑같습니다pqputline29911_30102

pqendcopy

서버와 동기화됩니다.

int pqendcopy (pgconn *conn);

이 함수는 서버가 완료 될 때까지 기다립니다 사자. 마지막 문자열이있을 때 발행해야합니다 를 사용하여 서버로 전송되었습니다.pqputline또는 마지막 문자열이있는 경우 를 사용하여 서버로부터 접수되었습니다.pggetline. 발행해야합니다 서버가 얻을 수 있습니다"out in sync"클라이언트와. 이 기능에서 돌아 왔을 때 서버는 다음 SQL 명령을받을 준비가되었습니다. 그만큼 성공적인 완료시, 0이 아닌 반환 값은 0입니다 그렇지 않으면. (사용PQERRORMESSAGE세부 정보를 검색하려면 반환 값은 0이 아닙니다.)

사용시pqgetresult, 응용 프로그램은 A에 응답해야합니다.pgres_copy_out실행하여 결과pqgetline반복적으로, 뒤 이어PQENDCOPY터미네이터 라인이 표시됩니다. 그런 다음로 돌아 가야합니다.pqgetresult루프까지pqgetresultNULL을 반환합니다 바늘. 마찬가지로 Apgres_copy_in결과는 a 일련의pqputline전화 뒤 이어PQENDCOPY로 돌아 가기pqgetresult루프. 이 계약은 A를 보장합니다.COPY일련의 명령SQL명령이 있습니다 올바르게 실행.

구식 응용 프로그램이 A를 제출할 가능성이 높습니다.COPYviaPQEXEC그리고 거래를 가정합니다 이후에 완료되었습니다.PQENDCOPY. 이것은 만 올바르게 작동합니다.32529_32535유일한SQL명령의 명령 끈.