34.12. 通知处理

服务器生成的通知和警告消息不会由查询执行功能返回,因为它们并不表示查询失败。而是将它们传递给通知处理函数,并在处理程序返回后正常 continue 执行。默认的通知处理功能在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之类的功能使用。