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

31.9. 와 관련된 기능copy토토 캔

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

전체 프로세스는 응용 프로그램이 먼저 발행한다는 것입니다. SQLcopyPQEXEC또는 동등한 함수 중 하나. 그만큼 이것에 대한 응답 (토토 캔에 오류가없는 경우)은 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. 만약에errormsgisNULL그런 다음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다시.) 언제asyncis false (Zero),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 문자 길이, 치료가 필요합니다 그것이 인식하기 위해\.올바르게 선 (예를 들어, 오해하지는 않습니다 터미네이터 라인에 대한 긴 데이터 라인의 끝).

pqgetLineAnync

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

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

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

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

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

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

pqputline

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

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

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

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

PQPUTNBYTES

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

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

이것은 똑같습니다pqputline30030_30221

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. 이것은 만 올바르게 작동합니다.COPY유일한SQL토토 캔의 토토 캔 끈.