34.10. 와 젠 토토 함수복사명령

복사명령어포스트그레SQL다음에서 사용하는 네트워크 연결에서 읽거나 쓸 수 있는 옵션이 있습니다.libpq. 이 섹션에 설명된 기능을 통해 애플리케이션은 복사된 젠 토토를 제공하거나 소비함으로써 이 기능을 활용할 수 있습니다.

전체 프로세스는 애플리케이션이 먼저 SQL을 발행하는 것입니다.복사명령을 통해PQexec또는 이에 상응하는 함수 중 하나. 이에 대한 응답(명령에 오류가 없는 경우)은 다음과 같습니다.PGresult상태 코드를 포함하는 개체PGRES_COPY_OUT또는PGRES_COPY_IN(지정된 복사 방향에 따라). 그런 다음 애플리케이션은 이 섹션의 기능을 사용하여 젠 토토 행을 수신하거나 전송해야 합니다. 젠 토토 전송이 완료되면 또 다른PGresult객체가 반환되어 전송의 성공 또는 실패를 나타냅니다. 상태는 다음과 같습니다.PGRES_COMMAND_OK성공을 위해 또는PGRES_FATAL_ERROR어떤 문제가 발생한 경우. 이 시점에서 다음을 통해 추가 SQL 명령을 실행할 수 있습니다.PQexec. (동일한 연결을 사용하여 다른 SQL 명령을 실행할 수 없습니다.복사작업이 진행 중입니다.)

만약에복사명령은 다음을 통해 발행됩니다.PQexec추가 명령을 포함할 수 있는 문자열에서 애플리케이션은 다음을 통해 결과를 계속 가져와야 합니다.PQgetResult완료 후복사시퀀스. 경우에만PQgetResult반환NULL다음이 확실한가요?PQexec명령 문자열이 완료되었으며 더 많은 명령을 실행해도 안전합니다.

이 섹션의 기능은 결과 상태를 얻은 후에만 실행되어야 합니다.PGRES_COPY_OUT또는PGRES_COPY_INfromPQexec또는PQgetResult.

A PGresult이러한 상태 값 중 하나를 포함하는 객체는 다음에 대한 추가 젠 토토를 전달합니다.복사작업을 시작하는 중입니다. 이 추가 젠 토토는 쿼리 결과와 관련하여 사용되는 함수를 통해 사용할 수 있습니다.

PQn필드

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

PQbinaryTuples

0은 전체 복사 형식이 텍스트임을 나타냅니다(줄바꿈으로 구분된 행, 구분 문자로 구분된 열 등). 1은 전체 복사 형식이 이진임을 나타냅니다. 참조복사더 많은 정보를 원하시면.

PQfformat

복사 작업의 각 열과 관련된 형식 코드(텍스트의 경우 0, 바이너리의 경우 1)를 반환합니다. 전체 복사 형식이 텍스트인 경우 열별 형식 코드는 항상 0이지만 이진 형식은 텍스트 열과 이진 열을 모두 지원할 수 있습니다. (그러나 현재 구현 기준으로복사, 이진 열만 이진 복사본에 나타납니다. 따라서 열별 형식은 항상 현재 전체 형식과 일치합니다.)

34.10.1. 전송 기능복사젠 토토

이 기능은 다음 중에 젠 토토를 보내는 데 사용됩니다.STDIN에서 복사. 연결이 되지 않은 상태에서 호출하면 실패합니다.COPY_IN상태.

PQputCopyData

동안 서버에 젠 토토를 보냅니다.COPY_IN상태.

int PQputCopyData(PGconn *conn,
                  const char *버퍼,
                  int nbytes);

다음을 전송합니다복사지정된 젠 토토버퍼, 길이n바이트, 서버에. 결과는 젠 토토가 대기열에 있으면 1이고, 버퍼가 가득 차서 대기열에 있지 않으면 0(이는 비차단 모드에서만 발생함), 오류가 발생한 경우 -1입니다. (사용PQerrorMessage반환 값이 -1인 경우 세부 정보를 검색합니다. 값이 0이면 쓰기 준비가 될 때까지 기다렸다가 다시 시도하세요.)

