| PostgreSQL 9.3.25 문서 | ||||
|---|---|---|---|---|
| PostgreSQL : 문서 : 9.3 : 배트맨 토토 처리 | PostgreSQL : 문서 : 9.3 : LIBPQ -C 토토 커뮤니티 | 31장.libpq- C 라이브러리 | PostgreSQL : 문서 : 9.3 : 환경 사설 토토 | |
libpq의 메이저 토토 사이트 시스템은 등록된 메이저 토토 사이트 핸들러에게 흥미로운 내용을 알리도록 설계되었습니다.libpq생성 등의 메이저 토토 사이트 또는 파괴PGconn그리고PGresult객체. 주요 사용 사례는 다음과 같습니다. 이를 통해 애플리케이션은 자신의 데이터를 다음과 연결할 수 있습니다.PGconn또는PGresult그리고 해당 데이터가 특정 시점에 해제되는지 확인하세요. 적절한 시간.
등록된 각 메이저 토토 사이트 핸들러는 두 개의 메이저 토토 사이트 핸들러와 연관되어 있습니다.
알려진 데이터libpq다음으로만
불투명무효 *포인터. 가 있습니다.통과다음에서 제공하는 포인터
이벤트 핸들러가 a에 등록된 경우의 애플리케이션PGconn. 통과 포인터는 절대로
의 삶에 대한 변화PGconn그리고
모두PGresults가 생성되었습니다. 그렇다면
사용되는 경우에는 수명이 긴 데이터를 가리켜야 합니다. 또한 다음이 있습니다.인스턴스 데이터시작하는 포인터NULL매번PGconn그리고PGresult.
이 포인터는를 사용하여 조작할 수 있습니다.PQinstanceData, PQsetInstanceData, PQresultInstanceData그리고PQsetResultInstanceData함수. 참고하세요
통과 포인터와 달리 a의 인스턴스 데이터PGconn다음에 의해 자동으로 상속되지 않습니다.PGresult그것에서 생성되었습니다.libpq통과 및 통과가 무엇인지 모릅니다.
인스턴스 데이터 포인터는 (있는 경우)를 가리키며 절대 그렇지 않습니다.
그들을 풀어주려고 시도하세요 - 그게 사건의 책임입니다
핸들러.
열거형PGEventId유형의 이름을 지정합니다. 메이저 토토 사이트 시스템이 처리하는 메이저 토토 사이트. 모든 값에는 이름이 있습니다. 로 시작하는PGEVT. 각 이벤트 유형에 대해 해당 이벤트 정보 구조가 있습니다. 이벤트 핸들러에 전달되는 매개변수입니다. 이벤트 유형은 다음과 같습니다.
등록 이벤트는 다음과 같은 경우에 발생합니다.PQregisterEventProc호출됩니다. 그것은 이상적이다
초기화할 시간입니다.instanceData안
메이저 토토 사이트 절차가 필요할 수 있습니다. 등록 메이저 토토 사이트는 하나만 발생합니다.
연결당 메이저 토토 사이트 핸들러. 메이저 토토 사이트 프로시저가 실패하면
등록이 중단되었습니다.
typedef 구조체
PGconn *콘;
PGEventRegister;
언제PGEVT_REGISTER메이저 토토 사이트는
수신됨,evtInfo포인터는 다음과 같아야 합니다.
a로 캐스팅PGEvent등록 *. 이
구조에는가 포함됩니다.PGconn그러면 됩니다
에 있다CONNECTION_OK상태; 보장
전화하면PQregisterEventProc상품을 얻은 직후PGconn.
실패 코드를 반환할 때 모든 정리는 no로 수행되어야 합니다PGEVT_CONNDESTROY메이저 토토 사이트가 전송됩니다.
연결 재설정 메이저 토토 사이트는 완료 시 시작됩니다.PQreset또는PQresetPoll. 두 경우 모두 이벤트는 다음과 같습니다.
재설정이 성공하면 시작됩니다. 이벤트 프로시저가 실패하는 경우
전체 연결 재설정이 실패합니다.PGconn입력됨CONNECTION_BAD상태 및PQresetPoll반환할 것입니다PGRES_POLLING_FAILED.
typedef 구조체
PGconn *콘;
PGEventConnReset;
때PGEVT_CONNRESET메이저 토토 사이트는 수신됨,evtInfo포인터는 다음과 같아야 합니다. a로 캐스팅PGEventConnReset *. 비록 포함된PGconn방금 재설정되었습니다. 모든 이벤트 데이터는 변경되지 않습니다. 이 이벤트는 다음 용도로 사용되어야 합니다. 관련된 모든 재설정/다시 로드/재쿼리instanceData. 메이저 토토 사이트 절차가 진행되더라도 처리 실패PGEVT_CONNRESET, 그렇죠 아직도 a를 받습니다PGEVT_CONNDESTROY메이저 토토 사이트 연결이 종료될 때.
다음에 대한 응답으로 연결 파괴 이벤트가 시작됩니다.PQfinish. 이벤트 프로시져입니다
libpq에는 해당 이벤트 데이터를 적절하게 정리할 책임이 없습니다.
이 기억을 관리하는 능력. 청소를 하지 않으면 다음과 같은 일이 발생합니다.
메모리 누수.
typedef 구조체
PGconn *콘;
PGEventConnDestroy;
때PGEVT_CONNDESTROY메이저 토토 사이트는
수신됨,evtInfo포인터는 다음과 같아야 합니다.
a로 캐스팅PGEventConnDestroy *. 이
메이저 토토 사이트가 발생하기 전에 발생함PQfinish다른 정리를 수행 중입니다. 메이저 토토 사이트의 반환 값
실패를 표시할 방법이 없기 때문에 절차가 무시됩니다.
에서PQfinish. 또한, 메이저 토토 사이트
절차 실패로 인해 정리 프로세스가 중단되어서는 안 됩니다.
원치 않는 기억.
결과 생성 이벤트는 모든 쿼리에 대한 응답으로 시작됩니다.
다음을 포함하여 결과를 생성하는 실행 함수PQgetResult. 이 이벤트는 다음 이후에만 시작됩니다.
결과가 성공적으로 생성되었습니다.
typedef 구조체
PGconn *콘;
PGresult *결과;
PGEventResultCreate;
때PGEVT_RESULTCREATE메이저 토토 사이트는
수신됨,evtInfo포인터는 다음과 같아야 합니다.
a로 캐스팅PGEventResultCreate *.콘생성하는 데 사용되는 연결입니다.
결과. 이곳은 무엇이든 초기화하기에 이상적인 장소입니다.instanceData다음과 연결되어야 합니다.
결과. 이벤트 절차가 실패하면 결과가 지워집니다.
실패가 전파됩니다. 이벤트 프로시저는 다음과 같아야 합니다.
노력해 보세요PQclear다음에 대한 결과 객체
그 자체. 실패 코드를 반환할 때 모든 정리 작업을 수행해야 합니다.
아니오로 수행됨PGEVT_RESULTDESTROY메이저 토토 사이트
발송됩니다.
다음에 대한 응답으로 결과 복사 이벤트가 시작됩니다.PQcopyResult. 이 이벤트는 다음 이후에만 시작됩니다.
복사가 완료되었습니다. 성공적으로 수행된 이벤트 프로시저만
처리했습니다PGEVT_RESULTCREATE또는PGEVT_RESULTCOPY소스에 대한 메이저 토토 사이트
결과가 수신됩니다PGEVT_RESULTCOPY메이저 토토 사이트.
typedef 구조체
const PGresult *src;
PGresult *dest;
PGEventResultCopy;
때PGEVT_RESULTCOPY메이저 토토 사이트는 수신됨,evtInfo포인터는 다음과 같아야 합니다. a로 캐스팅PGEventResultCopy *.src결과는 다음 동안 복사된 것입니다.대상결과는 복사 대상입니다. 이 이벤트는 다음의 전체 복사본을 제공하는 데 사용될 수 있습니다.인스턴스데이터, 이후PQcopyResult그렇게 할 수 없습니다. 메이저 토토 사이트 진행의 경우 실패하면 전체 복사 작업이 실패하고대상결과가 삭제됩니다. 반환할 때 실패 코드, 모든 정리는 아니오로 수행되어야 합니다.PGEVT_RESULTDESTROY이벤트가 다음에 대해 전송됩니다. 목적지 결과.
결과 파괴 이벤트는 다음에 대한 응답으로 시작됩니다.PQclear. 이벤트 프로시져입니다
libpq에는 해당 이벤트 데이터를 적절하게 정리할 책임이 없습니다.
이 기억을 관리하는 능력. 청소를 하지 않으면 다음과 같은 일이 발생합니다.
메모리 누수.
typedef 구조체
PGresult *결과;
PGEventResultDestroy;
때PGEVT_RESULTDESTROY메이저 토토 사이트는
수신됨,evtInfo포인터는 다음과 같아야 합니다.
a로 캐스팅PGEventResultDestroy *. 이
메이저 토토 사이트가 발생하기 전에 발생함PQclear다른 정리를 수행 중입니다. 메이저 토토 사이트의 반환 값
실패를 표시할 방법이 없기 때문에 절차가 무시됩니다.
에서PQclear. 또한, 메이저 토토 사이트
절차 실패로 인해 정리 프로세스가 중단되어서는 안 됩니다.
원치 않는 기억.
PGEventProc포인터에 대한 형식 정의입니다. 이벤트 프로시저, 즉 사용자 콜백 함수에 libpq에서 이벤트를 받습니다. 이벤트 프로시저의 서명 이어야 합니다
int eventproc(PGEventId evtId, void *evtInfo, void *passThrough)
그evtId매개변수는 다음을 나타냅니다.PGEVT메이저 토토 사이트가 발생했습니다.evtInfo포인터는 적절한 위치로 캐스트되어야 합니다.
이벤트에 대한 추가 정보를 얻기 위한 구조 유형입니다.통과매개변수는 포인터입니다.
에 제공됨PQregisterEventProc언제
이벤트 프로시저가 등록되었습니다. 함수는 다음을 반환해야 합니다.
성공하면 0이 아닌 값이고, 실패하면 0입니다.
특정 메이저 토토 사이트 프로시저는 한 번만 등록될 수 있습니다.PGconn. 그 이유는 주소가 프로시저는 연관된 항목을 식별하기 위한 조회 키로 사용됩니다. 인스턴스 데이터.
| 주의 |
|
Windows에서 함수는 두 개의 서로 다른 주소를 가질 수 있습니다: 하나 DLL 외부에서 볼 수 있고 다른 하나는 DLL 내부에서 볼 수 있습니다. 이 주소 중 하나만 사용된다는 점에 주의해야 합니다.libpq의 메이저 토토 사이트 프로시저 함수, 그렇지 않으면 혼란이 생길 것입니다. 코드 작성을 위한 가장 간단한 규칙 작업은 메이저 토토 사이트 프로시저가 선언되었는지 확인하는 것입니다.정적. 프로시저의 주소가 다음과 같아야 하는 경우 자체 소스 파일 외부에서 사용 가능하며 별도의 함수를 노출합니다. 주소를 반환합니다. |
PQregisterEventProclibpq에 이벤트 콜백 프로시저를 등록합니다.
int PQregisterEventProc(PGconn *conn, PGEventProc proc,
const char *이름, void *passThrough);
메이저 토토 사이트 프로시저는 각각에 한 번씩 등록되어야 합니다.PGconn메이저 토토 사이트를 수신하고 싶습니다. 있다 메모리 외에는 메이저 토토 사이트 프로시저의 수에 제한이 없습니다. 연결하여 등록할 수 있습니다. 이 함수는 성공하면 0이 아닌 값이고, 실패하면 0입니다.
그proc인수는 다음 경우에 호출됩니다. libpq 이벤트가 시작됩니다. 해당 메모리 주소는 조회에도 사용됩니다.instanceData.이름인수는 메이저 토토 사이트를 참조하는 데 사용됩니다. 오류 메시지의 절차. 이 값은 될 수 없습니다.NULL또는 길이가 0인 문자열. 이름 문자열은 에 복사됨PGconn그럼 뭐죠? 합격이 오래 지속될 필요는 없습니다.통과포인터가 다음으로 전달되었습니다.proc메이저 토토 사이트가 발생할 때마다. 이 주장은 수 수NULL.
PQsetInstanceData연결을 설정합니다콘'sinstanceData절차용proc에데이터. 이 성공하면 0이 아닌 값을 반환하고 실패하면 0을 반환합니다. (실패는 단지 가능하다면proc제대로 되지 않았습니다 에 등록됨콘.)
int PQsetInstanceData(PGconn *conn, PGEventProc proc, void *data);
PQinstanceData연결을 반환합니다.콘'sinstanceData프로시저와 연결됨proc, 또는NULL만일 아무것도 없습니다.
void *PQinstanceData(const PGconn *conn, PGEventProc proc);
PQresultSetInstanceData결과를 설정합니다instanceDataforproc에데이터. 성공하면 0이 아닌 값을 반환하고 실패하면 0을 반환합니다. (실패는 경우에만 가능proc아님 결과에 제대로 등록되었습니다.)
int PQresultSetInstanceData(PGresult *res, PGEventProc proc, void *data);
PQresultInstanceData결과를 반환합니다인스턴스데이터다음과 연결됨proc또는NULL아무것도 없다면.
void *PQresultInstanceData(const PGresult *res, PGEventProc proc);
다음은 관련 개인 데이터를 관리하는 기본 예입니다. libpq 연결 및 결과가 포함됩니다.
/* libpq 이벤트에 필요한 헤더(참고: libpq-fe.h 포함) */
#include <libpq-events.h
/* 인스턴스 데이터 */
typedef 구조체
int n;
문자 *str;
마이데이터;
/* PGEventProc */
static int myEventProc(PGEventId evtId, void *evtInfo, void *passThrough);
정수
메인(공허)
마이데이터 *데이터;
PGresult *res;
PGconn *콘 =
PQconnectdb("dbname=postgres 옵션=-csearch_path=");
if (PQstatus(conn) != CONNECTION_OK)
fprintf(stderr, "데이터베이스 연결 실패: %s",
PQerrorMessage(conn));
PQfinish(콘);
1을 반환합니다.
/* 이벤트를 수신해야 하는 모든 연결에서 한 번 호출됩니다.
* myEventProc에 PGEVT_REGISTER를 보냅니다.
*/
if (!PQregisterEventProc(conn, myEventProc, "mydata_proc", NULL))
fprintf(stderr, "PGEventProc를 등록할 수 없습니다\n");
PQfinish(콘);
1을 반환합니다.
/* conn 인스턴스 데이터를 사용할 수 있습니다 */
데이터 = PQinstanceData(conn, myEventProc);
/* myEventProc에 PGEVT_RESULTCREATE를 보냅니다 */
res = PQexec(conn, "SELECT 1 + 1");
/* 결과 인스턴스 데이터를 사용할 수 있습니다 */
데이터 = PQresultInstanceData(res, myEventProc);
/* PG_COPYRES_EVENTS가 사용되면 PGEVT_RESULTCOPY를 myEventProc에 보냅니다. */
res_copy = PQcopyResult(res, PG_COPYRES_TUPLES | PG_COPYRES_EVENTS);
/* PG_COPYRES_EVENTS가 있는 경우 결과 인스턴스 데이터를 사용할 수 있습니다.
* PQcopyResult 호출 중에 사용됩니다.
*/
데이터 = PQresultInstanceData(res_copy, myEventProc);
/* 두 지우기 모두 myEventProc에 PGEVT_RESULTDESTROY를 보냅니다. */
PQclear(res);
PQclear(res_copy);
/* myEventProc에 PGEVT_CONNDESTROY를 보냅니다 */
PQfinish(콘);
0을 반환합니다.
정적 정수
myEventProc(PGEventId evtId, void *evtInfo, void *passThrough)
스위치(evtId)
PGEVT_REGISTER:
PGEventRegister *e = (PGEventRegister *)evtInfo;
mydata *data = get_mydata(e-conn);
/* 앱별 데이터를 연결과 연결 */
PQsetInstanceData(e-conn, myEventProc, data);
부서지다;
사례 PGEVT_CONNRESET:
PGEventConnReset *e = (PGEventConnReset *)evtInfo;
mydata *data = PQinstanceData(e-conn, myEventProc);
만약 (데이터)
memset(data, 0, sizeof(mydata));
부서지다;
사례 PGEVT_CONNDESTROY:
PGEventConnDestroy *e = (PGEventConnDestroy *)evtInfo;
mydata *data = PQinstanceData(e-conn, myEventProc);
/* conn이 파괴되기 때문에 무료 인스턴스 데이터 */
만약 (데이터)
free_mydata(데이터);
부서지다;
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);
부서지다;
사례 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);
부서지다;
사례 PGEVT_RESULTDESTROY:
PGEventResultDestroy *e = (PGEventResultDestroy *)evtInfo;
mydata *data = PQresultInstanceData(e-result, myEventProc);
/* 결과가 삭제되므로 무료 인스턴스 데이터 */
만약 (데이터)
free_mydata(데이터);
부서지다;
/* 알 수 없는 이벤트 ID, TRUE를 반환합니다. */
기본값:
휴식;
TRUE를 반환합니다. /* 이벤트 처리 성공 */