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

31.4. 비동기 명령 처리

thePQEXEC함수는 적절합니다 정상적인 동기 응용 프로그램에서 명령을 제출합니다. 가지고 있습니다 그러나 몇 가지 결함은 일부 사람들에게 중요 할 수 있습니다. 사용자 :

  • PQEXEC명령이 될 때까지 기다립니다 완전한. 응용 프로그램은 다른 작업을 수행 할 수 있습니다 (예 : 사용자 인터페이스 유지),이 경우 차단하고 싶지 않습니다. 응답을 기다리고 있습니다.

  • 클라이언트 응용 프로그램의 실행이 중단되므로 결과를 기다립니다. 응용 프로그램이 결정하기가 어렵습니다. 진행중인 명령을 취소하려고합니다. (그럴 수 있습니다 신호 핸들러에서 완료되었지만 그렇지 않으면.)

  • PQEXEC하나만 반환 할 수 있습니다pgresult구조. 제출 된 경우 명령 문자열에는 여러 가지SQL명령, 마지막pgresultPQEXEC.

  • PQEXEC항상 수집합니다 명령의 전체 결과, 단일로 버퍼링pgresult. 이것은 오류 처리를 단순화하지만 응용 프로그램의 논리, 결과에 비현실적 일 수 있습니다. 많은 행이 포함되어 있습니다.

이러한 제한이 마음에 들지 않는 응용 프로그램은 대신 사용할 수 있습니다. 기본 기능PQEXEC에서 구축되었습니다 :pqsendqueryand토토. 또한pqsendqueryparams, pqsendprepare, pqsendqueryprepared, pqsenddescribrepreparedpqsenddescribePortal토토의 기능성pqexecparams, pqprepare, pqExecprepared, pqdescribepreparedpqdescribePortal각각.

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);

이것은에 해당합니다.pqsendquery14774_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오류 정보를 처리합니다 완전히.

사용pqsendqueryand토토를 해결합니다PQEXEC의 문제 : 명령 문자열에 포함 된 경우 다수의SQL명령, 이러한 명령의 결과는 개별적으로 얻을 수 있습니다. (이것 그건 그렇고 간단한 형태의 중첩 처리를 허용합니다. 클라이언트는 서버가있는 동안 하나의 명령 결과를 처리 할 수 ​​있습니다. 동일한 명령 문자열에서 나중에 쿼리를 계속하고 있습니다.)

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

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

pqconsumeInput

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

int pqconsumeInput (pgconn *conn);

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

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

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, PQPUTNBYTESPQENDCOPY차단하지 않고 대신 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, 서버가 차단 될 수 있기 때문입니다 우리에게 데이터를 보내려고 (예 : 통지 메시지, 우리를 읽지 않을 것입니다 우리가 읽을 때까지 데이터.) 한 번pqflush0을 반환하고 소켓을 읽을 때까지 기다린 다음 위에서 설명한 응답.