The application can divide the복사젠 토토는 편리한 크기의 버퍼 로드로 스트리밍됩니다. 버퍼 로드 경계는 전송할 때 의미론적으로 중요하지 않습니다. 젠 토토 스트림의 내용은 다음에서 예상되는 젠 토토 형식과 일치해야 합니다.복사명령; 참조복사for details.

PQputCopyEnd

동안 서버에 젠 토토 종료 표시를 보냅니다.COPY_IN상태.

int PQputCopyEnd(PGconn *conn,
                 const char *errormsg);

종료COPY_IN작업이 성공적으로 이루어진 경우errormsgisNULL. 만일errormsg아님NULL그러면복사다음이 가리키는 문자열로 인해 강제로 실패합니다.errormsgused as the error message. (그러나 이 정확한 오류 메시지가 서버에서 다시 나타날 것이라고 가정해서는 안 됩니다. 서버가 이미 실패했을 수도 있기 때문입니다.복사그 나름의 이유 때문입니다.)

종료 메시지가 전송된 경우 결과는 1입니다. 또는 비차단 모드에서는 종료 메시지가 성공적으로 대기열에 추가되었음을 나타낼 수 있습니다. (비차단 모드에서는 젠 토토가 전송되었는지 확인하기 위해 다음 쓰기 준비 및 호출을 기다려야 합니다.PQflush, 0을 반환할 때까지 반복.) 0은 버퍼가 가득 차서 함수가 종료 메시지를 대기열에 추가할 수 없음을 나타냅니다. 이는 비차단 모드에서만 발생합니다. (이 경우 쓰기 준비가 완료될 때까지 기다린 후 다음을 시도하세요.PQputCopyEnd다시 호출합니다.) 하드 오류가 발생하면 -1이 반환됩니다. 당신은 사용할 수 있습니다PQerrorMessage세부정보를 검색합니다.

After successfully callingPQputCopyEnd, 전화PQgetResult최종 결과 상태를 얻기 위해복사명령. 이 결과가 일반적인 방법으로 제공될 때까지 기다릴 수 있습니다. 그런 다음 정상 작동으로 돌아갑니다.

34.10.2. 수신 기능복사젠 토토

이 함수는 젠 토토를 수신하는 데 사용됩니다.STDOUT에 복사. 연결이 되지 않은 상태에서 호출하면 실패합니다.COPY_OUT상태.

PQgetCopyData

동안 서버로부터 젠 토토를 수신합니다.COPY_OUT상태.

int PQgetCopyData(PGconn *conn,
                  char **버퍼,
                  int 비동기);

동안 서버에서 다른 젠 토토 행을 얻으려고 시도합니다.복사. 젠 토토는 항상 한 번에 한 젠 토토 행씩 반환됩니다. 부분 행만 사용할 수 있는 경우에는 반환되지 않습니다. 젠 토토 행을 성공적으로 반환하려면 젠 토토를 보관할 메모리 덩어리를 할당해야 합니다.버퍼매개변수는 비-이어야 합니다.NULL. *버퍼할당된 메모리를 가리키거나NULL버퍼가 반환되지 않는 경우. 비-NULL결과 버퍼는 다음을 사용하여 해제되어야 합니다.PQfreemem더 이상 필요하지 않을 때.

행이 성공적으로 반환되면 반환 값은 행의 젠 토토 바이트 수입니다(이 값은 항상 0보다 큽니다). 반환된 문자열은 항상 null로 끝나지만 이는 아마도 텍스트에만 유용할 것입니다.복사. 0의 결과는 다음을 나타냅니다.복사아직 진행 중이지만 아직 사용 가능한 행이 없습니다. (이는 다음 경우에만 가능합니다.비동기사실입니다). -1의 결과는 다음을 나타냅니다.복사완료되었습니다. -2의 결과는 오류가 발생했음을 나타냅니다(참조)PQerrorMessage이유 때문에).

