2010-01-04 104 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