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