32.4. 비동기 스포츠 토토 결과 처리#

thePQEXEC함수는 정상적인 동기 응용 프로그램에서 스포츠 토토 결과을 제출하기에 적합합니다. 그러나 일부 사용자에게는 중요 할 수있는 몇 가지 결함이 있습니다.

  • PQEXEC스포츠 토토 결과이 완료되기를 기다립니다. 응용 프로그램에는 다른 작업 (예 : 사용자 인터페이스 유지)이있을 수 있습니다.이 경우 응답 대기를 차단하고 싶지 않습니다.

  • 결과를 기다리는 동안 클라이언트 응용 프로그램의 실행이 중단되기 때문에 응용 프로그램이 진행중인 스포츠 토토 결과을 취소하려고 시도하기가 어렵습니다. (신호 핸들러에서 수행 할 수는 있지만 그렇지 않으면 수행 할 수 있습니다.)

  • PQEXEC하나만 반환 할 수 있습니다pgresult구조. 제출 된 스포츠 토토 결과 문자열에 다중가 포함 된 경우SQL스포츠 토토 결과, 마지막pgresultPQEXEC.

  • PQEXEC항상 스포츠 토토 결과의 전체 결과를 수집하여 단일로 버퍼링합니다pgresult. 이것은 응용 프로그램의 오류 처리 로직을 단순화하지만 많은 행이 포함 된 결과에 비현실적 일 수 있습니다.

이러한 제한을 좋아하지 않는 응용 프로그램은 대신의 기본 기능을 사용할 수 있습니다.PQEXEC에서 구축되었습니다 :pqsendqueryandpqgetresult. 또한pqsendqueryparams, pqsendprepare, pqsendqueryprepared, pqsendDescribreprepared, pqsenddescribePortal, PQSENDCLOSEPREPAREDPQSENDCLOSEPORTALpqgetresult의 기능을 복제하려면pqexecparams, pqprepare, pqExecprepared, PQDESCREPREPARED, pqdescribePortal pqclosepreparedPQCLOSEPORTAL각각.

pqsendquery #

결과를 기다리지 않고 서버에 스포츠 토토 결과을 제출합니다. 스포츠 토토 결과이 성공적으로 발송 된 경우 1이 반환되고 그렇지 않은 경우 0 (사용.PQERRORMESSAGE실패에 대한 자세한 정보를 얻으려면).

int pqsendquery (pgconn *conn, const char *command);

성공적으로 전화 한 후pqsendquery, Callpqgetresult결과를 얻기 위해 한 번 이상.pqsendquery(동일한 연결에서) 다시 호출 할 수 없습니다pqgetresult스포츠 토토 결과이 완료되었음을 나타내는 널 포인터를 반환했습니다.

파이프 라인 모드에서는이 기능이 허용되지 않습니다.

pqsendqueryparams #

결과를 기다리지 않고 스포츠 토토 결과과 별도의 매개 변수를 서버에 제출합니다.

