이 문서는 지원되지 않는 버전의 PostgreSQL 용입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다현재버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

비동기 사설 토토 처리

PQEXEC 함수는 단순한 사설 토토를 제출하기에 적합합니다. 동기 응용 프로그램. 몇 가지 주요 결함이 있습니다 하지만:

  • PQEXEC는 사설 토토가 완료 될 때까지 기다립니다. 응용 프로그램 다른 작업을 수행 할 수 있습니다 (예 : 사용자 유지 보수 인터페이스),이 경우 대기를 막고 싶지 않습니다. 응답.

  • 컨트롤이 PQExec 내부에 묻혀 있으므로 진행중인 취소를 시도하기로 결정한 프론트 엔드 질문. (신호 핸들러에서 수행 할 수는 있지만 그렇지 않으면.)

  • pqexec은 하나의 pgresult 구조 만 반환 할 수 있습니다. 만약 제출 된 사설 토토 문자열에는 여러 SQL 명령이 포함되어 있습니다 마지막 pgresult는 pqexec에 의해 폐기됩니다.

이러한 제한이 마음에 들지 않는 응용 프로그램은 대신 사용할 수 있습니다. PQEXEC가 구축 한 기본 기능 : PQSENDQUERY 및 pqgetresult.

  • pqsendquery사설 토토 제출Postgres기다리지 않고 결과. 사설 토토가 성공적으로 사용되면 True가 반환됩니다 파견, 거짓이 아닌 경우 (어떤 경우에는 pqerrormessage를 사용하십시오. 실패에 대한 자세한 정보를 얻으십시오).

    int pqsendquery (pgconn *conn,
                    const char *query);
    pqsendquery를 성공적으로 호출 한 후 pqgetresult를 전화하십시오 또는 쿼리 결과를 얻기위한 더 많은 시간. pqsendquery는 그렇지 않을 수 있습니다 pqgetresult가 가질 때까지 다시 호출 (같은 연결) 쿼리가 완료되었음을 나타냅니다.
  • pqgetresult다음을 기다리십시오 이전 PQSendQuery에서 결과를 얻고 반환합니다. 널입니다 쿼리가 완료되면 반환되고 더 이상 없을 것입니다. 결과.

    pgresult *pqgetresult (pgconn *conn);
    pqgetresult는 null을 반환 할 때까지 반복적으로 호출해야합니다. 쿼리가 완료되었음을 나타냅니다. (쿼리가 없을 때 호출되는 경우 Active, Pqgetresult는 한 번에 Null을 반환합니다.) 각각이 아닌 각각 pqgetresult의 결과는 동일한 pgresult를 사용하여 처리해야합니다. 액세서 기능은 앞에서 설명한 기능입니다. 각각을 자유롭게하는 것을 잊지 마십시오 pqclear가있는 결과 객체를 완료하면 객체가 있습니다. pqgetresult 쿼리가 활성화되고 필요한 응답이있는 경우에만 차단됩니다. PQConsumeInput은 아직 데이터를 읽지 않았습니다.

