Phiên bản được hỗ trợ:hiện tại(17) /16 / 15 / 14 / 13
Phiên bản phát triển:18 / Devel
Phiên bản kèo bóng đá cúp c2 được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4

32,14. Hệ thống sự kèo bóng đá cúp c2#

libpqHệ thống sự kèo bóng đá cúp c2 được thiết kế để thông báo cho Trình xử lý sự kèo bóng đá cúp c2 đã đăng ký về thú vịlibpqCác sự kèo bóng đá cúp c2, chẳng hạn như sự sáng tạo hoặc phá hủyPGConnpgresultĐối tượng. Trường hợp sử dụng chính là điều này cho phép các ứng dụng liên kết dữ kèo bóng đá cúp c2 của riêng họ vớiPGConnhoặcpgresultvà đảm bảo rằng dữ kèo bóng đá cúp c2 đó được giải phóng vào một thời điểm thích hợp.

Mỗi trình xử lý sự kèo bóng đá cúp c2 đã đăng ký được liên kết với hai phần dữ liệu, được biết đếnlibpqchỉ dưới dạng mờvoid *Con trỏ. Có mộtPass-quaCon trỏ được cung cấp bởi ứng dụng khi trình xử lý sự kèo bóng đá cúp c2 được đăng ký vớiPGConn. Con trỏ truyền qua kèo bóng đá cúp c2 bao giờ thay đổi cho cuộc sống củaPGConnvà tất cảpgresultS được tạo ra từ nó; Vì vậy, nếu được sử dụng, nó phải trỏ đến dữ kèo bóng đá cúp c2 tồn tại lâu. Ngoài ra còn códữ kèo bóng đá cúp c2 thể hiệnCon trỏ, bắt đầunullTrong mỗiPGConnpgresult. Con trỏ này có thể được thao tác bằng cách sử dụngpqinstancedata, pqsetInstanceata, pqresultinstancedataPQResultsetInstanceatachức năng. Lưu ý rằng không giống như con trỏ truyền qua, dữ kèo bóng đá cúp c2 phiên bản củaPGConnkèo bóng đá cúp c2 được kế thừa tự động bởiPGRESULTs được tạo từ nó.libpq11829_12000

32.14.1. Loại sự kèo bóng đá cúp c2#

enumPGEVENTIDĐặt tên cho các loại sự kèo bóng đá cúp c2 được xử lý bởi hệ thống sự kèo bóng đá cúp c2. Tất cả các giá trị của nó có tên bắt đầu bằngPGEVT. Đối với mỗi loại sự kèo bóng đá cúp c2, có một cấu trúc thông tin sự kèo bóng đá cúp c2 tương ứng mang các tham số được truyền cho trình xử lý sự kèo bóng đá cúp c2. Các loại sự kèo bóng đá cúp c2 là:

PGEVT_REGISTER #

Sự kèo bóng đá cúp c2 đăng ký xảy ra khiPQRegisterEventProcđược gọi. Đó là thời điểm lý tưởng để khởi tạo bất kỳInstancedataMột quy trình sự kèo bóng đá cúp c2 có thể cần. Chỉ có một sự kèo bóng đá cúp c2 đăng ký sẽ được sa thải trên mỗi người xử lý sự kèo bóng đá cúp c2 cho mỗi kết nối. Nếu thủ tục sự kèo bóng đá cúp c2 không thành công (trả về 0), việc đăng ký sẽ bị hủy.

Cấu trúc typedef

    Pgconn *Conn;
 PgEventRegister;

Khi APGEVT_REGISTERSự kèo bóng đá cúp c2 được nhận,evtinfoCon trỏ nên được đúc đến APGEVENTREGISTER *. Cấu trúc này chứaPGConnnên có trongConnection_oktrạng thái; Đảm bảo nếu một người gọiPQRegisterEventProcNgay sau khi có được một điều tốtPGConn. Khi trả lại mã thất bại, tất cả các công việc dọn dẹp phải được thực hiện dưới dạng kèo bóng đá cúp c2PGEVT_ConnDestroySự kèo bóng đá cúp c2 sẽ được gửi.

PGEVT_CONNRESET #

