이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 32.4. 비동기 윈 토토 처리버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

31.4. 비동기 무지개 토토 처리

thePQEXEC함수는 적절합니다 정상적인 동기 응용 프로그램에서 무지개 토토을 제출합니다. 그것 그러나 몇 가지 결함이 있지만 일부 사용자 :

  • PQEXEC무지개 토토을 기다립니다 완료됩니다. 응용 프로그램은 다른 작업을 수행 할 수 있습니다 (예 : 사용자 인터페이스 유지 관리), 즉 응답 대기를 차단하고 싶지 않을 것입니다.

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

  • PQEXEC하나만 반환 할 수 있습니다pgresult구조. 만약 제출 된 무지개 토토 문자열은 여러SQL무지개 토토, 마지막pgresultPQEXEC.

  • PQEXEC항상 수집합니다 무지개 토토의 전체 결과, 단일로 버퍼링pgresult. 이것은 단순화되는 동안 응용 프로그램의 오류 처리 로직 많은 행이 포함 된 결과에 비현실적입니다.

이러한 제한을 좋아하지 않는 응용 프로그램은 대신 할 수 있습니다 의 기본 기능을 사용하십시오.PQEXEC에서 구축되었습니다 :pqsendqueryandpqgetresult. 또한pqsendqueryparams, pqsendprepare, pqsendqueryprepared, pqsendDescribrepreparedpqsenddescribePortalpqgetresult의 기능성pqexecparams, pqprepare, pqExecprepared, PQDESCREPREPAREDpqdescribePortal각각.

pqsendquery

기다리지 않고 서버에 무지개 토토을 제출합니다. 결과). 무지개 토토이 성공적으로 있으면 1이 반환됩니다 파견 된 경우 0이 아닌 경우 (어떤 경우 사용PQERRORMESSAGE더 많은 정보를 얻으려면 실패에 대해).

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

성공적으로 전화 한 후pqsendquery, Callpqgetresult얻을 수있는 한 번 이상 결과.pqsendquery(동일한 연결에서) 다시 호출 할 수 없습니다pqgetresulta 널 포인터, 무지개 토토이 완료되었음을 나타냅니다.

pqsendqueryparams

서버에 무지개 토토 및 별도의 매개 변수를 제출합니다 결과를 기다리지 않고 (들)

int pqsendqueryparams (pgconn *conn,
                      const char *명령,
                      int nparams,
                      const oid *paramtypes,
                      const char * const * paramvalues,
                      const int *paramlengths,
                      const int *faramformats,
                      int resultformat);

이것은에 해당합니다.pqsendquery15299_15459pqexecparams. 좋다pqexecparams, 그렇지 않을 것입니다 2.0 protocol 연결에서 작업하면 하나만 허용합니다 쿼리 문자열의 무지개 토토.

pqsendprepare

완료를 기다리지 않고 매개 변수가 주어진다.

int pqsendprepare (pgconn *conn,
                  const char *stmtname,
                  const char *쿼리,
                  int nparams,
                  const oid *paramtypes);

이것은 비동기 버전의입니다.pqprepare: 가능하면 1을 반환합니다 요청을 발송하고 그렇지 않은 경우 0. 성공 후 전화, 전화pqgetresultTO 서버가 성공적으로 생성했는지 여부를 결정하십시오 준비된 진술. 함수의 매개 변수가 처리됩니다 동일하게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 연결.

17999_18023

에 대한 정보를 얻기위한 요청을 제출합니다 대기하지 않고 지정된 준비된 진술 완성.

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

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

pqsenddescribePortal

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

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

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

pqgetresult

사전에서 다음 결과를 기다립니다pqsendquery, pqsendqueryparams, pqsendprepare, pqsendqueryprepared, pqsenddescribeprepared또는pqsenddescribePortal전화를 걸어 반환합니다 그것. 무지개 토토이 완료되면 널 포인터가 반환됩니다. 그리고 더 이상 결과가 없을 것입니다.

pgresult *pqgetresult (pgconn *conn);

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

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

