thePQEXEC
함수는 적절합니다
간단한 동기 응용 프로그램에서 명령을 제출합니다. 그것
그러나 몇 가지 주요 결함이 윈 토토 :
PQEXEC
명령을 기다립니다
완료됩니다. 응용 프로그램은 다른 작업을 수행 할 수 윈 토토
(예 : 사용자 인터페이스 유지 관리), 즉
응답 대기를 차단하고 싶지 않을 것입니다.
제어가 내부에 묻혀 있기 때문에PQEXEC
, 프론트 엔드가 어렵습니다
진행중인 명령을 취소하려고합니다.
(신호 핸들러에서 수행 할 수는 있지만
그렇지 않으면.)
PQEXEC
하나만 반환 할 수 윈 토토pgresult구조. 만약
제출 된 명령 문자열은 여러SQL명령, 마지막pgresultPQEXEC
.
이러한 제한을 좋아하지 않는 응용 프로그램은 대신 할 수 윈 토토
의 기본 기능을 사용하십시오.PQEXEC
에서 구축되었습니다 :pqsendquery
andpqgetresult
.
이 기능을 사용한 이전 프로그램과pqputline
andpqputnbytes
데이터를 보내기 위해 대기 대기를 차단할 수 윈 토토
백엔드. 그 문제를 해결하기 위해 함수pqsetnonBlocking
추가되었습니다.
오래된 응용 프로그램은 사용을 무시할 수 윈 토토pqsetnonBlocking
잠재적으로 구식을 얻습니다
행동 차단. 최신 프로그램을 사용할 수 윈 토토pqsetnonblocking
완전히 달성합니다
백엔드에 대한 비 차단 연결.
pqsetnonblocking
연결의 차단 상태.
int pqsetnonblocking (pgconn *conn, int arg)
if 비 블록에 연결 상태를 설정합니다.arg
IS 1, if 차단arg
는 0입니다. OK 인 경우 0, -1
오류 인 경우.
비 차단 상태에서pqputline
, PQPUTNBYTES
, pqsendquery
andPQENDCOPY
차단하지 않고 대신 돌아갑니다
다시 호출 해야하는 경우 오류입니다.
데이터베이스 연결이 비 차단으로 설정된 경우
모드 및PQEXEC
라고 불립니다
차단 연결 상태를 일시적으로 설정합니다.
까지PQEXEC
완료.
더 많은libpq가 예상됩니다
안전하게 만들기pqsetnonBlocking
가까운 기능
미래.
PqisnonBlocking
반환합니다
데이터베이스 연결 상태 차단.
int pqisnonblocking (const pgconn *conn)
반환 1 연결이 비 차단 모드로 설정된 경우 0, 0 차단하면.
pqsendquery
명령 제출
결과를 기다리지 않고 서버에. 1입니다
명령이 성공적으로 발송 된 경우 반환, 0이 아닌 경우 0
(이 경우 사용PQERRORMESSAGE
더 많은 정보를 얻으려면
실패에 대해).
int pqsendquery (pgconn *conn, const char *query);
성공적으로 전화 한 후pqsendquery
, Callpqgetresult
결과.pqsendquery
그렇지 않을 수 윈 토토
다시 전화 (같은 연결에서)까지pqgetresult
NULL을 반환했습니다
명령이 완료되었습니다.
pqgetresult
기다려주세요
다음 결과 이전의 결과pqsendquery
를 반환하십시오. 널입니다
쿼리가 완료되면 반환되고 더 이상 없을 것입니다.
결과.
pgresult *pqgetresult (pgconn *conn);
pqgetresult
호출해야합니다
NULL을 반환 할 때까지 반복적으로 명령을 나타냅니다
완료되었습니다. (명령이 활성화되지 않은 경우 호출되면pqgetresult
한 번에 null을 반환합니다.)
각각이 아닌 각각의 결과pqgetresult
를 사용하여 처리해야합니다
이전에 설명한 동일한 pgresult 액세서 기능. 하지 않다
로 각 결과 객체를 제거하는 것을 잊어 버리십시오.PQCLEAR
완료되면. 참고pqgetresult
쿼리가 활성화되어 있고 필요한 응답 데이터는 아직 없습니다.pqconsumeInput
.
사용pqsendquery
andpqgetresult
을 해결합니다.PQEXEC
의 문제 : 명령 인 경우
문자열에는 여러 가지가 포함SQL명령, 해당 명령의 결과를 얻을 수 있습니다
개별적으로. (이것은 간단한 형태의 겹침을 허용합니다
그런데 윈 토토 : 프론트 엔드는 결과를 윈 토토 할 수 있습니다.
백엔드가 여전히 나중에 쿼리에서 작동하는 동안 하나의 쿼리 중
같은 명령 문자열에서.) 그러나 호출pqgetresult
여전히 프론트 엔드가 발생합니다
백엔드가 다음을 완료 할 때까지 차단SQL명령. 이것은 적절하게 피할 수 있습니다
세 가지 기능 사용 :
pqconsumeInput
입력 인 경우
백엔드에서 사용할 수 있습니다.
int pqconsumeInput (pgconn *conn);
pqconsumeInput
정상적으로
반환 1 표시"오류 없음",
그러나 어떤 종류의 문제가 있으면 0을 반환합니다 (
사례PQERRORMESSAGE
설정).
결과는 입력 데이터가 있는지 여부를 말하지 않습니다.
실제로 수집되었습니다. 전화 후pqconsumeInput
, 신청서가 확인할 수 윈 토토PQISBUSY
및/또는pqnotifies
주 상태가 있는지 확인합니다
변경.
pqconsumeInput
호출 될 수 있습니다
응용 프로그램이 결과를 처리 할 준비가되어 있지 않더라도
또는 아직 알림. 루틴은 사용 가능합니다
데이터를 데이터로 저장하여 버퍼에 저장하여 A를 유발합니다.select ()
사라질 준비가 된 표시.
따라서 응용 프로그램은 사용할 수 있습니다pqconsumeInput
select ()
즉시 조건
레저에서 결과를 검사하십시오.
PQISBUSY
a
쿼리는 바쁘다, 즉pqgetresult
입력 대기 대기 블록.
0 반환은를 나타냅니다.pqgetresult
보증으로 호출 할 수 윈 토토
차단되지 않습니다.
int pqisbusy (pgconn *conn);
PQISBUSY
그 자체가 아닙니다
백엔드에서 데이터를 읽으려고 시도합니다. 그러므로pqconsumeInput
먼저 호출해야합니다
바쁜 상태는 결코 끝나지 않을 것입니다.
pqflush
플러시를 시도합니다
백엔드에 대기하는 데이터는 성공한 경우 0을 반환합니다 (또는
보내기 대기열이 비어 윈 토토) 또는eofIF IT
어떤 이유로 실패했습니다.
int pqflush (pgconn *conn);
pqflush
호출해야합니다
호출하기 전에 비 차단 연결에서select ()
응답이 있는지 확인합니다
도착했다. 0이 반환되면 데이터가 없도록합니다.
실제로 전송되지 않은 백엔드로 대기했습니다. 오직
사용한 응용 프로그램pqsetnonBlocking
이것에 대한 필요가 윈 토토.
pqsocket
파일을 얻습니다
백엔드 연결 소켓의 디스크립터 번호. 유효한
설명자는 = 0입니다. -1의 결과는 아니오를 나타냅니다
백엔드 연결이 현재 열려 있습니다.
int pqsocket (const pgconn *conn);
pqsocket
익숙해 져야합니다
준비하여 백엔드 소켓 디스크립터를 얻으십시오
실행select ()
. 이것은 허용합니다
차단 연결을 사용한 응용 프로그램 중 하나를 기다립니다.
백엔드 응답 또는 기타 조건. 의 결과 인 경우select ()
해당 데이터를 나타냅니다
백엔드 소켓에서 읽을 수 윈 토토pqconsumeInput
를 읽도록 호출해야합니다
데이터; 그 후,PQISBUSY
,
pqgetresult
및/또는pqnotifies
익숙해 질 수 있습니다
응답 윈 토토.
비 차단 연결 (사용한)pqsetnonBlocking
) 사용하지 않아야select ()
TLEALEpqflush
0을 반환했습니다
버퍼링 된 데이터는
백엔드.
이러한 기능을 사용하는 일반적인 프론트 엔드에는 기본 루프가 있습니다.
사용select
모두를 기다리려면
응답해야 할 조건. 조건 중 하나
백엔드에서 입력 할 수 윈 토토.select
의 용어는 파일에서 읽을 수있는 데이터입니다
에 의해 식별 된 설명 자pqsocket
.
기본 루프가 입력 준비를 감지하면 호출해야합니다pqconsumeInput
입력을 읽으려면.
그런 다음 호출 할 수 있습니다PQISBUSY
에 의해pqgetresult
ifPQISBUSY
거짓 (0)을 반환합니다. 또한 전화 할 수 윈 토토pqnotifies
알림을 감지합니다
메시지 (참조섹션 1.6).
사용하는 프론트 엔드pqsendquery
/pqgetresult
취소를 시도 할 수도 있습니다
백엔드에 의해 여전히 처리중인 명령.
PQREQUESTCANCEL
요청postgresql포기
현재 명령 처리.
int pqRequestCancel (pgconn *conn);
취소 요청이있는 경우 반환 값은 1입니다.
성공적으로 파견되지 않으면 0. (그렇지 않은 경우PQERRORMESSAGE
왜 그렇지 않은지 알려줍니다.) 성공
파견은 요청에
그러나 효과. 반환 값에 관계없이PQREQUESTCANCEL
,
응용 프로그램은 일반 결과 읽기를 계속해야합니다
사용 시퀀스pqgetresult
. 만약에
취소는 효과적이며 현재 명령은 의지합니다
일찍 종료하고 오류 결과를 반환하십시오. 만약
취소가 실패합니다 (예 : 백엔드가 이미 완료 되었기 때문에
명령 처리), 그러면 눈에 보이는 결과가 없습니다.
조금도.
현재 명령이 트랜잭션의 일부인 경우 취소는 전체 거래를 중단합니다.
PQREQUESTCANCEL
안전하게 할 수 있습니다
신호 핸들러에서 호출. 따라서 사용하는 것도 가능합니다
평원과 함께PQEXEC
,
신호 윈 토토기에서 취소 결정을 내릴 수있는 경우. 을 위한
예,PSQL호출PQREQUESTCANCEL
에서Sigint신호 핸들러, 따라서 허용
대화식 쿼리의 대화식 취소를 통해 발행PQEXEC
. 참고PQREQUESTCANCEL
연결은 현재 열려 있지 않거나 백엔드가 현재 없습니다.
명령 처리.