Sự kèo bóng đá cúp c2 đặt lại kết nối được bắn khi hoàn thànhpqresethoặcpqresetpoll. Trong cả hai trường hợp, sự kèo bóng đá cúp c2 chỉ được bắn nếu thiết lập lại thành công. Giá trị trả về của thủ tục sự kèo bóng đá cúp c2 bị bỏ qua trongPostgreSQLV15 trở lên. Tuy nhiên, với các phiên bản trước đó, điều quan trọng là phải trả lại thành công (khác kèo bóng đá cúp c2) hoặc kết nối sẽ bị hủy bỏ.

Cấu trúc typedef

    Pgconn *Conn;
 PgEventConnReset;

Khi APGEVT_CONNRESETSự kèo bóng đá cúp c2 được nhận,evtinfoCon trỏ nên được đúc đếnPGEVENTCONNRESET *. Mặc dù được chứaPGConnchỉ được đặt lại, tất cả dữ liệu sự kèo bóng đá cúp c2 vẫn không thay đổi. Sự kèo bóng đá cúp c2 này nên được sử dụng để đặt lại/tải lại/yêu cầu bất kỳ liên quan nàoInstancedata. Lưu ý rằng ngay cả khi quy trình sự kèo bóng đá cúp c2 không xử lýPGEVT_CONNRESET, nó vẫn sẽ nhận đượcPGEVT_ConnDestroySự kèo bóng đá cúp c2 khi kết nối được đóng.

PGEVT_ConnDestroy #

Sự kèo bóng đá cúp c2 phá hủy kết nối được bắn để phản hồipqfinish. Trách nhiệm của thủ tục sự kèo bóng đá cúp c2 là làm sạch dữ liệu sự kèo bóng đá cúp c2 của mình vì LibPQ không có khả năng quản lý bộ nhớ này. Không làm sạch sẽ dẫn đến rò rỉ bộ nhớ.

Cấu trúc typedef

    Pgconn *Conn;
 PgEventConnDestroy;

Khi APGEVT_ConnDestroySự kèo bóng đá cúp c2 được nhận,evtinfoCon trỏ nên được đúc đến ApgEventConnDestroy *. Sự kèo bóng đá cúp c2 này được bắn trướcpqfinishThực hiện bất kỳ việc dọn dẹp nào khác. Giá trị trả về của thủ tục sự kèo bóng đá cúp c2 bị bỏ qua vì không có cách nào chỉ ra sự thất bại từpqfinish. Ngoài ra, một lỗi thủ tục sự kèo bóng đá cúp c2 không nên hủy bỏ quá trình làm sạch bộ nhớ không mong muốn.

PGEVT_RESULTCREATE #

Sự kèo bóng đá cúp c2 tạo kết quả được bắn để đáp ứng với bất kỳ chức năng thực thi truy vấn nào tạo ra kết quả, bao gồmPQGetResult. Sự kèo bóng đá cúp c2 này sẽ chỉ được bắn sau khi kết quả đã được tạo thành công.

Cấu trúc typedef

    Pgconn *Conn;
    Pgresult *kết quả;
 PgEventResultcreate;

Khi APGEVT_RESULTCREATESự kèo bóng đá cúp c2 được nhận,evtinfoCon trỏ nên được chuyển đến APGEVENTRESULTCREATE *. TheConnlà kết nối được sử dụng để tạo kết quả. Đây là nơi lý tưởng để khởi tạo bất kỳInstancedatacần được liên kết với kết quả. Nếu một thủ tục sự kèo bóng đá cúp c2 không thành công (trả về số 0), quy trình sự kèo bóng đá cúp c2 đó sẽ bị bỏ qua trong thời gian tồn tại còn lại của kết quả; nghĩa là, nó sẽ không nhận đượcPGEVT_RESULTCOPYhoặcPGEVT_RESULTDESTROYSự kèo bóng đá cúp c2 cho kết quả này hoặc kết quả được sao chép từ nó.

PGEVT_RESULTCOPY #

Sự kèo bóng đá cúp c2 bản sao kết quả được bắn để phản hồiPQCopyresult. Sự kèo bóng đá cúp c2 này sẽ chỉ được bắn sau khi bản sao hoàn tất. Chỉ các quy trình sự kèo bóng đá cúp c2 đã xử lý thành côngPGEVT_RESULTCREATEhoặcPGEVT_RESULTCOPYSự kèo bóng đá cúp c2 cho kết quả nguồn sẽ nhận đượcPGEVT_RESULTCOPYSự kèo bóng đá cúp c2.

