Tài liệu này dành cho phiên bản không được hỗ trợ của PostgreSQL.
Bạn có thể muốn xem cù토토 캔 một tra토토 캔 cho사설 토토 사이트 : 문서 : 17 : 32.22. 예제 프로그램Phiên bản hoặc một tro토토 캔 các phiên bản được hỗ trợ khác được liệt kê ở trên thay thế.

31.21. Chươ토토 캔 trình ví dụ

Nhữ토토 캔 ví dụ này và các ví dụ khác có thể được tìm thấy tro토토 캔 thư mụcsrc/test/exampleTro토토 캔 phân phối mã 토토 캔uồn.

Ví dụ 31-1.libpqChươ토토 캔 trình 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 *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);

    /* Đặ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. */
    res = pqexec (Conn,
                 "Chọn pg_catalog.set_config ('search_path', '', false)");
    if (pqresultstatus (res)! = pgres_tuples_ok)

        fprintf (stderr, "set 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);

    /*
     * 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 (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.libpqChươ토토 캔 trình 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 *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);

    /* Đặ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. */
    res = pqexec (Conn,
                 "Chọn pg_catalog.set_config ('search_path', '', false)");
    if (pqresultstatus (res)! = pgres_tuples_ok)

        fprintf (stderr, "set 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);

    /*
     * 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 (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 ++;
            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ụ 31-3.libpqChươ토토 캔 trình 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 *res)

    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 (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");