PostgreSQL 通知處理

2021-09-02 11:53 更新

服務器產(chǎn)生的通知和警告消息不會被查詢執(zhí)行函數(shù)返回,因為它們不代表查詢失敗。它們可以被傳遞給一個通知處理函數(shù),并且在處理者返回后執(zhí)行會繼續(xù)正常進行。默認的處理函數(shù)會把消息打印在stderr上,但是應用可以通過提供它自己的處理函數(shù)來重載這種行為。

由于歷史原因,通知處理有兩個級別,稱為通知接收器和通知處理器。通知接收器的默認行為是格式化通知并且將一個字符串傳遞給通知處理器來打印。不過,如果一個應用選擇提供自己的通知接收器,它通常會忽略通知處理器層并且在通知接收器中完成所有工作。

函數(shù)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);

這些函數(shù)中的每一個會返回之前的通知接收器或處理器函數(shù)指針,并且設置新值。如果你提供了一個空函數(shù)指針,將不會采取任何動作,只會返回當前指針。

當接收到一個服務器產(chǎn)生的或者libpq內(nèi)部產(chǎn)生的通知或警告消息,通知接收器函數(shù)會被調(diào)用。 它會以一種PGRES_NONFATAL_ERROR PGresult的形式傳遞該消息 (這允許接收器使用 PQresultErrorField 抽取個別的域,或者使用PQresultErrorMessage或者PQresultVerboseErrorMessage得到一個完整的預格式化的消息)。 被傳遞給PQsetNoticeReceiver的同一個空指針也被傳遞(必要時,這個指針可以被用來訪問應用相關(guān)的狀態(tài))。

默認的通知接收器會簡單地抽取消息(使用PQresultErrorMessage)并且將它傳遞給通知處理器。

通知處理器負責處理一個以文本形式給出的通知或警告消息。該消息的字符串文本(包括一個收尾的新行)被傳遞給通知處理器,外加一個同時被傳遞給PQsetNoticeProcessor的空指針(必要時,這個指針可以被用來訪問應用相關(guān)的狀態(tài))。

默認的通知處理器很簡單:

static void
defaultNoticeProcessor(void *arg, const char *message)
{
    fprintf(stderr, "%s", message);
}

一旦你設定了一個通知接收器或處理器,你應該期待只要PGconn對象或者從它構(gòu)造出的PGresult對象存在,該函數(shù)就應該能被調(diào)用。 在一個PGresult創(chuàng)建時,PGconn的當前通知處理指針被復制到PGresult中,以備類似 PQgetvalue 的函數(shù)使用。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號