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

34.10. Các chức năng được liên kèo bóng đá c1 vớiCopylệnh

TheCopylệnh trongPostgreSQLCó các tùy chọn để đọc hoặc ghi vào kèo bóng đá c1 nối mạng được sử dụng bởilibpq. Các chức kèo bóng đá c1 được mô tả trong phần này cho phép các ứng dụng tận dụng khả kèo bóng đá c1 này bằng cách cung cấp hoặc tiêu thụ dữ liệu được sao chép.

Quá trình tổng thể là ứng dụng đầu tiên phát hành SQLCopylệnh thông quaPQEXEChoặc một trong các chức kèo bóng đá c1 tương đương. Phản hồi cho điều này (nếu không có lỗi trong lệnh) sẽ làpgresult12809_12844PGRES_COPY_OUThoặcPGRES_COPY_IN(tùy thuộc vào hướng sao chép được chỉ định). Sau đó, ứng dụng nên sử dụng các chức kèo bóng đá c1 của phần này để nhận hoặc truyền các hàng dữ liệu. Khi truyền dữ liệu hoàn tất, một người khácpgresultĐối tượng được trả về để biểu thị thành công hoặc thất bại của việc chuyển nhượng. Trạng thái của nó sẽ làPGRES_COMMAND_OKĐể thành công hoặcPGRES_FATAL_ERRORNếu gặp một số vấn đề. Tại thời điểm này, các lệnh SQL có thể được cấp quaPQEXEC. (Không thể thực thi các lệnh SQL khác bằng cùng một kèo bóng đá c1 nối trong khiCopyHoạt động đang được tiến hành.)

Nếu ACopyLệnh được cấp quaPQEXEC13841_13947PQGetResultSau khi hoàn thànhCopyTrình tự. Chỉ khiPQGetResultreturnnullCó chắc chắn rằngPQEXECChuỗi lệnh được thực hiện và an toàn khi đưa ra nhiều lệnh hơn.

Các chức năng của phần này chỉ được thực thi sau khi có được trạng thái kèo bóng đá c1 quả củaPGRES_COPY_OUThoặcPGRES_COPY_INtừPQEXEChoặcPQGetResult.

APGRESULTĐối tượng mang một trong các giá trị trạng thái này mang một số dữ kèo bóng đá c1 bổ sung vềCopyHoạt động đang bắt đầu. Dữ liệu bổ sung này có sẵn bằng cách sử dụng các chức năng cũng được sử dụng liên quan đến kèo bóng đá c1 quả truy vấn:

PQNFields

Trả về số lượng cột (trường) sẽ được sao chép.

15558_15574

0 Cho biết định dạng bản sao tổng thể là văn bản (các hàng được phân tách bằng các cột, các cột được phân tách bởi các ký tự phân cách, v.v.). 1 Cho biết định dạng bản sao tổng thể là nhị phân. Nhìn thấyCopyĐể biết thêm thông tin.

PQFFormat

Trả về mã định dạng (0 cho văn bản, 1 cho nhị phân) được liên kèo bóng đá c1 với mỗi cột của hoạt động sao chép. Các mã định dạng trên mỗi cột sẽ luôn bằng không khi định dạng bản sao tổng thể là văn bản, nhưng định dạng nhị phân có thể hỗ trợ cả cột văn bản và nhị phân. (Tuy nhiên, kể từ khi triển khai hiện tạiCopy, chỉ các cột nhị phân xuất hiện trong một bản sao nhị phân; Vì vậy, các định dạng trên mỗi cột luôn phù hợp kèo bóng đá c1 định dạng tổng thể hiện tại.)

34.10.1. Chức kèo bóng đá c1 gửiCopyData

Những chức kèo bóng đá c1 này được sử dụng để gửi dữ liệu trong thời gianSao chép từ Stdin. Họ sẽ thất bại nếu được gọi khi kèo bóng đá c1 nối không ởcopy_inBang.

pqputcopydata

Gửi dữ kèo bóng đá c1 đến máy chủ trong khicopy_inState.

int pqputcopydata (pgconn *Conn,
                  const char *bộ đệm,
                  int nbytes);

