2010-01-04 7 views
0

Je travaille sur une application C supposée parler à PostgreSQL. À l'heure actuelle, je dois gérer les avis et les avertissements envoyés par le serveur, mais je ne sais pas comment le faire fonctionner. Le (très peu clair) documentation dit que nous devrions utiliser PQsetNoticeReceiver pour définir une méthode en tant que récepteur des notifications, car le récepteur par défaut transmet simplement la notification à PQnoticeProcessor et cela imprime à stderr.Traitement des notifications PostgreSQL

J'ai défini une méthode ainsi

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

et je le définir comme le récepteur de notification par défaut au démarrage ainsi

PQsetNoticeReceiver(conn, noticeReceiver, NULL); 

Dans ma mise en œuvre de la méthode que je suis simplement l'impression d'un peu au hasard caractères à l'écran mais il n'est pas appelé. Le débogage étape par étape montre qu'il est défini comme le récepteur d'avis par défaut mais n'est jamais appelé.

Des idées?

+0

Êtes-vous sûr que votre programme reçoit des avis/avertissements? –

+0

Je les vois sur la console, mais je veux les piéger et les manipuler. Je ne sais pas ce que je fais de mal quand je passe ma méthode à la fonction PQ. – ruipacheco

+0

Excusez mon ignorance de C mais votre déclaration et celle des docs ne me ressemblent pas beaucoup. –

Répondre

2

La seule façon dont je pourrais le voir ne fonctionne pas si vous changez la connexion après avoir réglé le récepteur. Gardez à l'esprit que le récepteur est un paramètre de la connexion, donc si vous le déconnectez et le reconnectez, il s'en ira.

Cela fonctionne:

#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

Ne fais pas ça. Je règle le récepteur dès que la connexion est marquée avec succès et c'est tout. Mais il semble que ce ne soit pas appelé. – ruipacheco

+0

Pouvez-vous montrer un exemple de code? Cela fonctionne certainement pour moi. – alvherre

+0

Ma méthode s'appelait noticeReceiver et, pour une raison quelconque, mon app appelait toujours le récepteur par défaut. J'ai changé le nom de la méthode pour myrecv comme vous l'avez et voila, ça marche. En d'autres termes, j'ai perdu un jour à cause du nom de la méthode. – ruipacheco