ThePQEXEC
Hàm là đủ
Để gửi các lệnh trong các ứng dụng đồng bộ đơn giản. Nó
Tuy nhiên, có một vài thiếu sót lớn:
PQEXEC
Chờ lệnh
được hoàn thành. Ứng dụng có thể có công việc khác để làm
(chẳng hạn như duy trì giao diện người dùng), trong trường hợp đó
sẽ kèo bóng đá hom nay muốn chặn chờ phản hồi.
Vì điều khiển được chôn bên trongPQEXEC
, rất khó để frontend
Quyết định nó 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 kèo bóng đá hom nay
nếu kèo bóng đá hom nay thì.)
PQEXEC
chỉ có thể trả về mộtpgresultCấu trúc. Nếu
Chuỗi lệnh đã gửi chứa nhiềuSQLCác lệnh, tất cả trừ cuối cùngpgresultbị loại bỏ bởiPQEXEC
.
Các ứng dụng kèo bóng đá hom nay thích những hạn chế này 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ác chương trình cũ hơn đã sử dụng chức năng này cũng nhưpqputline
vàpqputnbytes
Có thể chặn chờ để gửi dữ liệu đến
phụ trợ. Để giải quyết kèo bóng đá hom nay đề đó, chức năngpqsetNonblocking
đã được thêm vào.
Các ứng dụng cũ có thể bỏ qua việc sử dụngpqsetNonblocking
và có được những người già có khả năng
chặn hành vi. Các chương trình mới hơn có thể sử dụngpqsetNonblocking
Để đạt được hoàn toàn
kết nối kèo bóng đá hom nay chặn đến phụ trợ.
pqsetNonblocking
Đặt
Trạng thái kèo bóng đá hom nay chặn của kết nối.
int pqsetNonblocking (pgconn *Conn, int arg)
Đặt trạng thái kết nối thành kèo bóng đá hom nay chặn nếuarg
là 1, chặn nếuarg
là 0. Trả về 0 nếu ok, -1
Nếu lỗi.
Ở trạng thái kèo bóng đá hom nay chặn, các cuộc gọi đếnpqputline
, pqputnbytes
, PQSendQuery
vàPQENDCOPY
sẽ kèo bóng đá hom nay chặn mà thay vào đó trở lại
một lỗi nếu chúng cần được gọi lại.
Khi kết nối cơ sở dữ liệu đã được đặt thành kèo bóng đá hom nay chặn
Chế độ vàPQEXEC
được gọi là, nó
sẽ tạm thời đặt trạng thái của kết nối để chặn
Cho đến khiPQEXEC
Hoàn thành.
Thêmlibpqđược dự kiến
được làm an toàn chopqsetNonblocking
Chức năng ở gần
tương lai.
pqisnonblocking
Trả về
Trạng thái chặn của kết nối cơ sở dữ liệu.
int pqisnonblockocking (const pgconn *Conn)
Trả về 1 nếu kết nối được đặt thành chế độ kèo bóng đá hom nay chặn, 0 Nếu chặn.
PQSendQuery
Gửi lệnh
đến máy chủ mà kèo bóng đá hom nay chờ đợi (các) kết quả. 1 là
được trả lại nếu lệnh được gửi thành công, 0 nếu kèo bóng đá hom nay
(Trong trường hợp nào, sử dụngpqerrormessage
Để biết thêm thông tin
về sự thất bại).
int pqsendquery (pgconn *Conn, const char *truy kèo bóng đá hom nay);
Sau khi gọi thành côngPQSendQuery
, gọiPQGetResult
một hoặc nhiều lần để có được
kết quả.PQSendQuery
có thể kèo bóng đá hom nay
được gọi lại (trên cùng một kết nối) cho đến khiPQGetResult
đã trả lại null, cho biết
rằng lệnh được thực hiện.
PQGetResult
Đợi
Kết quả tiếp theo từ trướcPQSendQuery
, và trả lại nó. Null là
trả lại khi truy vấn hoàn tất và sẽ kèo bóng đá hom nay còn
kết quả.
PQGetResult
phải được gọi
liên tục cho đến khi nó trả về null, chỉ ra rằng lệnh
được thực hiện. (Nếu được gọi khi kèo bóng đá hom nay có lệnh nào hoạt động,PQGetResult
Sẽ chỉ trả lại null cùng một lúc.)
Mỗi kết quả kèo bóng đá hom nay null từPQGetResult
nên được xử lý bằng cách sử dụng
như nhauPGRESULTCác chức năng của người phụ kiện
được mô tả trước đây. Đừng quên giải phóng từng đối tượng kết quả
vớiPQClear
Khi được thực hiện với nó.
Lưu ý rằngPQGetResult
Will
Chỉ chặn nếu một truy kèo bóng đá hom nay hoạt động và phản hồi cần thiết
Dữ liệu chưa được đọc bởiPQConsumeInput
.
Sử dụngPQSendQuery
vàPQGetResult
giải quyết một trongPQEXEC
16548_16603SQLCác lệnh, kết quả của các lệnh đó có thể được lấy
cá nhân. (Điều này cho phép một dạng đơn giản của chồng chéo
Xử lý, nhân tiện: Frontend có thể xử lý kết quả
của một truy kèo bóng đá hom nay trong khi phần phụ trợ vẫn đang làm việc trên các truy kèo bóng đá hom nay sau này
Trong cùng một chuỗi lệnh.) Tuy nhiên, gọiPQGetResult
Vẫn sẽ khiến Frontend đến
chặn cho đến khi phụ trợ hoàn thành tiếp theoSQLlệnh. Điều này có thể tránh được bằng cách thích hợp
Sử dụng thêm ba chức năng:
PQConsumeInput
Nếu đầu vào là
Có sẵn từ phần phụ trợ, tiêu thụ nó.
int pqconsumeinput (pgconn *Conn);
PQConsumeInput
Thông thường
trả về 1 chỉ ra"kèo bóng đá hom nay có lỗi",,
nhưng trả về 0 nếu có một loại rắc rối nào đó (trong đó
trường hợppqerrormessage
được đặt).
Lưu ý rằng kết quả kèo bóng đá hom nay cho biết liệu có bất kỳ dữ liệu đầu vào nào
thực sự được thu thập. Sau khi gọiPQConsumeInput
, ứng dụng có thể kiểm trapqisbusy
và/hoặcpqnotifyes
Để xem nhà nước của họ có
đã thay đổi.
PQConsumeInput
có thể được gọi
ngay cả khi ứng dụng kèo bóng đá hom nay được chuẩn bị để đối phó với kết quả
hoặc thông báo chỉ là chưa. Thói quen sẽ đọc có sẵn
dữ liệu và lưu nó trong bộ đệm, do đó gây raselect ()
Chỉ định đọc sẵn sàng đi.
Do đó ứng dụng có thể sử dụngPQConsumeInput
Để xóaselect ()
Điều kiện ngay lập tức, và sau đó
Kiểm tra kết quả lúc rảnh rỗi.
pqisbusy
Trả về 1 nếu a
Truy kèo bóng đá hom nay 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 của
kèo bóng đá hom nay chặn.
int pqisbusy (pgconn *Conn);
pqisbusy
sẽ kèo bóng đá hom nay chính nó
cố gắng đọc dữ liệu từ phần phụ trợ; Vì vậyPQConsumeInput
phải được gọi trước, hoặc
trạng thái bận rộn sẽ kèo bóng đá hom nay bao giờ kết thúc.
pqflush
cố gắng xả bất kỳ
dữ liệu xếp hàng vào phụ trợ, trả về 0 nếu thành công (hoặc nếu
Hàng đợi gửi trống) hoặcEOFNếu nó
thất bại vì một số lý do.
int pqflush (pgconn *Conn);
pqflush
Cần được gọi
Trên kết nối kèo bóng đá hom nay chặn trước khi gọiselect ()
Để xác định xem có phản hồi có
tới nơi. Nếu 0 được trả lại, nó đảm bảo rằng kèo bóng đá hom nay có dữ liệu
xếp hàng vào phần phụ trợ chưa thực sự được gửi. Chỉ một
các ứng dụng đã sử dụngpqsetNonblocking
Có nhu cầu về điều này.
PQSocket
lấy tệp
Số mô tả cho ổ cắm kết nối phụ trợ. Một hợp lệ
mô tả sẽ = 0; kết quả của -1 chỉ ra rằng kèo bóng đá hom nay
Kết nối phụ trợ hiện đang mở.
int pqsocket (const pgconn *Conn);
PQSocket
nên sử dụng
Có được bộ mô tả ổ cắm phụ trợ để chuẩn bị cho
thực thiselect ()
. Điều này cho phép
một ứng dụng sử dụng kết nối chặn để chờ
phản hồi phụ trợ hoặc các điều kiện khác. Nếu kết quả củaselect ()
Cho biết dữ liệu đó
có thể được đọc từ ổ cắm phụ trợ, sau đóPQConsumeInput
nên được gọi để đọc
dữ liệu; sau đó,pqisbusy
,
PQGetResult
, và/hoặcpqnotifyes
có thể được sử dụng để
xử lý phản hồi.
Kết nối kèo bóng đá hom nay chặn (đã sử dụngpqsetNonblocking
) kèo bóng đá hom nay nên sử dụngselect ()
cho đến khiPQFLUSH
đã trả về 0 cho biết rằng
kèo bóng đá hom nay có dữ liệu được đệm chờ đợi để được gửi đến
phụ trợ.
Một mặt trận điển hình sử dụng các chức năng này sẽ có vòng lặp chính
sử dụngChọn
Để chờ tất cả
Các điều kiện mà nó phải đáp ứng. Một trong những điều kiện
sẽ có sẵn từ phần phụ trợ, trongChọn
Các điều khoản có thể đọc được trên tệp
mô tả đượ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
, theo sau
quaPQGetResult
nếupqisbusy
Trả về sai (0). Nó cũng có thể gọipqnotifyes
Để phát hiện thông báo
tin nhắn (xemPhần 1.6).
Frontend sử dụngPQSendQuery
/PQGetResult
cũng có thể cố gắng hủy một
lệnh vẫn đang được xử lý bởi phụ trợ.
PQRequestCancel
yêu cầu rằngPostgreSQLTừ bỏ
Xử lý lệnh hiện tại.
int PQRequestCancel (PGConn *Conn);
Giá trị trả về là 1 nếu yêu cầu hủy bỏ là
Được gửi thành công, 0 nếu kèo bóng đá hom nay. (Nếu kèo bóng đá hom nay,pqerrormessage
Nói tại sao kèo bóng đá hom nay.) Thành công
Công văn kèo bóng đá hom nay đảm bảo rằng yêu cầu sẽ có bất kỳ
Hiệu ứng, tuy nhiên. Bất kể giá trị trả về củaPQRequestCancel
, The
Ứng dụng phải tiếp tục với việc đọc kết quả bình thường
trình tự bằng cách sử dụngPQGetResult
. Nếu như
Việc hủy bỏ có hiệu lực, lệnh hiện tại sẽ
chấm dứt sớm và trả về một kết quả lỗi. Nếu
Hủy bỏ thất bại (giả sử, vì phần phụ trợ đã được thực hiện
xử lý lệnh), sau đó sẽ kèo bóng đá hom nay có kết quả hiển thị
tất cả.
Lưu ý rằng nếu lệnh hiện tại là một phần của giao dịch, hủy bỏ sẽ hủy bỏ toàn bộ giao dịch.
PQRequestCancel
Có thể được an toàn
được gọi từ một người xử lý tín hiệu. Vì vậy, nó cũng có thể sử dụng nó
kết hợp với đơn giảnPQEXEC
,
Nếu quyết định hủy bỏ có thể được thực hiện trong một trình xử lý tín hiệu. Vì
ví dụ,PSQLGọiPQRequestCancel
từ ASigintTrình xử lý tín hiệu, do đó cho phép
Tương tác hủy các truy kèo bóng đá hom nay mà nó phát hành thông quaPQEXEC
. Lưu ý rằngPQRequestCancel
sẽ kèo bóng đá hom nay có tác dụng nếu
Kết nối hiện kèo bóng đá hom nay mở hoặc hiện tại kèo bóng đá hom nay
xử lý một lệnh.