?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
一個(gè)客戶端應(yīng)用可以使用本節(jié)描述的函數(shù),要求取消一個(gè)仍在被服務(wù)器處理的命令。
PQgetCancel
創(chuàng)建一個(gè)數(shù)據(jù)結(jié)構(gòu),這個(gè)數(shù)據(jù)結(jié)構(gòu)包含通過特定數(shù)據(jù)庫(kù)連接取消一個(gè)命令所需要的信息。
PGcancel *PQgetCancel(PGconn *conn);
給出一個(gè)PQgetCancel
連接對(duì)象,PQgetCancel
創(chuàng)建一個(gè)
PGcancel對(duì)象。如果給出
的conn是NULL或者是一個(gè)無效的連接,那么它將返回NULL。PGcancel對(duì)象是一個(gè)不透明的結(jié)構(gòu),
不應(yīng)該為應(yīng)用所直接訪問;我們只能把它傳遞給PQcancel
或者PQfreeCancel
。
PQfreeCancel
釋放PQgetCancel
創(chuàng)建的數(shù)據(jù)結(jié)構(gòu)。
void PQfreeCancel(PGcancel *cancel);
PQfreeCancel
釋放一個(gè)由前面的PQgetCancel
創(chuàng)建的數(shù)據(jù)對(duì)象。
PQcancel
要求服務(wù)器放棄處理當(dāng)前命令。
int PQcancel(PGcancel *cancel,char *errbuf,int errbufsize);
如果取消請(qǐng)求成功發(fā)送,則返回值為 1,否則為 0。如果不成功, 則errbuf里面會(huì)填充一些錯(cuò)誤信息,解釋為何不成功。errbuf必須是 一個(gè)大小為errbufsize的 char 數(shù)組(建議大小為 256 字節(jié))。
不過,成功發(fā)送取消請(qǐng)求并不保證請(qǐng)求會(huì)有任何效果。如果取消生效, 那么當(dāng)前的命令將提前結(jié)束并且返回一個(gè)錯(cuò)誤的結(jié)果。如果取消失敗(也就是說, 因?yàn)榉?wù)器已經(jīng)完成命令的處理),那么就根本不會(huì)有可見的結(jié)果。
如果PQcancel
是信號(hào)句柄里的一個(gè)局部變量,那么PQcancel
可以在一個(gè)信號(hào)
句柄里安全地調(diào)用。在PQcancel
涉及的范圍里,PQcancel
對(duì)象都是只讀的,
因此我們也可以從一個(gè)與處理PGconn對(duì)象的線程分離的線程里處理它。
PQrequestCancel
要求服務(wù)器放棄處理當(dāng)前命令。
int PQrequestCancel(PGconn *conn);
PQrequestCancel
是PQcancel
的一個(gè)廢棄的變種。它直接在PGconn對(duì)象上進(jìn)行操作,
并且如果失敗,就會(huì)在PGconn對(duì)象里存儲(chǔ)錯(cuò)誤信息(因此可以用PQerrorMessage
檢索出來。)
盡管功能一樣,但是這個(gè)方法在多線程程序里和信號(hào)句柄里會(huì)有危險(xiǎn),因?yàn)樗赡? 覆蓋PGconn的錯(cuò)誤信息,因此將可能把當(dāng)前連接正在處理的操作打亂。