Имеется 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 из которой фунции подключаются и работают без проблем. Права на оба файла одинаковые
Подскажите в чем проблема. Спасибо.
UDF вылетает с ошибкой please retry, specifying an option
Спасибо, лед тронулся! Скачал клиентскую библиотеку, положил файл firebird.msg - текст ошибки сразу поменялся Заругался какkdv писал(а):если функция не вызывается по причине либы udf, то там идет другая ошибка - или модуль не найден, или точка входа не найдена, и т.п. А про "retry, specifying..." - это у тебя или клиентская либа не от того сервера, или *.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 одинаковые
Пока разбирался с проблемой наткнулся на пару сообщений в инете про то что UDF написанные на Freepascal не работают на FreeBSD. На Linux'е нормально идут, а на FreeBSD траблы. Может тут есть люди которые используют UDF написанные на Freepascal на FreeBSD. Огромная просьба ответьте, какой версии у вас операционка, какой стоит Firebird и какой Freepascal. Спасибо.