提问人:AmrShams07 提问时间:7/11/2023 最后编辑:General GrievanceAmrShams07 更新时间:11/18/2023 访问量:137
如何使用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?
问:
我正在尝试使用 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);
答:
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
这个答案对现有答案没有任何补充。你混在一起也很奇怪。你真的理解这里的代码吗?exit
return
评论