이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 32.14. 메이저 토토 사이트 시스템버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

31.13. 메이저 토토 사이트 시스템

libpq의 메이저 토토 사이트 시스템입니다 등록 된 메이저 토토 사이트 핸들러에게 흥미로운 것에 대해 알리도록 설계되었습니다libpq창조와 같은 메이저 토토 사이트 또는의 파괴pgconnandpgresult개체. 주요 사용 사례는 그 것입니다 이를 통해 응용 프로그램은 자체 데이터를 A와 연결할 수 있습니다.pgconn또는pgresult그리고 해당 데이터가 an에 해당되는지 확인하십시오 적절한 시간.

각 등록 된 메이저 토토 사이트 핸들러는 두 조각과 관련이 있습니다. 알려진 데이터libpq만 불투명체void *포인터.Passthrough포인터가 제공합니다 메이저 토토 사이트 핸들러가 A에 등록 된 경우 응용 프로그램pgconn. 패스 스루 포인터는 결코 없습니다 삶의 변화pgconn및 모두pgresults에서 생성 된; 그래서 사용 된 것은 오래 지속되는 데이터를 가리켜 야합니다. 또한가 있습니다.인스턴스 데이터포인터, 시작null매번pgconnpgresult. 이 포인터는를 사용하여 조작 할 수 있습니다.pqinstancedata, PQSETINSTANCETA, pqresultinstancedataandPQSETRESULTINSTANCETA함수. 주목하십시오 패스 스루 포인터와 달리 A의 인스턴스 데이터pgconn자동으로 상속되지 않습니다pgresults에서 만들어졌습니다.libpq어떤 패스 스루와 인스턴스 데이터 포인터는 (무엇이든)를 가리키며 결코 그들을 해방 시키려고 시도하십시오 - 그것은 이벤트의 책임입니다 매니저.

31.13.1. 메이저 토토 사이트 유형

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

pgevt_register

레지스터 메이저 토토 사이트는 발생합니다PQREGISTEREVENTPROC호출됩니다. 이상적입니다 초기화 할 시간instanceataan 메이저 토토 사이트 절차가 필요할 수 있습니다. 단 하나의 레지스터 메이저 토토 사이트 만 해고됩니다 연결 당 메이저 토토 사이트 처리기. 메이저 토토 사이트 절차가 실패하면 등록이 중단되었습니다.

typedef struct

    pgconn *conn;
 pgeventRegister;

apgevt_register메이저 토토 사이트입니다 받은evtinfo포인터가 있어야합니다 캐스트pgeventRegister *. 이것 구조에는가 포함됩니다.pgconnConnection_ok상태; 보장 전화 한 경우PQREGISTEREVENTPROC선을 얻은 직후pgconn. 실패 코드를 반환 할 때는 모든 정리를 수행해야합니다PGEVT_CONNDESTROY메이저 토토 사이트가 발송됩니다.

PGEVT_CONNRESET

연결 재설정 메이저 토토 사이트가 완료되면pqreset또는pqresetpoll. 두 경우 모두 메이저 토토 사이트는 전용입니다 재설정이 성공하면 해고되었습니다. 메이저 토토 사이트 절차가 실패하면 전체 연결 재설정이 실패합니다. 그만큼pgconnConnection_Bad상태 및pqresetpollreturnpgres_polling_failed.

typedef struct

    pgconn *conn;
 pgeventconnreset;

언제PGEVT_CONNRESET메이저 토토 사이트입니다 받은evtinfo포인터가 있어야합니다 캐스트pgeventconnreset *. 하지만 포함 된pgconn방금 재설정되었습니다. 모든 메이저 토토 사이트 데이터는 변경되지 않았습니다. 이 메이저 토토 사이트는 익숙해 져야합니다 RESET/Reload/Requery 모든 관련instanceata. 메이저 토토 사이트 절차라도 마찬가지입니다 처리 실패PGEVT_CONNRESET여전히 APGEVT_CONNDESTROY메이저 토토 사이트 연결이 닫히면.

