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

1.4. 비동기 쿼리 윈 토토

thePQEXEC함수는 적절합니다 간단한 동기 응용 프로그램에서 명령을 제출합니다. 그것 그러나 몇 가지 주요 결함이 윈 토토 :

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

  • 제어가 내부에 묻혀 있기 때문에PQEXEC, 프론트 엔드가 어렵습니다 진행중인 명령을 취소하려고합니다. (신호 핸들러에서 수행 할 수는 있지만 그렇지 않으면.)

  • PQEXEC하나만 반환 할 수 윈 토토pgresult구조. 만약 제출 된 명령 문자열은 여러SQL명령, 마지막pgresultPQEXEC.

이러한 제한을 좋아하지 않는 응용 프로그램은 대신 할 수 윈 토토 의 기본 기능을 사용하십시오.PQEXEC에서 구축되었습니다 :pqsendqueryandpqgetresult.

이 기능을 사용한 이전 프로그램과pqputlineandpqputnbytes데이터를 보내기 위해 대기 대기를 차단할 수 윈 토토 백엔드. 그 문제를 해결하기 위해 함수pqsetnonBlocking추가되었습니다.

오래된 응용 프로그램은 사용을 무시할 수 윈 토토pqsetnonBlocking잠재적으로 구식을 얻습니다 행동 차단. 최신 프로그램을 사용할 수 윈 토토pqsetnonblocking완전히 달성합니다 백엔드에 대한 비 차단 연결.

  • pqsetnonblocking연결의 차단 상태.

    int pqsetnonblocking (pgconn *conn, int arg)

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

    비 차단 상태에서pqputline, PQPUTNBYTES, pqsendqueryandPQENDCOPY차단하지 않고 대신 돌아갑니다 다시 호출 해야하는 경우 오류입니다.

    데이터베이스 연결이 비 차단으로 설정된 경우 모드 및PQEXEC라고 불립니다 차단 연결 상태를 일시적으로 설정합니다. 까지PQEXEC완료.

    더 많은libpq가 예상됩니다 안전하게 만들기pqsetnonBlocking가까운 기능 미래.

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

    int pqisnonblocking (const pgconn *conn)

    반환 1 연결이 비 차단 모드로 설정된 경우 0, 0 차단하면.

  • pqsendquery명령 제출 결과를 기다리지 않고 서버에. 1입니다 명령이 성공적으로 발송 된 경우 반환, 0이 아닌 경우 0 (이 경우 사용PQERRORMESSAGE더 많은 정보를 얻으려면 실패에 대해).

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

    성공적으로 전화 한 후pqsendquery, Callpqgetresult결과.pqsendquery그렇지 않을 수 윈 토토 다시 전화 (같은 연결에서)까지pqgetresultNULL을 반환했습니다 명령이 완료되었습니다.

  • pqgetresult기다려주세요 다음 결과 이전의 결과pqsendquery를 반환하십시오. 널입니다 쿼리가 완료되면 반환되고 더 이상 없을 것입니다. 결과.

    pgresult *pqgetresult (pgconn *conn);

    pqgetresult호출해야합니다 NULL을 반환 할 때까지 반복적으로 명령을 나타냅니다 완료되었습니다. (명령이 활성화되지 않은 경우 호출되면pqgetresult한 번에 null을 반환합니다.) 각각이 아닌 각각의 결과pqgetresult를 사용하여 처리해야합니다 이전에 설명한 동일한 pgresult 액세서 기능. 하지 않다 로 각 결과 객체를 제거하는 것을 잊어 버리십시오.PQCLEAR완료되면. 참고pqgetresult쿼리가 활성화되어 있고 필요한 응답 데이터는 아직 없습니다.pqconsumeInput.

