Обработка уведомлений в PostgreSQL - PullRequest
0 голосов
/ 04 января 2010

Я работаю над приложением C, которое должно общаться с PostgreSQL. Сейчас мне нужно обрабатывать уведомления и предупреждения, отправленные сервером, но я не знаю, как заставить его работать.

(очень неясная) документация говорит, что мы должны использовать PQsetNoticeReceiver, чтобы установить метод в качестве получателя уведомлений, так как получатель по умолчанию просто пересылает уведомление в PQnoticeProcessor, и это печатает в stderr.

Я определил метод таким образом

static void noticeReceiver(void *arg, const PGresult *res)

и я устанавливаю его как приемник уведомлений по умолчанию при запуске, таким образом

PQsetNoticeReceiver(conn, noticeReceiver, NULL);

В моей реализации метода я просто выводю на экран несколько случайных символов, но он не вызывается. Пошаговая отладка показывает, что он установлен как приемник уведомлений по умолчанию, но никогда не вызывается.

Есть идеи?

1 Ответ

2 голосов
/ 05 января 2010

Единственный способ, которым я мог видеть, что это не работает, - это если вы измените соединение после настройки ресивера. Имейте в виду, что приемник является параметром соединения, поэтому, если вы отключите и снова подключите его, он исчезнет.

Это работает:

#include "libpq-fe.h"

static void myrecv(void *arg, const PGresult *res);

int main() {
    PGconn  *conn;
    PGresult *res;

    conn = PQconnectdb("");
    if (PQstatus(conn) == CONNECTION_BAD)
    {
        printf("connection error: %s\n",
                PQerrorMessage(conn));
        return -1;
    }

    PQsetNoticeReceiver(conn, myrecv, NULL);

    res = PQexec(conn, "select noisy_func();");
    if (PQresultStatus(res) == PGRES_FATAL_ERROR)
        printf("%s: error: %s\n",
                PQresStatus(PQresultStatus(res)),
                PQresultErrorMessage(res));

    return 0;
}

static void
myrecv(void *arg, const PGresult *res)
{
    printf("hey, got a notice saying \"%s\"\n",
            PQresultErrorField(res,
                PG_DIAG_MESSAGE_PRIMARY));
}
...