그PQexec함수는 다음에 적합합니다. 간단한 동기 애플리케이션에서 쿼리 제출. 그것은 그러나 몇 가지 주요 결함이 있습니다.
PQexec무지개 토토를 기다립니다. 완료되었습니다. 애플리케이션에 수행할 다른 작업이 있을 수 있습니다(예: 사용자 인터페이스 유지), 이 경우에는 원하지 않을 것입니다. 응답을 기다리는 블록입니다.
통제권이 내부에 묻혀있기 때문에PQexec, 프런트엔드에서 결정하기 어렵습니다. 진행 중인 무지개 토토를 취소하려고 합니다. (그럴수도 있지 신호 처리기에서 수행되지만 그렇지 않으면 수행되지 않습니다.)
PQexec하나만 반환할 수 있습니다. PGresult 구조. 제출된 쿼리 문자열에 다음이 포함된 경우 여러SQL명령, 다음을 제외한 모든 명령 마지막 PGresult는 다음에 의해 삭제됩니다.PQexec.
이러한 제한이 마음에 들지 않는 응용프로그램은 대신 다음을 사용할 수 있습니다. 기본 기능은PQexec이다 다음에서 빌드됨:PQsendQuery그리고PQgetResult.
이 기능을 사용하는 이전 프로그램은 물론PQputline그리고PQputnbytes다음으로 데이터 전송을 기다리는 것을 차단할 수 있습니다. 백엔드, 해당 문제를 해결하기 위해 함수PQset비차단추가되었습니다.
오래된 응용프로그램은 사용을 게을리할 수 있음PQset비차단그리고 잠재적으로 나이가 들수록 차단 행동. 최신 프로그램에서 사용할 수 있습니다.PQset비차단완전히 달성하다 백엔드에 대한 비차단 연결입니다.
PQset비차단상태를 설정합니다 논블로킹 연결입니다.
int PQsetnonblocking(PGconn *conn)이 함수는 다음 호출을 보장합니다.PQputline, PQputnbytes, PQsendQuery그리고PQendcopy차단하지 않고 대신 다시 호출해야 하면 오류가 발생합니다.
데이터베이스 연결이 비차단 모드로 설정된 경우 그리고PQexec호출되면, 일시적으로 연결 상태를 차단으로 설정합니다.PQexec완료합니다.
더 많은 libpq가 안전하게 만들어질 것으로 예상됩니다.PQset비차단근처에 있는 기능 미래.
PQis비차단다음을 반환합니다. 데이터베이스 연결의 차단 상태입니다.
int PQisnonblocking(const PGconn *conn)연결이 비차단 모드로 설정된 경우 TRUE를 반환합니다. 차단하는 경우 거짓입니다.
PQsendQuery다음에 질의를 제출하세요.포스트그레기다리지 않고 결과. 쿼리가 성공적으로 수행되면 TRUE가 반환됩니다. 전달되지 않으면 FALSE입니다(이 경우 PQerrorMessage를 사용하여 실패에 대한 자세한 정보를 얻으세요).
int PQsendQuery(PGconn *conn,
const char *쿼리);성공적으로 호출한 후PQsendQuery, 전화PQgetResult무지개 토토를 얻기 위해 한 번 이상
결과.PQsendQuery호출될 수 없습니다
다시 (동일한 연결에서)까지PQgetResult이 NULL을 반환했으며 이는
무지개 토토가 완료되었습니다.PQgetResult다음을 기다리세요 이전의 결과PQsendQuery그리고 돌려보내세요. 쿼리가 완료되면 NULL이 반환되고 더 이상 결과가 없습니다.
PGresult *PQgetResult(PGconn *conn);PQgetResult호출되어야 합니다 NULL을 반환할 때까지 반복하여 무지개 토토가 완료되었음을 나타냅니다. 완료. (활성 무지개 토토가 없을 때 호출되는 경우,PQgetResult한 번에 NULL을 반환합니다.) 각 null이 아닌 결과:PQgetResult해야 한다 이전에 동일한 PGresult 접근자 함수를 사용하여 처리됩니다. 설명했습니다. 다음을 사용하여 각 결과 객체를 해제하는 것을 잊지 마세요.PQclear끝났을 때. 참고하세요PQgetResult다음의 경우에만 차단됩니다. 쿼리가 활성화되어 있고 필요한 응답 데이터가 아직 없습니다 님이 읽었습니다.PQconsumeInput.
사용 중PQsendQuery그리고PQgetResult다음 중 하나를 해결합니다.PQexec의 문제: 쿼리 문자열에 다음이 포함된 경우 여러SQL명령, 결과 해당 명령은 개별적으로 얻을 수 있습니다. (이것은 간단한 그런데 중첩 처리 형태는 다음과 같습니다. 프런트엔드는 백엔드가 아직 있는 동안 하나의 쿼리 결과를 처리합니다. 동일한 쿼리 문자열에서 이후 쿼리를 작업합니다.) 그러나 전화PQgetResult여전히 백엔드가 다음 작업을 완료할 때까지 차단하는 프런트엔드SQL명령. 이는 적절한 사용으로 피할 수 있습니다. 세 가지 추가 기능:
PQconsumeInput입력이 다음과 같은 경우 백엔드에서 사용할 수 있으므로 사용하세요.
int PQconsumeInput(PGconn *conn);PQconsumeInput일반적으로 1을 반환합니다. "오류 없음"을 나타내지만 어떤 종류의 오류가 있는 경우 0을 반환합니다. 문제(이 경우PQerrorMessage이다 설정). 결과는 입력 데이터가 있는지 여부를 나타내지 않습니다. 실제로 수집되었습니다. 통화 후PQconsumeInput, 애플리케이션이 확인할 수 있습니다.PQisBusy및/또는PQ알림상태가 변경되었는지 확인합니다.
PQconsumeInput심지어 호출될 수도 있습니다. 애플리케이션이 결과를 처리할 준비가 되어 있지 않거나 아직 알림이 없습니다. 루틴은 사용 가능한 데이터를 읽고 버퍼에 저장하면 다음과 같은 오류가 발생합니다.선택(2) 읽기 준비 표시가 사라집니다. 는 따라서 애플리케이션은 다음을 사용할 수 있습니다.PQconsumeInput지우기 위해선택즉시 조건을 설정한 다음 검사하세요. 결과는 여유롭게.
PQisBusy무지개 토토인 경우 1을 반환합니다. 바쁘다, 즉,PQgetResult아마도 입력을 기다리는 블록입니다. 0 반환은 다음을 나타냅니다.PQgetResult다음과 같은 확신을 갖고 호출할 수 있습니다. 차단합니다.
int PQisBusy(PGconn *conn);PQisBusy자체는 시도하지 않을 것입니다 백엔드에서 데이터를 읽습니다. 그러므로PQconsumeInput먼저 호출되어야 합니다. 그렇지 않으면 사용 중입니다. 상태는 결코 끝나지 않을 것입니다.
PQflush데이터 플러시 시도 백엔드에 대기하고 성공하면 0을 반환합니다. 큐가 비어 있음) 또는 어떤 이유로 실패한 경우 EOF입니다.
int PQflush(PGconn *conn);PQflush다음에 호출되어야 합니다. 전화하기 전에 비차단 연결선택응답이 도착했는지 확인합니다. 0이면 반환되어 백엔드에 대기 중인 데이터가 없는지 확인합니다. 실제로 전송되지 않은 것입니다. 사용한 애플리케이션만PQsetnonblocking이것이 필요합니다.
PQsocket파일 획득 백엔드 연결 소켓의 설명자 번호입니다. 유효한 설명자는 = 0입니다. -1의 결과는 없음을 나타냅니다. 백엔드 연결이 현재 열려 있습니다.
int PQsocket(const PGconn *conn);PQsocket얻기 위해 사용해야 합니다. 실행을 준비하는 백엔드 소켓 설명자선택(2). 이를 통해 응용 프로그램이 허용됩니다. 차단 연결을 사용하여 백엔드 응답을 기다리거나 다른 조건. 결과가 다음과 같다면선택(2)는 다음에서 데이터를 읽을 수 있음을 나타냅니다. 백엔드 소켓, 그런 다음PQconsumeInput13789_13840PQisBusy, PQgetResult, 및/또는PQ알림처리하는 데 사용할 수 있습니다. 응답.
비차단 연결(사용된PQsetnonblocking)을 사용하면 안 됩니다.선택까지PQflush버퍼링된 데이터가 없음을 나타내는 0을 반환했습니다. 백엔드로 전송되기를 기다리고 있습니다.
이러한 기능을 사용하는 일반적인 프런트엔드는 메인 루프를 갖습니다. 을 사용하는선택(2) 모든 것을 기다리기 위해 응답해야 하는 조건입니다. 조건 중 하나는 다음과 같습니다. 백엔드에서 사용할 수 있는 입력입니다.선택의 용어는 파일에서 읽을 수 있는 데이터입니다. 다음으로 식별되는 설명자PQsocket. 언제 메인 루프가 입력 준비를 감지하면 호출해야 합니다.PQconsumeInput입력을 읽습니다. 그런 다음 호출할 수 있습니다.PQisBusy, 이어서PQgetResultifPQisBusy거짓(0)을 반환합니다. 전화할 수도 있습니다.PQ알림NOTIFY 메시지를 감지합니다(참조 '비동기 알림'(아래).
다음을 사용하는 프런트엔드PQsendQuery/PQgetResult또한 아직 처리 중인 무지개 토토를 취소하려고 시도할 수도 있습니다. 백엔드.
PQ요청취소요청하세요포스트그레스처리 포기 현재 쿼리입니다.
int PQrequestCancel(PGconn *conn);취소 요청이 성공적으로 이루어지면 반환 값은 1입니다. 발송됨, 그렇지 않은 경우 0 (그렇지 않다면,PQerrorMessage그 이유를 알려줍니다.) 성공적인 파견 그러나 요청이 효과가 있다는 보장은 없습니다. 반환 값에 관계없이PQ요청 취소, 애플리케이션은 다음과 같이 계속되어야 합니다. 다음을 사용하는 일반적인 결과 읽기 시퀀스PQgetResult. 취소가 유효한 경우, 현재 쿼리는 일찍 종료되고 오류 결과를 반환합니다. 만약에 취소가 실패합니다(예: 백엔드가 이미 완료되었기 때문에). 쿼리를 처리하는 중) 결과가 전혀 표시되지 않습니다.
현재 쿼리가 트랜잭션의 일부인 경우, 취소하면 전체 거래가 중단됩니다.
PQ요청 취소안전하게 호출될 수 있습니다 신호 처리기에서. 따라서 다음에서도 사용할 수 있습니다. 일반과 결합PQexec, 만약 취소 결정은 신호 처리기에서 이루어질 수 있습니다. 예를 들어,psql호출PQ요청 취소SIGINT 신호 처리기에서, 따라서 발행된 무지개 토토의 대화형 취소 허용PQexec. 참고하세요PQ요청취소다음과 같은 경우에는 아무런 효과가 없습니다. 연결이 현재 열려 있지 않거나 백엔드가 현재 열려 있지 않습니다. 쿼리를 처리하는 중입니다.