понедельник, 28 июня 2010 г.

Лунный кофе. Отладка.

Суть проблемы.

После встраивания lua в java, у получившейся связки, отсутствует одна важная функция - отладочные сообщения. Они конечно не шибко и нужны если вы сразу пишите код без ошибок, но я не такой.

Выглядит подобное отсутствие примерно так, если запустить скрипт с ошибками то работа сразу завершается и ни ответа не привета. Фиг поймешь что не так.

Проблема решается следующим образом:

LuaState.LdoFile возвращает не 0 в случае проблем. И вот тут то и придется поработать. Надо пройтись по стеку lua интерпретатора и выкинуть в stdout все что там есть предварительно преобразовав это все в строки.
примерно так

int stackPtr = 1;
tmp = L.getLuaObject(stackPtr);
while(tmp.isNil() == false)
{
System.out.println(" ["+stackPtr+"] "+tmp.toString());
stackPtr += 1;
tmp = L.getLuaObject(stackPtr);
}

И ура! Есть отладочные сообщения в случае если чего не так.

Но... если вы вызовете(допустив ошибку и имени) метод прокидываемого на уровень скрипта, Java объекта, то опять вам скажут нечто невразумительное

Invalid method call. No such method

и все тут.. ни имени метода ни строки где это произошло.

Красиво побороть эту напасть у меня не вышло. Там видимо надо шибко изгаляться с userdata в которые преобразуются все жабские объекты высовываемые в скрипт. Я не смог нормально раступить как это сделать, не смотря на почти неделю гуглежки. Если кто решил проблему красиво - велакм!

Я поступил проще.

В LuaJavaAPI.java в методе objectIndex
есть строка вида
throw new LuaException("Invalid method call. No such method");
собсно гря она нам и нужна.
меняем ее на
throw new LuaException("Invalid method call. No such method '"+methodName+"'");
и получаем глоток свежего воздуха в виде осмысленной информации о том чегоже мы такого неправильно вызываем.

И да.. не забудьте пересобрать если подключаете к проекту готовый джарник.

пятница, 11 июня 2010 г.

Тонкая однако работа!

Обнаружил преинтереснейшую особенность Oracle.

чтобы выбрать произвольный диапазон строк из таблицы надо сделать чтото в стиле

select *from
(select rownum r, ab.* from
(select * from tbl where rownum < 10)
ab)
where r between 2 and 6

а в постгрессе можно так:

select * from table limit 4 offset 6

вот такой вот ынтырпрайз этот оракл!!!