2010-01-04 146 views
0

我正在研究一个与PostgreSQL交谈的C应用程序。现在我需要处理服务器发送的通知和警告,但是我不知道如何使其工作。PostgreSQL通知处理

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

我已经定义了一个方法,从而

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

,我因此

PQsetNoticeReceiver(conn, noticeReceiver, NULL); 

在启动时将其设置为默认的通知接收器在我的方法实现我只是印刷一些随机的字符屏幕,但它不会被调用。逐步调试显示它被设置为默认通知接收者,但从未被调用过。

任何想法?

+0

你确定你的程序接收任何通知/警告? – 2010-01-04 19:24:25

+0

我在控制台上看到它们,但我想陷入并处理它们。当我将我的方法传递给PQ函数时,我只是不知道自己做错了什么。 – ruipacheco 2010-01-04 19:27:23

+0

请原谅我对C的无知,但是您的声明和文档中的声明与我看起来不太相似。 – 2010-01-04 19:38:22

回答

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)); 
} 
+0

不这样做。一旦连接标记成功,我立即设置接收器,就是这样。但它似乎没有被称为。 – ruipacheco 2010-01-04 22:23:26

+0

你可以显示示例代码?它当然适用于我。 – alvherre 2010-01-05 03:17:46

+0

我的方法被称为noticeReceiver,由于某种原因,我的应用程序始终称为默认接收方。我改变了方法的名称为myrecv,因为你拥有它,瞧,它的工作原理。 换句话说,我因为方法的名字而浪费了一天的时间。 – ruipacheco 2010-01-05 11:40:04