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

32.4. 비동기 스포츠 토토 사이트 처리#

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

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

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

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

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

이러한 제한이 마음에 들지 않는 응용 프로그램은 대신의 기본 기능을 사용할 수 있습니다.PQEXEC에서 구축되었습니다 :pqsendquerypqgetresult. 또한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,
                      const char *명령,
                      int nparams,
                      const oid *paramtypes,
                      const char * const * paramvalues,
                      const int *paramlengths,
                      const int *faramformats,
                      int resultformat);

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

pqsendprepare #

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

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

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

pqsendqueryprepared #

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

int pqsendqueryprepared (pgconn *conn,
                        const char *stmtname,
                        int nparams,
                        const char * const * paramvalues,
                        const int *paramlengths,
                        const int *faramformats,
                        int resultformat);

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

pqsendDescribreprepared #

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

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

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

PQSENDDESCRIPEPORTAL #

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

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, PQSENDDESCRIPEPORTAL, 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오류 정보를 완전히 처리하려면

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

|pqsendqueryandpqgetresult큰 쿼리 결과를 검색하고 있습니다. 이것은에서 논의됩니다.PostgreSQL : 문서 : 개발 : 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메시지 (참조PostgreSQL : 문서 : 개발 : 32.9. 비동기 롤 토토).

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

위에서 설명한 함수를 사용하여 데이터베이스 서버에서 입력을 기다리는 동안 차단을 피할 수 있습니다. 그러나 응용 프로그램이 출력을 서버로 전송하기 위해 대기 대기를 차단할 수 있습니다. 이것은 비교적 드물지만 매우 긴 SQL 명령 또는 데이터 값이 전송되면 발생할 수 있습니다. (응용 프로그램이를 통해 데이터를 전송하는 경우 훨씬 더 가능성이 높습니다복사.

pqsetnonBlocking #

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

int pqsetnonblocking (pgconn *conn, int arg);

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

비 차단 상태에서 성공적인 전화pqsendquery, pqputline, PQPUTNBYTES, pqputcopydataPQENDCOPY차단하지 않을 것입니다. 그들의 변경은 플러시 될 때까지 로컬 출력 버퍼에 저장됩니다. 실패한 통화가 오류를 반환하고 retried를 반환해야합니다.

참고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을 반환하고 소켓을 읽을 때까지 기다린 다음 위에서 설명한대로 응답을 읽습니다.