Skip to content

34.13. 通知处理#

服务器生成的通知和警告消息不会由查询执行函数返回,因为它们并不意味着查询失败。相反,它们会传递给通知处理函数,在处理程序返回后,执行会正常继续。默认通知处理函数在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提取各个字段,或使用PQresultErrorMessagePQresultVerboseErrorMessage获取完整的预格式化消息。)还传递了传递给PQsetNoticeReceiver的相同 void 指针。(如果需要,可以使用此指针访问特定于应用程序的状态。)

默认通知接收器只是提取消息(使用PQresultErrorMessage)并将其传递给通知处理器。

通知处理器负责处理以文本形式给出的通知或警告消息。它传递消息的字符串文本(包括尾随换行符),加上一个空指针,该指针与传递给PQsetNoticeProcessor的指针相同。(如果需要,可以使用此指针访问特定于应用程序的状态。)

默认通知处理器很简单

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

一旦设置了通知接收器或处理器,您应该期望在PGconn对象或从中创建的PGresult对象存在的情况下调用该函数。在创建PGresult时,PGconn的当前通知处理指针将复制到PGresult中,以便PQgetvalue等函数可能使用。