Copy
lệnh#TheCopy
lệnh trongPostgreSQLCó các tùy chọn để đọc hoặc ghi vào kèo bóng đá cúp c2 nối mạng được sử dụng bởilibpq. Các chức năng được mô tả trong phần này cho phép các ứng dụng tận dụng khả năng này bằng cách cung cấp hoặc tiêu thụ dữ kèo bóng đá cúp c2 được sao chép.
Quá trình tổng thể là ứng dụng đầu tiên phát hành SQLCopy
lệnh thông quaPQEXEC
hoặc một trong các hàm tương đương. Phản hồi cho điều này (nếu không có lỗi trong lệnh) sẽ làpgresult
đối tượng mang mã trạng thái củaPGRES_COPY_OUT
hoặ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 năng của phần này để nhận hoặc truyền các hàng dữ kèo bóng đá cúp c2. Khi truyền dữ kèo bóng đá cúp c2 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_ERROR
Nế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 đá cúp c2 nối trong khiCopy
Hoạt động đang được tiến hành.)
Nếu ACopy
Lệnh được cấp quaPQEXEC
Trong một chuỗi có thể chứa các lệnh bổ sung, ứng dụng phải tiếp tục tìm nạp kèo bóng đá cúp c2 quả quaPQGetResult
Sau khi hoàn thànhCopy
Trình tự. Chỉ khiPQGetResult
14147_14158null
Có chắc chắn rằngPQEXEC
Chuỗ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 đá cúp c2 quả củapgres_copy_out
hoặcPGRES_COPY_IN
từPQEXEC
hoặ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 đá cúp c2 bổ sung vềCopy
Hoạ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 đá cúp c2 quả truy vấn:
PQNFields
#Trả về số lượng cột (trường) sẽ được sao chép.
PQBinaryTuples
#15722_15901CopyĐể 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 đá cúp c2 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 với định dạng tổng thể hiện tại.)
Copy
Data#Các chức năng này được sử dụng để gửi dữ kèo bóng đá cúp c2 trongSao chép từ Stdin
. Họ sẽ thất bại nếu được gọi khi kèo bóng đá cúp c2 nối không ởcopy_in
State.
PQPutCopydata
#Gửi dữ kèo bóng đá cúp c2 đến máy chủ trong thời giancopy_in
Bang.
int pqputcopydata (pgconn *Conn, const char *bộ đệm, int nbytes);
TruyềnCopy
Dữ kèo bóng đá cúp c2 trong được chỉ địnhbộ đệm
, độ dàinbytes
, đến máy chủ. kèo bóng đá cúp c2 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
Để truy xuất 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ể chiaCopy
luồng dữ kèo bóng đá cúp c2 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 đá cúp c2 phải khớp với định dạng dữ kèo bóng đá cúp c2 được dự kiến bởiCopy
lệ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_in
Bang.
int pqputcopyend (pgconn *Conn, const char *errormsg);
kèo bóng đá cúp c2 thúccopy_in
Hoạt động thành công nếuerrormsg
lànull
. Nếu nhưerrormsg
không phảinull
sau đóCopy
bị buộc phải thất bại, với 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ạisao chép
vì lý do riêng của nó.)
kèo bóng đá cúp c2 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ề 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ửPQPutCopyEnd
gọ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 đá cúp c2 quả cuối cùng củaCopy
lệnh. Người ta có thể chờ kèo bóng đá cúp c2 quả này có sẵn theo cách thông thường. Sau đó trở lại hoạt động bình thường.
Copy
Data#Các chức năng này được sử dụng để nhận dữ kèo bóng đá cúp c2 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 đá cúp c2 nối không ởCopy_out
Bang.
PQGetCopydata
#Nhận dữ kèo bóng đá cúp c2 từ máy chủ trongcopy_out
Bang.
int PQGetCopydata (PGConn *Conn, Char ** Buffer, int async);
cố gắng lấy một hàng dữ kèo bóng đá cúp c2 khác từ máy chủ trong thời gianCopy
. Dữ kèo bóng đá cúp c2 luôn được trả về một hàng dữ kèo bóng đá cúp c2 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 đá cúp c2 liên quan đến việc phân bổ một khối bộ nhớ để giữ dữ kèo bóng đá cúp c2. Thebộ đệm
tham số phải không22820_22826
. *bộ đệm
được đặt để trỏ đến bộ nhớ được phân bổ hoặc thànhnull
Trong trường hợp không có bộ đệm nào được trả lại. Không phảinull
Bộ đệm kèo bóng đá cúp c2 quả phải được giải phóng bằng cách sử dụngPQFreemem
Khi không cần thiết.
Khi một hàng được trả về thành công, giá trị trả về là số byte dữ kèo bóng đá cúp c2 trong hàng (điều này sẽ luôn lớn hơn 0). Chuỗi được trả về luôn được chấm dứt, mặc dù điều này có lẽ chỉ hữu ích cho văn bảnCopy
. kèo bóng đá cúp c2 quả của 0 chỉ ra rằngCopy
vẫ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ể khiAsync
là đúng). kèo bóng đá cúp c2 quả của -1 chỉ ra rằngCopy
được thực hiện. kèo bóng đá cúp c2 quả của -2 chỉ ra rằng xảy ra lỗi (tham khảopqerrormessage
Vì lý do).
KhiAsync
là đúng (không phải bằng không),PQGetCopydata
sẽ không chặn chờ đầu vào; nó sẽ trả về 0 nếuCopy
vẫ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ọiPQConsumeInput
Trước khi gọiPQGetCopydata
Một lần nữa.) Khi24609_24616
là sai (không),PQGetCopydata
Sẽ chặn cho đến khi dữ kèo bóng đá cúp c2 có sẵn hoặc hoạt động hoàn thành.
sauPQGetCopydata
return -1, gọiPQGetResult
Để có được trạng thái kèo bóng đá cúp c2 quả cuối cùng củaCopy
lệnh. Người ta có thể chờ kèo bóng đá cúp c2 quả này có sẵn theo cách thông thường. Sau đó trở lại hoạt động bình thường.
Copy
#Các chức kèo bóng đá cúp c2 này đại diện cho 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 đá cúp c2 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 đá cúp c2 thúc mới (được truyền bởi máy chủ) vào một chuỗi bộ đệm có kích thướclength
.
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 dòng mới kèo bóng đá cúp c2 thúc thành một byte số 0.PQGetLine
returnEOF
Ở cuối đầu vào, 0 nếu toàn bộ dòng đã được đọc và 1 nếu bộ đệm đầy đủ nhưng việc chấm dứt 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 đá cúp c2 quả củaCopy
Lệnh. Nếu ứng dụng có thể nhận các dòng nhiều hơnlength
-1 ký tự dài, cần phải quan tâm để chắc chắn rằng nó nhận ra\.
27374_27479
PQGetLineAsync
#Đọc một hàngsao chép
Dữ kèo bóng đá cúp c2 (đượ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ự28149_28160
, nhưng nó có thể được sử dụng bởi các ứng dụng phải đọcCopy
Dữ kèo bóng đá cúp c2 không đồng bộ, nghĩa là không chặn. Đã phát hànhCopy
Lệnh và nhận đượcPGRES_COPY_OUT
Phản hồi, ứng dụng nên gọiPQConsumeInput
và28655_28671
cho đến khi phát hiện tín hiệu cuối cùng của dữ kèo bóng đá cúp c2.
Không giống nhưPQGetLine
, Hàm này chịu trách nhiệm phát hiện kèo bóng đá cúp c2 thúc dữ liệu.
trên mỗi cuộc gọi,PQGetLineAsync
Sẽ trả về dữ kèo bóng đá cúp c2 nếu hàng dữ kèo bóng đá cúp c2 hoàn chỉnh có sẵn tronglibpqbộ đệm đầu vào. Mặt khác, không có dữ kèo bóng đá cúp c2 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 đá cúp c2 cuối sao đã được nhận dạng hoặc 0 nếu không có dữ kèo bóng đá cúp c2 hoặc một số dương đưa số byte dữ kèo bóng đá cúp c2 đượ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.
Dữ kèo bóng đá cúp c2 được trả về sẽ không vượt ra ngoài ranh giới hàng dữ kèo bóng đá cúp c2. Nếu có thể một hàng toàn bộ sẽ được trả lại cùng một lúc. Nhưng nếu bộ đệm do người gọi cung cấp quá nhỏ để giữ một hàng được gửi bởi máy chủ, thì một hàng dữ kèo bóng đá cúp c2 một phần sẽ được trả về. Với dữ kèo bóng đá cúp c2 văn bản, điều này có thể được phát hiện bằng cách kiểm tra xem byte cuối cùng được trả về là\ n
hoặc không. (Trong một nhị phânCopy
, Phân tích cú pháp thực tế củaCopy
Định dạng dữ kèo bóng đá cúp c2 sẽ cần thiết để đưa ra quyết định tương đương.) Chuỗi được trả về không được chấm dứt. (Nếu bạn muốn thêm NULL chấm dứt, hãy chắc chắn vượt quaBufsize
Một nhỏ hơn phòng thực sự có sẵn.)
pqputline
#Gửi một chuỗi kèo bóng đá cúp c2 thúc null đến máy chủ. Trả về 0 nếu ok vàEOF
Nếu không thể gửi chuỗi.
int pqputline (PGConn *Conn, const char *chuỗi);
TheCopy
luồng dữ kèo bóng đá cúp c2 được gửi bởi một loạt các cuộc gọi đếnpqputline
có cùng định dạ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 đá cúp c2 trên mỗipqputline
cuộ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.
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 với máy chủ rằng nó đã hoàn thành việc gửiCopy
Dữ kèo bóng đá cúp c2. 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ọiPQENDCOPY
32076_32113
pqputnbytes
#Gửi chuỗi không kèo bóng đá cúp c2 thúc không đến máy chủ. Trả về 0 nếu ok vàEOF
Nế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 đá cúp c2 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
33221_33224Đồng bộ hóa với 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ụngpqputline
hoặ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 đá cúp c2 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ụngpqerrormessage
34116_34171
Khi sử dụngPQGetResult
, Ứng dụng sẽ trả lờiPGRES_COPY_OUT
kèo bóng đá cúp c2 quả bằng cách thực thiPQGetLine
Cứu, theo sau làPQENDCOPY
Sau khi thấy dòng Terminator được nhìn thấy. Sau đó nó sẽ trở lại34770_34783
Vòng lặp cho đếnPQGetResult
34907_34946PGRES_COPY_IN
kèo bóng đá cúp c2 quả được xử lý bởi một loạtpqputline
cuộc gọi theo sau làPQENDCOPY
, sau đó quay lạiPQGetResult
Vòng lặp. Sự sắp xếp này sẽ đảm bảo rằngCopy
Lệ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 đá cúp c2 gửiCopy
ViaPQEXEC
và 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ếuCopy
là duy nhấtSQLLệnh trong chuỗi lệnh.
Nếu bạn thấy bất cứ điều gì trong tài kèo bóng đá cúp c2 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 kèo bóng đá cúp c2.