언제비동기참입니다(0이 아님),PQgetCopyData입력 대기를 차단하지 않습니다. 다음과 같은 경우 0을 반환합니다.복사아직 진행 중이지만 전체 행을 사용할 수 없습니다. (이 경우 read-ready를 기다린 후 호출하세요.PQconsumeInput전화하기 전에PQgetCopyData다시.) 언제비동기거짓(영)입니다.PQgetCopyData젠 토토를 사용할 수 있거나 작업이 완료될 때까지 차단됩니다.

이후PQgetCopyData반환 -1, 호출PQgetResult최종 결과 상태를 얻기 위해복사명령. 이 결과가 일반적인 방법으로 제공될 때까지 기다릴 수 있습니다. 그런 다음 정상 작동으로 돌아갑니다.

34.10.3. 다음 용도로 사용되지 않는 함수:복사

이 함수는 이전 처리 방법을 나타냅니다.복사. 여전히 작동하지만 잘못된 오류 처리, 젠 토토 끝을 감지하는 불편한 방법, 바이너리 또는 비차단 전송에 대한 지원 부족으로 인해 더 이상 사용되지 않습니다.

PQgetline

줄바꿈으로 끝나는 문자 라인(서버에 의해 전송됨)을 크기의 버퍼 문자열로 읽습니다.길이.

int PQgetline(PGconn *conn,
              char *버퍼,
              정수 길이);

이 기능은 최대 복사길이-1 문자를 버퍼에 추가하고 종료 줄 바꿈을 0바이트로 변환합니다.PQgetline반환EOF입력 끝에서, 전체 줄을 읽었으면 0이고, 버퍼가 가득 찼지만 종료 줄 바꿈을 아직 읽지 않았다면 1입니다.

애플리케이션은 새 줄이 두 문자로 구성되어 있는지 확인해야 한다는 점에 유의하세요.\., 이는 서버가의 결과 전송을 완료했음을 나타냅니다.복사명령. 애플리케이션이 다음보다 많은 행을 수신할 수 있는 경우길이-1자 길이, 인식할 수 있도록 주의가 필요합니다.\.줄을 올바르게 입력합니다(예를 들어 긴 젠 토토 줄의 끝을 종결자 줄로 착각하지 않습니다).

PQgetlineAsync

행을 읽습니다.복사젠 토토(서버에서 전송됨)를 차단하지 않고 버퍼로 보냅니다.

int PQgetlineAsync(PGconn *conn,
                   char *버퍼,
                   int bufsize);

이 기능은 다음과 유사합니다PQgetline, 그러나 읽어야 하는 애플리케이션에서 사용할 수 있습니다.복사젠 토토를 비동기적으로, 즉 차단하지 않고. 발행한 후복사command and gotten aPGRES_COPY_OUT응답, 애플리케이션이 호출해야 함PQconsumeInput그리고PQgetlineAsync젠 토토 끝 신호가 감지될 때까지.

달리PQgetline, 이 함수는 젠 토토 끝을 감지하는 역할을 합니다.

호출할 때마다PQgetlineAsync전체 젠 토토 행을 사용할 수 있는 경우 젠 토토를 반환합니다.libpq의 입력 버퍼입니다. 그렇지 않으면 행의 나머지 부분이 도착할 때까지 젠 토토가 반환되지 않습니다. 이 함수는 젠 토토 복사 끝 표시가 인식되면 -1을 반환하고, 사용 가능한 젠 토토가 없으면 0을 반환하거나 반환된 젠 토토의 바이트 수를 나타내는 양수를 반환합니다. -1이 반환되면 호출자는 다음 호출을 해야 합니다.PQendcopy, 그런 다음 일반 처리로 돌아갑니다.