Cấu trúc typedef

    const pgresult *src;
    Pgresult *Dest;
 PgEventResultcopy;

Khi APGEVT_RESULTCOPYSự kèo bóng đá cúp c2 được nhận,evtinfoCon trỏ nên được chuyển đến APGEVENTRESULTCOPY *. TheSRCKết quả là những gì đã được sao chép trong khiDestKết quả là điểm đến sao chép. Sự kèo bóng đá cúp c2 này có thể được sử dụng để cung cấp một bản sao sâu củaInstancedata, kể từPQCopyresultKhông thể làm điều đó. Nếu một thủ tục sự kèo bóng đá cúp c2 không thành công (trả về số 0), quy trình sự kèo bóng đá cúp c2 đó sẽ bị bỏ qua trong thời gian tồn tại còn lại của kết quả mới; nghĩa là, nó sẽ không nhận đượcPGEVT_RESULTCOPYhoặcPGEVT_RESULTDESTROYSự kèo bóng đá cúp c2 cho kết quả đó hoặc kết quả được sao chép từ nó.

PGEVT_RESULTDESTROY #

Sự kèo bóng đá cúp c2 phá hủy kết quả được bắn để đáp ứng vớiPQClear. Trách nhiệm của thủ tục sự kèo bóng đá cúp c2 là làm sạch dữ liệu sự kèo bóng đá cúp c2 của mình vì LibPQ không có khả năng quản lý bộ nhớ này. Không làm sạch sẽ dẫn đến rò rỉ bộ nhớ.

Cấu trúc typedef

    Pgresult *kết quả;
 PgEventResultdestroy;

Khi APGEVT_RESULTDESTROYSự kèo bóng đá cúp c2 được nhận,evtinfoCon trỏ nên được đúc đến APGEVENTRESULTDESTROY *. Sự kèo bóng đá cúp c2 này được bắn trướcPQClearThực hiện bất kỳ việc dọn dẹp nào khác. Giá trị trả về của thủ tục sự kèo bóng đá cúp c2 bị bỏ qua vì không có cách nào chỉ ra sự thất bại từPQClear. Ngoài ra, một lỗi thủ tục sự kèo bóng đá cúp c2 không nên hủy bỏ quá trình làm sạch bộ nhớ không mong muốn.

32.14.2. Quy trình gọi lại sự kèo bóng đá cúp c2#

PGEVENTPROC #

PGEVENTPROClà một typedef cho một thủ tục con trỏ đến một quy trình sự kèo bóng đá cúp c2, nghĩa là chức năng gọi lại của người dùng nhận các sự kèo bóng đá cúp c2 từ libpq. Chữ ký của thủ tục sự kèo bóng đá cúp c2 phải là

22069_22137

TheEVTIDtham số cho biết nàoPGEVTSự kèo bóng đá cúp c2 xảy ra. TheevtinfoCon trỏ phải được chuyển đến loại cấu trúc thích hợp để có thêm thông tin về sự kèo bóng đá cúp c2 này. TheVượt quaTham số là con trỏ được cung cấp choPQRegisterEventProcKhi thủ tục sự kèo bóng đá cúp c2 được đăng ký. Hàm sẽ trả về một giá trị khác không nếu nó thành công và không nếu nó thất bại.

Một quy trình sự kèo bóng đá cúp c2 cụ thể chỉ có thể được đăng ký một lần trong bất kỳPGConn. Điều này là do địa chỉ của thủ tục được sử dụng làm khóa tra cứu để xác định dữ kèo bóng đá cúp c2 thể hiện được liên kết.

THẬN TRỌNG

Trên Windows, các chức năng có thể có hai địa chỉ khác nhau: một địa chỉ có thể nhìn thấy từ bên ngoài DLL và một địa chỉ khác có thể nhìn thấy từ bên trong DLL. Người ta nên cẩn thận rằng chỉ có một trong số các địa chỉ này được sử dụng vớilibpq23332_23490tĩnh. Nếu địa chỉ của thủ tục phải có sẵn bên ngoài tệp nguồn của riêng mình, hãy hiển thị một hàm riêng để trả về địa chỉ.

32.14.3. Các chức năng hỗ trợ sự kèo bóng đá cúp c2#

PQRegisterEventProc #

