开发者

How do I close all open cursors in Lua?

What's the proper pattern to close all open cursors in a lua script before closing the db connection? I have a helper function rows() that is called in multiple places which creates cursors, on the func开发者_StackOverflowtion end() I want to be able to close all that have been created.

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


The iterator function returned by rows() does not close the cursor until the end of the result set is reached. Perhaps some of the instantiations of the iterator did not completely read their results. You can try calling collectgarbage('collect') to clean up any unreferenced iterator functions before closing the connection. The rows() function could also place all cursors in a table with weak references and the end() function could enumerate these closing any open cursors.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