Truyềnsao chépDữ kèo bóng đá c1 trong được chỉ địnhbộ đệm, độ dàinbyte, đến máy chủ. kèo bóng đá c1 quả là 1 nếu dữ liệu được xếp hàng, 0 nếu nó không được xếp hàng vì bộ đệm đầy đủ (điều này sẽ chỉ xảy ra ở chế độ không chặn) hoặc -1 nếu xảy ra lỗi. (Sử dụngpqerrormessageĐể lấy chi tiết nếu giá trị trả về là -1. Nếu giá trị bằng không, hãy đợi để viết sẵn và thử lại.)

Ứng dụng có thể chiaCopyluồng dữ kèo bóng đá c1 thành tải bộ đệm của bất kỳ kích thước thuận tiện nào. Ranh giới tải bộ đệm không có ý nghĩa ngữ nghĩa khi gửi. Nội dung của luồng dữ kèo bóng đá c1 phải khớp với định dạng dữ kèo bóng đá c1 được dự kiến ​​bởiCopylệnh; nhìn thấyCopyĐể biết chi tiết.

pqputcopyend

Gửi chỉ báo cuối cùng vào máy chủ trong thời giancopy_inBang.

int pqputcopyend (pgconn *Conn,
                 const char *errormsg);

kèo bóng đá c1 thúccopy_inHoạt động thành công nếuerrormsgnull. Nếu nhưerrormsgkhông phảinullsau đóCopybị buộc phải thất bại, kèo bóng đá c1 chuỗi được trỏ bởierrormsgĐược sử dụng làm thông báo lỗi. (Tuy nhiên, người ta không nên cho rằng thông báo lỗi chính xác này sẽ quay lại từ máy chủ, vì máy chủ có thể đã thất bạiCopyvì lý do riêng của nó.)

kèo bóng đá c1 quả là 1 nếu thông báo chấm dứt được gửi; hoặc trong chế độ không chặn, điều này chỉ có thể chỉ ra rằng thông báo chấm dứt đã được xếp hàng thành công. .pqflush, lặp lại cho đến khi nó trả về số 0.) Số không chỉ ra rằng hàm không thể xếp hàng thông báo chấm dứt vì bộ đệm đầy đủ; Điều này sẽ chỉ xảy ra trong chế độ không chặn. (Trong trường hợp này, hãy đợi để viết sẵn và thửpqputcopyendgọi lại.) Nếu xảy ra lỗi khó xảy ra, -1 được trả về; Bạn có thể sử dụngpqerrormessageĐể lấy chi tiết.

Sau khi gọi thành côngPQPutCopyend, gọiPQGetResultĐể có được trạng thái kèo bóng đá c1 quả cuối cùng củaCopylệnh. Người ta có thể chờ kèo bóng đá c1 quả này có sẵn theo cách thông thường. Sau đó trở lại hoạt động bình thường.

34.10.2. Chức kèo bóng đá c1 nhậnCopyData

Các chức kèo bóng đá c1 này được sử dụng để nhận dữ liệu trong thời gianSao chép vào stdout. Họ sẽ thất bại nếu được gọi khi kèo bóng đá c1 nối không ởCopy_outBang.

PQGetCopydata

Nhận dữ kèo bóng đá c1 từ máy chủ trongcopy_outBang.

int PQGetCopydata (PGConn *Conn,
                  Char ** Buffer,
                  int async);

cố gắng lấy một hàng dữ kèo bóng đá c1 khác từ máy chủ trong thời gianCopy. Dữ kèo bóng đá c1 luôn được trả về một hàng dữ kèo bóng đá c1 tại một thời điểm; Nếu chỉ có một hàng một phần có sẵn, nó không được trả lại. Trả về thành công của một hàng dữ kèo bóng đá c1 liên quan đến việc phân bổ một khối bộ nhớ để giữ dữ kèo bóng đá c1. The22420_22428tham số phải khôngnull. *bộ đệmđược đặt để trỏ đến bộ nhớ được phân bổ hoặc đếnnullTrong trường hợp không trả lại bộ đệm. Không phảinullBộ đệm kèo bóng đá c1 quả nên được giải phóng bằng cách sử dụngPQFreememKhi không cần thiết.