반환된 젠 토토는 젠 토토 행 경계를 넘어 확장되지 않습니다. 가능하다면 전체 행이 한 번에 반환됩니다. 그러나 호출자가 제공한 버퍼가 너무 작아서 서버에서 보낸 행을 보유할 수 없는 경우 부분 젠 토토 행이 반환됩니다. 텍스트 젠 토토의 경우 마지막으로 반환된 바이트가 다음과 같은지 테스트하여 이를 감지할 수 있습니다.\n아니요. (바이너리에서복사, 실제 구문 분석복사동등한 결정을 내리려면 젠 토토 형식이 필요합니다.) 반환된 문자열은 null로 끝나지 않습니다. (종료 null을 추가하려면 a를 전달해야 합니다.버프크기실제로 사용 가능한 방보다 하나 더 작습니다.)

PQputline

Null 종료 문자열을 서버로 보냅니다. 정상이면 0을 반환하고EOF문자열을 보낼 수 없는 경우.

int PQputline(PGconn *conn,
              const char *string);

복사다음에 대한 일련의 호출로 전송된 젠 토토 스트림PQputline에 의해 반환된 것과 동일한 형식을 가짐PQgetlineAsync, 단, 애플리케이션은 각 각 정확히 하나의 젠 토토 행을 보낼 의무는 없습니다.PQputline전화; 통화당 부분 회선을 보내거나 여러 회선을 보내도 괜찮습니다.

참고

이전PostgreSQL프로토콜 3.0, 애플리케이션이 두 문자를 명시적으로 보내는 것이 필요했습니다.\.서버에 전송이 완료되었음을 알리는 마지막 줄로복사젠 토토. 이는 여전히 작동하지만 더 이상 사용되지 않으며 다음의 특별한 의미가 있습니다.\.향후 릴리스에서는 제거될 것으로 예상됩니다. 전화하면 충분합니다PQendcopy실제 젠 토토를 보낸 후.

PQputnbytes

널로 끝나지 않는 문자열을 서버로 보냅니다. 정상이면 0을 반환하고EOF문자열을 보낼 수 없는 경우.

int PQputnbytes(PGconn *conn,
                const char *버퍼,
                int nbytes);

이것은 정확히 같습니다PQputline, 전송할 바이트 수가 직접 지정되므로 젠 토토 버퍼를 null로 종료할 필요가 없다는 점은 제외됩니다. 바이너리 젠 토토를 보낼 때 이 절차를 사용하세요.

PQendcopy

서버와 동기화합니다.

int PQendcopy(PGconn *conn);

이 함수는 서버가 복사를 완료할 때까지 기다립니다. 다음을 사용하여 마지막 문자열이 서버로 전송되었을 때 발행되어야 합니다.PQputline또는 다음을 사용하여 서버로부터 마지막 문자열을 수신한 경우PQgetline. 발급되어야 합니다. 그렇지 않으면 서버가 가져옵니다.동기화되지 않음with the client. 이 함수에서 반환되면 서버는 다음 SQL 명령을 받을 준비가 됩니다. 성공적으로 완료되면 반환 값은 0이고, 그렇지 않으면 0이 아닙니다. (사용PQerrorMessage반환 값이 0이 아닌 경우 세부 정보를 검색합니다.)

사용 시PQgetResult, 애플리케이션은 a에 응답해야 합니다.PGRES_COPY_OUT실행에 의한 결과PQgetline반복적으로, 이어서PQendcopy종료 줄이 표시된 후. 그런 다음 다음으로 돌아가야 합니다.PQgetResult다음까지 반복PQgetResult널 포인터를 반환합니다. 마찬가지로PGRES_COPY_IN결과는 일련의에 의해 처리됩니다.PQputline다음 호출PQendcopy, 그런 다음으로 돌아갑니다.PQgetResult루프. 이 합의는 다음을 보장합니다.복사명령어가 일련의에 포함되어 있습니다.SQL명령이 올바르게 실행됩니다.

이전 신청서는 다음을 제출할 가능성이 높습니다.복사경유PQexec다음에 트랜잭션이 완료되었다고 가정합니다.PQendcopy. 이는 다음과 같은 경우에만 올바르게 작동합니다.복사is the onlySQL명령 문자열의 명령.

수정 사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.