33.12. 通知處理
伺服器産生的通知和警告消息不會被查詢執行函數傳回,因為它們不代表查詢失敗。它們可以被傳遞給一個通知處理函數,并且在處理者傳回後執行會繼續正常進行。預設的處理函數會把消息列印在
stderr
上,但是應用可以通過提供它自己的處理函數來重載這種行為。
由于曆史原因,通知處理有兩個級别,稱為通知接收器和通知處理器。通知接收器的預設行為是格式化通知并且将一個字元串傳遞給通知處理器來列印。不過,如果一個應用選擇提供自己的通知接收器,它通常會忽略通知處理器層并且在通知接收器中完成所有工作。
函數
PQsetNoticeReceiver
為一個連接配接對象設定或者檢查目前的通知接收器。相似地,
PQsetNoticeProcessor
設定或檢查目前的通知處理器。
typedef void (*PQnoticeReceiver) (void *arg, const PGresult *res);
PQnoticeReceiver
PQsetNoticeReceiver(PGconn *conn,
PQnoticeReceiver proc,
void *arg);
typedef void (*PQnoticeProcessor) (void *arg, const char *message);
PQnoticeProcessor
PQsetNoticeProcessor(PGconn *conn,
PQnoticeProcessor proc,
void *arg);
這些函數中的每一個會傳回之前的通知接收器或處理器函數指針,并且設定新值。如果你提供了一個空函數指針,将不會采取任何動作,隻會傳回目前指針。
當接收到一個伺服器産生的或者libpq内部産生的通知或警告消息,通知接收器函數會被調用。它會以一種
PGRES_NONFATAL_ERROR
PGresult
的形式傳遞該消息(這允許接收器使用
PQresultErrorField
抽取個别的域,或者使用
PQresultErrorMessage
完成預格式化的消息)。被傳遞給
PQsetNoticeReceiver
的同一個空指針也被傳遞(必要時,這個指針可以被用來通路應用相關的狀态)。
預設的通知接收器會簡單地抽取消息(使用
PQresultErrorMessage
)并且将它傳遞給通知處理器。
通知處理器負責處理一個以文本形式給出的通知或警告消息。該消息的字元串文本(包括一個收尾的新行)被傳遞給通知處理器,外加一個同時被傳遞給
PQsetNoticeProcessor
的空指針(必要時,這個指針可以被用來通路應用相關的狀态)。
預設的通知處理器很簡單:
static void
defaultNoticeProcessor(void *arg, const char *message)
{
fprintf(stderr, "%s", message);
}
一旦你設定了一個通知接收器或處理器,你應該期待隻要
PGconn
對象或者從它構造出的
PGresult
對象存在,該函數就應該能被調用。在一個
PGresult
建立時,
PGconn
的目前通知處理指針被複制到
PGresult
中,以備類似
PQgetvalue
的函數使用。
本文轉自PostgreSQL中文社群,原文連結:
33.12. 通知處理