PGEVT_CONNDESTROY

연결 파괴 메이저 토토 사이트가 해고되어pqfinish. 이벤트 절차입니다 libpq가 없기 때문에 이벤트 데이터를 올바르게 정리할 책임 이 메모리를 관리하는 능력. 청소에 실패하면 이어질 것입니다 메모리 누출.

typedef struct

    pgconn *conn;
 pgeventconndestroy;

언제PGEVT_CONNDESTROY메이저 토토 사이트입니다 받은evtinfo포인터가 있어야합니다 캐스트pgeventconndestroy *. 이것 메이저 토토 사이트는 전에 해고됩니다.pqfinish다른 청소 수행. 메이저 토토 사이트의 반환 값 실패를 나타내는 방법이 없으므로 절차는 무시됩니다. 에서pqfinish. 또한 메이저 토토 사이트 절차 실패는 청소 과정을 중단해서는 안됩니다. 원치 않는 기억.

pgevt_resultcreate

결과 생성 메이저 토토 사이트가 쿼리에 응답하여 해고됩니다. 를 포함하여 결과를 생성하는 실행 함수pqgetresult. 이 행사는 이후에만 해고됩니다 결과가 성공적으로 만들어졌습니다.

typedef struct

    pgconn *conn;
    pgresult *결과;
 pgeventresultcreate;

언제pgevt_resultcreate메이저 토토 사이트입니다 받은evtinfo포인터가 있어야합니다 캐스트pgeventresultcreate *. 그만큼conn생성에 사용되는 연결입니다 결과. 이곳은 모든 것을 초기화하기에 이상적인 장소입니다instanceata결과. 메이저 토토 사이트 절차가 실패하면 결과가 지워집니다. 그리고 실패는 전파 될 것입니다. 메이저 토토 사이트 절차는해서는 안됩니다 시도PQCLEAR결과 객체 그 자체. 실패 코드를 반환 할 때는 모든 정리가 있어야합니다 아니오로 수행pgevt_resultdestroy메이저 토토 사이트 발송됩니다.

pgevt_resultcopy

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

typedef struct

    const pgresult *src;
    pgresult *dest;
 pgeventresultcopy;

언제pgevt_resultcopy메이저 토토 사이트입니다 받은evtinfo포인터가 있어야합니다 캐스트pgeventresultcopy *. 그만큼SRC결과는 복사 한 내용입니다dest결과는 사본 대상입니다. 이 메이저 토토 사이트는의 깊은 사본을 제공하는 데 사용될 수 있습니다.instanceata이후pqcopyresult그렇게 할 수 없습니다. 메이저 토토 사이트 절차 인 경우 실패하면 전체 사본 작업이 실패하고dest결과가 지워집니다. 반환 할 때 실패 코드, 모든 정리는 없음으로 수행해야합니다PGEVT_RESULTDESTROY메이저 토토 사이트가 발송됩니다 목적지 결과.

pgevt_resultdestroy

결과 파괴 메이저 토토 사이트는 A에 대한 응답으로 해고되었습니다PQCLEAR. 이벤트 절차입니다 libpq가 없기 때문에 이벤트 데이터를 올바르게 정리할 책임 이 메모리를 관리하는 능력. 청소에 실패하면 이어질 것입니다 메모리 누출.

typedef struct

    pgresult *결과;
 pgeventresultdestroy;

언제PGEVT_RESULTDESTROY메이저 토토 사이트입니다 받은evtinfo포인터가 있어야합니다 캐스트pgeventresultdestroy *. 이것 메이저 토토 사이트는 전에 해고됩니다.PQCLEAR다른 정리 수행. 메이저 토토 사이트의 반환 값 실패를 나타내는 방법이 없으므로 절차는 무시됩니다. 에서PQCLEAR. 또한 메이저 토토 사이트 절차 실패는 청소 과정을 중단해서는 안됩니다. 원치 않는 기억.

