thePQEXEC함수는 적합합니다
PQEXEC쿼리가 될 때까지 기다립니다
제어가 내부에 묻혀 있기 때문에PQEXEC, 프론트 엔드가 결정하기가 어렵습니다
PQEXEC하나만 반환 할 수 토토 결과SQL명령, 모두PQEXEC.
이러한 제한을 좋아하지 않는 응용 프로그램은 대신 할 수 토토 결과PQEXEC에서 구축되었습니다 :pqsendqueryandpqgetresult.
이 기능을 사용한 오래된 프로그램과pqputlineandpqputnbytes데이터를 보내기 위해 대기 대기를 차단할 수 토토 결과pqsetnonblocking추가되었습니다.
오래된 응용 프로그램은 사용을 무시할 수 토토 결과pqsetnonblocking잠재적으로 구식을 얻습니다pqsetnonblocking완전히 달성합니다
pqsetnonblocking
int pqsetnonblocking (pgconn *conn, int arg)arg 인 경우 비 블로킹에 연결 상태를 설정합니다.
비 차단 상태에서 전화pqputline, pqputnbytes, pqsendqueryandPQENDCOPY차단하지 않고 대신 돌아갑니다
데이터베이스 연결이 비 차단으로 설정되었을 때PQEXEC호출됩니다PQEXEC완료.
LIBPQ의 더 많은 사람들이 안전해질 것으로 예상됩니다pqsetnonblocking근처의 기능
pqisnonBlocking반환합니다
int pqisnonblocking (const pgconn *conn)연결이 비 블로킹 모드로 설정된 경우 true를 반환합니다.
pqsendquery쿼리 제출Postgres기다리지 않고
int pqsendquery (pgconn *conn,11831_11857pqsendquery, Callpqgetresult쿼리를 얻기 위해 한 번 이상pqsendquery호출 할 수 없습니다pqgetresultNULL을 반환하여
pqgetresult다음을 기다리십시오pqsendquery,
pgresult *pqgetresult (pgconn *conn);pqgetresult호출해야합니다pqgetresult한 번에 null을 반환합니다.) 각각pqgetresult동일한 pgresult 액세서를 사용하여 처리해야합니다PQCLEAR언제pqgetresult쿼리가 활성화되어 있고 필요한 경우에만 차단됩니다.pqconsumeInput.
사용pqsendqueryandpqgetresult를 해결합니다PQEXEC의 문제 : 쿼리 문자열에 포함 된 경우SQL명령, 결과pqgetresult여전히SQL명령. 이것은 피할 수 토토 결과
pqconsumeInput입력 인 경우
int pqconsumeInput (pgconn *conn);pqconsumeInput일반적으로 1PQERRORMESSAGEISpqconsumeInput, 신청서가 확인할 수 토토 결과PQISBUSY및/또는pqnotifies상태가 바뀌 었는지 확인하려면
pqconsumeInput호출 될 수 토토 결과select(2) 사라질 준비가 된 표시.pqconsumeInputselect즉시 조건
PQISBUSY쿼리가있는 경우 1을 반환합니다pqgetresultpqgetresult보증으로 호출 할 수 토토 결과
int pqisbusy (pgconn *conn);PQISBUSY그 자체가 시도하지 않을 것입니다pqconsumeInput먼저, 또는 바쁘다
pqflush플러시를 시도합니다
int pqflush (pgconn *conn);pqflushaselect응답이 도착했는지 확인하려면. 0 인 경우pqsetnonblocking이것에 대한 필요가 토토 결과.
pqsocket파일을 얻습니다
int pqsocket (const pgconn *conn);pqsocket획득하는 데 사용해야합니다select(2). 이것은 응용 프로그램을 허용합니다select(2)는 데이터를 읽을 수 있음을 나타냅니다pqconsumeInput데이터를 읽으려면 호출되어야합니다. 그 후,PQISBUSY, pqgetresult,pqnotifies처리에 사용될 수 있습니다
비 차단 연결 (사용한pqsetnonblocking) 사용하지 않아야selectpqflush0을 반환하여 거기에 있음을 나타냅니다
이러한 기능을 사용하는 일반적인 프론트 엔드에는 기본 루프가 있습니다.select(2) 모든 것을 기다립니다select의 용어는 파일에서 읽을 수있는 데이터입니다pqsocket. 언제pqconsumeInput입력을 읽으려면. 그렇다면 할 수 토토 결과PQISBUSY그 뒤에pqgetresultifPQISBUSY거짓 (0)을 반환합니다. 또한 전화 할 수 있습니다pqnotifies알림 메시지를 감지하려면 (참조
사용하는 프론트 엔드pqsendquery/pqgetresult아직 처리중인 쿼리를 취소하려고 할 수도 토토 결과.
pqRequestCancel요청Postgres포기 처리
int pqRequestCancel (pgconn *conn);취소 요청이 성공적으로 인 경우 반환 값이 1입니다.PQERRORMESSAGE왜 그렇지 않은지 알려줍니다.) 성공적인 파견pqRequestCancel, 응용 프로그램은 계속되어야합니다pqgetresult. 취소가 효과적이면
현재 쿼리가 트랜잭션의 일부인 경우
pqRequestCancel안전하게 할 수 토토 결과PQEXEC, ifPSQL호출pqRequestCancelSigint 신호 핸들러에서,PQEXEC. 참고pqRequestCancel