如何关闭Lua中所有打开的游标?

如何关闭Lua中所有打开的游标?,lua,database-cursor,luasql,Lua,Database Cursor,Luasql,在关闭db连接之前,关闭lua脚本中所有打开的游标的正确模式是什么?我有一个助手函数rows(),它在多个地方被调用以创建游标,在函数end()上我希望能够关闭所有已创建的 function rows (sql_statement) local cursor = assert (con:execute (sql_statement)); local closed = false; return function () if (closed) then return n

在关闭db连接之前,关闭lua脚本中所有打开的游标的正确模式是什么?我有一个助手函数rows(),它在多个地方被调用以创建游标,在函数end()上我希望能够关闭所有已创建的

function rows (sql_statement)
   local cursor = assert (con:execute (sql_statement));
   local closed = false;
   return function ()
     if (closed) then return nil end;
     local row = {};
     result = cursor:fetch(row);
     if (result == nil) then
       cursor:close();
       closed = true;
       return nil;
     end;
     return row;
   end
end

function end() 
   -- this con:close() call fails because of open cursors
   con:close();
   env:close();
end

rows()
返回的迭代器函数在到达结果集末尾之前不会关闭光标。也许迭代器的一些实例化没有完全读取它们的结果。在关闭连接之前,您可以尝试调用
collectgarbage('collect')
清除任何未引用的迭代器函数。
rows()
函数还可以将所有游标放在具有弱引用的表中,
end()
函数可以枚举这些游标,关闭所有打开的游标。

数据库处理不是“本机”Lua的一部分,对吗?如果您使用的是库,也许您应该提到哪一个,因为不同的库可能有不同的实现和行为。注意:end是一个关键字,不应用作函数名。