🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 31.6\. 取消正在处理的查询 一个客户端应用可以使用本节描述的函数,要求取消一个仍在被服务器处理的命令。 `PQgetCancel` 创建一个数据结构,这个数据结构包含通过特定数据库连接取消一个命令所需要的信息。 ``` PGcancel *PQgetCancel(PGconn *conn); ``` 给出一个`PGconn`连接对象,`PQgetCancel`创建一个 `PGcancel`对象。如果给出的`conn` 是`NULL`或者是一个无效的连接,那么它将返回`NULL`。 `PGcancel`对象是一个不透明的结构,不应该为应用所直接访问; 我们只能把它传递给`PQcancel`或者`PQfreeCancel`。 `PQfreeCancel` 释放`PQgetCancel`创建的数据结构。 ``` void PQfreeCancel(PGcancel *cancel); ``` `PQfreeCancel`释放一个由前面的`PQgetCancel`创建的数据对象。 `PQcancel` 要求服务器放弃处理当前命令。 ``` int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize); ``` 如果取消请求成功发送,则返回值为 1,否则为 0。如果不成功,则`errbuf` 里面会填充解释的错误信息。`errbuf`必须是一个大小为`errbufsize` 的 char 数组(建议大小为 256 字节)。 不过,成功发送取消请求并不保证请求会有任何效果。如果取消生效, 那么当前的命令将提前结束并且返回一个错误的结果。如果取消失败(也就是说, 因为服务器已经完成命令的处理),那么就根本不会有可见的结果。 如果`errbuf`是信号句柄里的一个局部变量,那么`PQcancel` 可以在一个信号句柄里安全地调用。在`PQcancel`涉及的范围里, `PGcancel`对象都是只读的, 因此我们也可以从一个与处理`PGconn` 对象的线程分离的线程里处理它。 `PQrequestCancel` `PQrequestCancel`是`PQcancel`的一个废弃的变种。 ``` int PQrequestCancel(PGconn *conn); ``` 要求服务器放弃对当前命令的处理。它直接在`PGconn`对象上进行操作, 并且如果失败,就会在`PGconn`对象里存储错误信息(因此可以用 `PQerrorMessage`检索出来。)尽管功能一样, 但是这个方法在多线程程序里和信号句柄里会有危险,因为它可能覆盖`PGconn` 的错误信息,因此将可能把当前连接正在处理的操作打乱。