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 không được hỗ trợ:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
Tài liệu này dành cho phiên bản không được hỗ trợ của kèo bóng đá hôm nay và ngày mai.
Bạn có thể muốn xem cùng một trang chohiện tạiPhiên bản hoặc một trong các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

31.20. kèo bóng đá hôm nay và ngày mai ví dụ

Những ví dụ này và các ví dụ khác có thể được tìm thấy trong thư mụcsrc/test/exampleTrong mã nguồn phân bổ.

Ví dụ 31-1.libpqkèo bóng đá hôm nay và ngày mai ví dụ 1

/*
 * testlibpq.c
 *
 * Kiểm tra phiên bản C của libpq, thư viện frontend kèo bóng đá hôm nay và ngày mai.
 */
#include <stdio.h
#include <stdlib.h
#include <libpq-fe.h

khoảng trống tĩnh
exit_nicely (pgconn *Conn)

    Pqfinish (Conn);
    Thoát (1);

int
Main (int argc, char ** argv)

    const char *Conninfo;
    Pgconn *Conn;
    Pgresult *res;
    int nfields;
    int i,
                j;

    /*
     * Nếu người dùng cung cấp tham số trên dòng lệnh, hãy sử dụng nó làm
     * Chuỗi Conninfo; Nếu không, mặc định để cài đặt dbname = postgres và sử dụng
     * Biến môi trường hoặc mặc định cho tất cả các tham số kết nối khác.
     */
    if (argc 1)
        Conninfo = argv [1];
    khác
        ConnInfo = "dbname = postgres";

    / * Tạo kết nối với cơ sở dữ liệu */
    Conn = PQConnectDB (ConnInfo);

    / * Kiểm tra xem kết nối phụ trợ đã được thực hiện thành công */
    if (pqstatus (Conn)! = Connection_ok)

        fprintf (stderr, "kết nối với cơ sở dữ liệu không thành công: %s",
                Pqerrormessage (Conn));
        exit_nicely (Conn);

    /*
     * Trường hợp thử nghiệm của chúng tôi ở đây liên quan đến việc sử dụng con trỏ, mà chúng tôi phải ở bên trong
     * Một khối giao dịch.  Chúng ta có thể làm toàn bộ với một
     * Pqexec () của "chọn * từ pg_database", nhưng điều đó quá tầm thường để thực hiện
     * Một ví dụ tốt.
     */

    / * Bắt đầu một khối giao dịch */
    res = pqExec (Conn, "bắt đầu");
    if (pqresultstatus (res)! = pgres_command_ok)

        fprintf (stderr, "lệnh bắt đầu không thành công: %s", pqerrormessage (Conn));
        PQCLEAR (RES);
        exit_nicely (Conn);

    /*
     * PQClear pgresult có nên không còn cần thiết để tránh bộ nhớ
     * rò rỉ
     */
    PQCLEAR (RES);

    /*
     * Tìm nạp các hàng từ PG_DATABASE, Danh mục hệ thống của cơ sở dữ liệu
     */
    res = pqExec (Conn, "khai báo con trỏ myportal cho chọn * từ pg_database");
    if (pqresultstatus (res)! = pgres_command_ok)

        fprintf (stderr, "tuyên bố con trỏ không thành công: %s", pqerrormessage (Conn));
        PQCLEAR (RES);
        exit_nicely (Conn);

    PQCLEAR (RES);

    res = pqExec (Conn, "tìm nạp tất cả trong myportal");
    if (pqresultstatus (res)! = pgres_tuples_ok)

        fprintf (stderr, "tìm nạp tất cả đều thất bại: %s", pqerrormessage (Conn));
        PQCLEAR (RES);
        exit_nicely (Conn);

    / * Đầu tiên, in ra tên thuộc tính */
    nfields = pqnfields (res);
    for (i = 0; i <nfields; i ++)
        printf ("%-15s", pqfname (res, i));
    printf ("\ n \ n");

    / * Tiếp theo, in ra các hàng */
    for (i = 0; i <pqntuples (res); i ++)

        for (j = 0; j <nfields; j ++)
            printf ("%-15s", pqgetValue (res, i, j));
        printf ("\ n");

    PQCLEAR (RES);

    / * Đóng cổng ... chúng tôi không bận tâm kiểm tra lỗi ... */
    res = pqExec (Conn, "Đóng myportal");
    PQCLEAR (RES);

    / * kết thúc giao dịch */
    res = pqExec (Conn, "end");
    PQCLEAR (RES);

    / * Đóng kết nối với cơ sở dữ liệu và dọn dẹp */
    Pqfinish (Conn);

    trả lại 0;

