| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 27. libpq - C 庫 | Fast Forward | Next |
服務器生成的注意信息和警告信息都不會由查詢執行函數返回,因為他們並不蘊涵這查詢的失敗。 它們會被傳遞給一個注意信息處理函數,然後在該處理返回之後繼續正常執行。 缺省的注意信息處理函數在 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 的同一個 void 指針也同樣傳遞給該函數。 (必要時,這個指針可以用來訪問應用相關的狀態。)
缺省的注意信息接收器只是簡單的抽取信息(使用 PQresultErrorMessage)然後傳遞給注意信息處理器。
注意信息處理器負責處理一個以文本形式給出的注意或者警告信息。 系統傳遞給他消息的字串文本(包括結尾的新行符),加上一個和傳遞給 PQsetNoticeProcessor 一樣的 void (無類型)指針。(必要時,這個指針可以用來訪問應用相關的狀態。)
缺省的注意信息處理器就是
static void
defaultNoticeProcessor(void * arg, const char * message)
{
fprintf(stderr, "%s", message);
}一旦你設置了注意消息接收器或者處理器,那麼你就應該準備好在 PGconn 對象或者 PGresult 對象開始存在的時候起就有人調用它們。在創建 PGresult 的時候, PGconn 的當前注意信息處理指針被拷貝到 PGresult,以便被類似 PQgetvalue 這樣的函數使用。