사용pqsendqueryandpqgetresult을 해결합니다.PQEXEC의 문제 : 명령 인 경우 문자열에는 여러 가지가 포함SQL명령, 해당 명령의 결과를 얻을 수 있습니다 개별적으로. (이것은 간단한 형태의 겹침을 허용합니다 그런데 윈 토토 : 프론트 엔드는 결과를 윈 토토 할 수 있습니다. 백엔드가 여전히 나중에 쿼리에서 작동하는 동안 하나의 쿼리 중 같은 명령 문자열에서.) 그러나 호출pqgetresult여전히 프론트 엔드가 발생합니다 백엔드가 다음을 완료 할 때까지 차단SQL명령. 이것은 적절하게 피할 수 있습니다 세 가지 기능 사용 :

  • pqconsumeInput입력 인 경우 백엔드에서 사용할 수 있습니다.

    int pqconsumeInput (pgconn *conn);

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

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

  • PQISBUSYa 쿼리는 바쁘다, 즉pqgetresult입력 대기 대기 블록. 0 반환은를 나타냅니다.pqgetresult보증으로 호출 할 수 윈 토토 차단되지 않습니다.

    int pqisbusy (pgconn *conn);

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

  • pqflush플러시를 시도합니다 백엔드에 대기하는 데이터는 성공한 경우 0을 반환합니다 (또는 보내기 대기열이 비어 윈 토토) 또는eofIF IT 어떤 이유로 실패했습니다.

    int pqflush (pgconn *conn);

    pqflush호출해야합니다 호출하기 전에 비 차단 연결에서select ()응답이 있는지 확인합니다 도착했다. 0이 반환되면 데이터가 없도록합니다. 실제로 전송되지 않은 백엔드로 대기했습니다. 오직 사용한 응용 프로그램pqsetnonBlocking이것에 대한 필요가 윈 토토.

  • pqsocket파일을 얻습니다 백엔드 연결 소켓의 디스크립터 번호. 유효한 설명자는 = 0입니다. -1의 결과는 아니오를 나타냅니다 백엔드 연결이 현재 열려 있습니다.

    int pqsocket (const pgconn *conn);

    pqsocket익숙해 져야합니다 준비하여 백엔드 소켓 디스크립터를 얻으십시오 실행select (). 이것은 허용합니다 차단 연결을 사용한 응용 프로그램 중 하나를 기다립니다. 백엔드 응답 또는 기타 조건. 의 결과 인 경우select ()해당 데이터를 나타냅니다 백엔드 소켓에서 읽을 수 윈 토토pqconsumeInput를 읽도록 호출해야합니다 데이터; 그 후,PQISBUSY, pqgetresult및/또는pqnotifies익숙해 질 수 있습니다 응답 윈 토토.

    비 차단 연결 (사용한)pqsetnonBlocking) 사용하지 않아야select ()TLEALEpqflush0을 반환했습니다 버퍼링 된 데이터는 백엔드.

이러한 기능을 사용하는 일반적인 프론트 엔드에는 기본 루프가 있습니다. 사용select모두를 기다리려면 응답해야 할 조건. 조건 중 하나 백엔드에서 입력 할 수 윈 토토.select의 용어는 파일에서 읽을 수있는 데이터입니다 에 의해 식별 된 설명 자pqsocket. 기본 루프가 입력 준비를 감지하면 호출해야합니다pqconsumeInput입력을 읽으려면. 그런 다음 호출 할 수 있습니다PQISBUSY에 의해pqgetresultifPQISBUSY거짓 (0)을 반환합니다. 또한 전화 할 수 윈 토토pqnotifies알림을 감지합니다 메시지 (참조섹션 1.6).

사용하는 프론트 엔드pqsendquery/pqgetresult취소를 시도 할 수도 있습니다 백엔드에 의해 여전히 처리중인 명령.

  • PQREQUESTCANCEL요청postgresql포기 현재 명령 처리.

    int pqRequestCancel (pgconn *conn);

    취소 요청이있는 경우 반환 값은 1입니다. 성공적으로 파견되지 않으면 0. (그렇지 않은 경우PQERRORMESSAGE왜 그렇지 않은지 알려줍니다.) 성공 파견은 요청에 그러나 효과. 반환 값에 관계없이PQREQUESTCANCEL, 응용 프로그램은 일반 결과 읽기를 계속해야합니다 사용 시퀀스pqgetresult. 만약에 취소는 효과적이며 현재 명령은 의지합니다 일찍 종료하고 오류 결과를 반환하십시오. 만약 취소가 실패합니다 (예 : 백엔드가 이미 완료 되었기 때문에 명령 처리), 그러면 눈에 보이는 결과가 없습니다. 조금도.

현재 명령이 트랜잭션의 일부인 경우 취소는 전체 거래를 중단합니다.

PQREQUESTCANCEL안전하게 할 수 있습니다 신호 핸들러에서 호출. 따라서 사용하는 것도 가능합니다 평원과 함께PQEXEC, 신호 윈 토토기에서 취소 결정을 내릴 수있는 경우. 을 위한 예,PSQL호출PQREQUESTCANCEL에서Sigint신호 핸들러, 따라서 허용 대화식 쿼리의 대화식 취소를 통해 발행PQEXEC. 참고PQREQUESTCANCEL연결은 현재 열려 있지 않거나 백엔드가 현재 없습니다. 명령 처리.