22875_23106Copy. kèo bóng đá c1 quả của 0 chỉ ra rằngCopyvẫn đang được tiến hành, nhưng chưa có hàng nào có sẵn (điều này chỉ có thể khiAsynclà đúng). kèo bóng đá c1 quả của -1 chỉ ra rằngCopyđược thực hiện. kèo bóng đá c1 quả của -2 chỉ ra rằng xảy ra lỗi (tham khảopqerrormessageVì lý do).

KhiAsynclà đúng (không phải bằng không),PQGetCopydata23799_23863Copyvẫn đang được tiến hành nhưng không có hàng hoàn chỉnh nào có sẵn. (Trong trường hợp này, hãy đợi sẵn sàng đọc và sau đó gọi24082_24098Trước khi gọiPQGetCopydataMột lần nữa.) KhiAsynclà sai (không),PQGetCopydataSẽ chặn cho đến khi dữ kèo bóng đá c1 có sẵn hoặc hoạt động hoàn thành.

sauPQGetCopydatareturn -1, gọiPQGetResultĐể có được trạng thái kèo bóng đá c1 quả cuối cùng củaCopyLệnh. Người ta có thể chờ kèo bóng đá c1 quả này có sẵn theo cách thông thường. Sau đó trở lại hoạt động bình thường.

34.10.3. Các chức kèo bóng đá c1 lỗi thời choCopy

Các chức kèo bóng đá c1 này biểu thị các phương thức xử lý cũ hơnCopy. Mặc dù chúng vẫn hoạt động, nhưng chúng không được xử lý do xử lý lỗi kém, các phương pháp bất tiện trong việc phát hiện kèo bóng đá c1 thúc dữ liệu và thiếu hỗ trợ cho việc chuyển nhượng nhị phân hoặc không chặn.

PQGetLine

Đọc một dòng ký tự kèo bóng đá c1 thúc mới (được truyền bởi máy chủ) vào một chuỗi bộ đệm có kích thướcLEGN.

int PQGetLine (PGConn *Conn,
              Char *bộ đệm,
              int length);

Hàm này sao chép lênlength-1 ký tự thành bộ đệm và chuyển đổi kèo bóng đá c1 thúc dòng mới thành một byte số 0.PQGetLinereturnEOFỞ cuối đầu vào, 0 nếu toàn bộ dòng đã được đọc và 1 nếu bộ đệm đầy nhưng dòng mới chưa được đọc.

Lưu ý rằng ứng dụng phải kiểm tra xem một dòng mới có bao gồm hai ký tự\., cho biết máy chủ đã hoàn thành việc gửi kèo bóng đá c1 quả củaCopyLệnh. Nếu ứng dụng có thể nhận các dòng nhiều hơnLEGN-1 ký tự dài, cần phải quan tâm để chắc chắn rằng nó nhận ra\.26932_27037

PQGetLineAsync

Đọc một hàng củaCopyDữ kèo bóng đá c1 (được truyền bởi máy chủ) vào bộ đệm mà không chặn.

int PQGetLineAnync (PGConn *Conn,
                   Char *bộ đệm,
                   int bufsize);

Hàm này tương tựPQGetLine, nhưng nó có thể được sử dụng bởi các ứng dụng phải đọcCopyDữ kèo bóng đá c1 không đồng bộ, nghĩa là không chặn. Đã phát hànhCopyLệnh và nhận đượcPGRES_COPY_OUTPhản hồi, ứng dụng nên gọiPQConsumeInputPQGetLineAsyncCho đến khi phát hiện tín hiệu cuối cùng của dữ kèo bóng đá c1.

Không giống nhưPQGetLine, chức năng này chịu trách nhiệm phát hiện kèo bóng đá c1 thúc dữ liệu.

trên mỗi cuộc gọi,PQGetLineAsyncSẽ trả về dữ kèo bóng đá c1 nếu có sẵn hàng dữ kèo bóng đá c1 hoàn chỉnh tronglibpqbộ đệm đầu vào. Mặt khác, không có dữ kèo bóng đá c1 nào được trả về cho đến khi phần còn lại của hàng đến. Hàm trả về -1 nếu điểm đánh dấu dữ kèo bóng đá c1 cuối sao đã được nhận dạng hoặc 0 nếu không có dữ kèo bóng đá c1 hoặc một số dương đưa số byte dữ kèo bóng đá c1 được trả về. Nếu -1 được trả về, người gọi phải gọi tiếp theopqendcopy, sau đó trở lại xử lý bình thường.

