LINUX.ORG.RU

Острая Lua-FPC необходимость

 , ,


0

2

Прошу не кидать камнями, если мой вопрос покажется слишком длинным. По работе возникла срочная необходимость встроить в существующее приложение на 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?


По описанию похоже на то, что биндинги, лежащие в luarocks под оффтопиком давно никто не тестировал.

Рассматривается ли такой вариант, как реализовать интерфейс, позволяющий Lua-коду обращаться к базе через функции самого приложения?

Minoru ★★★
()
Последнее исправление: Minoru (всего исправлений: 1)
Ответ на: комментарий от Minoru

Можно еще на luajit перейти и использовать (через FFI) C-шные библиотеки для доступа к базе данных.

Vovka-Korovka ★★★★★
()
Последнее исправление: Vovka-Korovka (всего исправлений: 1)

А на кой хрен дозволять ЛУА напрямую к бд обращаться? Сделай функции для луа в самом приложении.

unC0Rr ★★★★★
()
Ответ на: комментарий от Minoru

Да, вариант работы с базой через приложение рассматривался - он работает.

SunDoc
() автор топика
Ответ на: комментарий от unC0Rr

Не знаю на какой хрен. Недостаток опыта - поэтому и спрашиваю - как правильно? Мне показалось, что луа и сам не плохо подтягивает инфу из БД, по крайней мере тот же самый отдельный .lua скрипт работает «на ура». Поэтому вместо кучи биндингов «туда-сюда» решил кое-какие вспомогательные справочники таскать из lua напрямую. Если это не возможно - вернусь к практике работы через приложение, однако в ситуации хотелось бы разобраться. Кстати, lua.pas завязан на Lua 5.1 Но есть уже Lua 5.3 - может у кого-то есть опыт встраивания Lua 5.3 ?

SunDoc
() автор топика
Ответ на: комментарий от SunDoc

Есть опыт с луа 5.2 только.

А смысл доступа только через приложение - в контроле сохранности инвариантов, если таковые есть по логике приложения, но не контролируются на стороне БД.

unC0Rr ★★★★★
()
Ответ на: комментарий от unC0Rr

Встраивания 5.2 в FPC? Скомпилированный самостоятельно или откуда-то взятый? Использовался ли там luarocks?

SunDoc
() автор топика
Ответ на: комментарий от SunDoc

Без luarocks, и по сути просто поправленный lua.pas

unC0Rr ★★★★★
()
Ответ на: комментарий от Napilnik

А он разве под оффтопик работает? Вроде в доках сказано что нет, а система УЖЕ двухплатформенная, и мне это не изменить.

SunDoc
() автор топика
Ответ на: комментарий от unC0Rr

это самый здравй вариант. Напиши пару вызовов и все.

а luarocks вообще вроде загнулся к чертям, кажется.

anonymous
()
Ответ на: комментарий от Napilnik

Проверю обязательно. Пока вроде с Луа всё ОК, от Luarocks отказался - вместо него сделал необходимые биндинги из главного приложения. В принципе всё получается зашибись - но эта зашибительность привела меня к двум новым вопросам, которые я обязательно получу на старте:

1. Есть к приложению через Lua.so (dll) подключен скрипт - может ли он инклудить другие скрипты (к примеру какую-нибудь самописную библиотеку функций)? Или тоже через бинд делать?

2. Можно ли добавить самописный отладчик для подгруженного скрипта?

Вопросы пока риторические, исследовать еще не успел.

SunDoc
() автор топика
Ответ на: комментарий от SunDoc

Да, на первый вопрос уже могу сам себе ответить:

1. Можно инклудить другие свои скрипты без особых проблем. Все работает.

Если кому интересно (и у меня все получится) - в дальнейшем смогу выпилить и отдельно показать эту получившуюся библиотеку. Выглядит красиво.

SunDoc
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.