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 に答える