Ví dụ 31-2.libpqkèo bóng đá hôm nay và ngày mai ví dụ 2

/*
 * testlibpq2.c
 * Kiểm tra giao diện thông báo không đồng bộ
 *
 * Bắt đầu kèo bóng đá hôm nay và ngày mai này, sau đó từ PSQL trong một cửa sổ khác làm
 * Thông báo cho TBL2;
 * Lặp lại bốn lần để có được kèo bóng đá hôm nay và ngày mai này để thoát.
 *
 * Hoặc, nếu bạn muốn có được ưa thích, hãy thử điều này:
 * Xuất hiện một cơ sở dữ liệu với các lệnh sau
 * (được cung cấp trong SRC/Test/Agrly/TestLibPQ2.sql):
 *
 * Tạo bảng tbl1 (i int4);
 *
 * Tạo bảng tbl2 (i int4);
 *
 * Tạo quy tắc R1 như khi chèn vào TBL1 làm
 * (Chèn vào các giá trị TBL2 (new.i); thông báo cho TBL2);
 *
 * Và làm điều này bốn lần:
 *
 * Chèn vào các giá trị TBL1 (10);
 */
#include <stdio.h
#include <stdlib.h
#include <chuỗi.h
#include <errno.h
#include <sys/time.h
#include <libpq-fe.h

khoảng trống tĩnh
exit_nicely (pgconn *Conn)

    Pqfinish (Conn);
    Thoát (1);

int
Main (int argc, char ** argv)

    const char *Conninfo;
    Pgconn *Conn;
    Pgresult *res;
    Pgnotify *thông báo;
    int nnotifys;

    /*
     * Nếu người dùng cung cấp tham số trên dòng lệnh, hãy sử dụng nó làm
     * Chuỗi Conninfo; Nếu không, mặc định để cài đặt dbname = postgres và sử dụng
     * Biến môi trường hoặc mặc định cho tất cả các tham số kết nối khác.
     */
    if (argc 1)
        Conninfo = argv [1];
    khác
        ConnInfo = "dbname = postgres";

    / * Tạo kết nối với cơ sở dữ liệu */
    Conn = PQConnectDB (ConnInfo);

    / * Kiểm tra xem kết nối phụ trợ đã được thực hiện thành công */
    if (pqstatus (Conn)! = Connection_ok)

        fprintf (stderr, "kết nối với cơ sở dữ liệu không thành công: %s",
                Pqerrormessage (Conn));
        exit_nicely (Conn);

    /*
     * Phát hành lệnh lắng nghe để cho phép thông báo từ thông báo của Quy tắc.
     */
    res = pQExec (Conn, "Nghe TBL2");
    if (pqresultstatus (res)! = pgres_command_ok)

        fprintf (stderr, "lệnh nghe thất bại: %s", pqerrormessage (Conn));
        PQCLEAR (RES);
        exit_nicely (Conn);

    /*
     * PQClear pgresult có nên không còn cần thiết để tránh bộ nhớ
     * rò rỉ
     */
    PQCLEAR (RES);

    /* Thoát sau bốn thông báo được nhận. */
    nnotifys = 0;
    trong khi (nnotifys <4)

        /*
         * Ngủ cho đến khi điều gì đó xảy ra trên kết nối.  Chúng tôi sử dụng Chọn (2)
         * Để chờ đợi, nhưng bạn cũng có thể sử dụng Poll () hoặc tương tự
         * cơ sở.
         */
        int sock;
        fd_set input_mask;

        sock = pqsocket (Conn);

        if (sock <0)
            phá vỡ;              / * không nên xảy ra */

        Fd_zero (& input_mask);
        Fd_set (sock, & input_mask);

        if (select (sock + 1, & input_mask, null, null, null) <0)

            fprintf (stderr, "select () không thành công: %s \ n", strerror (errno));
            exit_nicely (Conn);

        / * Bây giờ kiểm tra đầu vào */
        PQConsumeInput (Conn);
        while ((thông báo = pqnotifyes (Conn))! = null)

            fprintf (stderr,
                    "Async thông báo về ' %s' nhận được từ phụ trợ pid %d \ n",
                    thông báo- relname, thông báo- be_pid);
            Pqfreemem (thông báo);
            nnotifys ++;

    fprintf (stderr, "thực hiện. \ n");

    / * Đóng kết nối với cơ sở dữ liệu và dọn dẹp */
    Pqfinish (Conn);

    trả lại 0;

