UDF вылетает с ошибкой please retry, specifying an option

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Ответить
d_g_v
Сообщения: 3
Зарегистрирован: 14 мар 2006, 05:02

UDF вылетает с ошибкой please retry, specifying an option

Сообщение d_g_v » 14 мар 2006, 06:15

Имеется Firebird 1.5.2_4 на FreeBSD
Собрал простую UDF с помощью FreePascal
============================================
library test;
{$mode objfpc}
uses sysutils;

function MyFunction(var i: integer): integer; cdecl; export;
begin
Result:=i+5;
end;

exports
MyFunction name 'yyy';
end.
============================================

Подключил в базе

============================================
DECLARE EXTERNAL FUNCTION yyy
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'yyy' MODULE_NAME 'libtest'
============================================

При вызове получаю данную ошибку. В том же каталоге лежит ib_udf.so из которой фунции подключаются и работают без проблем. Права на оба файла одинаковые

Подскажите в чем проблема. Спасибо.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 мар 2006, 17:21

если функция не вызывается по причине либы udf, то там идет другая ошибка - или модуль не найден, или точка входа не найдена, и т.п. А про "retry, specifying..." - это у тебя или клиентская либа не от того сервера, или *.msg на клиенте и сервере не совпадают.

d_g_v
Сообщения: 3
Зарегистрирован: 14 мар 2006, 05:02

Сообщение d_g_v » 15 мар 2006, 09:12

kdv писал(а):если функция не вызывается по причине либы udf, то там идет другая ошибка - или модуль не найден, или точка входа не найдена, и т.п. А про "retry, specifying..." - это у тебя или клиентская либа не от того сервера, или *.msg на клиенте и сервере не совпадают.
Спасибо, лед тронулся! Скачал клиентскую библиотеку, положил файл firebird.msg - текст ошибки сразу поменялся :) Заругался как
Access to UDF library "liblibtest.so" is denied by server administrator.
Почему то добавился префикс "lib"... Изменяю объявлени на ...ENTRY_POINT 'yyy' MODULE_NAME 'libtest.so'
получаю
Access to UDF library "liblibtest.so.so" is denied by server administrator.

Далее пробую объявить как ...ENTRY_POINT 'yyy' MODULE_NAME 'test', в надежде что firebird для себя получит правильное "libtest.so", но в ответ получаю
Invalid request BLR at offset 64. function YYY is not defined.
module name or entrypoint could not be found.


Затем вообще переименовываю файл "libtest.so" в "xxxlibtext.so" на что получаю
Access to UDF library "libtest.so" is denied by server administrator.

Стало совсем непонятно...
Ну и на последок эксперимент, который запутал окончательно:

Удаляю декларацию UDF из базы, удаляю файл "libtest.so", переименовываю "ib_udf.so" в "libtest.so" :) , объявляю UDF

DECLARE EXTERNAL FUNCTION STRLEN
CSTRING(32767)
RETURNS INTEGER BY VALUE
ENTRY_POINT 'IB_UDF_strlen' MODULE_NAME 'libtest.so'

делаю вызов - и данная функция замечательно работает!

Так в чем же причина? Неужели собранные во Freepascal модули .SO
не работают в данной версии Firebird под FreeBSD? Тогда почему ошибка насчет entrypoint появилась всего в одном случае. Написал тестовую прогу на том же Freepascal из котрой нормально подключил данную библиотеку и успешно вызвал из нее функцию. Полгода назад делал тоже самое, но для Firebird под Linux и там все замечательно работало.

P.S. : после каждого изменения декларации и перед каждой тестовой выборкой на всякий случай производился реконнект к базе. Данный коннект был единственным. Права на работающую ib_udf.so и собственную libtest.so одинаковые

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 мар 2006, 09:58

1. в module name нельзя указывать ни путь, ни расширение. Даже если указать, и будет работать, это плохо переносимо.
2. FreePascal отвечает сам за себя :) FB не имеет никаких критериев по типу компилятора, на котором написан модуль .dll/so.

d_g_v
Сообщения: 3
Зарегистрирован: 14 мар 2006, 05:02

Сообщение d_g_v » 15 мар 2006, 12:02

Пока разбирался с проблемой наткнулся на пару сообщений в инете про то что UDF написанные на Freepascal не работают на FreeBSD. На Linux'е нормально идут, а на FreeBSD траблы. Может тут есть люди которые используют UDF написанные на Freepascal на FreeBSD. Огромная просьба ответьте, какой версии у вас операционка, какой стоит Firebird и какой Freepascal. Спасибо.

Ответить