?
? ????? PHP ??? ???? ??? ?? ??
服務(wù)器生成的注意信息和警告信息都不會(huì)由查詢執(zhí)行函數(shù)返回,因?yàn)樗麄儾⒉惶N(yùn)涵這查詢的失敗。 它們會(huì)被傳遞給一個(gè)注意信息處理函數(shù),然后在該處理返回之后繼續(xù)正常執(zhí)行。 缺省的注意信息處理函數(shù)在stderr上打印該信息, 但是應(yīng)用可以通過提供自己的處理函數(shù)來覆蓋這個(gè)行為。
猶豫歷史原因,系統(tǒng)里存在兩個(gè)級(jí)別的注意信息處理,分別叫做注意信息接收器和注意信息處理器。 缺省的行為是注意信息接收器格式化注意信息然后給注意信息處理器傳遞一個(gè)字串進(jìn)行打印。 不過,對(duì)于自行處理這些事情的應(yīng)用而言,通常是忽略注意信息處理器層, 而只是在注意信息接收器里完成所有動(dòng)作。
函數(shù)PQsetNoticeReceiver
為一個(gè)連接對(duì)象設(shè)置或者檢查當(dāng)前的注意信息接收器。
類似的是PQsetNoticeProcessor
設(shè)置或者檢查當(dāng)前的注意信息處理器。
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ù)逗返回前一個(gè)注意信息接收器或者處理器函數(shù)指針,然后設(shè)置新的數(shù)值。 如果你提供一個(gè)空函數(shù)指針,那么就不會(huì)執(zhí)行任何動(dòng)作,但是返回當(dāng)前指針。
當(dāng)我們從服務(wù)器獲取一個(gè)注意或者警告信息的時(shí)候,或者是收到libpq內(nèi)部生成的類似信息時(shí),
注意信息接收器函數(shù)將被調(diào)用。消息會(huì)以一個(gè)PGRES_NONFATAL_ERROR的PGresult. 的形式傳遞。
(這就允許接收器用PQresultErrorField
抽取獨(dú)立的字段,
或者用PQresultErrorMessage
完成預(yù)先格式化好的信息。)
傳遞給PQsetNoticeReceiver
的同一個(gè) void 指針也同樣傳遞給該函數(shù)。
(必要時(shí),這個(gè)指針可以用來訪問應(yīng)用相關(guān)的狀態(tài)。)
缺省的注意信息接收器只是簡(jiǎn)單的抽取信息(使用PQresultErrorMessage
)然后傳遞給注意信息處理器。
注意信息處理器負(fù)責(zé)處理一個(gè)以文本形式給出的注意或者警告信息。系統(tǒng)傳遞給他消息的
字串文本(包括結(jié)尾的新行符),加上一個(gè)和傳遞給PQsetNoticeProcessor
一樣的 void (無類型)指針。
(必要時(shí),這個(gè)指針可以用來訪問應(yīng)用相關(guān)的狀態(tài)。)
缺省的注意信息處理器就是
static void defaultNoticeProcessor(void *arg,const char *message) { fprintf(stderr,"%s",message); }
一旦你設(shè)置了注意消息接收器或者處理器,那么你就應(yīng)該準(zhǔn)備好在PGconn對(duì)象
或者PGresult對(duì)象開始存在的時(shí)候起就有人調(diào)用它們。在創(chuàng)建PGresult的時(shí)候,
PGconn的當(dāng)前注意信息處理指針被拷貝到PGresult,
以便被類似PQgetvalue
這樣的函數(shù)使用。