Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

34.7. 取消进行中的查询

客户端应用程序可以使用本节中描述的函数请求取消服务器仍在处理的命令。

PQgetCancel

创建一个包含取消通过特定数据库连接发出的命令所需信息的数据结构。

PGcancel *PQgetCancel(PGconn *conn);

PQgetCancel创建一个PGcancel 对象,给定一个PGconn连接对象。 如果给定的connNULL或无效连接,则返回NULLPGcancel对象是一个不透明结构,不应直接被应用程序访问;它只能传递给PQcancelPQfreeCancel

PQfreeCancel

释放由PQgetCancel创建的数据结构。

void PQfreeCancel(PGcancel *cancel);

PQfreeCancel释放先前由PQgetCancel创建的数据对象。

PQcancel

请求服务器放弃当前命令的处理。

int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize);

返回值为1表示取消请求成功发送,为0表示未成功发送。如果未成功发送,errbuf将填充一个解释性错误消息。 errbuf必须是大小为errbufsize的char数组(建议大小为256字节)。

成功的调度并不保证请求会产生任何效果。然而,如果取消操作成功,当前命令将提前终止并返回错误结果。 如果取消操作失败(比如,因为服务器已经完成了命令的处理),那么将不会有任何可见的结果。

PQcancel可以安全地从信号处理程序中调用,如果errbuf是信号处理程序中的局部变量。 就PQcancel而言,PGcancel对象是只读的,因此它也可以从与操作PGconn对象的线程分离的线程中调用。

PQrequestCancel

PQrequestCancelPQcancel 的一个已弃用的变体。

int PQrequestCancel(PGconn *conn);

请求服务器放弃当前命令的处理。它直接作用于PGconn对象, 失败时将错误消息存储在PGconn对象中(可以通过PQerrorMessage检索)。 尽管功能相同,但这种方法在多线程程序或信号处理程序中不安全,因为可能会覆盖PGconn的错误消息, 从而破坏当前连接上正在进行的操作。