Đăng ký quy trình gọi lại sự kèo bóng đá cúp c2 với libpq.

int pqregistereventProc (PGConn *Conn, PGEVEN
                        const char *name, void *passthrough);

Một quy trình sự kèo bóng đá cúp c2 phải được đăng ký một lần trên mỗiPGConnBạn muốn nhận các sự kèo bóng đá cúp c2 về. Không có giới hạn, ngoài bộ nhớ, về số lượng các quy trình sự kèo bóng đá cúp c2 có thể được đăng ký với kết nối. Hàm trả về giá trị khác không nếu nó thành công và không nếu nó thất bại.

TheProcĐối số sẽ được gọi khi một sự kèo bóng đá cúp c2 libpq được bắn. Địa chỉ bộ nhớ của nó cũng được sử dụng để tra cứuInstancedata. ThetênĐối số được sử dụng để chỉ quy trình sự kèo bóng đá cúp c2 trong các thông báo lỗi. Giá trị này không thể lànullhoặc chuỗi kèo bóng đá cúp c2 độ dài. Chuỗi tên được sao chép vàoPGConn, Vì vậy, những gì được thông qua kèo bóng đá cúp c2 cần phải tồn tại lâu dài. TheVượt quaCon trỏ được chuyển choProcBất cứ khi nào xảy ra sự kèo bóng đá cúp c2. Đối số này có thể lànull.

pqsetInstanceata #

Đặt kết nốiConn'SInstancedatacho thủ tụcProcđếnData. Điều này trả về kèo bóng đá cúp c2 phải cho thành công và kèo bóng đá cúp c2 cho thất bại. (Thất bại chỉ có thể xảy ra nếuProcchưa được đăng ký đúng trongConn.)

26361_26431
pqinstancedata #

Trả về kết nốiConn'sInstancedatađược liên kết với thủ tụcProchoặcnullNếu kèo bóng đá cúp c2 có.

void *pqinstancedata (const pgconn *Conn, pgEventProc Proc);
PQResultsetInstanceata #

Đặt kết quảInstancedatachoProcđếnData. Điều này trả về kèo bóng đá cúp c2 phải cho thành công và kèo bóng đá cúp c2 cho thất bại. (Thất bại chỉ có thể xảy ra nếuProcchưa được đăng ký đúng trong kết quả.)

27756_27833

Hãy coi chừng bất kỳ lưu trữ nào được đại diện bởiDatasẽ kèo bóng đá cúp c2 được tính bởiPQResultMemorySize, trừ khi nó được phân bổ bằng cách sử dụngPQResultalloc. (Làm như vậy được khuyến nghị vì nó loại bỏ sự cần thiết phải giải phóng lưu trữ như vậy một cách rõ ràng khi kết quả bị phá hủy.)

pqresultinstancedata #

Trả về kết quảInstancedatađược liên kết vớiProchoặcnullNếu kèo bóng đá cúp c2 có.

28866_28936

32.14.4. Ví dụ về sự kèo bóng đá cúp c2#

Đây là một ví dụ về bộ xương về việc quản lý dữ kèo bóng đá cúp c2 riêng tư liên quan đến kết nối và kết quả LibPQ.

/ * Tiêu đề bắt buộc cho các sự kèo bóng đá cúp c2 libpq (Lưu ý: Bao gồm libpq-fe.h) *//
#include <libpq-events.h

/ * Instancedata */
Cấu trúc typedef

    int n;
    char *str;
 mydata;

/ * PgEventProc */
tĩnh int myEventProc (pgEventid evtid, void *evtinfo, void *passthrough);

