On this page
33.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
提取各个字段,或者使用PQresultErrorMessage
或PQresultVerboseErrorMessage
获得完整的预格式化消息.)还传递了传递给PQsetNoticeReceiver
的相同的 void 指针。 (如果需要,此指针可用于访问特定于应用程序的状态.)
默认的通知接收者仅提取消息(使用PQresultErrorMessage
)并将其传递给通知处理器。
通知处理器负责处理以文本形式给出的通知或警告消息。它传递给消息的字符串文本(包括结尾的换行符),再加上一个空指针,该指针与传递给PQsetNoticeProcessor
的指针相同。 (如果需要,此指针可用于访问特定于应用程序的状态.)
默认的通知处理器很简单:
static void
defaultNoticeProcessor(void *arg, const char *message)
{
fprintf(stderr, "%s", message);
}
设置了通知接收者或处理者后,您应该期望只要该函数创建的PGconn
对象或PGresult
对象存在就可以调用该函数。创建PGresult
时,会将PGconn
的当前通知处理指针复制到PGresult
中,以供PQgetvalue
之类的功能使用。