사용pqsendqueryandpqgetresult를 해결합니다PQEXEC의 문제 : 무지개 토토 인 경우 문자열에는 여러 가지가 포함SQL무지개 토토, 해당 무지개 토토의 결과를 얻을 수 있습니다 개별적으로. (이것은 간단한 형태의 겹침을 허용합니다 그건 그렇고, 처리 : 클라이언트는 결과를 처리 할 수 ​​있습니다. 서버가 여전히 나중에 쿼리에서 작동하는 동안 하나의 무지개 토토 같은 무지개 토토 문자열.)

pqsendqueryandpqgetresult큰 쿼리 결과를 검색하고 있습니다 한 번에 행. 이것은에서 논의됩니다.섹션 31.5.

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

pqconsumeInput

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

int pqconsumeInput (pgconn *conn);

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

pqconsumeInput할 수 있습니다 응용 프로그램이 처리 할 준비가되지 않은 경우에도 호출 아직 결과 또는 알림. 함수가 읽습니다 사용 가능한 데이터 및 버퍼에 저장하여 A를 유발합니다.select ()읽기 준비 사라지는 징후. 따라서 응용 프로그램은 사용할 수 있습니다pqconsumeInputselect ()조건 즉시, 여가에서 결과를 조사하십시오.

PQISBUSY

무지개 토토이 바쁘면 1을 반환합니다. 즉,pqgetresult대기를 막을 것입니다 입력. 0 반환은를 나타냅니다.pqgetresult보증으로 호출 할 수 있습니다 차단되지 않음.

int pqisbusy (pgconn *conn);

PQISBUSY그 자체가 아닙니다 서버에서 데이터를 읽으려고 시도합니다. 그러므로pqconsumeInput먼저 호출되거나 바쁜 상태는 결코 끝나지 않을 것입니다.

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

사용하는 클라이언트pqsendquery/pqgetresulta 서버에서 여전히 처리중인 무지개 토토; 보다섹션 31.6. 그러나 반환 값pqcancel, 응용 프로그램은 정상 결과 읽기 순서를 계속해야합니다 사용pqgetresult. 성공 취소는 단순히 무지개 토토이 더 빨리 끝나게합니다 그렇지 않은 것보다.

위에서 설명한 함수를 사용하여 데이터베이스 서버에서 입력을 기다리는 동안 차단을 피하십시오. 그러나 응용 프로그램이 차단 될 가능성이 여전히 남아 있습니다. 서버로 출력을 보내기를 기다립니다. 이것은 비교적 드문 일입니다 매우 긴 SQL 명령 또는 데이터 값이 전송되면 발생할 수 있습니다. (응용 프로그램이를 통해 데이터를 전송하는 경우 훨씬 더 가능성이 높습니다복사,) 가능성과 완전히 비 차단 데이터베이스를 달성합니다 작동, 다음 추가 기능을 사용할 수 있습니다.

pqsetnonblocking

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

int pqsetnonblocking (pgconn *conn, int arg);

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

비 차단 상태에서 전화pqsendquery, pqputline, pqputnbytesPQENDCOPY대신 차단되지 않고 대신 다시 호출 해야하는 경우 오류를 반환합니다.

참고PQEXEC그렇지 않습니다 비 차단 모드를 존중하십시오. 그것이 호출되면, 그것은 행동합니다 어쨌든 패션 차단.

PqisnonBlocking

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

int pqisnonblocking (const pgconn *conn);

연결이 비 차단 모드로 설정된 경우 1 그리고 차단하면 0.

pqflush

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

int pqflush (pgconn *conn);

블로킹되지 않은 연결에 무지개 토토이나 데이터를 전송 한 후 부르다pqflush. 1이 반환되면 기다리십시오 소켓이 읽기 또는 쓰기 준비가되기 위해. 그것이되면 쓰기 준비, 전화pqflush다시. 만약에 읽기 준비가되어 콜pqconsumeInput, 전화pqflush다시. 까지 반복pqflush반환 0. (확인해야합니다 읽기 준비가되고 입력을 배수하려면pqconsumeInput, 서버가 차단할 수 있기 때문에 우리에게 데이터를 보내려고 (예 : 통지 메시지, 우리를 읽지 않을 것입니다 우리가 읽을 때까지 데이터.) 한 번pqflush0을 반환하고 소켓이 될 때까지 기다립니다 읽은 다음 위에서 설명한대로 응답을 읽으십시오.