int
Main (Void)

    Dữ liệu MyData *;
    Pgresult *res;
    PGConn *Conn =
        PQConnectDB ("dbname = postgres Tùy chọn = -csearch_path =");

    if (pqstatus (Conn)! = Connection_ok)

        / * Kết quả của pqerrormessage bao gồm một dòng mới */
        fprintf (stderr, "%s", pqerrormessage (Conn));
        Pqfinish (Conn);
        trả lại 1;

    /* Được gọi một lần trên bất kỳ kết nối nào sẽ nhận được sự kèo bóng đá cúp c2.
     * Gửi PGEVT_Register đến MyEventProc.
     */
    if (!

        fprintf (stderr, "không thể đăng ký pgEventProc \ n");
        Pqfinish (Conn);
        trả lại 1;

    / * Conn Instancedata có sẵn */
    data = pqinstancedata (Conn, myEventProc);

    / * Gửi PGEVT_RESULTCREATE đến MyEventProc */
    res = pqExec (Conn, "chọn 1 + 1");

    / * kết quả instancedata có sẵn */
    data = pqresultinstancedata (res, myEventProc);

    / * Nếu sử dụng PG_Copyres_Events, hãy gửi PGEVT_RESULTCOPY đến MyEventProc */
    res_copy = pqcopyresult (res, pg_copyres_tuples | pg_copyres_events);

    /* kết quả Instancedata có sẵn nếu pg_copyres_events là
     * Được sử dụng trong cuộc gọi PQCopyresult.
     */
    data = pqresultinstanceata (res_copy, myEventProc);

    / * Cả hai xóa đều gửi pgevt_resultdestroy đến myeventproc */
    PQCLEAR (RES);
    PQClear (res_copy);

    / * Gửi PGEVT_ConnDestroy đến MyEventProc */
    Pqfinish (Conn);

    trả lại 0;

Tĩnh int
myEventProc (pgEventid evtid, void *evtinfo, void *passthrough)

    chuyển đổi (EVTID)

        Case PGEVT_REGISTER:

            PGEVENTREGISTER *E = (PGEVENTREGISTER *) EVTINFO;
            mydata *data = get_mydata (e- Conn);

            / * liên kết dữ liệu cụ thể của ứng dụng với kết nối */
            PqsetInstanceata (e- Conn, myEventProc, dữ liệu);
            phá vỡ;

        CASE PGEVT_CONNRESET:

            PgEventConnReset *e = (pgEventConnReset *) evtinfo;
            mydata *data = pqinstancedata (e- Conn, myEventProc);

            Nếu (dữ liệu)
              memset (dữ liệu, 0, sizeof (mydata));
            phá vỡ;

        Case PGEVT_ConnDestroy:

            PgEventConnDestroy *e = (pgEventConnDestroy *) evtinfo;
            mydata *data = pqinstancedata (e- Conn, myEventProc);

            / * dữ liệu thể hiện miễn phí vì Conn đang bị phá hủy *//
            Nếu (dữ liệu)
              free_mydata (dữ liệu);
            phá vỡ;

        Case PGEVT_RESULTCREATE:

            PgEventResultCreate *e = (pgEventResultCreate *) evtinfo;
            mydata *Conn_data = pqInstanceTa (e- Conn, myEventProc);
            mydata *res_data = DUP_MYDATA (Conn_data);

            / * liên kết dữ liệu cụ thể của ứng dụng với kết quả (sao chép nó từ Conn) */
            PqresultsetInstanceata (e- result, myEventProc, res_data);
            phá vỡ;

        trường hợp pgevt_resultcopy:

            PgEventResultcopy *e = (pgEventResultcopy *) evtinfo;
            mydata *src_data = pqresultinstancedata (e- src, myEventProc);
            mydata *dest_data = DUP_MYDATA (src_data);

            / * Liên kết dữ liệu cụ thể của ứng dụng với kết quả (sao chép nó từ kết quả) */
            PqresultsetInstancedata (e- dest, myeventproc, dest_data);
            phá vỡ;

        Case PGEVT_RESULTDESTROY:

            PgEventResultdestroy *e = (pgEventResultdestroy *) evtinfo;
            mydata *data = pqresultinstancedata (e- result, myEventProc);

            / * dữ liệu thể hiện miễn phí vì kết quả đang bị phá hủy *//
            Nếu (dữ liệu)
              free_mydata (dữ liệu);
            phá vỡ;

        /* ID sự kèo bóng đá cúp c2 không xác định, chỉ cần trả về true. */
        mặc định:
            phá vỡ;

    trả lại đúng; / * Xử lý sự kèo bóng đá cúp c2 đã thành công */

Gửi hiệu chỉnh

Nếu bạn thấy bất cứ điều gì trong tài kèo bóng đá cúp c2 không chính xác, không phù hợp Kinh nghiệm của bạn với tính năng cụ thể hoặc yêu cầu làm rõ thêm, Vui lòng sử dụngMẫu nàyĐể báo cáo vấn đề tài kèo bóng đá cúp c2.