如何使用libpq中的非阻塞连接功能,并在与libpq — C库建立连接时触发通知或回调?

How to use non-blocking connection function in libpq and trigger a notification or callback when the connection is established withlibpq — C Library?

提问人:AmrShams07 提问时间:7/11/2023 最后编辑:General GrievanceAmrShams07 更新时间:11/18/2023 访问量:137

问:

我正在尝试使用 C 语言中的 libpq 库与 PostgreSQL 数据库建立非阻塞连接,并且我希望能够在建立连接后触发通知或回调函数。

我知道 PQconnectStart() 可用于启动非阻塞连接,PQconnectPoll() 可用于检查连接状态,但我不确定一旦建立连接如何触发通知或回调函数。

PGconn *conn;
PGconnStatusType status;

conn = PQconnectStart("dbname=mydatabase user=myusername password=mypassword");

if (conn == NULL) {
    fprintf(stderr, "Connection initialization failed\n");
    exit(1);
}

while ((status = PQconnectPoll(conn)) != CONNECTION_OK) {
    if (status == PGRES_POLLING_FAILED) {
        fprintf(stderr, "Connection failed: %s\n", PQerrorMessage(conn));
        PQfinish(conn);
        exit(1);
    }
}

// Connection is established, how do I trigger a notification or callback function?

// Do something with the connection here...

PQfinish(conn);

C PostgreSQL 套接字

评论


答:

0赞 Laurenz Albe 7/11/2023 #1

我不认为你能那样做。如果有响应,则必须调用套接字进行轮询。您可以启动一个线程或并行进程,该线程或并行进程使用 ,调用您的回调。select()select()

评论

0赞 AmrShams07 7/12/2023
我认为你是对的,唯一可能的办法是将 select() 保留在我可以创建一个线程的地方,到目前为止我所做的是在真正需要连接时创建一个 while 循环,然后一旦建立连接,我就会断开循环并触发一个线程
0赞 Marcos Silva 7/11/2023 #2

我认为您可以使用通知接收器

您可以使用 PQsetNoticeReceiver 设置自定义通知接收器回调函数,每当收到通知或警告消息时都会调用该函数。此回调函数可用于根据应用程序的要求处理和处理收到的消息。

文件通知处理

评论

0赞 Laurenz Albe 7/11/2023
这与非阻塞连接到数据库无关。
0赞 General Grievance 11/18/2023
@LaurenzAlbe 介意解释为什么会这样?可能会帮助模组清理关于这个问题的许多冗余答案。
0赞 Tito 7/11/2023 #3

那么,建立连接后,触发通知将使用该功能。它允许您设置一个回调函数,每当从 PostgreSQL 收到警告消息时都会调用该函数。PQsetNoticeReceiver

触发器应如下所示:

PQsetNoticeReceiver(conn, notificationHandler, NULL);

其中 是定义的回调函数。notificationHandler

0赞 Sadeed Ahmad 7/12/2023 #4

为了在建立连接后触发通知或回调函数,您可以使用PQsetNoticeReceiver函数设置回调函数。当从数据库收到通知时,将调用它。

0赞 adil shahid 11/17/2023 #5
  • 您需要设置一个回调函数,以便使用 处理服务器通知。PQsetNoticeProcessor

  • PQsetNoticeProcessor应该在连接完全建立之后但在连接之前调用。PQconnectStart

  • 对于从 PostgreSQL 服务器收到的每条通知或警告消息,都将调用回调函数。

#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>

void noticeProcessor(void *arg, const char *message) {
    // Your callback function implementation
    printf("Notice from server: %s\n", message);
}

int main() {
    PGconn *conn;
    PGconnStatusType status;

    conn = PQconnectStart("dbname=mydatabase user=myusername password=mypassword");

    if (conn == NULL) {
        fprintf(stderr, "Connection initialization failed\n");
        exit(1);
    }

    PQsetNoticeProcessor(conn, noticeProcessor, NULL);

    while ((status = PQconnectPoll(conn)) != CONNECTION_OK) {
        if (status == PGRES_POLLING_FAILED) {
            fprintf(stderr, "Connection failed: %s\n", PQerrorMessage(conn));
            PQfinish(conn);
            exit(1);
        }
    }

    // Connection is established, noticeProcessor will handle server notices.


    PQfinish(conn);

    return 0;
}

评论

0赞 General Grievance 11/18/2023
这个答案对现有答案没有任何补充。你混在一起也很奇怪。你真的理解这里的代码吗?exitreturn