PQSENDQUERY 및 PQGETRESULT 사용은 PQEXEC 중 하나를 해결합니다 문제 : 쿼리 문자열에 여러 SQL 명령이 포함 된 경우 이러한 명령의 결과는 개별적으로 얻을 수 있습니다. (이것 그건 그렇고 간단한 형태의 중첩 처리를 허용합니다. Frontend는 백엔드가있는 동안 하나의 쿼리 결과를 처리 할 수 ​​있습니다. 동일한 쿼리 문자열에서 나중에 쿼리에서 여전히 작업 중입니다.) 그러나 pqgetresult에 전화를 걸면 여전히 프론트 엔드가 차단됩니다. 백엔드가 다음 SQL 명령을 완료 할 때까지. 이것은 될 수 있습니다 세 가지 기능을 올바르게 사용하여 피합니다.

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

    int pqconsumeInput (pgconn *conn);
    pqconsumeInput은 일반적으로 "오류 없음"을 나타내는 1을 반환하지만 어떤 종류의 문제가 있으면 0을 반환합니다 (이 경우에는 pqerrormessage가 설정됩니다). 결과는 여부를 말하지 않습니다 모든 입력 데이터가 실제로 수집되었습니다. 전화 후 PQCONSUMEINPUT, 응용 프로그램은 PQISBUSY 및/OR을 점검 할 수 있습니다 pqnotife는 그들의 상태가 바뀌 었는지 확인합니다. pqconsumeInput 일 수 있습니다 응용 프로그램이 아직 결과 또는 알림. 루틴은 사용 가능합니다 데이터를 데이터로 저장하여 버퍼에 저장하여 SELECT (2)를 유발합니다. read-ready indication to go away. 따라서 응용 프로그램은 사용할 수 있습니다 pqconsumeInput을 통해 선택된 조건을 즉시 지우고 즉시 지우십시오 레저에서 결과를 검사하십시오.
  • PQISBUSY쿼리 인 경우 true를 반환합니다 바쁘다. 즉, pqgetresult는 입력 대기를 막을 것이다. 에이 false return은 pqgetresult를 호출 할 수 있음을 나타냅니다 차단되지 않는 보장.

    int pqisbusy (pgconn *conn);
    PQISBUSY 자체는 백엔드; 따라서 pqconsumeInput을 먼저 호출해야합니다 바쁜 상태는 결코 끝나지 않을 것입니다.
  • pqsocket파일을 얻습니다 백엔드 연결 소켓의 디스크립터 번호. 유효한 설명자는 = 0입니다. -1의 결과는 아니오를 나타냅니다 백엔드 연결이 현재 열려 있습니다.

    int pqsocket (pgconn *conn);
    PQSocket을 사용하여 백엔드 소켓을 얻어야합니다 Select (2)를 실행하기위한 설명 자. 이것은 허용합니다 백엔드 응답 또는 기타를 기다리는 응용 프로그램 정황. select (2)의 결과가 데이터가 될 수 있음을 나타냅니다. 백엔드 소켓에서 읽은 다음 pqconsumeInput을 호출해야합니다. 데이터를 읽으려면; 그 후, pqisbusy, pqgetresult 및/또는 pqnotifies는 응답을 처리하는 데 사용될 수 있습니다.

이러한 함수를 사용하는 일반적인 프론트 엔드에는 기본 루프가 있습니다. Select (2)를 사용하여 모든 조건을 기다려야합니다. 응답. 조건 중 하나는 Backend, Select의 용어로 파일에서 읽을 수있는 데이터 pqsocket에서 식별 한 설명 자. 기본 루프가 입력을 감지 할 때 준비, 입력을 읽으려면 pqconsumeInput을 호출해야합니다. 그렇다면 할 수 있습니다 PQISBUSY에 전화 한 다음 PQGETRESULT PQISBUSY가 False를 반환하면 또한 PQNotifies에 호출하여 알림 메시지를 감지 할 수 있습니다 ( "비동기식 알림", 아래). 예는 다음에 나와 있습니다 샘플 프로그램 섹션.

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

  • pqRequestCancel요청Postgres포기 처리 현재 쿼리.

    int pqrequestCancel (pgconn *conn);
    취소 요청이 있으면 반환 값이 참입니다. 성공적으로 발송, 그렇지 않은 경우 거짓. (그렇지 않은 경우, pqerrormessage 성공하지 못하는 이유를 알려줍니다.) 성공적인 파견은 그러나 요청은 어떤 영향을 미칩니다. 반환에 관계없이 pqrequestCancel의 값, 응용 프로그램은 계속해야합니다 pqgetresult를 사용한 정상 결과 읽기 서열. 만약 취소는 효과적이며 현재 쿼리는 조기에 종료됩니다 오류 결과를 반환합니다. 취소가 실패한 경우 ( 백엔드는 이미 쿼리 처리를 수행했습니다. 전혀 눈에 띄는 결과가 아닙니다.

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

PQRequestCancel은 신호 처리기에서 안전하게 호출 할 수 있습니다. 그래서, 일반 pqexec과 함께 사용하는 것도 가능합니다. 취소 결정은 신호 처리기에서 이루어질 수 있습니다. 을 위한 예를 들어, PSQL은 Sigint 신호 핸들러에서 pqrequestCancel을 호출합니다. 따라서 문제가 발생하는 쿼리의 대화식 취소를 허용합니다 pqexec을 통해. pqrequestCancel은 영향을 미치지 않습니다 연결이 현재 열려 있지 않거나 백엔드가 현재 쿼리 처리.