Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

32.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 等函数有可能使用。