PQcancelCreate
#准备一个可以发送取消请求的连接。
PGcancelConn *PQcancelCreate(PGconn *conn);
PQcancelCreate
创建一个 PGcancelConn
对象,但不会立即开始通过此连接发送取消请求。可以通过使用 PQcancelBlocking
以阻塞方式和使用 PQcancelStart
以非阻塞方式通过此连接发送取消请求。返回值可以传递给 PQcancelStatus
以检查是否成功创建了 PGcancelConn
对象。 PGcancelConn
对象是一个不透明结构,应用程序不应直接访问。此 PGcancelConn
对象可以用来以线程安全的方式取消在原始连接上运行的查询。
在设置取消请求连接时,将重用原始客户端的许多连接参数。重要的是,如果原始连接需要连接加密和/或目标主机验证(使用 sslmode
或 gssencmode
),则取消请求连接会使用相同的需求。但是,任何仅在客户端身份验证期间或客户端身份验证后使用的连接选项都会被忽略,因为取消请求不需要身份验证,并且在提交取消请求后立即关闭连接。
请注意,当 PQcancelCreate
返回非空指针时,必须在使用完它后调用 PQcancelFinish
,以释放结构和任何关联的内存块。即使取消请求失败或被放弃,也必须这样做。
PQcancelBlocking
#请求服务器以阻塞方式放弃处理当前命令。
int PQcancelBlocking(PGcancelConn *cancelConn);
请求通过给定的 PGcancelConn
发出,该连接需要使用 PQcancelCreate
创建。 PQcancelBlocking
的返回值为 1,如果取消请求成功发送,则为 0。如果失败,则可以使用 PQcancelErrorMessage
检索错误消息。
然而,取消请求成功发送并不保证该请求会产生任何效果。如果取消请求有效,则正在取消的命令将提前终止并返回错误结果。如果取消请求失败(例如,因为服务器已经完成命令处理),则根本不会有可见的结果。
PQcancelStart
PQcancelPoll
#请求服务器以非阻塞方式放弃处理当前命令。
int PQcancelStart(PGcancelConn *cancelConn); PostgresPollingStatusType PQcancelPoll(PGcancelConn *cancelConn);
请求通过给定的 PGcancelConn
发出,该连接需要使用 PQcancelCreate
创建。 PQcancelStart
的返回值为 1,如果可以启动取消请求,则为 0。如果失败,则可以使用 PQcancelErrorMessage
检索错误消息。
如果 PQcancelStart
成功,下一步是轮询 libpq,以便它可以继续执行取消连接序列。使用 PQcancelSocket
获取数据库连接底层套接字的描述符。(注意:不要假设套接字在 PQcancelPoll
调用之间保持不变。)因此循环:如果 PQcancelPoll(cancelConn)
最后返回 PGRES_POLLING_READING
,则等待套接字准备就绪以读取(如 select()
、poll()
或类似系统函数所示)。然后再次调用 PQcancelPoll(cancelConn)
。相反,如果 PQcancelPoll(cancelConn)
最后返回 PGRES_POLLING_WRITING
,则等待套接字准备就绪以写入,然后再次调用 PQcancelPoll(cancelConn)
。在第一次迭代中,即如果您还没有调用 PQcancelPoll(cancelConn)
,则表现得好像它最后返回了 PGRES_POLLING_WRITING
。继续此循环,直到 PQcancelPoll(cancelConn)
返回 PGRES_POLLING_FAILED
(表示连接过程失败),或者 PGRES_POLLING_OK
(表示取消请求成功发送)。
然而,取消请求成功发送并不保证该请求会产生任何效果。如果取消请求有效,则正在取消的命令将提前终止并返回错误结果。如果取消请求失败(例如,因为服务器已经完成命令处理),则根本不会有可见的结果。
在连接过程中的任何时候,都可以通过调用 PQcancelStatus
检查连接状态。如果此调用返回 CONNECTION_BAD
,则表示取消过程失败;如果调用返回 CONNECTION_OK
,则表示取消请求成功发送。这两种状态都可以从上面描述的 PQcancelPoll
的返回值中检测到。在异步连接过程期间(仅在期间)也可能会出现其他状态。这些状态指示连接过程的当前阶段,可能有助于例如向用户提供反馈。这些状态是
CONNECTION_ALLOCATED
#等待调用 PQcancelStart
或 PQcancelBlocking
,以实际打开套接字。这是在调用 PQcancelCreate
或 PQcancelReset
后立即出现的连接状态。此时还没有启动与服务器的连接。要实际开始发送取消请求,请使用 PQcancelStart
或 PQcancelBlocking
。
CONNECTION_STARTED
#等待建立连接。
CONNECTION_MADE
#连接正常;等待发送。
CONNECTION_AWAITING_RESPONSE
#等待服务器响应。
CONNECTION_SSL_STARTUP
#协商 SSL 加密。
CONNECTION_GSS_STARTUP
#协商 GSS 加密。
请注意,虽然这些常量将保留(为了保持兼容性),但应用程序不应该依赖于这些常量以特定顺序出现,或根本不出现,也不应该依赖于状态始终为这些记录的值之一。应用程序可以执行类似于以下操作
switch(PQcancelStatus(conn)) { case CONNECTION_STARTED: feedback = "Connecting..."; break; case CONNECTION_MADE: feedback = "Connected to server..."; break; . . . default: feedback = "Connecting..."; }
连接参数 connect_timeout
在使用 PQcancelPoll
时被忽略;应用程序负责决定是否已经过去了过长的时间。否则,PQcancelStart
后跟 PQcancelPoll
循环等效于 PQcancelBlocking
。
PQcancelStatus
#返回取消连接的状态。
ConnStatusType PQcancelStatus(const PGcancelConn *cancelConn);
状态可以是多个值之一。但是,只有三个值在异步取消过程之外可见: CONNECTION_ALLOCATED
、 CONNECTION_OK
和 CONNECTION_BAD
。使用 PQcancelCreate
成功创建的 PGcancelConn
的初始状态为 CONNECTION_ALLOCATED
。成功发送的取消请求的状态为 CONNECTION_OK
。失败的取消尝试由状态 CONNECTION_BAD
标记。OK 状态将一直保持,直到调用 PQcancelFinish
或 PQcancelReset
为止。
有关可能返回的其他状态代码,请参阅 PQcancelStart
的条目。
然而,取消请求成功发送并不保证该请求会产生任何效果。如果取消请求有效,则正在取消的命令将提前终止并返回错误结果。如果取消请求失败(例如,因为服务器已经完成命令处理),则根本不会有可见的结果。
PQcancelSocket
#获取与服务器取消连接套接字的文件描述符编号。
int PQcancelSocket(const PGcancelConn *cancelConn);
有效的描述符将大于或等于 0;结果为 -1 表示当前没有打开服务器连接。这可能会因为在 PGcancelConn
上调用本节中的任何函数(PQcancelErrorMessage
和 PQcancelSocket
本身除外)而发生变化。
PQcancelErrorMessage
#返回取消连接操作最近生成的错误消息。
char *PQcancelErrorMessage(const PGcancelConn *cancelconn);
几乎所有使用 PGcancelConn
的 libpq 函数,如果失败,都会为 PQcancelErrorMessage
设置消息。请注意,按照 libpq 约定,非空的 PQcancelErrorMessage
结果可以包含多行,并且将包含尾随换行符。调用者不应直接释放结果。当关联的 PGcancelConn
句柄传递给 PQcancelFinish
时,它将被释放。结果字符串不应期望在 PGcancelConn
结构上的操作之间保持不变。
PQcancelFinish
#关闭取消连接(如果它尚未完成发送取消请求)。还释放 PGcancelConn
对象使用的内存。
void PQcancelFinish(PGcancelConn *cancelConn);
请注意,即使取消尝试失败(如 PQcancelStatus
所示),应用程序也应调用 PQcancelFinish
来释放 PGcancelConn
对象使用的内存。在调用 PQcancelFinish
之后,PGcancelConn
指针不得再次使用。
PQcancelReset
#重置 PGcancelConn
,使其可以重复用于新的取消连接。
void PQcancelReset(PGcancelConn *cancelConn);
如果 PGcancelConn
当前用于发送取消请求,则此连接将关闭。然后,它将准备 PGcancelConn
对象,以便它可以用于发送新的取消请求。
这可用于为 PGconn
创建一个 PGcancelConn
,并在原始 PGconn
的整个生命周期中重复使用它。
这些函数代表发送取消请求的旧方法。虽然它们仍然有效,但由于它们不以加密方式发送取消请求(即使原始连接指定了 sslmode
或 gssencmode
来要求加密),因此它们已过时。因此,强烈建议不要在新代码中使用这些旧方法,并且建议更改现有代码以改为使用新函数。
PQgetCancel
#创建一个包含使用 PQcancel
取消命令所需信息的数据结构。
PGcancel *PQgetCancel(PGconn *conn);
PQgetCancel
根据 PGconn
连接对象创建一个 PGcancel
对象。如果给定的 conn
为 NULL
或无效连接,它将返回 NULL
。PGcancel
对象是一个不透明结构,应用程序不应直接访问它;它只能传递给 PQcancel
或 PQfreeCancel
。
PQfreeCancel
#释放由 PQgetCancel
创建的数据结构。
void PQfreeCancel(PGcancel *cancel);
PQfreeCancel
释放之前由 PQgetCancel
创建的数据对象。
PQcancel
#PQcancel
是 PQcancelBlocking
的过时且不安全变体,但可以在信号处理程序中安全使用。
int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize);
PQcancel
仅出于向后兼容的原因而存在。应改用 PQcancelBlocking
。PQcancel
唯一的优势是它可以安全地从信号处理程序中调用,如果 errbuf
是信号处理程序中的局部变量。但是,这通常不被认为是一个足够大的优势,不值得这个函数存在的安全问题。
对于 PQcancel
而言,PGcancel
对象是只读的,因此它也可以从与操作 PGconn
对象的线程分开的线程中调用。
PQcancel
的返回值为 1(如果成功分派取消请求)或 0(否则)。如果失败,则 errbuf
将填充说明性错误消息。errbuf
必须是大小为 errbufsize
的字符数组(建议的大小为 256 字节)。
PQrequestCancel
#PQrequestCancel
是 PQcancelBlocking
的过时且不安全变体。
int PQrequestCancel(PGconn *conn);
PQrequestCancel
仅出于向后兼容的原因而存在。应改用 PQcancelBlocking
。使用 PQrequestCancel
而不是 PQcancelBlocking
没有什么优势。
请求服务器放弃处理当前命令。它直接对 PGconn
对象进行操作,如果失败,则将错误消息存储在 PGconn
对象中(然后可以通过 PQerrorMessage
检索它)。虽然功能相同,但这在多线程程序或信号处理程序中是不安全的,因为覆盖 PGconn
的错误消息可能会搞乱当前在连接上进行的操作。
如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符或需要进一步澄清,请使用 此表格 报告文档问题。