天天看點

PostgreSQL 10.1 手冊_部分 IV. 用戶端接口_第 33 章 libpq - C 庫_33.6. 取消進行中的查詢

33.6. 取消進行中的查詢

一個用戶端應用可以使用本節描述的函數請求取消一個仍在被伺服器處理的指令。

PQgetCancel

建立一個資料結構,這個資料結構包含取消一個通過特定資料庫連接配接發出的指令所需要的資訊。
PGcancel *PQgetCancel(PGconn *conn);      
給出一個PQgetCancel連接配接對象,PQgetCancel建立一個 PGcancel對象。如果給出 的conn是NULL或者是一個無效的連接配接,那麼它将傳回NULL。PGcancel對象是一個不透明的結構, 不應該為應用所直接通路;我們隻能把它傳遞給PQcancel或者PQfreeCancel。 給定一個

PGconn

連接配接對象,

PQgetCancel

建立一個

PGcancel

對象。如果給定的

conn

NULL

或者一個不合法的連接配接,它将傳回

NULL

PGcancel

對象是一個透明的結構,它不能直接被應用通路。它隻能被傳遞給

PQcancel

PQfreeCancel

PQfreeCancel

釋放一個由

PQgetCancel

建立的資料結構。
void PQfreeCancel(PGcancel *cancel);      
PQfreeCancel釋放一個由前面的PQgetCancel建立的資料對象。 

PQfreeCancel

釋放一個之前由

PQgetCancel

建立的資料對象。

PQcancel

要求伺服器放棄目前指令的處理。
int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize);      
如果取消請求成功發送,則傳回值為 1,否則為 0。如果不成功,則

errbuf

會被填充一個解釋性的錯誤消息。

errbuf

必須是一個尺寸為

errbufsize

的字元數組(推薦尺寸為 256 位元組)。,解釋為何不成功。errbuf必須是 一個大小為errbufsize的 char 數組(建議大小為 256 位元組)。

不過,成功的發送并不保證請求會有任何效果。如果取消有效,那麼目前的指令将提前終止并且傳回一個錯誤結果。如果取消失敗(也就是說, 因為伺服器已經完成指令的處理),那麼就根本不會有可見的結果。

如果PQcancel是信号句柄裡的一個局部變量,那麼PQcancel可以在一個信号 句柄裡安全地調用。在PQcancel涉及的範圍裡,PQcancel對象都是隻讀的, 是以我們也可以從一個與處理PGconn對象的線程分離的線程裡處理它。 如果

errbuf

是信号處理器中的一個局部變量,

PQcancel

可以從一個信号處理器中安全地調用。在

PGcancel

有關的範圍内,

PQcancel

都是隻讀的,是以也可以在一個從操縱

PGconn

對象的線程中獨立出來的線程中調用它。

PQrequestCancel

PQrequestCancel

PQcancel

的一個被廢棄的變體。
int PQrequestCancel(PGconn *conn);      
要求伺服器放棄目前指令的處理。它直接在

PGconn

對象上進行操作, 并且如果失敗,就會在

PGconn

對象裡存儲錯誤消息(是以可以用

PQerrorMessage

檢索出來)。 盡管功能相同,這個方法在多線程程式裡和信号處理器裡會帶來危險,因為它可能 覆寫

PGconn

的錯誤消息,進而将目前連接配接上正在處理的操作搞亂。
本文轉自PostgreSQL中文社群,原文連結: