copy
명령COPY
명령PostgreSQL|libpq. 이 섹션에 설명 된 기능은 복사 스포츠 토토 베트맨를 공급하거나 소비하여 응용 프로그램 이이 기능을 활용할 수 있도록합니다.
전체 프로세스는 응용 프로그램이 먼저 SQL을 발행한다는 것입니다.copy
PQEXEC
또는 동등한 함수 중 하나. 이것에 대한 응답 (명령에 오류가없는 경우)은 A입니다.pgresult
상태 코드를 가진 객체pgres_copy_out
또는pgres_copy_in
(지정된 사본 방향에 따라 다름). 그런 다음 응용 프로그램은이 섹션의 기능을 사용하여 스포츠 토토 베트맨 행을 수신하거나 전송해야합니다. 스포츠 토토 베트맨 전송이 완료되면 다른pgresult
객체가 반환되어 전송의 성공 또는 실패를 나타냅니다. 그 상태는pgres_command_ok
성공 또는pgres_fatal_error
문제가 발생한 경우. 이 시점에서 추가 SQL 명령은를 통해 발행 될 수 있습니다.PQEXEC
. ( 동안 동일한 연결을 사용하여 다른 SQL 명령을 실행할 수 없습니다137PostgreSQL : 문서 : 11 : 34.9. 사본 명령과 관련된 함수49
운영 진행 중입니다.)
if aCOPY
명령은를 통해 발행됩니다.PQEXEC
추가 명령을 포함 할 수있는 문자열에서 응용 프로그램은 계속해서 결과를 가져와야합니다pqgetresult
완료 후COPY
시퀀스. 만pqgetresult
반환NULL
확실합니까PQEXEC
명령 문자열이 완료되었으며 더 많은 명령을 발행하는 것이 안전합니다.
이 섹션의 기능은 결과 상태를 얻은 후에 만 실행해야합니다.pgres_copy_out
또는pgres_copy_in
FromPQEXEC
또는pqgetresult
.
apgresult
이러한 상태 값 중 하나를 갖는 객체에 대한 추가 스포츠 토토 베트맨가 있습니다COPY
시작중인 작동. 이 추가 스포츠 토토 베트맨는 쿼리 결과와 관련하여 사용되는 기능을 사용하여 사용할 수 있습니다.
pqnfields
복사 할 열 (필드) 수를 반환합니다.
pqbinaryTuples
0은 전체 사본 형식이 텍스트임을 나타냅니다 (노 라인으로 구분 된 행, 분리기 문자로 분리 된 열). 도 1은 전체 사본 형식이 바이너리임을 나타냅니다. 보다copy자세한 내용은
pqfformat
사본 조작의 각 열과 관련된 형식 코드 (텍스트의 경우 0, 이진의 경우 1)를 반환합니다. 전체 사본 형식이 텍스트 인 경우 콜럼 당 형식 코드는 항상 0이되지만 이진 형식은 텍스트와 이진 열 모두를 지원할 수 있습니다. (그러나 현재의 구현시copy
, 이진 기둥만이 이진 사본에 나타납니다. 따라서 컬럼 당 형식은 항상 전체 형식과 일치합니다.)
이러한 추가 스포츠 토토 베트맨 값은 프로토콜 3.0을 사용할 때만 사용할 수 있습니다. 프로토콜 2.0을 사용하면이 모든 기능이 0을 반환합니다.
COPY
스포츠 토토 베트맨이 기능은 동안 스포츠 토토 베트맨를 보내는 데 사용됩니다.stdin에서 복사
. 연결이 없을 때 호출하면 실패합니다copy_in
State.
pqputcopydata
기간 동안 서버로 스포츠 토토 베트맨를 보냅니다copy_in
State.
int pqputcopydata (pgconn *conn, const char *버퍼, int nbytes);
전송copy
지정된 스포츠 토토 베트맨버퍼
, 길이nbytes
, 서버. 결과는 스포츠 토토 베트맨를 대기하는 경우 1, 전체 버퍼로 인해 대기열이없는 경우 0 (비 블로킹 모드에서만 발생) 또는 오류가 발생한 경우 -1입니다. (사용PQERRORMESSAGE
반환 값이 -1 인 경우 세부 사항을 검색합니다. 값이 0 인 경우 쓰기 준비를 기다리고 다시 시도하십시오.)
응용 프로그램은를 나눌 수 있습니다.copy
편리한 크기의 버퍼로드로의 스포츠 토토 베트맨 스트림. 버퍼-로드 경계는 보낼 때 의미 론적 의미가 없습니다. 스포츠 토토 베트맨 스트림의 내용은에서 기대하는 스포츠 토토 베트맨 형식과 일치해야합니다.COPY
명령; 보다COPY자세한 내용.
pqputcopyend
기간 동안 서버에 스포츠 토토 베트맨 종료 표시를 보냅니다copy_in
State.
int pqputcopyend (pgconn *conn, const char *errormsg);
종료copy_in
성공적으로 작동하는 경우errormsg
isNULL
. 만약에errormsg
NULL
그런 다음copy
|errormsg
오류 메시지로 사용됩니다. (서버가 이미 실패했을 수 있으므로이 정확한 오류 메시지가 서버에서 돌아올 것이라고 가정해서는 안됩니다copy
자체 이유로. 또한 Pre-3.0 protocol 연결을 사용할 때 강제 고장 옵션이 작동하지 않습니다.)
종료 메시지가 전송 된 경우 결과는 1입니다. 또는 비 차단 모드에서는 종료 메시지가 성공적으로 대기되었음을 나타낼 수 있습니다. (차단 모드에서 스포츠 토토 베트맨가 전송되었는지 확인하려면 다음에 쓰기 준비를 기다려야합니다.pqflush
, 0을 반환 할 때까지 반복합니다.) 0은 전체 버퍼로 인해 함수가 종료 메시지를 대기열 할 수 없음을 나타냅니다. 이것은 비 차단 모드에서만 발생합니다. (이 경우 쓰기 준비를 기다리고를 시도하십시오.PQPUTCOPYEND
다시 호출하십시오.) 하드 오류가 발생하면 -1이 반환됩니다. 사용할 수 있습니다PQERRORMESSAGE
세부 정보를 검색하려면
성공적으로 전화 한 후pqputcopyend
, Callpqgetresult
의 최종 결과 상태를 얻으려면COPY
명령. 이 결과가 일반적인 방식으로 사용할 수 있기를 기다릴 수 있습니다. 그런 다음 정상 작동으로 돌아갑니다.
COPY
스포츠 토토 베트맨이 기능은 동안 스포츠 토토 베트맨를 수신하는 데 사용됩니다.stdout에 복사
. 연결이 없을 때 호출하면 실패합니다Copy_out
State.
pqgetCopyData
기간 동안 서버로부터 스포츠 토토 베트맨 수신Copy_out
State.
int pqgetcopydata (pgconn *conn, char ** 버퍼, int async);
a 기간 동안 서버에서 다른 행의 스포츠 토토 베트맨 행을 얻으려고 시도합니다.COPY
. 스포츠 토토 베트맨는 항상 한 번에 하나의 스포츠 토토 베트맨 행으로 반환됩니다. 부분 행만 사용할 수 있으면 반환되지 않습니다. 스포츠 토토 베트맨 행을 성공적으로 반환하려면 스포츠 토토 베트맨를 보유하기 위해 메모리 청크를 할당하는 것이 포함됩니다. 그만큼버퍼
매개 변수는 비 여야합니다NULL
. *버퍼
할당 된 메모리를 가리키거나NULL
버퍼가 반환되지 않은 경우. 비NULL
결과 버퍼를 사용하여 해제해야PQFREEMEM
더 이상 필요하지 않은 경우.
행이 성공적으로 반환되면 반환 값은 행의 스포츠 토토 베트맨 바이트 수입니다 (이것은 항상 0보다 클 것입니다). 반환 된 문자열은 항상 무효화되지만 텍스트에만 유용 할 것입니다COPY
. 0의 결과는임을 나타냅니다.COPY
아직 진행 중이지만 아직 사용 가능한 행이 없습니다 (이것은 가능합니다.async
참). -1의 결과는임을 나타냅니다.COPY
완료되었습니다. -2의 결과는 오류가 발생했음을 나타냅니다 (ConsultPQERRORMESSAGE
이유가 있습니다).
언제async
true (제로가 아님),pqgetCopyData
입력 대기를 차단하지 않습니다. 이면 0을 반환합니다.COPY
여전히 진행 중이지만 완전한 행을 사용할 수 없습니다. (이 경우 읽기 준비를 기다린 다음 전화pqconsumeInput
호출 전pqgetCopyData
다시.) 언제async
거짓 (0),pqgetCopyData
스포츠 토토 베트맨를 사용할 수 있거나 작업이 완료 될 때까지 차단됩니다.
이후pqgetCopyData
returns -1, callpqgetresult
의 최종 결과 상태를 얻으려면COPY
명령. 이 결과가 일반적인 방식으로 사용할 수 있기를 기다릴 수 있습니다. 그런 다음 정상 작동으로 돌아갑니다.
COPY
이러한 기능은 오래된 취급 방법을 나타냅니다COPY
. 그들은 여전히 작동하지만 오류 처리가 열악하고, 스포츠 토토 베트맨 종료를 감지하는 불편한 방법, 이진 또는 비 차단 전송에 대한 지원 부족으로 인해 더 이상 사용되지 않습니다.
pqgetline
Newline-Terminated 문자 라인 (서버에서 전송)을 버퍼 크기로 읽습니다길이
.
int pqgetline (pgconn *conn, char *버퍼, int 길이);
이 함수는까지 복사합니다.길이
-1 문자 버퍼에 문자를 사용하고 종단 신축을 제로 바이트로 변환합니다.pqgetline
반환eof
입력 끝에서 전체 라인을 읽은 경우 0, 버퍼가 가득 찼지만 종료 신생 라인을 아직 읽지 않은 경우 0..
신청서는 새 라인이 두 문자로 구성되어 있는지 확인해야합니다.\.
, 이는 서버가의 결과를 송신했음을 나타냅니다.COPY
명령. 응용 프로그램이 이상의 줄을받을 수있는 경우길이
-1 문자 길이는 길고, 치료가 필요합니다\.
라인을 올바르게 (예를 들어, 터미네이터 라인의 긴 스포츠 토토 베트맨 라인의 끝을 오해하지 마십시오)..
pqgetLineAnsync
행을 읽는다COPY
스포츠 토토 베트맨 (서버에서 전송) 차단없이 버퍼로 전송합니다.
int pqgetlineAneCync (pgconn *conn, char *버퍼, int bufsize);
이 기능은와 유사합니다.pqgetline
, 그러나 읽어야하는 응용 프로그램에서 사용할 수 있습니다COPY
스포츠 토토 베트맨 비동기 적으로, 즉 차단하지 않고. 발행COPY
명령 및 apgres_copy_out
응답, 신청서가 호출해야합니다pqconsumeInput
andpqgetLineAnsync
스포츠 토토 베트맨 종료 신호가 감지 될 때까지.
와 달리pqgetline
,이 함수는 스포츠 토토 베트맨 끝 감지에 대한 책임이 있습니다.
각 호출마다PQGETLINEASYNC
전체 스포츠 토토 베트맨 행을 사용할 수 있으면 스포츠 토토 베트맨를 반환합니다libpq의 입력 버퍼. 그렇지 않으면 나머지 행이 도착할 때까지 스포츠 토토 베트맨가 반환되지 않습니다. 코피 종단 스포츠 토토 베트맨 마커가 인식 된 경우 함수는 -1 또는 스포츠 토토 베트맨를 사용할 수없는 경우 0 또는 반환 된 스포츠 토토 베트맨의 바이트 수를 제공하는 양수를 반환합니다. -1이 반환되면 발신자는 다음 호출PQENDCOPY
그리고 정상 처리로 돌아갑니다.
반환 된 스포츠 토토 베트맨는 스포츠 토토 베트맨 열 경계를 넘어 확장되지 않습니다. 가능하면 전체 행이 한 번에 반환됩니다. 그러나 발신자가 제공하는 버퍼가 서버에서 전송하는 행을 유지하기에는 너무 작아서 부분 스포츠 토토 베트맨 행이 반환됩니다. 텍스트 스포츠 토토 베트맨를 사용하면 마지막 반환 바이트가인지 테스트하여 감지 할 수 있습니다.\ n
(이진에서COPY
, 실제 구문 분석COPY
동등한 결정을하기 위해서는 스포츠 토토 베트맨 형식이 필요합니다.) 반환 된 문자열은 무효가 끝나지 않습니다. (종료 Null을 추가하려면 A를 통과하십시오.bufsize
실제로 사용 가능한 방보다 작은 하나입니다.)
pqputline
서버에 null 종결 문자열을 보냅니다. OK이고 0을 반환합니다.eof
문자열을 보낼 수없는 경우.
int pqputline (pgconn *conn, const char *string);
theCOPY
일련의 통화로 보낸 스포츠 토토 베트맨 스트림pqputline
|pqgetLineAnc
, 응용 프로그램이 정확히 하나의 스포츠 토토 베트맨 행을 보내야한다는 것을 제외하고pqputline
전화; 통화 당 부분 줄 또는 여러 줄을 보내는 것은 괜찮습니다.
전PostgreSQL프로토콜 3.0, 응용 프로그램이 두 문자를 명시 적으로 보내야 할 필요가있었습니다\.
서버에 보내는 것을 나타내는 최종 라인으로COPY
스포츠 토토 베트맨. 이것은 여전히 작동하지만 감가 상각되며의 특별한 의미는\.
향후 릴리스에서 제거 될 수 있습니다. 전화하기에 충분합니다PQENDCOPY
실제 스포츠 토토 베트맨를 보낸 후.
PQPUTNBYTES
널리 터진 문자열을 서버로 보냅니다. OK이고 0을 반환합니다.eof
문자열을 보낼 수없는 경우.
int pqputnbytes (pgconn *conn, const char *버퍼, int nbytes);
이것은 똑같습니다pqputline
-보내는 바이트 수가 직접 지정되기 때문에 스포츠 토토 베트맨 버퍼를 무효화 할 필요가 없다는 점을 제외하고. 이진 스포츠 토토 베트맨를 보낼 때이 절차를 사용하십시오.
PQENDCOPY
서버와 동기화됩니다.
int pqendcopy (pgconn *conn);
이 함수는 서버가 복사를 마칠 때까지 기다립니다. 마지막 문자열이를 사용하여 서버로 전송 될 때 발행해야합니다.pqputline
또는 마지막 문자열이 서버에서 사용하여 수신 된 경우pqgetline
. 발행해야합니다. 그렇지 않으면 서버가 얻을 것입니다“동기화”클라이언트와. 이 기능에서 돌아 오면 서버는 다음 SQL 명령을 수신 할 준비가되었습니다. 성공적인 완료시 반환 값은 0이지만 0이 아닌 그렇지 않으면 0입니다. (사용PQERRORMESSAGE
반환 값이 0이 아닌 경우 세부 정보를 검색하려면.)
사용시pqgetresult
, 응용 프로그램은 a에 응답해야합니다.pgres_copy_out
실행하여 결과pqgetline
반복적으로PQENDCOPY
터미네이터 라인이 보입니다. 그런 다음로 돌아 가야합니다.pqgetresult
루프까지pqgetresult
널 포인터를 반환합니다. 마찬가지로 Apgres_copy_in
결과는 일련의 일련의 처리입니다.pqputline
통화 후PQENDCOPY
,로 돌아갑니다pqgetresult
루프. 이 계약은 A를 보장합니다.COPY
일련의 명령SQL명령이 올바르게 실행됩니다.
이전 응용 프로그램이 A를 제출할 가능성이 높습니다COPY
viaPQEXEC
그리고 거래가 이후에 이루어 졌다고 가정합니다PQENDCOPY
. 이것은 만 올바르게 작동합니다.COPY
유일한SQL명령 문자열의 명령.