지원 버전 :현재(17) /16 / 15 / 14 / 13
개발 버전 :18 / Devel
지원되지 않는 버전 :12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4

34.14. 이벤트 시스템

cách đọc kèo bóng đá의 이벤트 시스템은 등록 된 이벤트 핸들러에게 흥미로운 정보를 알리도록 설계되었습니다cách đọc kèo bóng đá예를 들어, 예를 들어cách đọc kèo bóng đáandcách đọc kèo bóng đá개체. 주요 사용 사례는 응용 프로그램이 자신의 데이터를 A와 연결할 수 있다는 것입니다.cách đọc kèo bóng đá또는cách đọc kèo bóng đá그리고 해당 데이터가 적절한 시간에 제출되도록하십시오.

각 등록 된 이벤트 핸들러는 알려진 두 가지 데이터와 관련이 있습니다.cách đọc kèo bóng đá불투명 한cách đọc kèo bóng đá *포인터.패스 스루이벤트 핸들러가 A에 등록 될 때 응용 프로그램에서 제공하는 포인터cách đọc kèo bóng đá. 패스 스루 포인터는의 삶에 대해 결코 변하지 않습니다cách đọc kèo bóng đá및 allcách đọc kèo bóng đás에서 생성 된; 따라서 사용되면 오래 지속되는 데이터를 가리켜 야합니다. 또한가 있습니다.인스턴스 데이터포인터, 시작null매번cách đọc kèo bóng đáandcách đọc kèo bóng đá. 이 포인터는를 사용하여 조작 할 수 있습니다.pqinstancedata, PQSETINSTANCETA, pqresultinstancedataandPQRESULSTSETINSTANCETA함수. 패스 스루 포인터와 달리 A의 인스턴스 데이터cách đọc kèo bóng đá자동으로 상속되지 않습니다cách đọc kèo bóng đás에서 생성되었습니다.cách đọc kèo bóng đá패스 스루 및 인스턴스 데이터 포인터가 무엇을 가리키는 지 알지 못하고 (아무것도 해방하려고 시도하지 않을 것입니다. 이벤트 핸들러의 책임입니다..

34.14.1. 이벤트 유형

ENUMpgeventid이벤트 시스템에서 처리하는 이벤트 유형의 이름을 지정합니다. 모든 값은로 시작하는 이름이 있습니다.pgevt. 각 이벤트 유형마다 이벤트 핸들러에 전달되는 매개 변수를 전달하는 해당 이벤트 정보 구조가 있습니다. 이벤트 유형은 다음과 같습니다.

pgevt_register

레지스터 이벤트는 발생합니다PQREGISTEREVENTPROC호출됩니다. 모든 것을 초기화하기에 이상적인 시간입니다instanceata이벤트 절차가 필요할 수 있습니다. 연결 당 이벤트 핸들러 당 하나의 레지스터 이벤트 만 해고됩니다. 이벤트 절차가 실패하면 (반환 0) 등록이 취소됩니다.

typedef struct

    cách đọc kèo bóng đá *conn;
 pgeventRegister;

언제pgevt_register이벤트가 접수되었습니다.evtinfo포인터가 a에 캐스트해야합니다pgeventRegister *. 이 구조에는가 포함되어 있습니다.cách đọc kèo bóng đáConnection_ok상태; 전화가 보장 보장PQREGISTEREVENTPROC선을 얻은 직후cách đọc kèo bóng đá. 실패 코드를 반환 할 때는 모든 정리를 수행해야합니다PGEVT_CONNDESTROY이벤트가 발송됩니다.

PGEVT_CONNRESET

연결 재설정 이벤트가 완료되면pqreset또는pqresetpoll. 두 경우 모두 이벤트는 재설정이 성공한 경우에만 해고됩니다. 이벤트 절차의 반환 값은 무시됩니다PostgreSQLv15 이상. 그러나 이전 버전에서는 성공을 반환하는 것이 중요합니다 (0이 아닌). 연결이 중단됩니다.

typedef struct

    cách đọc kèo bóng đá *conn;
 pgeventconnreset;

언제PGEVT_CONNRESET이벤트가 접수되었습니다.evtinfo포인터가 a에 캐스트해야합니다pgeventconnreset *. 포함되어 있지만cách đọc kèo bóng đá방금 재설정되었으며 모든 이벤트 데이터는 변경되지 않았습니다. 이 이벤트는 관련된 모든 것을 재설정/새로 고침/요청하는 데 사용해야합니다instanceata. 이벤트 절차가 처리되지 않더라도PGEVT_CONNRESET, 여전히 a를받을 것입니다.PGEVT_CONNDESTROY연결이 닫힌 경우 이벤트.

pgevt_conndestroy

연결 파괴 이벤트가 해고되어pqfinish. cách đọc kèo bóng đá 가이 메모리를 관리 할 수 ​​없기 때문에 이벤트 데이터를 올바르게 정리하는 것은 이벤트 절차의 책임입니다. 정리하지 않으면 메모리 누출이 발생합니다.

typedef struct

    cách đọc kèo bóng đá *conn;
 pgeventconndestroy;

언제PGEVT_CONNDESTROY이벤트가 접수되었습니다.evtinfo포인터가 a에 캐스트해야합니다pgeventconndestroy *. 이 이벤트는 이전에 해고됩니다pqfinish다른 정리 수행. 이벤트 절차의 반환 값은 실패를 나타내는 방법이 없기 때문에 무시됩니다pqfinish. 또한 이벤트 절차 실패는 원치 않는 메모리를 청소하는 과정을 중단해서는 안됩니다.

pgevt_resultcreate

결과 생성 이벤트는 결과를 생성하는 쿼리 실행 함수에 응답하여pqgetresult. 이 이벤트는 결과가 성공적으로 생성 된 후에 만 ​​해고됩니다.

typedef struct

    cách đọc kèo bóng đá *conn;
    pgresult *결과;
 pgeventresultcreate;

언제pgevt_resultcreate이벤트가 접수되었습니다.evtinfo포인터가 a에 캐스트해야합니다pgeventresultcreate *. 그만큼cách đọc kèo bóng đá결과를 생성하는 데 사용되는 연결입니다. 이곳은 모든 것을 초기화하기에 이상적인 장소입니다instanceata결과와 관련이 있어야합니다. 이벤트 절차가 실패하면 (returns zero), 해당 이벤트 절차는 결과의 나머지 수명에 대해 무시됩니다. 즉,받지 못할 것입니다pgevt_resultcopy또는PGEVT_RESULTDESTROY이 결과 또는 결과에 대한 이벤트.

pgevt_resultcopy

결과 사본 이벤트가 응답하여 해고됩니다pqcopyresult. 이 이벤트는 사본이 완료된 후에 만 ​​해고됩니다. 성공적으로 처리 한 이벤트 절차 만pgevt_resultcreate또는pgevt_resultcopy소스 결과에 대한 이벤트가 수신됩니다pgevt_resultcopy이벤트.

typedef struct

    const cách đọc kèo bóng đá *src;
    cách đọc kèo bóng đá *dest;
 pgeventresultcopy;

언제pgevt_resultcopy이벤트가 접수되었습니다.evtinfo포인터가 a에 캐스트해야합니다pgeventresultcopy *. 그만큼SRC결과는 복사 한 내용입니다dest결과는 사본 대상입니다. 이 이벤트는의 깊은 사본을 제공하는 데 사용될 수 있습니다.instanceata이후pqcopyresult그렇게 할 수 없습니다. 이벤트 절차가 실패하면 (0을 반환), 새로운 결과의 나머지 수명에 대해 해당 이벤트 절차가 무시됩니다. 즉,받지 못할 것입니다pgevt_resultcopy또는pgevt_resultdestroy그 결과 또는 결과에 대한 이벤트.

pgevt_resultdestroy

결과 파괴 이벤트는 A에 대한 응답으로 해고됩니다PQCLEAR. cách đọc kèo bóng đá 가이 메모리를 관리 할 수 ​​없기 때문에 이벤트 데이터를 올바르게 정리하는 것은 이벤트 절차의 책임입니다. 정리하지 않으면 메모리 누출이 발생합니다.

typedef struct

    cách đọc kèo bóng đá *결과;
 pgeventresultdestroy;

언제pgevt_resultdestroy이벤트가 접수되었습니다.evtinfo포인터가 a에 캐스트해야합니다pgeventresultdestroy *. 이 이벤트는 이전에 해고됩니다PQCLEAR다른 정리 수행. 이벤트 절차의 반환 값은 실패를 나타내는 방법이 없기 때문에 무시됩니다PQCLEAR. 또한 이벤트 절차 실패는 원치 않는 메모리를 청소하는 과정을 중단해서는 안됩니다.

34.14.2. 이벤트 콜백 절차

pgeventproc

pgeventproc| 이벤트 절차, 즉 cách đọc kèo bóng đá로부터 이벤트를 수신하는 사용자 콜백 함수에 대한 포인터의 typedef입니다. 이벤트 절차의 서명은이어야합니다.

int eventProc (pgeventid evtid, cách đọc kèo bóng đá *evtinfo, cách đọc kèo bóng đá *passthrough)

theevtid매개 변수는를 나타냅니다.pgevt이벤트가 발생했습니다. 그만큼evtinfo포인터는 이벤트에 대한 추가 정보를 얻으려면 적절한 구조 유형으로 시전해야합니다. 그만큼Passthrough매개 변수는 제공된 포인터입니다PQREGISTEREVENTPROC이벤트 절차가 등록 된 시점. 기능이 성공하면 0이 아닌 값을 반환하고 실패하면 0이됩니다.

특정 이벤트 절차는 한 번만 등록 할 수 있습니다cách đọc kèo bóng đá. 프로 시저의 주소가 관련 인스턴스 데이터를 식별하기위한 조회 키로 사용되기 때문입니다.

주의

Wind 이 주소 중 하나만 사용되도록 조심해야합니다.cách đọc kèo bóng đá의 이벤트-처리 함수, 그렇지 않으면 혼란이 발생합니다. 작동하는 코드 작성의 가장 간단한 규칙은 이벤트 절차가 선언되도록하는 것입니다정적. 프로 시저의 주소를 자체 소스 파일 외부에서 사용할 수 있어야하는 경우 별도의 기능을 노출하여 주소를 반환합니다.

34.14.3. 이벤트 지원 기능

PQREGISTEREVENTPROC

cách đọc kèo bóng đá로 이벤트 콜백 절차를 등록합니다.

int pqregistereventProc (cách đọc kèo bóng đá *conn, pgeventproc Proc,
                        const char *name, void *passthrough);

이벤트 절차는 각각에 한 번 등록해야합니다cách đọc kèo bóng đá당신은 이벤트를 받고 싶습니다. 연결에 등록 할 수있는 이벤트 절차 수에는 메모리 외에는 제한이 없습니다. 이 함수는 성공하면 0이 아닌 값을 반환하고 실패하면 0이됩니다.

theProccách đọc kèo bóng đá 이벤트가 발사되면 인수가 호출됩니다. 메모리 주소는 조회에도 사용됩니다instanceata. 그만큼이름인수는 오류 메시지에서 이벤트 절차를 참조하는 데 사용됩니다. 이 값은 될 수 없습니다NULL또는 제로 길이 문자열. 이름 문자열이에 복사됩니다.cách đọc kèo bóng đá, 따라서 통과되는 것은 오래 지속될 필요는 없습니다. 그만큼Passthrough포인터가 전달됩니다Proc이벤트가 발생할 때마다. 이 주장은NULL.

PQSETINSTANCETA

연결 설정cách đọc kèo bóng đá'sinstanceata절차Procto데이터. 이것은 성공을 위해 0이 아닌 반환하고 실패로 0이됩니다. (실패는 경우에만 가능합니다Proc에 제대로 등록되지 않았습니다cách đọc kèo bóng đá.)

int pqsetinstanctata (cách đọc kèo bóng đá *conn, pgeventproc proc, void *data);
PQINSTANCETA

연결을 반환cách đọc kèo bóng đá'sinstanceata절차 관련Proc또는NULL없는 경우.

void *pqinstancedata (const cách đọc kèo bóng đá *conn, pgeventproc proc);
pqresultsetinstancedata

결과 설정instanceataforProcto데이터. 이것은 성공을 위해 0이 아닌 반환하고 실패로 0이됩니다. (실패는 경우에만 가능합니다Proc결과에 제대로 등록되지 않았습니다.)

int pqresultsetinstancedata (pgresult *res, pgeventproc proc, cách đọc kèo bóng đá *data);

데이터pqresultMemorySize를 사용하여 할당되지 않는 한pqresultalloc. (결과가 파괴 될 때 그러한 스토리지를 명시 적으로 제거 할 필요가 없기 때문에 그렇게하는 것이 좋습니다.)

PQRESULTINSTANCETA

결과를 반환합니다instanceata관련Proc또는NULL없다면.

cách đọc kèo bóng đá *pqresultinstancedata (const pgresult *res, pgeventproc proc);

34.14.4. 이벤트 예

cách đọc kèo bóng đá 연결 및 결과와 관련된 개인 데이터를 관리하는 골격 예입니다.

/ * LIBPQ 이벤트에 필수 헤더 (참고 : libpq-fe.h 포함) */
#include <libpq-events.h

/ * instancedata */
typedef struct

    int n;
    char *str;
 myData;

/ * pgeventProc */
정적 int myeventProc (pgeventid evtid, void *evtinfo, void *passthrough);

int
메인 (void)

    MyData *데이터;
    pgresult *res;
    cách đọc kèo bóng đá *conn =
        pqconnectdb ( "dbname = postgres 옵션 = -csearch_path =");

    if (pqstatus (conn)! = connection_ok)

        / * PQERRORMESSAGE의 결과는 후행 Newline */에 포함됩니다.
        fprintf (stderr, "%s", pqerrormessage (conn));
        pqfinish (conn);
        반환 1;

    /* 이벤트를 수신 해야하는 모든 연결에서 한 번 호출.
     * pgevt_register를 MyeventProc에 보냅니다.
     */
    if (! pqregistereventProc (Conn, MyEventProc, "MyData_Proc", NULL))))

        fprintf (stderr, "pgeventproc \ n 등록 할 수 없음);
        pqfinish (conn);
        반환 1;

    / * Conn Instancedata를 사용할 수 있습니다 */
    data = pqinstancedata (Conn, MyeventProc);

    / * pgevt_resultcreate를 MyeventProc */로 보냅니다.
    res = pqexec (conn, "select 1 + 1");

    / * 결과 instanceata를 사용할 수 있습니다 */
    data = pqresultinstancedata (res, myeventproc);

    / * pg_copyres_events가 사용되는 경우 pgevt_resultcopy를 MyeventProc */로 보냅니다.
    res_copy = pqcopyresult (res, pg_copyres_tuples | pg_copyres_events);

    /* pg_copyres_events 인 경우 결과 instancedata를 사용할 수 있습니다
     * pqcopyresult 호출 중에 사용됩니다.
     */
    data = pqresultinstancedata (res_copy, myeventProc);

    / * 두 가지 모두 PGEVT_RESULTDESTROY를 MyEventProc */에 보냅니다.
    PQCLEAR (RES);
    pqclear (res_copy);

    / * PGEVT_CONNDESTROY를 MyEventProc */로 보냅니다.
    pqfinish (conn);

    반환 0;

정적 int
MyeventProc (pgeventid evtid, void *evtinfo, void *passthrough)

    스위치 (evtid)

        CASE PGEVT_REGISTER :

            pgeventregister *e = (pgeventregister *) evtinfo;
            myData *data = get_mydata (e- conn);

            / * 앱 특정 데이터를 연결 */
            pqsetinstancedata (e- conn, myeventProc, data);
            부서지다;

        CASE PGEVT_CONNRESET :

            pgeventconnreset *e = (pgeventconnreset *) evtinfo;
            myData *data = pqinstancedata (e- conn, myeventProc);

            if (데이터)
              memset (data, 0, sizeof (mydata));
            부서지다;

        사례 PGEVT_CONNDESTROY :

            pgeventconndestroy *e = (pgeventconndestroy *) evtinfo;
            myData *data = pqinstancedata (e- conn, myeventProc);

            / * 무료 인스턴스 데이터 Conn이 파괴 되었기 때문에 */
            if (데이터)
              free_mydata (데이터);
            부서지다;

        CASE PGEVT_RESULTCREATE :

            pgeventresultcreate *e = (pgeventresultcreate *) evtinfo;
            mydata *conn_data = pqinstancedata (e- conn, myeventProc);
            mydata *res_data = dup_mydata (conn_data);

            / * 응용 프로그램 특정 데이터를 결과와 연결합니다 (CONN에서 복사) */
            pqresultsetinstancedata (e- result, myeventProc, res_data);
            부서지다;

        CASE PGEVT_RESULTCOPY :

            pgeventresultcopy *e = (pgeventresultcopy *) evtinfo;
            myData *src_data = pqresultinstancedata (e- src, myeventProc);
            myData *dest_data = dup_mydata (src_data);

            / * 앱 특정 데이터를 결과와 연결합니다 (결과에서 복사) */
            pqresultsetinstancedata (e- dest, myeventProc, dest_data);
            부서지다;

        CASE PGEVT_RESULTDESTROY :

            pgeventresultdestroy *e = (pgeventresultdestroy *) evtinfo;
            myData *data = pqresultinstancedata (e- result, myeventProc);

            / * 결과가 파괴 되었기 때문에 무료 인스턴스 데이터 */
            if (데이터)
              free_mydata (데이터);
            부서지다;

        /* 알 수없는 이벤트 ID, 그냥 true를 반환하십시오. */
        기본:
            부서지다;

    진실을 반환하십시오. / * 이벤트 처리 성공 */

수정 제출

문서에 올바른 것이 없다면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면