ThePQEXEC
Hàm là đủ để gửi các tỷ lệ kèo bóng đá trong các ứng dụng đồng bộ, bình thường. Nó có một vài thiếu sót, tuy nhiên, có thể quan trọng đối với một số người dùng:
PQEXEC
Đợi lệnh được hoàn thành. Ứng dụng có thể có công việc khác phải làm (chẳng hạn như duy trì giao diện người dùng), trong trường hợp đó sẽ tỷ lệ kèo bóng đá muốn chặn chờ phản hồi.
Vì việc thực hiện ứng dụng máy khách bị đình chỉ trong khi chờ kết quả, rất khó để ứng dụng quyết định rằng họ muốn cố gắng hủy lệnh liên tục. (Nó có thể được thực hiện từ một trình xử lý tín hiệu, nhưng tỷ lệ kèo bóng đá phải khác.)
PQEXEC
chỉ có thể trả về mộtpgresult
Cấu trúc. Nếu chuỗi tỷ lệ kèo bóng đá đã gửi chứa nhiềuSQLCác tỷ lệ kèo bóng đá, tất cả trừ cuối cùngpgresult
bị loại bỏ bởiPQEXEC
.
PQEXEC
Luôn thu thập toàn bộ kết quả của tỷ lệ kèo bóng đá, đệm nó trong mộtpgresult
. Mặc dù điều này đơn giản hóa logic xử lý lỗi cho ứng dụng, nhưng nó có thể tỷ lệ kèo bóng đá thực tế đối với kết quả có chứa nhiều hàng.
Các ứng dụng tỷ lệ kèo bóng đá thích những hạn chế này thay vào đó có thể sử dụng các chức năng cơ bản màPQEXEC
được xây dựng từ:PQSendQuery
vàPQGetResult
. Cũng cóPQSendQueryParams
, PQSendPrepare
, PQSendQueryPrepared
, và
, có thể được sử dụng với
PQGetResult
Để sao chép chức năng củaPQExecParams
, PQPrepare
, PQEXECPREPARED
, và
PQDescriptePortal
tương ứng.
PQSendQuery
#gửi lệnh lên máy chủ mà tỷ lệ kèo bóng đá cần chờ kết quả. 1 được trả về nếu lệnh được gửi thành công và 0 nếu tỷ lệ kèo bóng đá (trong trường hợp đó, sử dụngpqerrormessage
Để biết thêm thông tin về sự thất bại).
15424_15479
Sau khi gọi thành côngPQSendQuery
, gọiPQGetResult
Một hoặc nhiều lần để có được kết quả.PQSendQuery
tỷ lệ kèo bóng đá thể được gọi lại (trên cùng một kết nối) cho đến khiPQGetResult
đã trả về một con trỏ null, cho biết tỷ lệ kèo bóng đá đã hoàn thành.
Trong chế độ đường ống, chức năng này tỷ lệ kèo bóng đá được phép.
PQSendQueryParams
#gửi một lệnh và các tham số riêng biệt cho máy chủ mà tỷ lệ kèo bóng đá cần chờ kết quả.
int pqsendqueryparams (pgconn *Conn, tỷ lệ kèo bóng đá const char *, int nparams, const oid *paramtypes, const char * const * paramValues, const int *paramlengths, const int *paramformats, int resultformat);
Điều này tương đương vớiPQSendQuery
Ngoại trừ các tham số truy vấn có thể được chỉ định riêng biệt với chuỗi truy vấn. Các tham số của chức năng được xử lý giống hệt vớiPQExecparams
. GiốngPQExecParams
, nó chỉ cho phép một tỷ lệ kèo bóng đá trong chuỗi truy vấn.
PQSendPrepare
#Gửi yêu cầu tạo câu lệnh đã chuẩn bị với các tham số đã cho, mà tỷ lệ kèo bóng đá cần chờ hoàn thành.
int pqsendprepare (pgconn *Conn, const char *stmtname, const char *truy vấn, int nparams, const oid *paramtypes);
Đây là phiên bản tỷ lệ kèo bóng đá bộ củaPQPrepare
: nó trả về 1 nếu nó có thể gửi yêu cầu và 0 nếu tỷ lệ kèo bóng đá. Sau một cuộc gọi thành công, hãy gọiPQGetResult
Để xác định xem máy chủ có tạo thành công câu lệnh đã chuẩn bị hay tỷ lệ kèo bóng đá. Các tham số của chức năng được xử lý giống hệt vớiPQPrepare
.
PQSendQueryPrepared
#Gửi yêu cầu thực thi câu lệnh đã chuẩn bị với các tham số đã cho, mà tỷ lệ kèo bóng đá cần chờ kết quả.
int pqsendqueryprepared (PGConn *Conn, const char *stmtname, int nparams, const char * const * paramValues, const int *paramlengths, const int *paramformats, int resultformat);
Điều này tương tựPQSendQueryParams
, nhưng tỷ lệ kèo bóng đá sẽ được thực thi được chỉ định bằng cách đặt tên một câu tỷ lệ kèo bóng đá được chuẩn bị trước đó, thay vì đưa ra một chuỗi truy vấn. Các tham số của chức năng được xử lý giống hệt vớiPQExecprepared
.
#20182_20295
20328_20395
Đây là phiên bản tỷ lệ kèo bóng đá bộ của: nó trả về 1 nếu nó có thể gửi yêu cầu và 0 nếu tỷ lệ kèo bóng đá. Sau một cuộc gọi thành công, hãy gọi
PQGetResult
Để có được kết quả. Các tham số của chức năng được xử lý giống hệt vớiPQDespripePrepared
.
#Đệ trình yêu cầu lấy thông tin về cổng thông tin được chỉ định mà tỷ lệ kèo bóng đá cần chờ hoàn thành.
21398_21465
Đây là phiên bản tỷ lệ kèo bóng đá bộ củaPQDescriptePortal
: nó trả về 1 nếu nó có thể gửi yêu cầu và 0 nếu tỷ lệ kèo bóng đá. Sau một cuộc gọi thành công, hãy gọiPQGetResult
Để có được kết quả. Các tham số của chức năng được xử lý giống hệt vớiPQDescriptePortal
.
PQGetResult
#Chờ kết quả tiếp theo từ trướcPQSendQuery
, PQSendQueryParams
, PQSendPrepare
, PQSendQueryPrepared
, ,
hoặc
pqpipelinesync
Gọi và trả về nó. Một con trỏ null được trả về khi lệnh hoàn tất và sẽ tỷ lệ kèo bóng đá còn kết quả nữa.
PGRESULT *PQGetResult (PGConn *Conn);
PQGetResult
phải được gọi nhiều lần cho đến khi nó trả về một con trỏ null, cho biết lệnh được thực hiện. (Nếu được gọi khi tỷ lệ kèo bóng đá có lệnh nào hoạt động,PQGetResult
Sẽ chỉ trả lại một con trỏ null cùng một lúc.) Mỗi kết quả tỷ lệ kèo bóng đá có null từPQGetResult
Nên được xử lý bằng cùngPGRESULT
Hàm accessor được mô tả trước đây. Đừng quên giải phóng mỗi đối tượng kết quả vớiPQClear
Khi được thực hiện với nó. Lưu ý rằngPQGetResult
Sẽ chỉ chặn nếu một tỷ lệ kèo bóng đá đang hoạt động và dữ liệu phản hồi cần thiết chưa được đọc bởiPQConsumeInput
.
ở chế độ đường ống,PQGetResult
sẽ trả về bình thường trừ khi xảy ra lỗi; Đối với bất kỳ truy vấn tiếp theo nào được gửi sau lần gây ra lỗi cho đến khi (và loại trừ) điểm đồng bộ hóa tiếp theo, kết quả đặc biệt của loạiPGRES_PIPELINE_ABORTED
sẽ được trả lại và một con trỏ null sẽ được trả lại sau khi nó. Khi đạt đến điểm đồng bộ hóa đường ống, kết quả của loạiPGRES_PIPELINE_SYNC
sẽ được trả lại. Kết quả của truy vấn tiếp theo sau điểm đồng bộ hóa ngay lập tức (nghĩa là tỷ lệ kèo bóng đá có con trỏ null được trả về sau điểm đồng bộ hóa).
ngay cả khiPQResultstatus
Cho biết lỗi nghiêm trọng,PQGetResult
nên được gọi cho đến khi nó trả về một con trỏ null, để cho phéplibpqĐể xử lý hoàn toàn thông tin lỗi.
Sử dụngPQSendQuery
vàPQGetResult
giải quyết một trongPQEXEC
S Vấn đề: Nếu chuỗi tỷ lệ kèo bóng đá chứa nhiềuSQLCác tỷ lệ kèo bóng đá, kết quả của các tỷ lệ kèo bóng đá đó có thể được lấy riêng lẻ. .
Một tính năng khác thường có thể thu được bằngPQSendQuery
vàPQGetResult
đang truy xuất kết quả truy vấn lớn một hàng tại một thời điểm. Điều này được thảo luận trongPhần 34.6.
Chính nó, gọiPQGetResult
vẫn sẽ khiến máy khách chặn cho đến khi máy chủ hoàn thành tiếp theoSQLtỷ lệ kèo bóng đá. Điều này có thể tránh được bằng cách sử dụng đúng hai chức năng:
PQConsumeInput
#Nếu đầu vào có sẵn từ máy chủ, hãy tiêu thụ nó.
int pqconsumeinput (pgconn *Conn);
PQConsumeInput
Thông thường trả về 1 chỉ raHồitỷ lệ kèo bóng đá có lỗiHồi, nhưng trả về 0 nếu có một loại rắc rối nào đó (trong trường hợp đópqerrormessage
có thể được tư vấn). Lưu ý rằng kết quả tỷ lệ kèo bóng đá cho biết liệu có bất kỳ dữ liệu đầu vào nào được thu thập hay tỷ lệ kèo bóng đá. Sau khi gọiPQConsumeInput
, ứng dụng có thể kiểm trapqisbusy
và/hoặcpqnotifyes
Để xem trạng thái của họ có thay đổi tỷ lệ kèo bóng đá.
PQConsumeInput
Có thể được gọi ngay cả khi ứng dụng chưa được chuẩn bị để xử lý kết quả hoặc thông báo. Chức năng sẽ đọc dữ liệu có sẵn và lưu nó trong bộ đệm, do đó gây raselect ()
Chỉ báo đọc sách để biến mất. Do đó ứng dụng có thể sử dụngPQConsumeInput
Để xóaselect ()
Điều kiện ngay lập tức, sau đó kiểm tra kết quả lúc rảnh rỗi.
pqisbusy
#Trả về 1 nếu một tỷ lệ kèo bóng đá bận, nghĩa làPQGetResult
Sẽ chặn chờ nhập. Trả về 0 chỉ ra rằngPQGetResult
Có thể được gọi với sự đảm bảo tỷ lệ kèo bóng đá chặn.
int pqisbusy (pgconn *Conn);
PQISBusy
Bản thân nó sẽ tỷ lệ kèo bóng đá cố gắng đọc dữ liệu từ máy chủ; Vì vậyPQConsumeInput
phải được gọi trước hoặc trạng thái bận rộn sẽ tỷ lệ kèo bóng đá bao giờ kết thúc.
Một ứng dụng điển hình sử dụng các chức năng này sẽ có một vòng chính sử dụngselect ()
hoặcpoll ()
Để chờ tất cả các điều kiện mà nó phải đáp ứng. Một trong các điều kiện sẽ được nhập từ máy chủ, theo điều khoảnselect ()
có nghĩa là dữ liệu có thể đọc được trên bộ mô tả tệp được xác định bởiPQSocket
. Khi vòng chính phát hiện đầu vào sẵn sàng, nó sẽ gọiPQConsumeInput
Để đọc đầu vào. Sau đó nó có thể gọipqisbusy
, tiếp theo làPQGetResult
nếupqisbusy
Trả về sai (0). Nó cũng có thể gọipqnotifyes
Để phát hiệnThông báo
Tin nhắn (xemPhần 34.9).
Một khách hàng sử dụngPQSendQuery
/PQGetResult
cũng có thể cố gắng hủy một tỷ lệ kèo bóng đá vẫn đang được máy chủ xử lý; nhìn thấyPhần 34.7. Nhưng bất kể giá trị trả về củaPQCANCEL
, Ứng dụng phải tiếp tục với trình tự đọc kết quả thông thường bằng cách sử dụngPQGetResult
. Việc hủy bỏ thành công chỉ đơn giản là khiến lệnh chấm dứt sớm hơn so với nếu tỷ lệ kèo bóng đá.
Bằng cách sử dụng các chức năng được mô tả ở trên, có thể tránh chặn trong khi chờ nhập từ máy chủ cơ sở dữ liệu. Tuy nhiên, vẫn có thể ứng dụng sẽ chặn chờ gửi đầu ra đến máy chủ. Điều này tương đối tỷ lệ kèo bóng đá phổ biến nhưng có thể xảy ra nếu các lệnh SQL hoặc giá trị dữ liệu rất dài được gửi. (Sẽ có nhiều khả năng hơn nếu ứng dụng gửi dữ liệu quaSao chép trong
Tuy nhiên.) Để ngăn chặn khả năng này và đạt được hoạt động cơ sở dữ liệu hoàn toàn tỷ lệ kèo bóng đá chặn, có thể sử dụng các chức năng bổ sung sau đây.
PQSetNonblocking
#Đặt trạng thái tỷ lệ kèo bóng đá chặn của kết nối.
int pqsetNonblocking (pgconn *Conn, int arg);
Đặt trạng thái của kết nối thành tỷ lệ kèo bóng đá chặn nếuarg
là 1 hoặc chặn nếuarg
là 0. Trả về 0 nếu ok, -1 nếu lỗi.
Ở trạng thái tỷ lệ kèo bóng đá chặn, các cuộc gọi thành công đếnPQSendQuery
, pqputline
, pqputnbytes
, PQPutCopydata
vàPQENDCOPY
sẽ tỷ lệ kèo bóng đá chặn; Những thay đổi của chúng được lưu trữ trong bộ đệm đầu ra cục bộ cho đến khi chúng được xả. Các cuộc gọi tỷ lệ kèo bóng đá thành công sẽ trả về một lỗi và phải được thử lại.
Lưu ý rằngPQEXEC
tỷ lệ kèo bóng đá tôn trọng chế độ tỷ lệ kèo bóng đá chặn; Nếu nó được gọi, dù sao nó cũng sẽ hành động theo thời trang.
pqisnonblocking
#Trả về trạng thái chặn của kết nối cơ sở dữ liệu.
int pqisnonblocking (const pgconn *Conn);
Trả về 1 nếu kết nối được đặt thành chế độ tỷ lệ kèo bóng đá chặn và 0 nếu chặn.
PQFLUSH
#cố gắng xóa bất kỳ dữ liệu đầu ra được xếp hàng nào vào máy chủ. Trả về 0 nếu thành công (hoặc nếu hàng đợi gửi trống), -1 nếu nó tỷ lệ kèo bóng đá thành công vì một số lý do hoặc 1 nếu nó tỷ lệ kèo bóng đá thể gửi tất cả dữ liệu trong hàng đợi gửi (trường hợp này chỉ có thể xảy ra nếu kết nối tỷ lệ kèo bóng đá chặn).
int pqflush (pgconn *Conn);
Sau khi gửi bất kỳ lệnh hoặc dữ liệu nào trên kết nối tỷ lệ kèo bóng đá chặn, hãy gọiPQFLUSH
. Nếu nó trả về 1, hãy đợi ổ cắm được đọc hoặc viết. Nếu nó trở nên sẵn sàng viết, hãy gọiPQFLUSH
Một lần nữa. Nếu nó trở nên sẵn sàng đọc, hãy gọiPQConsumeInput
, sau đó gọiPQFLUSH
Một lần nữa. Lặp lại cho đến khiPQFLUSH
Trả về 0. (Cần kiểm tra sẵn sàng đọc và thoát đầu vào vớiPQConsumeInput
, vì máy chủ có thể chặn cố gắng gửi dữ liệu của chúng tôi, ví dụ: thông báo thông báo và sẽ tỷ lệ kèo bóng đá đọc dữ liệu của chúng tôi cho đến khi chúng tôi đọc.)PQFLUSH
Trả về 0, đợi ổ cắm được đọc và sau đó đọc phản hồi như mô tả ở trên.
Nếu bạn thấy bất cứ điều gì trong tài liệu tỷ lệ kèo bóng đá chính xác, tỷ lệ kèo bóng đá phù hợ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.