Prepared statement improvements and fixes
Данный mr создан как результат использования prepared statements в sbroad. Там было несколько проблем.
- У меня не получилось малой кровью начать использовать msgpack из execute_raw() (вообще, нужно полностью отрефакторить execute, сейчас эти ручки использовать особо не получится, имхо). Поэтому я создаю prepared statement через тарантул модуль (бонус в наличии деструктора), а далее из lua вызываю
box.execute(stmt_id, params)
. Для этого сделал публичным id. - Нашелся баг, приводящий к segfault в деструкторе prepared statement. Мы не должны сами дергать
sql_stmt_finalize()
ни при каких обстоятельствах, только помечать для GC черезsql_unprepare()
. Далее, когда очередная вставка prepared statement не будет влезать в кэш тарантула (параметрsql_cache_size
), мы произведем сборку мусора всех помеченных на удаление prepared statements. А если перед этим мы удалим часть из них ручками черезsql_stmt_finalize()
, то мы падаем с segfault.
Edited by Denis Smirnov