0

我正在开发一个应该与 PostgreSQL 对话的 C 应用程序。现在我需要处理服务器发送的通知和警告,但我不知道如何让它工作。

(非常不清楚)文档说我们应该使用 PQsetNoticeReceiver 将方法设置为通知的接收者,因为默认接收者只是将通知转发到 PQnoticeProcessor 并打印到 stderr。

我已经定义了一个方法

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

我将它设置为启动时的默认通知接收器

PQsetNoticeReceiver(conn, noticeReceiver, NULL);

在我的方法实现中,我只是将一些随机字符打印到屏幕上,但它没有被调用。逐步调试表明它被设置为默认通知接收器,但从未调用过。

有任何想法吗?

4

1 回答 1

2

我看到它不起作用的唯一方法是在设置接收器后更改连接。请记住,接收器是连接的参数,因此如果您断开连接并重新连接,它就会消失。

这有效:

#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));
}
于 2010-01-04T21:59:23.963 回答