Postgresql 9.3.25 문서 | ||||
---|---|---|---|---|
PostgreSQL : 문서 : 9.3 : 배트맨 토토 처리 | PostgreSQL : 문서 : 9.3 : LIBPQ -C 토토 커뮤니티 | 31 장.libpq-C 라이브러리 | PostgreSQL : 문서 : 9.3 : 환경 사설 토토 |
libpq의 메이저 토토 사이트 시스템입니다 등록 된 메이저 토토 사이트 핸들러에게 흥미로운 것에 대해 알리도록 설계되었습니다libpq창조와 같은 메이저 토토 사이트 또는의 파괴pgconnandpgresult개체. 주요 사용 사례는 그 것입니다 이를 통해 응용 프로그램은 자체 데이터를 A와 연결할 수 있습니다.pgconn또는pgresult그리고 해당 데이터가 an에 해당되는지 확인하십시오 적절한 시간.
각 등록 된 메이저 토토 사이트 핸들러는 두 조각과 관련이 있습니다.
알려진 데이터libpq만
불투명체void *포인터.Passthrough포인터가 제공합니다
메이저 토토 사이트 핸들러가 A에 등록 된 경우 응용 프로그램pgconn. 패스 스루 포인터는 결코 없습니다
삶의 변화pgconn및
모두pgresults에서 생성 된; 그래서
사용 된 것은 오래 지속되는 데이터를 가리켜 야합니다. 또한가 있습니다.인스턴스 데이터포인터, 시작null매번pgconn및pgresult.
이 포인터는를 사용하여 조작 할 수 있습니다.pqinstancedata
, PQSETINSTANCETA
, pqresultinstancedata
andPQSETRESULTINSTANCETA
함수. 주목하십시오
패스 스루 포인터와 달리 A의 인스턴스 데이터pgconn자동으로 상속되지 않습니다pgresults에서 만들어졌습니다.libpq어떤 패스 스루와
인스턴스 데이터 포인터는 (무엇이든)를 가리키며 결코
그들을 해방 시키려고 시도하십시오 - 그것은 이벤트의 책임입니다
매니저.
ENUMpgeventid유형의 이름을 지정합니다 메이저 토토 사이트 시스템에서 처리 한 메이저 토토 사이트. 모든 값에는 이름이 있습니다 부터 시작pgevt. 각 이벤트 유형에 대해 다음과 같은 해당 이벤트 정보 구조가 있습니다. 매개 변수는 이벤트 핸들러로 전달되었습니다. 이벤트 유형은 다음과 같습니다.
레지스터 메이저 토토 사이트는 발생합니다PQREGISTEREVENTPROC
호출됩니다. 이상적입니다
초기화 할 시간instanceataan
메이저 토토 사이트 절차가 필요할 수 있습니다. 단 하나의 레지스터 메이저 토토 사이트 만 해고됩니다
연결 당 메이저 토토 사이트 처리기. 메이저 토토 사이트 절차가 실패하면
등록이 중단되었습니다.
typedef struct pgconn *conn; pgeventRegister;
apgevt_register메이저 토토 사이트입니다
받은evtinfo포인터가 있어야합니다
캐스트pgeventRegister *. 이것
구조에는가 포함됩니다.pgconnConnection_ok상태; 보장
전화 한 경우PQREGISTEREVENTPROC
선을 얻은 직후pgconn.
실패 코드를 반환 할 때는 모든 정리를 수행해야합니다PGEVT_CONNDESTROY메이저 토토 사이트가 발송됩니다.
연결 재설정 메이저 토토 사이트가 완료되면pqreset
또는pqresetpoll
. 두 경우 모두 메이저 토토 사이트는 전용입니다
재설정이 성공하면 해고되었습니다. 메이저 토토 사이트 절차가 실패하면
전체 연결 재설정이 실패합니다. 그만큼pgconnConnection_Bad상태 및pqresetpoll
returnpgres_polling_failed.
typedef struct pgconn *conn; pgeventconnreset;
언제PGEVT_CONNRESET메이저 토토 사이트입니다 받은evtinfo포인터가 있어야합니다 캐스트pgeventconnreset *. 하지만 포함 된pgconn방금 재설정되었습니다. 모든 메이저 토토 사이트 데이터는 변경되지 않았습니다. 이 메이저 토토 사이트는 익숙해 져야합니다 RESET/Reload/Requery 모든 관련instanceata. 메이저 토토 사이트 절차라도 마찬가지입니다 처리 실패PGEVT_CONNRESET여전히 APGEVT_CONNDESTROY메이저 토토 사이트 연결이 닫히면.
연결 파괴 메이저 토토 사이트가 해고되어pqfinish
. 이벤트 절차입니다
libpq가 없기 때문에 이벤트 데이터를 올바르게 정리할 책임
이 메모리를 관리하는 능력. 청소에 실패하면 이어질 것입니다
메모리 누출.
typedef struct pgconn *conn; pgeventconndestroy;
언제PGEVT_CONNDESTROY메이저 토토 사이트입니다
받은evtinfo포인터가 있어야합니다
캐스트pgeventconndestroy *. 이것
메이저 토토 사이트는 전에 해고됩니다.pqfinish
다른 청소 수행. 메이저 토토 사이트의 반환 값
실패를 나타내는 방법이 없으므로 절차는 무시됩니다.
에서pqfinish
. 또한 메이저 토토 사이트
절차 실패는 청소 과정을 중단해서는 안됩니다.
원치 않는 기억.
결과 생성 메이저 토토 사이트가 쿼리에 응답하여 해고됩니다.
를 포함하여 결과를 생성하는 실행 함수pqgetresult
. 이 행사는 이후에만 해고됩니다
결과가 성공적으로 만들어졌습니다.
typedef struct pgconn *conn; pgresult *결과; pgeventresultcreate;
언제pgevt_resultcreate메이저 토토 사이트입니다
받은evtinfo포인터가 있어야합니다
캐스트pgeventresultcreate *. 그만큼conn생성에 사용되는 연결입니다
결과. 이곳은 모든 것을 초기화하기에 이상적인 장소입니다instanceata결과. 메이저 토토 사이트 절차가 실패하면 결과가 지워집니다.
그리고 실패는 전파 될 것입니다. 메이저 토토 사이트 절차는해서는 안됩니다
시도PQCLEAR
결과 객체
그 자체. 실패 코드를 반환 할 때는 모든 정리가 있어야합니다
아니오로 수행pgevt_resultdestroy메이저 토토 사이트
발송됩니다.
결과 사본 메이저 토토 사이트가 응답하여 해고됩니다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메이저 토토 사이트가 발송됩니다 목적지 결과.
결과 파괴 메이저 토토 사이트는 A에 대한 응답으로 해고되었습니다PQCLEAR
. 이벤트 절차입니다
libpq가 없기 때문에 이벤트 데이터를 올바르게 정리할 책임
이 메모리를 관리하는 능력. 청소에 실패하면 이어질 것입니다
메모리 누출.
typedef struct pgresult *결과; pgeventresultdestroy;
언제PGEVT_RESULTDESTROY메이저 토토 사이트입니다
받은evtinfo포인터가 있어야합니다
캐스트pgeventresultdestroy *. 이것
메이저 토토 사이트는 전에 해고됩니다.PQCLEAR
다른 정리 수행. 메이저 토토 사이트의 반환 값
실패를 나타내는 방법이 없으므로 절차는 무시됩니다.
에서PQCLEAR
. 또한 메이저 토토 사이트
절차 실패는 청소 과정을 중단해서는 안됩니다.
원치 않는 기억.
pgeventproc는 포인터의 타이핑입니다 이벤트 절차, 즉 사용자 콜백 함수 libpq로부터 이벤트를받습니다. 이벤트 절차의 서명 해야 됨
int eventProc (pgeventid evtid, void *evtinfo, void *passthrough)
theevtid매개 변수는를 나타냅니다.pgevt이벤트가 발생했습니다. 그만큼evtinfo포인터는 적절한 곳에 시전해야합니다
이벤트에 대한 추가 정보를 얻기위한 구조 유형. 그만큼Passthrough매개 변수는 포인터입니다
제공PQREGISTEREVENTPROC
언제
이벤트 절차가 등록되었습니다. 함수는 a
성공하면 0이 아닌 값이 실패하면 0입니다.
특정 메이저 토토 사이트 절차는 한 번만 등록 할 수 있습니다pgconn. 주소 때문입니다 절차는 관련을 식별하기위한 조회 키로 사용됩니다. 인스턴스 데이터.
주의 |
Windows에서 기능에는 두 가지 주소가있을 수 있습니다. 하나는 하나입니다 DLL 외부에서 볼 수 있고 다른 하나는 DLL 내부에서 볼 수 있습니다. 이 주소 중 하나만 사용되도록 조심해야합니다.libpq의 메이저 토토 사이트-처리 함수, 그렇지 않으면 혼란이 발생합니다. 코드를 작성하는 가장 간단한 규칙입니다 메이저 토토 사이트 절차가 선언되도록하는 것입니다정적. 절차의 주소가 있어야하는 경우 자체 소스 파일 외부에서 사용할 수 있으며 별도의 기능을 노출시킵니다. 주소를 반환하려면 |
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
결과 설정instanceataforProcto데이터. 이것은 성공을 위해 0이 아닌 반환하고 실패로 0이됩니다. (실패입니다 가능하면 가능Proc그렇지 않았습니다 결과에 올바르게 등록되었습니다.)
int pqresultsetinstancedata (pgresult *res, pgeventproc proc, void *data);
pqresultinstancedata
결과를 반환instanceata관련Proc또는NULL없다면.
void *pqresultinstancedata (const pgresult *res, pgeventproc proc);
개인 데이터 관리의 골격 예는 다음과 같습니다. 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를 반환하십시오. */ 기본: 부서지다; 진실을 반환하십시오. / * 이벤트 처리 성공 */