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/example
Trong phân phối mã nguồn.
Ví dụ 32.1. libpqChương 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, "%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ụ 32.2. libpqChương 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/select.h #include <sys/time.h #include <sys/type.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, "%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ụ 32.3. libpqChương 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 Standard_Conforming_Strings = on; * 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");
Nếu bạn thấy bất cứ điều gì trong tài liệu không chính xác, không khớ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 liệu.