29102_29433\ nhoặc không. (Trong một nhị phânCopy, Phân tích cú pháp thực tế củaCopy29574_29745bufsizeMột nhỏ hơn phòng thực sự có sẵn.)

pqputline

Gửi một chuỗi kèo bóng đá c1 thúc null đến máy chủ. Trả về 0 nếu ok vàEOFNếu không thể gửi chuỗi.

int pqputline (pgconn *Conn,
              const char *chuỗi);

TheCopyluồng dữ kèo bóng đá c1 được gửi bởi một loạt các cuộc gọi đếnpqputlinecó định dạng giống như được trả về bởiPQGetLineAsync, ngoại trừ các ứng dụng không bắt buộc phải gửi chính xác một hàng dữ kèo bóng đá c1 cho mỗipqputlinecuộc gọi; Không sao khi gửi một dòng một phần hoặc nhiều dòng cho mỗi cuộc gọi.

Lưu ý

trướcPostgreSQLGiao thức 3.0, ứng dụng cần phải gửi rõ ràng hai ký tự\.Là một dòng cuối cùng để chỉ ra kèo bóng đá c1 máy chủ rằng nó đã hoàn thành việc gửiCopyDữ kèo bóng đá c1. Mặc dù điều này vẫn hoạt động, nó không được chấp nhận và ý nghĩa đặc biệt của\.có thể được loại bỏ trong một bản phát hành trong tương lai. Nó đủ để gọiPQENDCOPYSau khi gửi dữ kèo bóng đá c1 thực tế.

pqputnbytes

Gửi một chuỗi không kèo bóng đá c1 thúc không đến máy chủ. Trả về 0 nếu ok vàEOFNếu không thể gửi chuỗi.

int pqputnbytes (pgconn *Conn,
                const char *bộ đệm,
                int nbytes);

Điều này giống hệtpqputline, ngoại trừ bộ đệm dữ liệu không cần phải kèo bóng đá c1 thúc vì số lượng byte gửi được chỉ định trực tiếp. Sử dụng quy trình này khi gửi dữ liệu nhị phân.

PQENDCOPY

Đồng bộ hóa kèo bóng đá c1 máy chủ.

int pqendcopy (pgconn *Conn);

Hàm này đợi cho đến khi máy chủ hoàn thành việc sao chép. Nó sẽ được cấp khi chuỗi cuối cùng được gửi đến máy chủ bằng cách sử dụngpqputlinehoặc khi chuỗi cuối cùng được nhận từ máy chủ bằng cách sử dụngPQGetLine. Nó phải được cấp hoặc máy chủ sẽ nhận đượcOut of SyncVới máy khách. Khi trở về từ chức kèo bóng đá c1 này, máy chủ đã sẵn sàng nhận lệnh SQL tiếp theo. Giá trị trả về là 0 khi hoàn thành thành công, khác không. (Sử dụngpqerrormessage33471_33526

Khi sử dụngPQGetResult, Ứng dụng sẽ trả lờiPGRES_COPY_OUTkèo bóng đá c1 quả bằng cách thực thiPQGetLineLiên tục, theo sau làPQENDCOPYSau khi thấy dòng Terminator được nhìn thấy. Sau đó nó sẽ trở lạiPQGetResultVòng lặp cho đếnPQGetResultTrả về một con trỏ null. Tương tự APGRES_COPY_INkèo bóng đá c1 quả được xử lý bởi một loạtpqputlinecuộc gọi theo sau làPQENDCOPY, sau đó quay lạiPQGetResultVòng lặp. Sự sắp xếp này sẽ đảm bảo rằngCopyLệnh được nhúng trong một loạtSQLCác lệnh sẽ được thực thi chính xác.

Các ứng dụng cũ có khả kèo bóng đá c1 gửi34982_34988ViaPQEXECvà giả sử rằng giao dịch được thực hiện saupqendcopy. Điều này sẽ chỉ hoạt động chính xác nếuCopylà duy nhấtSQLLệnh trong chuỗi lệnh.

Gửi hiệu chỉnh

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 kèo bóng đá c1 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 đá c1.