31.13.2. 메이저 토토 사이트 콜백 절차

pgeventproc

pgeventproc는 포인터의 타이핑입니다 이벤트 절차, 즉 사용자 콜백 함수 libpq로부터 이벤트를받습니다. 이벤트 절차의 서명 해야 됨

int eventProc (pgeventid evtid, void *evtinfo, void *passthrough)

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

특정 메이저 토토 사이트 절차는 한 번만 등록 할 수 있습니다pgconn. 주소 때문입니다 절차는 관련을 식별하기위한 조회 키로 사용됩니다. 인스턴스 데이터.

주의

Windows에서 기능에는 두 가지 주소가있을 수 있습니다. 하나는 하나입니다 DLL 외부에서 볼 수 있고 다른 하나는 DLL 내부에서 볼 수 있습니다. 이 주소 중 하나만 사용되도록 조심해야합니다.libpq의 메이저 토토 사이트-처리 함수, 그렇지 않으면 혼란이 발생합니다. 코드를 작성하는 가장 간단한 규칙입니다 메이저 토토 사이트 절차가 선언되도록하는 것입니다정적. 절차의 주소가 있어야하는 경우 자체 소스 파일 외부에서 사용할 수 있으며 별도의 기능을 노출시킵니다. 주소를 반환하려면

31.13.3. 이벤트 지원 기능

PQREGISTEREVENTPROC

메이저 토토 사이트 콜백 절차를 LIBPQ로 등록합니다.

int pqregistereventProc (pgconn *conn, pgeventproc Proc,
                        const char *name, void *passthrough);

메이저 토토 사이트 절차는 각각에 한 번 등록해야합니다pgconn당신은 메이저 토토 사이트를 받고 싶습니다. 거기 있습니다 메모리 이외의 메이저 토토 사이트 절차 수에 제한이 없습니다. 연결에 등록 할 수 있습니다. 함수는 a 성공하면 0이 아닌 값이 실패하면 0입니다.

theProcLIBPQ 메이저 토토 사이트가 발사됩니다. 메모리 주소는 조회에도 사용됩니다instanceata. 그만큼이름인수는 메이저 토토 사이트를 참조하는 데 사용됩니다 오류 메시지의 절차. 이 값은 될 수 없습니다NULL또는 제로 길이 문자열. 이름 문자열은입니다 에 복사pgconn통과 된 것은 오래 지속될 필요는 없습니다. 그만큼Passthrough포인터가 전달됩니다Proc메이저 토토 사이트가 발생할 때마다. 이 주장은 할 수 있습니다 BENULL.

PQSETINSTANCETA

연결 설정conn'sinstanceata절차Procto데이터. 이것 성공을 위해 0이 아닌 반환하고 실패로 0이됩니다. (실패는 전용입니다 가능하면 가능하다면Proc제대로되지 않았습니다 등록conn.)

int pqsetinstancedata (pgconn *conn, pgeventproc proc, void *data);
PQINSTANCETA

연결을 반환conn'sinstanceata절차와 관련된Proc또는nullif 아무것도 없습니다.

void *pqinstancedata (const pgconn *conn, pgeventproc proc);
pqresultsetinstancedata

결과 설정instanceataforProc​​to데이터. 이것은 성공을 위해 0이 아닌 반환하고 실패로 0이됩니다. (실패입니다 가능하면 가능Proc그렇지 않았습니다 결과에 올바르게 등록되었습니다.)

int pqresultsetinstancedata (pgresult *res, pgeventproc proc, void *data);
pqresultinstancedata

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

void *pqresultinstancedata (const pgresult *res, pgeventproc proc);

31.13.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;
    pgconn *conn =
        pqconnectdb ( "dbname = postgres 옵션 = -csearch_path =");

    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를 반환하십시오. */
        기본:
            부서지다;

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