int pqsendqueryparams (pgconn *conn,

이것은에 해당합니다.pqsendquery16244_16376pqexecparams. 좋다pqexecparams, 쿼리 문자열에서 하나의 스포츠 토토 결과 만 허용합니다.

pqsendprepare #

완료를 기다리지 않고 주어진 매개 변수로 준비된 스포츠 토토 결과문을 작성하라는 요청을 보냅니다.

int pqsendprepare (pgconn *conn,

이것은 비동기 버전의입니다.pqprepare: 요청을 파견 할 수있는 경우 1, 그렇지 않은 경우 0을 반환합니다. 성공적인 전화 후 전화pqgetresult서버가 준비된 스포츠 토토 결과문을 성공적으로 작성했는지 여부를 결정합니다. 함수의 매개 변수는 동일하게 처리됩니다.pqprepare.

pqsendqueryprepared #

결과를 기다리지 않고 주어진 매개 변수로 준비된 스포츠 토토 결과문을 실행하라는 요청을 보냅니다.

int pqsendqueryprepared (pgconn *conn,

이것은와 유사합니다.pqsendqueryparams, 그러나 실행되는 명령은 쿼리 문자열을 제공하는 대신 이전에 준비된 명령문을 지정하여 지정됩니다. 함수의 매개 변수는 동일하게 처리됩니다.pqExecprepared.

pqsendDescribreprepared #

완료를 기다리지 않고 지정된 준비된 진술에 대한 정보를 얻으려는 요청을 제출합니다.

int pqsenddescribeprepared (pgconn *conn, const char *stmtname);

이것은 비동기 버전의입니다.PQDESCREPREPARED: 요청을 파견 할 수있는 경우 1, 그렇지 않은 경우 0을 반환합니다. 성공적인 전화 후 전화pqgetresult결과를 얻으려면. 함수의 매개 변수는 동일하게 처리됩니다.PQDESCREPREPARED.

pqsenddescribePortal #

완료를 기다리지 않고 지정된 포털에 대한 정보를 얻기위한 요청을 제출합니다.

int pqsenddescribePortal (pgconn *conn, const char *portalname);

이것은 비동기 버전의입니다.pqdescribePortal: 요청을 파견 할 수있는 경우 1, 그렇지 않은 경우 0을 반환합니다. 성공적인 전화 후 전화pqgetresult결과를 얻으려면. 함수의 매개 변수는 동일하게 처리됩니다.pqdescribePortal.

PQSENDCLOSEPREPARED #

완료를 기다리지 않고 지정된 준비된 진술을 닫으라는 요청을 제출합니다.

int pqsendcloseprepared (pgconn *conn, const char *stmtname);

이것은 비동기 버전의입니다.pqcloseprepared: 요청을 파견 할 수있는 경우 1, 그렇지 않은 경우 0을 반환합니다. 성공적인 전화 후 전화pqgetresult결과를 얻으려면. 함수의 매개 변수는 동일하게 처리됩니다.pqcloseprepared.

PQSENDCLOSEPORTAL #

완료를 기다리지 않고 지정된 포털을 닫기위한 요청을 제출합니다.

int pqsendcloseportal (pgconn *conn, const char *portalname);

이것은 비동기 버전의입니다.PQCLOSEPORTAL: 요청을 파견 할 수있는 경우 1, 그렇지 않은 경우 0을 반환합니다. 성공적인 전화 후 전화pqgetresult결과를 얻으려면. 함수의 매개 변수는 동일하게 처리됩니다.PQCLOSEPORTAL.

pqgetresult #

사전에서 다음 결과를 기다립니다pqsendquery, pqsendqueryparams, pqsendprepare, pqsendqueryprepared, pqsendDescribreprepared, pqsenddescribePortal, PQSENDCLOSEPREPARED, PQSENDCLOSEPORTAL, PQSENDPIPELINESYNC또는PQPIPELINESYNC전화를 걸어 반환합니다. 스포츠 토토 결과이 완료되면 널 포인터가 반환되고 더 이상 결과가 없습니다.

pgresult *pqgetresult (pgconn *conn);

pqgetresult스포츠 토토 결과이 완료되었음을 나타내는 널 포인터를 반환 할 때까지 반복적으로 호출해야합니다. (스포츠 토토 결과이 활성화되지 않은 경우 호출되면pqgetresult한 번에 널 포인터를 반환합니다.) 각각의 비 널은의 결과입니다.pqgetresult동일한 것을 사용하여 처리해야합니다pgresult앞에서 설명한 액세서 기능. 로 각 결과 객체를 자유롭게하는 것을 잊지 마십시오.PQCLEAR완료되면. 참고pqgetresult스포츠 토토 결과이 활성화되고 필요한 응답 데이터가 아직 읽지 않은 경우에만 차단됩니다pqconsumeInput .

파이프 라인 모드에서pqgetresult오류가 발생하지 않는 한 정상적으로 반환됩니다. 다음 동기화 지점까지 오류를 일으킨 후에 전송 된 후속 쿼리의 경우, 다음 동기화 지점까지 (유형의 특별한 결과)pgres_pipeline_aborted가 반환되고 널 포인터가 반환됩니다. 파이프 라인 동기화 지점에 도달하면 유형의 결과pgres_pipeline_sync반환됩니다. 동기화 지점 후 다음 쿼리의 결과는 즉시 뒤 따릅니다 (즉, 동기화 지점 후에는 널 포인터가 반환되지 않습니다)..

Note

때도pqresultstatus치명적인 오류를 나타냅니다.pqgetresult허용하기 위해 널 포인터를 반환 할 때까지 호출해야합니다libpq오류 정보를 완전히 처리하려면

사용pqsendqueryandpqgetresultPQEXEC의 문제 : 스포츠 토토 결과 문자열에 다중 포함 된 경우SQL스포츠 토토 결과, 해당 스포츠 토토 결과의 결과는 개별적으로 얻을 수 있습니다. (이렇게하면 간단한 형태의 중첩 처리가 가능합니다. 그건 그렇고, 클라이언트는 서버가 동일한 스포츠 토토 결과 문자열에서 나중에 쿼리에서 여전히 작동하는 동안 하나의 스포츠 토토 결과의 결과를 처리 할 수 ​​있습니다.).

pqsendqueryandpqgetresult큰 쿼리 결과를 검색하고 있습니다. 이것은에서 논의됩니다.PostgreSQL : 문서 : 17 : 32.6. 토토 커뮤니티 검색 결과 chunks.

그 자체로, 전화pqgetresult서버가 다음을 완료 할 때까지 클라이언트가 여전히 차단하게됩니다SQL명령. 두 가지 기능을 올바르게 사용하여 피할 수 있습니다.

pqconsumeInput #

서버에서 입력을 사용할 수 있으면 소비하십시오.

int pqconsumeInput (pgconn *conn);

pqconsumeInput일반적으로 반환 1 표시오류 없음, 그러나 어떤 종류의 문제가 있으면 0을 반환합니다 (어떤 경우.PQERRORMESSAGE참조 할 수 있습니다). 결과는 입력 데이터가 실제로 수집되었는지 여부를 말하지 않습니다.pqconsumeInput, 응용 프로그램이 확인할 수 있습니다PQISBUSY및/또는pqnotifies상태가 바뀌 었는지 확인하려면

pqconsumeInput응용 프로그램이 아직 결과 나 알림을 처리 할 준비가되어 있지 않더라도 호출 할 수 있습니다. 함수는 사용 가능한 데이터를 읽고 버퍼에 저장하여 A를 유발합니다.select ()사라질 준비가 된 표시. 따라서 응용 프로그램은 사용할 수 있습니다pqconsumeInputselect ()즉시 조건을 한 다음 여가에서 결과를 검사하십시오.

PQISBUSY #

스포츠 토토 결과이 바쁜 경우 1, 즉 반환 1pqgetresult입력 대기 대기 블록. 0 반환은를 나타냅니다.pqgetresult차단되지 않는다는 확신으로 호출 할 수 있습니다.

int pqisbusy (pgconn *conn);

PQISBUSY자체가 서버에서 데이터를 읽으려고 시도하지 않습니다. 그러므로pqconsumeInput먼저 호출되어야합니다. 그렇지 않으면 바쁜 상태가 끝나지 않을 것입니다.

이러한 함수를 사용하는 일반적인 응용 프로그램은 사용하는 기본 루프가 있습니다select ()또는poll ()응답 해야하는 모든 조건을 기다리려면. 조건 중 하나는 서버에서 사용할 수있는 입력이며select ()|pqsocket. 기본 루프가 입력 준비를 감지하면 호출해야합니다pqconsumeInput입력을 읽으려면. 그런 다음 호출 할 수 있습니다PQISBUSY그 뒤에pqgetresultifPQISBUSY거짓 (0)을 반환합니다. 또한 전화 할 수 있습니다pqnotifies감지하려면Notify메시지 (참조섹션 32.9).

사용하는 클라이언트pqsendquery/pqgetresult서버에서 여전히 처리중인 스포츠 토토 결과을 취소하려고 시도 할 수도 있습니다. 보다PostgreSQL : 문서 : 17 : 32.7. 진행중인 쿼리 배트맨 토토. 그러나 반환 값에 관계없이pqcancelblocking, 응용 프로그램은를 사용하여 일반 결과 읽기 순서를 계속 유지해야합니다.pqgetresult. 성공적인 취소는 단순히 스포츠 토토 결과이 다른 것보다 빨리 종료 될 것입니다..

위에서 설명한 함수를 사용하여 데이터베이스 서버에서 입력을 기다리는 동안 차단을 피할 수 있습니다. 그러나 응용 프로그램이 출력을 서버로 전송하기 위해 대기 대기를 차단할 수 있습니다.복사)

pqsetnonBlocking #

연결의 비 차단 상태를 설정합니다.

int pqsetnonblocking (pgconn *conn, int arg);

비 블로킹에 연결 상태를 설정합니다. ifargIS 1 또는 if 차단argIS 0. OK 인 경우 0, 오류 인 경우 -1을 반환합니다.

비 차단 상태에서 성공적인 호출pqsendquery, pqputline, pqputnbytes, pqputcopydataPQENDCOPY차단하지 않을 것입니다. 그들의 변경은 플러시 될 때까지 로컬 출력 버퍼에 저장됩니다.

참고PQEXEC비 차단 모드를 존중하지 않습니다. 그것이 부름을 받으면 어쨌든 패션을 차단하는 데 행동 할 것입니다.

pqisnonBlocking #

데이터베이스 연결의 차단 상태를 반환합니다.

int pqisnonblocking (const pgconn *conn);

연결이 차단 모드로 설정된 경우 1이고 차단하면 0을 반환합니다.

pqflush #

대기열 출력 데이터를 서버로 플러시하려고 시도합니다. 성공한 경우 (또는 전송 큐가 비어있는 경우), 어떤 이유로 실패한 경우 -1 또는 1 또는 1이 전송 큐에서 모든 데이터를 전송할 수없는 경우 1을 반환합니다 (이 경우 연결이 차단되지 않은 경우에만 발생할 수 있음)..

int pqflush (pgconn *conn);

비 차단 연결에 스포츠 토토 결과이나 데이터를 보내고 나면 hallpqflush. 1이 반환되면 소켓이 읽거나 쓰기 준비가 될 때까지 기다립니다.pqflush다시. 읽기 준비가되면 전화pqconsumeInput, 전화pqflush다시. 까지 반복pqflush반환 0. (읽기 준비를 확인하고 입력을 배출해야합니다pqconsumeInput, 서버가 우리에게 데이터를 보내려고 시도 할 수 있기 때문에, 예를 들어 통지 메시지를 보내고, 읽을 때까지 데이터를 읽지 않기 때문입니다.)pqflush0을 반환하고 소켓을 읽을 때까지 기다린 다음 위에서 설명한대로 응답을 읽습니다.

정정 제출

문서에 올바른 것이 없다면 일치하지 않습니다.이 양식문서 문제를보고하려면