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 tỷ lệ kèo bóng đá.
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ế.

33.21. Chương tỷ lệ kèo bóng đá 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 phân phối mã nguồn.

Ví dụ 33.1.libpqChương tỷ lệ kèo bóng đá ví dụ 1

/*
 * src/test/example/testlibpq.c
 *
 *
 * testlibpq.c
 *
 * Kiểm tra phiên bản C của libpq, thư viện frontend postgresql.
 */
#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 *tỷ lệ kèo bóng đá;
    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);

    /* Đặt đường dẫn tìm kiếm luôn an toàn, vì vậy người dùng độc hại không thể kiểm soát. */
    tỷ lệ kèo bóng đá = pqexec (Conn,
                 "Chọn pg_catalog.set_config ('search_path', '', false)");
    if (pqresultstatus (tỷ lệ kèo bóng đá)! = pgres_tuples_ok)

        fprintf (stderr, "set thất bại: %s", pqerrormessage (Conn));
        PQCLEAR (tỷ lệ kèo bóng đá);
        exit_nicely (Conn);

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

    /*
     * 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 */
    tỷ lệ kèo bóng đá = pqExec (Conn, "bắt đầu");
    if (pqresultstatus (tỷ lệ kèo bóng đá)! = pgres_command_ok)

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

    PQCLEAR (tỷ lệ kèo bóng đá);

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

        fprintf (stderr, "tuyên bố con trỏ không thành công: %s", pqerrormessage (Conn));
        PQCLEAR (tỷ lệ kèo bóng đá);
        exit_nicely (Conn);

    PQCLEAR (tỷ lệ kèo bóng đá);

    tỷ lệ kèo bóng đá = pqExec (Conn, "tìm nạp tất cả trong myportal");
    if (pqresultstatus (tỷ lệ kèo bóng đá)! = pgres_tuples_ok)

        fprintf (stderr, "tìm nạp tất cả đều thất bại: %s", pqerrormessage (Conn));
        PQCLEAR (tỷ lệ kèo bóng đá);
        exit_nicely (Conn);

    / * Đầu tiên, in ra tên thuộc tính */
    nfields = pqnfields (tỷ lệ kèo bóng đá);
    for (i = 0; i <nfields; i ++)
        printf ("%-15s", pqfname (tỷ lệ kèo bóng đá, i));
    printf ("\ n \ n");

    / * Tiếp theo, in ra các hàng */
    for (i = 0; i <pqntuples (tỷ lệ kèo bóng đá); i ++)

        for (j = 0; j <nfields; j ++)
            printf ("%-15s", pqgetValue (tỷ lệ kèo bóng đá, i, j));
        printf ("\ n");

    PQCLEAR (tỷ lệ kèo bóng đá);

    / * Đóng cổng ... chúng tôi không bận tâm kiểm tra lỗi ... */
    tỷ lệ kèo bóng đá = pqExec (Conn, "Đóng myportal");
    PQCLEAR (tỷ lệ kèo bóng đá);

    / * kết thúc giao dịch */
    tỷ lệ kèo bóng đá = pqExec (Conn, "end");
    PQCLEAR (tỷ lệ kèo bóng đá);

    / * Đó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ụ 33.2.libpqChương tỷ lệ kèo bóng đá ví dụ 2

/*
 * src/test/example/testlibpq2.c
 *
 *
 * testlibpq2.c
 * Kiểm tra giao diện thông báo không đồng bộ
 *
 * Bắt đầu chương trình 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 chương trình 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 lược đồ testlibpq2;
 * Đặt search_path = testlibpq2;
 * 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);
 *
 * Bắt đầu chương trình này, sau đó từ PSQL làm điều này bốn lần:
 *
 * Chèn vào các giá trị testlibpq2.tbl1 (10);
 */

#ifdef Win32
#include <windows.h
#endif
#include <stdio.h
#include <stdlib.h
#include <chuỗi.h
#include <errno.h
#include <sys/time.h
#include <sys/type.h
#ifdef có_sys_select_h
#include <sys/select.h
#endif

#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 *tỷ lệ kèo bóng đá;
    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);

    /* Đặt đường dẫn tìm kiếm luôn an toàn, vì vậy người dùng độc hại không thể kiểm soát. */
    tỷ lệ kèo bóng đá = pqexec (Conn,
                 "Chọn pg_catalog.set_config ('search_path', '', false)");
    if (pqresultstatus (tỷ lệ kèo bóng đá)! = pgres_tuples_ok)

        fprintf (stderr, "set thất bại: %s", pqerrormessage (Conn));
        PQCLEAR (tỷ lệ kèo bóng đá);
        exit_nicely (Conn);

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

    /*
     * 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.
     */
    tỷ lệ kèo bóng đá = pQExec (Conn, "Nghe TBL2");
    if (pqresultstatus (tỷ lệ kèo bóng đá)! = pgres_command_ok)

        fprintf (stderr, "lệnh nghe thất bại: %s", pqerrormessage (Conn));
        PQCLEAR (tỷ lệ kèo bóng đá);
        exit_nicely (Conn);

    PQCLEAR (tỷ lệ kèo bóng đá);

    /* 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 ++;
            PQConsumeInput (Conn);

    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ụ 33.3.libpqChương tỷ lệ kèo bóng đá ví dụ 3

/*
 * src/test/example/testlibpq3.c
 *
 *
 * 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 lược đồ testlibpq3;
 * Đặt search_path = testlibpq3;
 * 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
 */

#ifdef Win32
#include <windows.h
#endif

#include <stdio.h
#include <stdlib.h
#include <stdint.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ử dụng nó hai lần.
 */
khoảng trống tĩnh
show_binary_results (pgresult *tỷ lệ kèo bóng đá)

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

    / * Sử dụng pqfnumber để tránh các giả định về thứ tự trường trong kết quả */
    i_fnum = pqfnumber (tỷ lệ kèo bóng đá, "i");
    t_fnum = pqfnumber (tỷ lệ kèo bóng đá, "t");
    b_fnum = pqfnumber (tỷ lệ kèo bóng đá, "b");

    for (i = 0; i <pqntuples (tỷ lệ kèo bóng đá); 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 (tỷ lệ kèo bóng đá, i, i_fnum);
        tptr = pqgetValue (tỷ lệ kèo bóng đá, i, t_fnum);
        bptr = pqgetValue (tỷ lệ kèo bóng đá, 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 (tỷ lệ kèo bóng đá, i, b_fnum);

        printf ("tuple %d: got \ n", i);
        printf ("i = ( %d byte) %d \ n",
               PqgetLpm (tỷ lệ kèo bóng đá, i, i_fnum), ival);
        printf ("t = (%d byte) '%s' \ n",
               PQGetLpm (tỷ lệ kèo bóng đá, i, t_fnum), tptr);
        printf ("b = (%d byte)", blen);
        for (j = 0; j <blen; j ++)
            printf ("\%03o", bptr [j]);
        printf ("\ n \ n");