그복사토토포스트그레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필드복사할 열(필드) 수를 반환합니다.
PQbinaryTuples0은 전체 복사 형식이 텍스트임을 나타냅니다(행 줄바꿈으로 구분, 열은 구분 기호로 구분 문자 등). 1은 전체 복사 형식이 다음과 같음을 나타냅니다. 바이너리. 참조PostgreSQL : 문서 : 8.0 : 스포츠 토토 결과용 자세한 정보.
PQfformat형식 코드를 반환합니다(텍스트의 경우 0, 바이너리의 경우 1). 복사 작업의 각 열과 연결됩니다. 는 열별 형식 코드는 항상 0이 됩니다. 전체 복사 형식은 텍스트이지만 바이너리 형식은 텍스트 열과 이진 열을 모두 지원합니다. (그러나, 현재로서는 현재 구현복사, 이진 복사본에는 이진 열만 나타납니다. 그래서 열별 형식은 항상 전체 형식과 일치합니다. 현재.)
참고:이러한 추가 데이터 값은 프로토콜 3.0을 사용할 때 사용할 수 있습니다. 프로토콜 2.0을 사용하는 경우, 이 모든 함수는 0을 반환합니다.
이 기능은 다음 중에 데이터를 보내는 데 사용됩니다.STDIN에서 복사. 언제 호출하면 실패합니다. 연결이 되지 않았습니다.COPY_IN상태.
PQputCopyData동안 서버에 데이터를 보냅니다.COPY_IN상태.
int PQputCopyData(PGconn *conn,
const char *버퍼,
int nbytes);
다음을 전송합니다복사데이터
지정된버퍼, 중
길이n바이트, 서버에.
데이터가 전송되면 결과는 1이고, 그렇지 않으면 0입니다.
시도가 차단될 수 있기 때문에 전송되었습니다(이 경우는
연결이 비차단 모드인 경우 가능) 또는 -1
오류가 발생한 경우. (사용PQerrorMessage다음 경우에 세부정보를 검색하려면
반환 값은 -1입니다. 값이 0이면 대기
쓰기 준비가 된 후 다시 시도하세요.)
응용 프로그램은 다음을 나눌 수 있습니다.복사모든 버퍼 로드로 데이터 스트림 편리한 크기. 버퍼 로드 경계에는 의미가 없습니다. 보낼 때의 중요성. 데이터의 내용 스트림은 예상되는 데이터 형식과 일치해야 합니다.복사토토; 참조PostgreSQL : 문서 : 8.0 : 스포츠 토토 결과자세한 내용은.
PQputCopyEnd동안 서버에 데이터 종료 표시를 보냅니다.COPY_IN상태.
int PQputCopyEnd(PGconn *conn,
const char *errormsg);
종료COPY_IN작동 만약에 성공적이라면errormsgisNULL. 만일errormsg아닙니다NULL그다음은복사다음이 가리키는 문자열로 인해 강제로 실패합니다.errormsg오류로 사용됨 메시지. (이 정확한 오류가 있다고 가정해서는 안 됩니다. 그러나 메시지는 서버에서 다시 반환됩니다. 서버가 이미 실패했을 수 있습니다.복사그 나름대로의 이유가 있습니다. 또한 강제 실패 옵션을 사용할 때 작동하지 않습니다. 3.0 이전 프로토콜 연결.)
종료 데이터가 전송되면 결과는 1, 0입니다.
시도가 차단되어 전송되지 않은 경우(이것은
연결이 비차단인 경우에만 가능합니다.
모드) 또는 오류가 발생한 경우 -1입니다. (사용PQerrorMessage다음 경우에 세부정보를 검색하려면
반환 값은 -1입니다. 값이 0이면 대기
쓰기 준비가 된 후 다시 시도하세요.)
성공적으로 호출한 후PQputCopyEnd, 전화PQgetResult최종 결과를 얻기 위해
의 상태복사토토. 하나
이 결과가 평소대로 나올 때까지 기다릴 수 있습니다.
방법. 그런 다음 정상 작동으로 돌아갑니다.
이 함수는 데이터를 수신하는 데 사용됩니다.STDOUT에 복사. 언제 호출하면 실패합니다. 연결이 되지 않았습니다.COPY_OUT상태.
PQgetCopyData동안 서버로부터 데이터를 수신합니다.COPY_OUT상태.
int PQgetCopyData(PGconn *conn,
char **버퍼,
int 비동기);
서버에서 다른 데이터 행을 얻으려는 시도
동안복사. 데이터는 항상
한 번에 하나의 데이터 행을 반환했습니다. 부분 행만 있는 경우
사용 가능한 경우 반환되지 않습니다. 성공적인 반환
데이터 행에는 보유할 메모리 덩어리를 할당하는 작업이 포함됩니다.
데이터.버퍼매개변수
-가 아니어야 합니다.NULL. *버퍼할당된 항목을 가리키도록 설정되었습니다.
기억, 또는NULL경우에
버퍼가 반환되지 않습니다. 비-NULL결과 버퍼는 다음을 사용하여 해제되어야 합니다.PQfreemem더 이상 필요하지 않을 때.
행이 성공적으로 반환되면 반환 값은
행의 데이터 바이트 수입니다(항상
0보다 커야 함). 반환된 문자열은 항상
null로 종료되지만 이는 아마도 다음 경우에만 유용할 것입니다.
텍스트복사. 0의 결과
다음을 나타냅니다.복사아직
진행 중이지만 아직 사용 가능한 행이 없습니다(이것은
가능한 경우비동기사실입니다).
-1의 결과는 다음을 나타냅니다.복사완료되었습니다. -2의 결과는 다음을 나타냅니다.
오류가 발생했음을 알려드립니다(문의하세요)PQerrorMessage이유 때문에).
언제비동기참입니다(아님
제로),PQgetCopyData할 것이다
입력을 기다리는 것을 차단하지 않습니다. 다음과 같은 경우 0을 반환합니다.복사아직 진행 중이지만 아니요
전체 행을 사용할 수 있습니다. (이 경우에는
준비된 후 호출PQconsumeInput전화하기 전에PQgetCopyData다시.) 언제비동기거짓(영)입니다.PQgetCopyData차단됩니다
데이터를 사용할 수 있거나 작업이 완료될 때까지.
이후PQgetCopyData반환 -1, 호출PQgetResult최종 결과를 얻기 위해
의 상태복사토토. 하나
이 결과가 평소대로 나올 때까지 기다릴 수 있습니다.
방법. 그런 다음 정상 작동으로 돌아갑니다.
이 함수는 이전 처리 방법을 나타냅니다.복사. 그들은 여전히 일하고 있지만, 잘못된 오류 처리, 불편한 방법으로 인해 더 이상 사용되지 않습니다. 데이터 끝 감지 및 바이너리 지원 부족 또는 비차단 전송.
PQgetline줄바꿈으로 끝나는 문자 줄을 읽습니다. (서버에 의해 전송됨) 크기의 버퍼 문자열로길이.
int PQgetline(PGconn *conn,
char *버퍼,
정수 길이);
이 기능은 최대 복사길이-1 문자를 버퍼에 넣고
종료되는 개행 문자를 0바이트로 변환합니다.PQgetline반환EOF입력 끝에서, 0이면
전체 라인을 읽었으며, 버퍼가 가득 차면 1입니다.
그러나 종료 개행 문자는 아직 읽혀지지 않았습니다.
응용프로그램은 새로운 줄은 두 문자로 구성됩니다.\., 이는 서버에 결과 전송을 완료했습니다.복사토토. 응용 프로그램이 다음보다 많은 라인을 수신합니다.길이-1자 길이이므로 주의가 필요합니다. 확실히 인식하려면\.라인을 정확하게 입력합니다(예를 들어 실수하지 않습니다). 종료자 라인에 대한 긴 데이터 라인의 끝).
PQgetlineAsync다음 행을 읽습니다.복사데이터 (서버에 의해 전송됨) 없이 버퍼로 차단합니다.
int PQgetlineAsync(PGconn *conn,
char *버퍼,
int bufsize);
이 기능은 다음과 유사합니다PQgetline, 하지만 다음에서 사용할 수 있습니다.
읽어야 하는 애플리케이션복사데이터를 비동기적으로, 즉 차단하지 않고. 데
발행했다복사토토 및
를 받았습니다PGRES_COPY_OUT응답, 애플리케이션이 호출해야 함PQconsumeInput그리고PQgetlineAsync데이터 끝까지
신호가 감지되었습니다.
달리PQgetline, 이거
함수는 감지를 담당합니다.
데이터 끝입니다.
호출할 때마다PQgetlineAsync다음과 같은 경우 데이터를 반환합니다.
전체 데이터 행은 다음에서 사용할 수 있습니다.libpq의 입력 버퍼입니다. 그렇지 않으면, 아니오
행의 나머지 부분이 도착할 때까지 데이터가 반환됩니다. 는
함수는 데이터 복사 끝 표시가 있는 경우 -1을 반환합니다.
인식되었습니다. 데이터가 없으면 0입니다.
데이터의 바이트 수를 나타내는 양수
돌아왔다. -1이 반환되면 호출자는 다음 호출을 해야 합니다.PQendcopy, 그런 다음 반환
정상 처리됩니다.
반환된 데이터는 데이터 행을 넘어 확장되지 않습니다. 경계. 가능하다면 전체 행이 한 번에 반환됩니다. 시간. 그러나 호출자가 제공한 버퍼가 너무 서버에서 전송한 행을 보관하기 위해 작은 크기, 그 다음 부분 데이터 행이 반환됩니다. 텍스트 데이터를 사용하면 다음과 같습니다. 마지막으로 반환된 바이트가 다음과 같은지 테스트하여 감지되었습니다.\n아니면요. (바이너리에서복사, 실제 구문 분석복사데이터 형식이 필요합니다 동등한 결정을 내리기 위해.) 반환된 문자열은 null로 끝나지 않습니다. (추가하고 싶다면 null을 종료하려면 a를 전달해야 합니다.버프크기방보다 하나 작음 실제로 사용 가능합니다.)
PQputlineNull 종료 문자열을 서버로 보냅니다. 반품 괜찮으면 0이고EOF전송할 수 없는 경우 문자열.
int PQputline(PGconn *conn,
const char *string);
그복사다음에서 보낸 데이터 스트림
일련의 호출PQputline그것과 같은 형식입니다
에 의해 반환됨PQgetlineAsync,
단, 신청서가 정확하게 보내질 의무는 없습니다.
당 하나의 데이터 행PQputline전화; 한 줄만 보내도 되고, 여러 줄을 보내도 괜찮습니다.
통화당.
참고:이전포스트그레SQL프로토콜 3.0이었습니다. 애플리케이션이 명시적으로 전송하는 데 필요합니다. 두 문자\.최종적으로 완료되었음을 서버에 알리는 라인 보내는 중복사데이터. 동안 이것은 여전히 작동하지만 더 이상 사용되지 않으며 특수 의 의미\.될 수 있습니다 향후 릴리스에서는 제거될 예정입니다. 그것은 전화하기에 충분합니다
PQendcopy다음을 보낸 후 실제 데이터입니다.
PQputnbytes널로 끝나지 않는 문자열을 서버로 보냅니다. 정상이면 0을 반환하고EOF불가능할 경우 문자열을 보내려면.
int PQputnbytes(PGconn *conn,
const char *버퍼,
int nbytes);
이것은 정확히 같습니다PQputline, 단, 데이터 버퍼는 제외
바이트 수는 null로 종료될 필요가 없습니다.
send는 직접 지정됩니다. 다음 경우에 이 절차를 사용하십시오.
바이너리 데이터를 전송합니다.
PQendcopy서버와 동기화합니다.
int PQendcopy(PGconn *conn);
이 함수는 서버가 작업을 완료할 때까지 기다립니다.
복사. 마지막 문자열이 나올 때 발행되어야 합니다.
다음을 사용하여 서버로 전송되었습니다.PQputline또는 마지막 문자열이
다음을 사용하여 서버로부터 수신되었습니다.PGgetline. 발급받아야 하거나,
서버가 얻을 것이다"동기화되지 않음"클라이언트와 함께. 이 함수에서 반환되면
서버가 다음 SQL 토토을 수신할 준비가 되었습니다. 는
성공적인 완료 시 반환 값은 0, 0이 아님
그렇지 않으면. (사용PQerrorMessage다음 경우에 세부정보를 검색하려면
반환 값은 0이 아닙니다.)
사용 시PQgetResult,
애플리케이션은 a에 응답해야 합니다.PGRES_COPY_OUT실행 결과PQgetline반복적으로,
이어서PQendcopy이후
터미네이터 라인이 보입니다. 그런 다음 다음으로 돌아가야 합니다.PQgetResult다음까지 반복PQgetResult널을 반환합니다.
포인터. 마찬가지로PGRES_COPY_IN결과는 다음에 의해 처리됩니다.
일련의PQputline호출
이어서PQendcopy그러면
으로 돌아갑니다.PQgetResult루프. 이 합의는 다음을 보장합니다.복사일련의 토토에 포함된 토토SQL토토은 다음과 같습니다
올바르게 실행되었습니다.
이전 신청서는 다음을 제출할 가능성이 높습니다.복사경유PQexec그리고 거래가
이후에 완료됨PQendcopy.
이는 다음과 같은 경우에만 올바르게 작동합니다.복사유일한SQL토토의 토토
문자열.