2010-07-22 3 views
0

Каков правильный шаблон для закрытия всех открытых курсоров в сценарии lua перед закрытием соединения db? У меня есть вспомогательная функция rows(), которая вызывается в нескольких местах, которая создает курсоры, в функции end() Я хочу иметь возможность закрыть все созданные.Как закрыть все открытые курсоры в Lua?

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 
+2

Обработка баз данных не является частью «родной» Lua, не так ли? Если вы используете библиотеку, возможно, вы должны указать, какой из них, потому что разные могут иметь разные реализации и поведение. –

+4

note: end - это ключевое слово и не может использоваться как имя функции. – daurnimator

ответ

2

Функция итератор, возвращаемый rows() не закрывает курсор до конца результирующего набора достигается. Возможно, некоторые из экземпляров итератора не полностью читали их результаты. Вы можете попробовать позвонить collectgarbage('collect'), чтобы очистить любые функции, не связанные с итератором, до закрытия соединения. Функция rows() также может помещать все курсоры в таблицу со слабыми ссылками, а функция end() может перечислять эти закрывающие любые открытые курсоры.

Смежные вопросы