thePQEXEC함수는 적합합니다 간단한 동기 응용 프로그램에서 무지개 토토 제출. 그것은 있습니다 그러나 몇 가지 주요 결함이 있지만 :
PQEXEC무지개 토토가 될 때까지 기다립니다 완전한. 응용 프로그램은 다른 작업을 수행 할 수 있습니다 (예 : 사용자 인터페이스 유지),이 경우에는 원하지 않습니다. 응답을 기다리는 차단.
제어가 내부에 묻혀 있기 때문에PQEXEC, 프론트 엔드가 결정하기가 어렵습니다 진행중인 무지개 토토를 취소하려고합니다. (그럴 수 있습니다 신호 핸들러에서 완료되었지만 그렇지 않으면.)
PQEXEC하나만 반환 할 수 있습니다 pgresult 구조. 제출 된 무지개 토토 문자열에 포함 된 경우 다수의SQL명령, 모든 것 마지막 pgresult는에 의해 폐기됩니다.PQEXEC.
이러한 제한이 마음에 들지 않는 응용 프로그램은 대신 사용할 수 있습니다. 기본 기능PQEXECIS 건축 :pqsendqueryandpqgetresult.
이 기능을 사용한 오래된 프로그램과pqputlineandpqputnbytes데이터를 보내기 위해 대기 대기를 차단할 수 있습니다 백엔드, 해당 문제를 해결하기 위해 함수pqsetnonBlocking추가되었습니다.
오래된 응용 프로그램은 사용을 무시할 수 있습니다pqsetnonBlocking잠재적으로 구식을 얻으십시오 행동 차단. 최신 프로그램을 사용할 수 있습니다pqsetnonBlocking완전히 달성합니다 백엔드에 대한 비 차단 연결.
pqsetnonBlocking상태를 설정합니다 비 블로킹에 대한 연결.
int pqsetnonblocking (pgconn *conn)이 기능은을 보장합니다.pqputline, PQPUTNBYTES, pqsendquery및PQENDCOPY차단하지 않고 대신 an을 반환합니다 다시 호출 해야하는 경우 오류.
데이터베이스 연결이 비 블로킹 모드로 설정된 경우 그리고PQEXEC호출됩니다 일시적으로 블록 연결 상태를 때까지 그만큼PQEXEC완료.
더 많은 Libpq가 안전해질 것으로 예상pqsetnonBlocking근처의 기능 미래.
pqisnonBlocking반환합니다 데이터베이스 연결 상태 차단.
int pqisnonblocking (const pgconn *conn)연결이 비 블로킹 모드로 설정된 경우 true를 반환합니다. 차단하면 거짓.
pqsendquery무지개 토토 제출Postgres기다리지 않고 결과. 무지개 토토가 성공적으로 사용되면 True가 반환됩니다 파견, 거짓이 아닌 경우 (어떤 경우에는 pqerrormessage를 사용하십시오. 실패에 대한 자세한 정보를 얻으십시오).
int pqsendquery (pgconn *conn, const char *query);성공적으로 전화 한 후pqsendquery, Callpqgetresult무지개 토토를 얻기 위해 한 번 이상 결과.pqsendquery호출 할 수 없습니다 다시 (같은 연결에)까지pqgetresultNULL을 반환하여 무지개 토토가 완료되었습니다.
pqgetresult다음을 기다리십시오 이전의 결과pqsendquery및 반환하십시오. 무지개 토토가 완료되면 NULL이 반환됩니다 더 이상 결과가 없을 것입니다.
pgresult *pqgetresult (pgconn *conn);pqgetresult호출해야합니다 NULL을 반환 할 때까지 반복적으로 쿼리가 완료. (쿼리가 없을 때 호출 된 경우pqgetresult한 번에 null을 반환합니다.) 각각 비 널 결과pqgetresult이전에 동일한 pgresult 액세서 기능을 사용하여 처리됩니다 설명. 로 각 결과 객체를 자유롭게하는 것을 잊지 마십시오.PQCLEAR완료되면. 참고pqgetresulta 무지개 토토는 활성화되어 있으며 필요한 응답 데이터는 아직 없습니다.pqconsumeInput.
사용pqsendqueryandpqgetresultPQEXEC의 문제 : 무지개 토토 문자열에 포함 된 경우 다수의SQL명령, 결과 이러한 명령은 개별적으로 얻을 수 있습니다. (이것은 단순한 것을 허용합니다 그건 그렇고 겹쳐진 처리의 형태 : 프론트 엔드는 백엔드가 여전히있는 동안 하나의 무지개 토토 결과를 처리합니다. 동일한 무지개 토토 문자열에서 나중에 무지개 토토 작업을 수행합니다.) 그러나 부름pqgetresult여전히 백엔드가 다음을 완료 할 때까지 차단하는 프론트 엔드SQL명령. 이것은 적절한 사용으로 피할 수 있습니다 세 가지 기능 :
pqconsumeInput입력 인 경우 백엔드에서 사용할 수 있습니다.
int pqconsumeInput (pgconn *conn);pqconsumeInput일반적으로 1 "오류 없음"을 나타내지 만 어떤 종류의 경우 0을 반환합니다. 문제 (어떤 경우PQERRORMESSAGEis 세트). 결과는 입력 데이터가 있는지 여부를 말하지 않습니다. 실제로 수집되었습니다. 전화 후pqconsumeInput, 신청서가 확인할 수 있습니다PQISBUSY및/또는pqnotifies상태가 바뀌 었는지 확인하려면
pqconsumeInput도 호출 될 수 있습니다 신청서가 결과를 처리 할 준비가되지 않은 경우 아직 알림. 일상은 사용 가능한 데이터를 읽습니다 버퍼에 저장하여 A를 유발합니다.select(2) 사라질 준비가 된 표시. 그만큼 따라서 응용 프로그램은 사용할 수 있습니다pqconsumeInputselect즉시 조건을 확인한 다음 검사하십시오 여가의 결과.
PQISBUSY무지개 토토가있는 경우 1을 반환합니다 바쁘다, 즉pqgetresult입력을 기다리는 블록. 0 반환은를 나타냅니다.pqgetresultNOT의 확신으로 호출 할 수 있습니다 블로킹.
int pqisbusy (pgconn *conn);PQISBUSY자체가 시도하지 않을 것입니다 백엔드에서 데이터를 읽습니다. 그러므로pqconsumeInput먼저 호출해야합니다 상태는 결코 끝나지 않을 것입니다.
pqflush데이터를 플러시하려고 시도합니다 백엔드에 대기하면 성공한 경우 0을 반환합니다 (또는 보내는 경우 큐가 비어 있거나 어떤 이유로 실패한 경우
int pqflush (pgconn *conn);pqflusha 호출 전 비 차단 연결selectreponce가 도착했는지 확인합니다. 0 인 경우 반환되면 백엔드에 대기되는 데이터가 없도록합니다. 실제로 보내지 않았습니다. 사용한 응용 프로그램 만pqsetnonBlocking이 문제가 필요합니다.
pqsocket파일을 얻습니다 백엔드 연결 소켓의 디스크립터 번호. 유효한 설명자는 = 0입니다. -1의 결과는 아니오를 나타냅니다 백엔드 연결이 현재 열려 있습니다.
int pqsocket (const pgconn *conn);pqsocket획득하는 데 사용해야합니다 실행 준비를위한 백엔드 소켓 디스크립터select(2). 이것은 응용 프로그램을 허용합니다 차단 연결을 사용하여 백엔드 응답을 기다리거나 다른 조건. 의 결과 인 경우select(2)는 데이터를 읽을 수 있음을 나타냅니다 백엔드 소켓,pqconsumeInput데이터를 읽으려면 호출되어야합니다. 그 후,PQISBUSY, pqgetresult, 및/또는pqnotifies처리에 사용될 수 있습니다 응답.
비 차단 연결 (사용한pqsetnonBlocking) 사용하지 않아야selectpqflush버퍼링 된 데이터가 없음을 나타내는 0을 반환했습니다. 백엔드로 보내기를 기다리고 있습니다.
이러한 함수를 사용하는 일반적인 프론트 엔드에는 기본 루프가 있습니다. 사용select(2) 모든 것을 기다립니다 응답 해야하는 조건. 조건 중 하나가 될 것입니다 백엔드에서 사용할 수있는 입력,select의 용어는 파일에서 읽을 수있는 데이터입니다 에 의해 식별 된 설명 자pqsocket. 언제 메인 루프는 입력 준비를 감지하고 호출해야합니다pqconsumeInput입력을 읽으려면. 그런 다음 호출 할 수 있습니다PQISBUSYpqgetresultifPQISBUSY거짓 (0)을 반환합니다. 또한 전화 할 수 있습니다pqnotifies알림 메시지를 감지하려면 (참조 "비동기식 알림", 아래).
사용하는 프론트 엔드pqsendquery/pqgetresult여전히 처리중인 무지개 토토를 취소하려고 할 수도 있습니다. 백엔드.
PQREQUESTCANCEL요청Postgres포기 처리 현재 쿼리.
int pqRequestCancel (pgconn *conn);취소 요청이 성공적으로 인 경우 반환 값이 1입니다. 없으면 0. (그렇지 않은 경우PQERRORMESSAGE왜 그렇지 않은지 알려줍니다.) 성공적인 파견 그러나 요청이 어떤 영향을 미칠 것이라고 보장하지 않습니다. 반환 값에 관계없이PQREQUESTCANCEL, 응용 프로그램은 계속해야합니다 사용 정상 결과 읽기 순서pqgetresult. 취소가 효과적이면 현재 쿼리는 조기에 종료되고 오류 결과를 반환합니다. 만약에 취소가 실패합니다 (백엔드가 이미 완료 되었기 때문에 쿼리 처리) 그러면 전혀 눈에 띄는 결과가 없습니다.
현재 쿼리가 트랜잭션의 일부인 경우 취소는 전체 거래를 중단합니다.
PQREQUESTCANCEL안전하게 호출 할 수 있습니다 신호 핸들러에서. 따라서 사용하는 것도 가능합니다 평범한PQEXEC신호 처리기에서 취소 결정은 신호 처리기에서 이루어질 수 있습니다. 예를 들어,PSQL호출PQREQUESTCANCELSigint 신호 핸들러에서 대화식 무지개 토토의 대화식 취소 허용PQEXEC. 참고PQREQUESTCANCEL연결은 현재 열려 있지 않거나 백엔드가 현재 없습니다. 쿼리 처리.