31.13. Обработка уведомлений#
31.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
, или получать полное предварительно отформатированное сообщение с помощью PQresultErrorMessage
или PQresultVerboseErrorMessage
). Также передается указатель на void, который был передан в PQsetNoticeReceiver
. (Этот указатель может использоваться для доступа к специфичному для приложения состоянию, если это необходимо).
По умолчанию получатель уведомлений просто извлекает сообщение (с помощью PQresultErrorMessage
) и передает его обработчику уведомлений.
Процессор уведомлений отвечает за обработку уведомления или предупреждения, представленного в текстовой форме. Он получает строку текста сообщения (включая завершающий символ перехода строки) и указатель на void, который является тем же самым указателем, переданным в функцию PQsetNoticeProcessor
. (Этот указатель может использоваться для доступа к специфичному для приложения состоянию, если это необходимо).
The default notice processor is simply:
static void defaultNoticeProcessor(void *arg, const char *message) { fprintf(stderr, "%s", message); }
После установки получателя или обработчика уведомлений следует ожидать, что эта функция может быть вызвана до тех пор, пока существуют объекты PGconn
или PGresult
, созданные из них. При создании PGresult
указатели на обработку уведомлений текущего PGconn
копируются в PGresult
для возможного использования функциями, такими как PQgetvalue
.