토토 9.3.25 문서 | ||||
---|---|---|---|---|
PostgreSQL : 문서 : 9.3 : 토토 커뮤니티 실행 함수 | PostgreSQL : 문서 : 9.3 : LIBPQ -C 토토 커뮤니티 | 31 장.libpq-C 라이브러리 | 다음 |
thePQEXEC
함수는 적절합니다
정상적인 동기 응용 프로그램에서 명령을 제출합니다. 가지고 있습니다
그러나 몇 가지 결함은 일부 사람들에게 중요 할 수 있습니다.
사용자 :
PQEXEC
명령이 될 때까지 기다립니다
완전한. 응용 프로그램은 다른 작업을 수행 할 수 있습니다 (예 :
사용자 인터페이스 유지),이 경우 차단하고 싶지 않습니다.
응답을 기다리고 있습니다.
클라이언트 응용 프로그램의 실행이 중단되므로 결과를 기다립니다. 응용 프로그램이 결정하기가 어렵습니다. 진행중인 명령을 취소하려고합니다. (그럴 수 있습니다 신호 핸들러에서 완료되었지만 그렇지 않으면.)
PQEXEC
하나만 반환 할 수 있습니다pgresult구조. 제출 된 경우
명령 문자열에는 여러 가지SQL명령, 마지막pgresultPQEXEC
.
PQEXEC
항상 수집합니다
명령의 전체 결과, 단일로 버퍼링pgresult. 이것은 오류 처리를 단순화하지만
응용 프로그램의 논리, 결과에 비현실적 일 수 있습니다.
많은 행이 포함되어 있습니다.
이러한 제한이 마음에 들지 않는 응용 프로그램은 대신 사용할 수 있습니다.
기본 기능PQEXEC
에서 구축되었습니다 :pqsendquery
and토토
. 또한pqsendqueryparams
, pqsendprepare
, pqsendqueryprepared
, pqsenddescribreprepared
및pqsenddescribePortal
토토
의 기능성pqexecparams
,
pqprepare
, pqExecprepared
, pqdescribeprepared
및pqdescribePortal
각각.
pqsendquery
기다리지 않고 서버에 명령을 제출합니다.
결과). 명령이 성공적으로 발송 된 경우 1이 반환됩니다
그리고 0이 아닌 경우 0 (어떤 경우 사용PQERRORMESSAGE
에 대한 자세한 정보를 얻으려면
실패).
int pqsendquery (pgconn *conn, const char *command);
성공적으로 전화 한 후pqsendquery
, Call토토
결과.pqsendquery
호출 할 수 없습니다
다시 (같은 연결에)까지토토
Null 포인터를 반환했습니다.
명령이 완료되었음을 나타냅니다.
pqsendqueryparams
명령과 별도의 매개 변수를 서버에 제출합니다. 결과를 기다리고 있습니다.
int pqsendqueryparams (pgconn *conn, const char *명령, int nparams, const oid *paramtypes, const char * const * paramvalues, const int *paramlengths, const int *faramformats, int resultformat);
이것은에 해당합니다.pqsendquery
14774_14910pqexecparams
. 좋다pqexecparams
, 2.0 protocol에서는 작동하지 않습니다
연결 및 쿼리에서 하나의 명령 만 허용합니다.
끈.
pqsendprepare
주어진과 함께 준비된 명령문을 작성하라는 요청을 보냅니다. 완료를 기다리지 않고 매개 변수.
int pqsendprepare (pgconn *conn, const char *stmtname, const char *쿼리, int nparams, const oid *paramtypes);
이것은 비동기 버전의입니다.pqprepare
: 가능하면 1을 반환합니다
요청을 발송하고 그렇지 않은 경우 0. 성공적인 전화 후 전화토토
서버는 준비된 명령문을 성공적으로 작성했습니다. 기능
매개 변수는 동일하게 처리됩니다pqprepare
. 좋다pqprepare
, 2.0 protocol에서는 작동하지 않습니다
사이.
pqsendqueryprepared
주어진 상태에서 준비된 진술을 실행하라는 요청을 보냅니다. 결과를 기다리지 않고 매개 변수.
int pqsendqueryprepared (pgconn *conn, const char *stmtname, int nparams, const char * const * paramvalues, const int *paramlengths, const int *faramformats, int resultformat);
이것은와 유사합니다.pqsendqueryparams
이지만 실행되는 명령
대신 이전에 준비된 진술을 명명하여 지정됩니다
쿼리 문자열 제공. 함수의 매개 변수가 처리됩니다
동일하게pqExecprepared
. 좋다pqExecprepared
, 작동하지 않습니다
2.0 protocol 연결.
pqsendDescribreprepared
지정된 정보를 얻기위한 요청을 제출합니다 완성을 기다리지 않고 준비된 진술.
int pqsenddescribeprepared (pgconn *conn, const char *stmtname);
이것은 비동기 버전의입니다.pqdescribePrepared
: 가능하면 1이 반환됩니다
요청을 파견하고 그렇지 않은 경우 0. 성공적인 전화 후
부르다토토
결과. 함수의 매개 변수는 동일하게 처리됩니다.PQDESCREPREPARED
. 좋다PQDESCREPREPARED
, 작동하지 않습니다
2.0 protocol 연결.
PQSENDDESCRIPEPORTAL
지정된 정보를 얻기위한 요청을 제출합니다 완성을 기다리지 않고 포털.
int pqsenddescribePortal (pgconn *conn, const char *portalname);
이것은 비동기 버전의입니다.pqdescribePortal
: 가능하면 1을 반환합니다
요청을 발송하고 그렇지 않은 경우 0. 성공적인 전화 후 전화토토
결과를 얻으려면.
함수의 매개 변수는 동일하게 처리됩니다.pqdescribePortal
. 좋다pqdescribePortal
, 작동하지 않습니다
2.0 protocol 연결.
토토
사전에서 다음 결과를 기다립니다pqsendquery
, pqsendqueryparams
, pqsendprepare
, pqsendqueryprepared
, pqsenddescribreprepared
또는pqsendDescribePortal
전화를 걸어 반환합니다. 널
명령이 완료되면 포인터가 반환되고
더 이상 결과가 없습니다.
pgresult *토토 (pgconn *conn);
토토
호출해야합니다
널 포인터를 반환 할 때까지 반복적으로
명령이 완료되었습니다. (명령이 활성화되지 않은 경우 호출되면토토
그냥 널 포인터를 반환합니다
한 번.) 각각이 아닌 각각의 결과는토토
동일한 것을 사용하여 처리해야합니다pgresult액세서 기능 이전
설명. 로 각 결과 객체를 자유롭게하는 것을 잊지 마십시오.PQCLEAR
완료되면. 참고토토
a
명령은 활성화되어 있으며 필요한 응답 데이터는 아직 없었습니다.
읽기pqconsumeInput
.
참고 :때도
pqresultstatus
치명적인 오류를 나타냅니다.토토
까지 전화해야합니다 허용하려면 널 포인터를 반환합니다libpq오류 정보를 처리합니다 완전히.
사용pqsendquery
and토토
를 해결합니다PQEXEC
의 문제 : 명령 문자열에 포함 된 경우
다수의SQL명령,
이러한 명령의 결과는 개별적으로 얻을 수 있습니다. (이것
그건 그렇고 간단한 형태의 중첩 처리를 허용합니다.
클라이언트는 서버가있는 동안 하나의 명령 결과를 처리 할 수 있습니다.
동일한 명령 문자열에서 나중에 쿼리를 계속하고 있습니다.)
pqsendquery
and토토
큰 쿼리 결과를 검색하고 있습니다
한 번에 행. 이것은에서 논의됩니다.섹션 31.5.
그 자체로, 전화토토
서버가 완료 될 때까지 클라이언트가 여전히 차단하게됩니다.
다음SQL명령. 이것은 될 수 있습니다
두 가지 기능을 올바르게 사용하여 피합니다.
pqconsumeInput
서버에서 입력을 사용할 수 있으면 소비하십시오.
int pqconsumeInput (pgconn *conn);
pqconsumeInput
일반적으로 1
표시"오류 없음"이지만 0을 반환합니다
어떤 종류의 문제가있었습니다 (어떤 경우PQERRORMESSAGE
상담 할 수 있습니다). 주목하십시오
결과는 입력 데이터가 실제로 수집되었는지 여부는 말하지 않습니다.
전화 후pqconsumeInput
,
응용 프로그램이 확인할 수 있습니다PQISBUSY
및/또는pqnotifies
주 상태가 있는지 확인합니다
변경.
pqconsumeInput
도 호출 할 수 있습니다
신청서가 결과를 처리 할 준비가되지 않은 경우
아직 알림. 기능은 사용 가능한 데이터를 읽습니다
버퍼에 저장하여 A를 유발합니다.select ()
사라질 준비가 된 표시. 그만큼
따라서 응용 프로그램은 사용할 수 있습니다pqconsumeInput
select ()
즉시 조건을 확인한 다음 검사하십시오
여가의 결과.
PQISBUSY
반환 1 명령이 바쁜 경우, 즉토토
입력 대기 대기 블록. A 0
반환은를 나타냅니다.토토
can
차단하지 않는다는 확신으로 부름을 받으십시오.
int pqisbusy (pgconn *conn);
PQISBUSY
그 자체가 시도하지 않을 것입니다
서버에서 데이터를 읽으려면; 그러므로pqconsumeInput
먼저, 또는 바쁘다
상태는 결코 끝나지 않을 것입니다.
이러한 함수를 사용하는 일반적인 응용 프로그램은 주된 것입니다.
사용하는 루프select ()
또는poll ()
모든 조건을 기다리려면
응답해야합니다. 조건 중 하나가 입력됩니다
서버에서 사용할 수 있으며select ()
파일에서 읽을 수있는 데이터를 의미합니다
에 의해 식별 된 설명 자pqsocket
.
기본 루프가 입력 준비를 감지하면 호출해야합니다pqconsumeInput
입력을 읽으려면. 그렇다면 할 수 있습니다
부르다PQISBUSY
그 뒤에토토
ifPQISBUSY
거짓 (0)을 반환합니다. 또한 전화 할 수 있습니다pqnotifies
감지하려면알림메시지 (참조섹션 31.8).
사용하는 클라이언트pqsendquery
/토토
명령을 취소하려고 시도 할 수도 있습니다
그것은 여전히 서버에 의해 처리되고 있습니다. 보다섹션 31.6. 그러나 반환에 관계없이
의 가치pqcancel
, 응용 프로그램
를 사용하여 일반 결과 읽기 시퀀스를 계속해야합니다.토토
. 성공
취소는 단순히 명령이 더 빨리 종료됩니다.
그렇지 않으면.
위에서 설명한 기능을 사용하여 피할 수 있습니다. 데이터베이스 서버에서 입력을 기다리는 동안 차단. 하지만, 응용 프로그램이 대기 대기를 차단할 가능성이 여전히 남아 있습니다. 출력을 서버로 보냅니다. 이것은 비교적 드문 일이지만 가능합니다 매우 긴 SQL 명령 또는 데이터 값이 전송되면 발생합니다. (그것은 응용 프로그램이를 통해 데이터를 전송하는 경우 훨씬 더 가능성이 있습니다.복사,) 그러나이 가능성을 방지하기 위해 완전히 비 차단 데이터베이스 작업, 다음을 달성하십시오 추가 기능을 사용할 수 있습니다.
pqsetnonBlocking
연결의 비 차단 상태를 설정합니다.
int pqsetnonblocking (pgconn *conn, int arg);
비 블로킹에 연결 상태를 설정합니다. ifargIS 1 또는 if 차단argIS 0. OK 인 경우 0, 오류 인 경우 -1을 반환합니다.
비 블로킹 상태에서pqsendquery
, pqputline
, PQPUTNBYTES
및PQENDCOPY
차단하지 않고 대신 an을 반환합니다
다시 호출 해야하는 경우 오류.
참고PQEXEC
존경하지 않습니다
비 차단 모드; 그것이 호출되면, 그것은 패션을 차단하는 데 작용합니다
그래도.
pqisnonBlocking
데이터베이스 연결의 차단 상태를 반환합니다.
int pqisnonblocking (const pgconn *conn);
연결이 비 차단 모드로 설정된 경우 1이고 if 0 인 경우 1 블로킹.
pqflush
대기열 출력 데이터를 서버로 플러시하려고 시도합니다. 보고 0 성공한 경우 (또는 보내기 큐가 비어있는 경우), -1 실패한 경우 -1 어떤 이유로 든 또는 모든 데이터를 보낼 수없는 경우 1 아직 큐를 보내십시오 (이 경우 연결이있는 경우에만 발생할 수 있습니다. 비 차단).
int pqflush (pgconn *conn);
비 차단 연결에 대한 명령 또는 데이터를 전송 한 후
부르다pqflush
. 1이 반환되면 기다리십시오
소켓이 읽기 또는 쓰기 준비가되기 위해. 그것이되면
쓰기 준비, 전화pqflush
다시. 만약에
읽기 준비가되어 콜pqconsumeInput
, 그런 다음 호출pqflush
다시. 까지 반복27547_27556
반환 0. (확인해야합니다
읽기 준비와 입력을 배수pqconsumeInput
, 서버가 차단 될 수 있기 때문입니다
우리에게 데이터를 보내려고 (예 : 통지 메시지, 우리를 읽지 않을 것입니다
우리가 읽을 때까지 데이터.) 한 번pqflush
0을 반환하고 소켓을 읽을 때까지 기다린 다음
위에서 설명한 응답.