32.10. 와 토토 핫 함수복사명령#

복사명령어PostgreSQL다음에서 사용하는 네트워크 연결에서 읽거나 쓸 수 있는 옵션이 있습니다.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이지만 이진 형식은 텍스트 열과 이진 열을 모두 지원할 수 있습니다. (그러나 현재 구현 기준으로복사, 이진 열만 이진 복사본에 나타납니다. 따라서 열별 형식은 항상 현재 전체 형식과 일치합니다.)

32.10.1. 전송 토토 핫복사데이터#

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

PQputCopyData #

동안 서버에 데이터를 보냅니다.COPY_IN상태.

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

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

응용 프로그램은 다음을 나눌 수 있습니다.복사데이터는 편리한 크기의 버퍼 로드로 스트리밍됩니다. 버퍼 로드 경계는 전송할 때 의미론적으로 중요하지 않습니다. 데이터 스트림의 내용은 다음에서 예상되는 데이터 형식과 일치해야 합니다.복사명령; 보다복사자세한 내용은.

PQputCopyEnd #

동안 서버에 데이터 종료 표시를 보냅니다.COPY_IN상태.

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

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

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

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

32.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최종 결과 상태를 얻기 위해복사명령. 이 결과가 일반적인 방법으로 제공될 때까지 기다릴 수 있습니다. 그런 다음 정상 작동으로 돌아갑니다.

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

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

PQgetline #

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

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

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

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

PQgetlineAsync #

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

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

이 기능은 다음과 유사합니다.PQgetline, 그러나 읽어야 하는 애플리케이션에서 사용할 수 있습니다.복사데이터를 비동기적으로, 즉 차단하지 않고 데이터를 전송합니다. 발행한 후복사명령을 받고 a를 받았습니다.PGRES_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전화; 통화당 부분 회선을 보내거나 여러 회선을 보내도 괜찮습니다.

참고

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

PQputnbytes #

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

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

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

PQendcopy #

서버와 동기화합니다.

int PQendcopy(PGconn *conn);

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

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

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

수정 사항 제출

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