我正在尝试针对postgresql服务器(9.3版)调试node.js中“node pg cursor”模块的问题
该模块允许对select中的N行进行顺序读取,并通过发送
cur.read(N): 'Execute' on portal=unnamed, rows=N
此命令最多获取N行,我们可以继续以增量方式获取行,直到最后接收
CommandComplete
ReadyForQuery
现在我的问题是,在获取所有行并到达执行序列的末尾之前,我想退出扩展命令:我想增量地获取N行、N行、N行,。。有一次我觉得我已经够多了。
当我这样做(通过Execute停止获取)时,查询似乎永远达不到CommandComplete或ReadyForQuery。这看起来很正常,因为没有任何东西告诉扩展查询我再也不会从中请求行。
除了关闭连接之外,是否有一个命令在不从门户获取所有行的情况下到达CommandComplete或ReadyForQuery?
我试图发送Close并接收CloseComplete,但它没有转到ReadyForQuery。
如果我通过在协议上发送垃圾来强制错误响应,我将到达ReadyForQuery,但这似乎不是很干净。。。
最佳答案
我想你指的是这个,in the documentation:
如果Execute
在完成门户的执行之前终止(由于达到非零的结果行计数),它将发送一条PortalSuspended
消息;此消息的出现告诉前端应针对同一门户发出另一个执行以完成操作。在门户执行完成之前,不会发送指示源SQL命令完成的CommandComplete
消息。因此,Execute
阶段总是由以下消息之一的出现而终止:CommandComplete
、EmptyQueryResponse
(如果门户是从空查询字符串创建的)、ErrorResponse
或PortalSuspended
。
可能,您得到的是PortalSuspended
,您希望放弃门户,而不执行任何其他门户或使用任何其他结果。
如果是,我想您可以发送一条消息:
在完成每一系列扩展查询消息时,前端应发出同步消息。如果当前事务不在BEGIN/COMMIT事务块中,则此无参数消息将导致后端关闭该事务(“close”表示如果没有错误,则提交,如果有错误,则回滚)。然后发出ReadyForQuery响应。
您可能希望首先针对门户发布Sync
:
关闭消息关闭现有的准备好的语句或门户并释放资源。
所以我认为你需要做的是,在信息流方面:Close
Parse
命名门户Bind
循环:Describe
具有行数限制以获取某些行
如果不再需要行;那么Execute
入口
跳出循环
如果收到Close
:
跳出循环CommandComplete
等待Sync