©
本文档使用
php.cn手册 发布
一个客户端应用可以使用本节描述的函数,要求取消一个仍在被服务器处理的命令。
PQgetCancel
创建一个数据结构,这个数据结构包含通过特定数据库连接取消一个命令所需要的信息。
PGcancel *PQgetCancel(PGconn *conn);
给出一个PQgetCancel
连接对象,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 字节)。
不过,成功发送取消请求并不保证请求会有任何效果。如果取消生效, 那么当前的命令将提前结束并且返回一个错误的结果。如果取消失败(也就是说, 因为服务器已经完成命令的处理),那么就根本不会有可见的结果。
如果PQcancel
是信号句柄里的一个局部变量,那么PQcancel
可以在一个信号
句柄里安全地调用。在PQcancel
涉及的范围里,PQcancel
对象都是只读的,
因此我们也可以从一个与处理PGconn对象的线程分离的线程里处理它。
PQrequestCancel
要求服务器放弃处理当前命令。
int PQrequestCancel(PGconn *conn);
PQrequestCancel
是PQcancel
的一个废弃的变种。它直接在PGconn对象上进行操作,
并且如果失败,就会在PGconn对象里存储错误信息(因此可以用PQerrorMessage
检索出来。)
尽管功能一样,但是这个方法在多线程程序里和信号句柄里会有危险,因为它可能
覆盖PGconn的错误信息,因此将可能把当前连接正在处理的操作打乱。