지원 버전 :현재(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
이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다현재버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

tỷ lệ kèo bóng đá tối nay31.12. 이벤트 시스템

libpq의 이벤트 시스템입니다 등록 된 이벤트 핸들러에게 흥미로운 것에 대해 알리도록 설계되었습니다libpq이벤트와 같은 이벤트 창조 또는 파괴tỷ lệ kèo bóng đá tối nayandtỷ lệ kèo bóng đá tối nay개체. 주요 용도 사례는 응용 프로그램이 자신의 데이터를 연관시킬 수 있도록하는 것입니다. A와 함께tỷ lệ kèo bóng đá tối nay또는tỷ lệ kèo bóng đá tối nay그리고 해당 데이터가 제출되는지 확인하십시오 적절한 시간.

각 등록 된 이벤트 핸들러는 두 조각과 관련이 있습니다. 알려진 데이터libpq만 불투명체tỷ lệ kèo bóng đá tối nay *포인터.Passthrough포인터가 제공합니다 이벤트 핸들러가 A에 등록 된 경우 응용 프로그램tỷ lệ kèo bóng đá tối nay. 패스 스루 포인터는 결코 없습니다 삶의 변화tỷ lệ kèo bóng đá tối nay및 Alltỷ lệ kèo bóng đá tối nays에서 생성 된; 따라서 사용되면 오래 지속되는 데이터를 가리켜 야합니다. 또한 거기에인스턴스 데이터포인터 시작null모든tỷ lệ kèo bóng đá tối naytỷ lệ kèo bóng đá tối nay. 이 포인터는 사용하여 조작 할 수 있습니다 그만큼pqinstancedata, PQSETINSTANCETA, pqresultinstancedataandPQSETRESULTINSTANCETA함수. 주목하십시오 패스 스루 포인터와 달리 A의 인스턴스 데이터tỷ lệ kèo bóng đá tối nay자동으로 상속되지 않습니다tỷ lệ kèo bóng đá tối nays에서 생성되었습니다.libpq무엇을 모릅니다 통과 및 인스턴스 데이터 포인터는 (무엇이든)를 가리 킵니다. 그들을 해방 시키려고하지 않을 것입니다 - 그것은 의무입니다. 이벤트 핸들러.

31.12.1. 이벤트 유형

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

pgevt_register

레지스터 이벤트는 발생할 때 발생합니다.PQREGISTEREVENTPROC호출됩니다. 그것은 모든 초기화에 이상적인 시간instanceata이벤트 절차가 필요할 수 있습니다. 이벤트 핸들러 당 하나의 레지스터 이벤트 만 해고됩니다. 연결 당. 이벤트 절차가 실패하면 등록이 중단되었습니다.

typedef struct

    tỷ lệ kèo bóng đá tối nay *conn;
 pgeventRegister;

a​​pgevt_register이벤트 접수,evtinfo포인터가 a에 캐스트해야합니다pgeventRegister *. 이 구조 포함tỷ lệ kèo bóng đá tối nayConnection_ok상태; 전화가 보장 보장PQREGISTEREVENTPROC직후 좋은 획득tỷ lệ kèo bóng đá tối nay. 언제 실패 코드를 반환하면 모든 정리가 수행되어야합니다 아니요PGEVT_CONNDESTROY이벤트 발송됩니다.

PGEVT_CONNRESET

연결 재설정 이벤트가 완료되면pqreset또는pqresetpoll. 두 경우 모두 이벤트 재설정이 성공한 경우에만 해고됩니다. 이벤트 인 경우 프로 시저가 실패하면 전체 연결 재설정이 실패합니다. 그만큼tỷ lệ kèo bóng đá tối nayConnection_Bad상태 및pqresetpoll복귀 할 것입니다pgres_polling_failed.

typedef struct

    tỷ lệ kèo bóng đá tối nay *conn;
 pgeventconnreset;

언제PGEVT_CONNRESET이벤트 접수,evtinfo포인터가 a에 캐스트해야합니다pgeventconnreset *. 비록 포함tỷ lệ kèo bóng đá tối nay그냥이었다 재설정, 모든 이벤트 데이터는 변경되지 않았습니다. 이 행사 관련된 모든 것을 재설정/새로 고침/요청하는 데 사용해야합니다instanceata. 더라도 이벤트 절차가 처리되지 않습니다PGEVT_CONNRESET, 여전히 a를받을 것입니다.PGEVT_CONNDESTROY이벤트 연결이 닫혔습니다.

PGEVT_CONNDESTROY

연결 파괴 이벤트가 해고되어pqfinish. 이벤트입니다 이벤트를 올바르게 정리하는 절차의 책임 LIBPQ로서의 데이터는이 메모리를 관리 할 능력이 없습니다. 정리하지 않으면 메모리 누출이 발생합니다.

typedef struct

    tỷ lệ kèo bóng đá tối nay *conn;
 pgeventconndestroy;

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

pgevt_resultcreate

결과 생성 이벤트는 어떤 것에 대응하여 해고됩니다. 결과를 생성하는 쿼리 실행 기능 포함pqgetresult. 이것 결과는 결과가 발생한 후에 만 ​​해고됩니다. 성공적으로 만들어졌습니다.

typedef struct

    tỷ lệ kèo bóng đá tối nay *conn;
    pgresult *결과;
 pgeventresultcreate;

apgevt_resultcreate이벤트가 접수되었습니다.evtinfo포인터가 a에 캐스트해야합니다pgeventresultcreate *. 그만큼tỷ lệ kèo bóng đá tối nay생성에 사용되는 연결입니다 결과. 이곳은 모든 것을 초기화하기에 이상적인 장소입니다instanceata그게 필요합니다 결과와 관련이 있습니다. 이벤트 절차가 실패하면 결과가 지워지고 실패는 전파. 이벤트 절차는 시도해서는 안됩니다pqclear결과 객체 그 자체로. 실패 코드를 반환 할 때는 모두 정리하십시오 아니오로 수행해야합니다PGEVT_RESULTDESTROY이벤트가 될 것입니다 전송된.

pgevt_resultcopy

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

typedef struct

    const tỷ lệ kèo bóng đá tối nay *src;
    tỷ lệ kèo bóng đá tối nay *dest;
 pgeventresultcopy;

언제pgevt_resultcopy이벤트 접수,evtinfo포인터가 a에 캐스트해야합니다pgeventresultcopy *. 그만큼SRC결과는 복사 한 내용입니다dest결과는 사본입니다 목적지. 이 이벤트는 깊은 곳을 제공하는 데 사용될 수 있습니다 사본instanceata이후pqcopyresult그렇게 할 수 없습니다. 만약에 이벤트 절차가 실패하면 전체 사본 작업이 발생합니다 실패와dest결과 지우십시오. 실패 코드를 반환 할 때는 모두 정리하십시오 아니오로 수행해야합니다pgevt_resultdestroy이벤트가 발송됩니다 목적지 결과.

pgevt_resultdestroy

결과 파괴 이벤트는 A에 대한 응답으로 해고되었습니다PQCLEAR. 이벤트입니다 이벤트를 올바르게 정리하는 절차의 책임 LIBPQ로서의 데이터는이 메모리를 관리 할 능력이 없습니다. 정리하지 않으면 메모리 누출이 발생합니다.

typedef struct

    tỷ lệ kèo bóng đá tối nay *결과;
 pgeventresultdestroy;

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

31.12.2. 이벤트 콜백 절차

pgeventproc

pgeventproc는 typedef입니다 이벤트 절차, 즉 사용자에 대한 포인터 LIBPQ로부터 이벤트를 수신하는 콜백 함수. 그만큼 이벤트 절차의 서명은이어야합니다.

int eventProc (pgeventid evtid, tỷ lệ kèo bóng đá tối nay *evtinfo, tỷ lệ kèo bóng đá tối nay *passthrough)

theevtid매개 변수 어느 것을 나타냅니다pgevt이벤트 발생했습니다. 그만큼evtinfo포인터 얻기 위해 적절한 구조 유형으로 캐스트해야합니다. 이벤트에 대한 추가 정보. 그만큼Passthrough매개 변수는 포인터입니다 제공PQREGISTEREVENTPROC이벤트 시점 절차가 등록되었습니다. 함수는 a 성공하면 0이 아닌 값이 실패하면 0입니다.

특정 이벤트 절차 만 등록 할 수 있습니다 한 번tỷ lệ kèo bóng đá tối nay. 이것은 절차의 주소는 조회로 사용되기 때문에 관련 인스턴스 데이터를 식별하는 키

주의

Windows에서는 기능이 서로 다를 수 있습니다 주소 : 하나는 DLL 외부에서 볼 수 있습니다 DLL 내부에서 보이는 또 다른. 하나 야 이 주소 중 하나만이라도 조심하십시오 와 함께libpq의 이벤트 처리 기능은 그렇지 않으면 혼란이 발생합니다. 그만큼 작동하는 코드를 작성하는 가장 간단한 규칙입니다 이벤트 절차가 선언되도록static. 만약 절차 주소는 외부에서 사용할 수 있어야합니다 자체 소스 파일, 별도의 기능을 노출시킵니다 주소를 반환하십시오.

31.12.3. 이벤트 지원 기능

PQREGISTEREVENTPROC

LIBPQ로 이벤트 콜백 절차를 등록합니다.

int pqregistereventProc (tỷ lệ kèo bóng đá tối nay *conn, pgeventproc Proc,
                        const char *name, void *passthrough);

이벤트 절차는 각각에 한 번 등록해야합니다tỷ lệ kèo bóng đá tối nay당신은 받고 싶습니다 이벤트. 메모리 외에는 제한이 없습니다 등록 할 수있는 이벤트 절차 수 연결과 함께. 함수는 0이 아닌 값을 반환합니다 실패하면 성공하고 0이되면

theProc인수가 될 것입니다 LIBPQ 이벤트가 발사 될 때 호출됩니다. 메모리 주소입니다 또한 조회에 익숙해instanceata. 그만큼이름인수는 오류 메시지의 이벤트 절차. 이 값은 될 수 없습니다NULL또는 제로 길이 문자열. 그만큼 이름 문자열이에 복사됩니다.tỷ lệ kèo bóng đá tối nay이므로 통과 할 필요는 없습니다 수명이 길다. 그만큼Passthrough포인터가 전달됩니다Proc이벤트가 발생할 때마다. 이 주장은NULL.

PQSETINSTANCETA

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

int pqsetinstanctata (tỷ lệ kèo bóng đá tối nay *conn, pgeventproc proc, void *data);
PQINSTANCETA

연결을 반환tỷ lệ kèo bóng đá tối nay'sinstanceata절차와 관련된Proc또는NULL없다면.

void *pqinstancedata (const tỷ lệ kèo bóng đá tối nay *conn, pgeventproc proc);
pqresultsetinstancedata

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

int pqresultsetinstancedata (pgresult *res, pgeventproc proc, tỷ lệ kèo bóng đá tối nay *data);
PQRESULTINSTANCETA

결과를 반환합니다instanceata관련Proc또는NULLif 아무것도 없습니다.

tỷ lệ kèo bóng đá tối nay *pqresultinstancedata (const pgresult *res, pgeventproc proc);

31.12.4. 이벤트 예

개인 데이터 관리의 골격 예입니다 LIBPQ 연결 및 결과와 관련이 있습니다.

/ * 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;
    tỷ lệ kèo bóng đá tối nay *conn = pqconnectdb ( "dbname = postgres");

    if (pqstatus (conn)! = connection_ok)

        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에서 복사) */
            pqsetresultinstancedata (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);

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

        CASE PGEVT_RESULTDESTROY :

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

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

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

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