Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C PostgreSQL通知处理_C_Postgresql_Pointers_Libpq - Fatal编程技术网

C PostgreSQL通知处理

C PostgreSQL通知处理,c,postgresql,pointers,libpq,C,Postgresql,Pointers,Libpq,我正在开发一个C应用程序,它应该与PostgreSQL对话。现在我需要处理服务器发送的通知和警告,但我不知道如何让它工作 (非常不清楚)说我们应该使用PQsetNoticeReceiver将一个方法设置为通知的接收者,因为默认接收者只是将通知转发给PQnoticeProcessor,然后打印到stderr 我这样定义了一个方法 static void noticeReceiver(void *arg, const PGresult *res) 我将它设置为启动时的默认通知接收者 PQsetNo

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

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

我这样定义了一个方法

static void noticeReceiver(void *arg, const PGresult *res)
我将它设置为启动时的默认通知接收者

PQsetNoticeReceiver(conn, noticeReceiver, NULL);
在我的方法实现中,我只是将一些随机字符打印到屏幕上,但它没有被调用。逐步调试显示,它被设置为默认通知接收器,但它从未被调用


有什么想法吗?

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

这项工作:

#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));
}

您确定您的程序收到任何通知/警告吗?我在控制台上看到它们,但我想捕获并处理它们。当我把我的方法传递给PQ函数时,我不知道我做错了什么。请原谅我不知道C,但是你的声明和文档中的声明看起来不太像。你能详细说明一下吗?也许这会有帮助。啊,忽略这一点-在阅读了一些关于C函数指针的主题后,我相信你在这方面做得很好。不这样做。一旦连接被标记为成功,我就设置接收器,就是这样。但它似乎没有被调用。我的方法被称为noticeReceiver,出于某种原因,我的应用程序总是调用默认接收器。我将方法的名称更改为myrecv,正如您所看到的那样,瞧,它起作用了。换句话说,我因为方法名浪费了一天时间。这很奇怪。如果它被称为defaultNoticeReceiver,我可以相信它与默认接收者之间存在冲突,但是我不知道这是怎么发生的。请记住,它们被引用为指针,而不是名称(PQsetNoticeReceiver调用本身除外)。