Прошу не кидать камнями, если мой вопрос покажется слишком длинным. По работе возникла срочная необходимость встроить в существующее приложение на Lazarus некий язык для более гибкой работы всяких доп.функций, для чего мной был выбран Lua. До этого с Lua я сталкивался только в конфигах awesome, но теперь потребовалось больше. Приложение, кстати, работает с БД Firebird и существует в версиях для Linux и Windows (клиенты разные). В общем, само встраивание Lua 5.1 в FPC особых проблем не доставило - всё как по-мануалу «Lua API» + lua.pas. Однако нежданчик прилетел откуда не ждали. Итак, схема [БД <- Приложение -> Lua] оказалась вполне рабочей и кроссплатформенной. А вот [БД <- Приложение -> Lua -> БД] - не завелась. Т.е. если Lua-скрипт хочет залезть в БД сам - то получается облом. Проблема тут оказалась в том, что Lua работает с Firebird через luarocks (fbclient) что, соответственно, приводит к двум задачам: 1) откомпилить модули luarocks 2) использовать их.
Первая задача на Linux прошла без проблем, и, по ожиданиям, со второй тоже проблем не будет. А вот на Windows компиляция luarocks показалась адским адом - с шаманством и правкой make-файлов. Несмотря на убитый день fbclient откомпилить под Windows так и не удалось (Из-за Alien-rock). Хрен с ним. Для опытов взял вместо Firebird базу Sqlite. Sqlite откомпилить удалось, но работать она заработала, причем весьма странно. И вот собственно код:
package.cpath = "./luasql/?.dll;"..package.cpath
local x = require "luasql.sqlite3"
function F1()
env = assert(x.sqlite3())
con = assert(env:connect("test.db"))
con:setautocommit(true)
local status, err = pcall(function () cur = assert(con:execute"CREATE TABLE tab1 (id integer);") end)
cur = assert(con:execute("SELECT id, name FROM test"))
-- ОШИБКА ЗДЕСЬ!
--row = cur:fetch ({}, "a")
--[[ while row do
-- print(string.format("Id: %s, Name: %s", row.id, row.name))
row = cur:fetch (row, "a")
end]]
cur:close()
con:close()
env:close()
end
В итоге: скрипт может создать новую таблицу в БД, но стоит только что-то читать из существующих таблиц, как FPC отваливается с ошибкой:
An unhandled exception occurred at $77C41F70 : EAccessViolation : Access violation $77C41F70 $7701F1AC $713FDCC2 $73F853E2 $73F7782B
Вопрос: что я делаю с Lua не так? Куда копать и почему падает FPC?