Ví dụ 31-3.libpqkèo bóng đá hôm nay và ngày mai ví dụ 3

/*
 * Testlibpq3.c
 * Kiểm tra các tham số ngoài dòng và I/O nhị phân.
 *
 * Trước khi chạy này, hãy điền vào cơ sở dữ liệu với các lệnh sau
 * (được cung cấp trong src/test/example/testlibpq3.sql):
 *
 * Tạo bảng TEST1 (i int4, t văn bản, b bytea);
 *
 * Chèn vào các giá trị test1 (1, 'joe' vị trí ',' \ 000 \ 001 \ 002 \ 003 \ 004 ');
 * Chèn vào các giá trị Test1 (2, 'ho ở đó', '\ 004 \ 003 \ 002 \ 001 \ 000');
 *
 * Đầu ra dự kiến ​​là:
 *
 * Tuple 0: Got
 * i = (4 byte) 1
 * t = (11 byte) 'Joe's Place'
 * b = (5 byte) \ 000 \ 001 \ 002 \ 003 \ 004
 *
 * Tuple 0: Got
 * I = (4 byte) 2
 * t = (8 byte) 'ho ở đó'
 * b = (5 byte) \ 004 \ 003 \ 002 \ 001 \ 000
 */
#include <stdio.h
#include <stdlib.h
#include <chuỗi.h
#include <sys/type.h
#include <libpq-fe.h

/ * cho ntohl/htonl */
#include <netinet/in.h
#include <arpa/inet.h

khoảng trống tĩnh
exit_nicely (pgconn *Conn)

    Pqfinish (Conn);
    Thoát (1);

/*
 * Hàm này in một kết quả truy vấn là một định dạng nhị phân từ
 * Một bảng được định nghĩa như trong nhận xét ở trên.  Chúng tôi chia nó ra vì
 * hàm main () sử kèo bóng đá hôm nay và ngày maing nó hai lần.
 */
khoảng trống tĩnh
show_binary_results (pgresult *res)

    int i,
                j;
    int i_fnum,
                t_fnum,
                b_fnum;

    / * Sử kèo bóng đá hôm nay và ngày maing pqfnumber để tránh các giả định về thứ tự trường trong kết quả */
    i_fnum = pqfnumber (res, "i");
    t_fnum = pqfnumber (res, "t");
    b_fnum = pqfnumber (res, "b");

    for (i = 0; i <pqntuples (res); i ++)

        char *iptr;
        char *tptr;
        char *bptr;
        int blen;
        int ival;

        / * Nhận các giá trị trường (chúng tôi bỏ qua khả năng chúng là null!) */
        iptr = pqgetValue (res, i, i_fnum);
        tptr = pqgetValue (res, i, t_fnum);
        bptr = pqgetValue (res, i, b_fnum);

        /*
         * Đại diện nhị phân của INT4 nằm trong thứ tự byte mạng, mà
         * Chúng ta nên ép buộc tốt hơn cho đơn đặt hàng byte địa phương.
         */
        Ival = nTohl ( *((uint32_t *) iptr));

        /*
         * Biểu diễn nhị phân của văn bản là, tốt, văn bản và kể từ khi libpq
         * Đủ tốt để nối một byte số 0 vào nó, nó sẽ hoạt động tốt
         * dưới dạng chuỗi C.
         *
         * Đại diện nhị phân của bytea là một loạt các byte, có thể
         * Bao gồm các null nhúng vì vậy chúng tôi phải chú ý đến chiều dài trường.
         */
        blen = pQGetLpm (res, i, b_fnum);

        printf ("tuple %d: got \ n", i);
        printf ("i = ( %d byte) %d \ n",
               PqgetLpm (res, i, i_fnum), ival);
        printf ("t = (%d byte) '%s' \ n",
               PQGetLpm (res, i, t_fnum), tptr);
        printf ("b = (%d byte)", blen);
        for (j = 0; j <blen; j ++)
            printf ("\%03o", bptr [j]);
        printf ("\ n \ n");