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

1.3.

thePQEXEC함수는 적합합니다

  • PQEXEC쿼리가 될 때까지 기다립니다

  • 제어가 내부에 묻혀 있기 때문에PQEXEC, 프론트 엔드가 결정하기가 어렵습니다

  • PQEXEC하나만 반환 할 수 토토 결과SQL명령, 모두PQEXEC.

이러한 제한을 좋아하지 않는 응용 프로그램은 대신 할 수 토토 결과PQEXEC에서 구축되었습니다 :pqsendqueryandpqgetresult.

이 기능을 사용한 오래된 프로그램과pqputlineandpqputnbytes데이터를 보내기 위해 대기 대기를 차단할 수 토토 결과pqsetnonblocking추가되었습니다.

오래된 응용 프로그램은 사용을 무시할 수 토토 결과pqsetnonblocking잠재적으로 구식을 얻습니다pqsetnonblocking완전히 달성합니다

  • pqsetnonblocking

    int pqsetnonblocking (pgconn *conn, int arg)
    arg 인 경우 비 블로킹에 연결 상태를 설정합니다.

    비 차단 상태에서 전화pqputline, pqputnbytes, pqsendqueryandPQENDCOPY차단하지 않고 대신 돌아갑니다

    데이터베이스 연결이 비 차단으로 설정되었을 때PQEXEC호출됩니다PQEXEC완료.

    LIBPQ의 더 많은 사람들이 안전해질 것으로 예상됩니다pqsetnonblocking근처의 기능

  • pqisnonBlocking반환합니다

    int pqisnonblocking (const pgconn *conn)
    연결이 비 블로킹 모드로 설정된 경우 true를 반환합니다.
  • pqsendquery쿼리 제출Postgres기다리지 않고

    int pqsendquery (pgconn *conn,
    11831_11857pqsendquery, Callpqgetresult쿼리를 얻기 위해 한 번 이상pqsendquery호출 할 수 없습니다pqgetresultNULL을 반환하여
  • pqgetresult다음을 기다리십시오pqsendquery,

    pgresult *pqgetresult (pgconn *conn);
    pqgetresult호출해야합니다pqgetresult한 번에 null을 반환합니다.) 각각pqgetresult동일한 pgresult 액세서를 사용하여 처리해야합니다PQCLEAR언제pqgetresult쿼리가 활성화되어 있고 필요한 경우에만 차단됩니다.pqconsumeInput.

사용pqsendqueryandpqgetresult를 해결합니다PQEXEC의 문제 : 쿼리 문자열에 포함 된 경우SQL명령, 결과pqgetresult여전히SQL명령. 이것은 피할 수 토토 결과

  • pqconsumeInput입력 인 경우

    int pqconsumeInput (pgconn *conn);
    pqconsumeInput일반적으로 1PQERRORMESSAGEISpqconsumeInput, 신청서가 확인할 수 토토 결과PQISBUSY및/또는pqnotifies상태가 바뀌 었는지 확인하려면

    pqconsumeInput호출 될 수 토토 결과select(2) 사라질 준비가 된 표시.pqconsumeInputselect즉시 조건

  • PQISBUSY쿼리가있는 경우 1을 반환합니다pqgetresultpqgetresult보증으로 호출 할 수 토토 결과

    int pqisbusy (pgconn *conn);
    PQISBUSY그 자체가 시도하지 않을 것입니다pqconsumeInput먼저, 또는 바쁘다
  • pqflush플러시를 시도합니다

    int pqflush (pgconn *conn);
    pqflushaselect응답이 도착했는지 확인하려면. 0 인 경우pqsetnonblocking이것에 대한 필요가 토토 결과.
  • pqsocket파일을 얻습니다

    int pqsocket (const pgconn *conn);
    pqsocket획득하는 데 사용해야합니다select(2). 이것은 응용 프로그램을 허용합니다select(2)는 데이터를 읽을 수 있음을 나타냅니다pqconsumeInput데이터를 읽으려면 호출되어야합니다. 그 후,PQISBUSY, pqgetresult,pqnotifies처리에 사용될 수 있습니다

    비 차단 연결 (사용한pqsetnonblocking) 사용하지 않아야selectpqflush0을 반환하여 거기에 있음을 나타냅니다

이러한 기능을 사용하는 일반적인 프론트 엔드에는 기본 루프가 있습니다.select(2) 모든 것을 기다립니다select의 용어는 파일에서 읽을 수있는 데이터입니다pqsocket. 언제pqconsumeInput입력을 읽으려면. 그렇다면 할 수 토토 결과PQISBUSY그 뒤에pqgetresultifPQISBUSY거짓 (0)을 반환합니다. 또한 전화 할 수 있습니다pqnotifies알림 메시지를 감지하려면 (참조

사용하는 프론트 엔드pqsendquery/pqgetresult아직 처리중인 쿼리를 취소하려고 할 수도 토토 결과.

  • pqRequestCancel요청Postgres포기 처리

    int pqRequestCancel (pgconn *conn);
    취소 요청이 성공적으로 인 경우 반환 값이 1입니다.PQERRORMESSAGE왜 그렇지 않은지 알려줍니다.) 성공적인 파견pqRequestCancel, 응용 프로그램은 계속되어야합니다pqgetresult. 취소가 효과적이면

현재 쿼리가 트랜잭션의 일부인 경우

pqRequestCancel안전하게 할 수 토토 결과PQEXEC, ifPSQL호출pqRequestCancelSigint 신호 핸들러에서,PQEXEC. 참고pqRequestCancel