Форум: "Базы";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];
ВнизОтладка UDF Firebird Найти похожие ветки
← →
AlexPul (2003-09-09 17:59) [0]пытаюсь отладить UDF
Посоветовали указать в качестве Run \ Parameters \ Host Application ibserver.exe
Так я и делаю. Только через несколько секунд работа приложения завершается.
← →
Verg (2003-09-09 18:19) [1]
> Посоветовали указать в качестве Run \ Parameters \ Host
> Application ibserver.exe
Да, но только он (ibserver) должен запускаться не сервисом, а обычным консольным приложением (как под 9х).
← →
AlexPul (2003-09-09 18:34) [2]Я написал библиотеку с функцией
Function ANKLIKE(s1, s2: PChar; Porog: Longint): Longint; cdecl; export;
Как мне ее правильно декларировать в БД.
Я делаю так:
DECLARE EXTERNAL FUNCTION ANKLIKE
VARCHAR (100),
VARCHAR (100),
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT "ANKLIKE" MODULE_NAME "ankudf";
Все OK
Однако попытка выполнить запрос
select COUNT(*) from "Table1" where
ANKLIKE("Table1"."aaaaaaa", "123", 8)=1
приводит к тому, что я в функцию получаю мусор.
Подскажите, что я не так делаю
← →
kaif (2003-09-09 19:15) [3]Вроде все верно.
А ты пробовал эту функцию отладить просто импортировав ее в обычное приложение? Так проще будет. Может функция неправильно работает.
← →
Reindeer Moss Eater (2003-09-09 19:21) [4]приводит к тому, что я в функцию получаю мусор.
Как это было установлено?
Как читаются переданные параметры в udf?
← →
Digitman (2003-09-10 08:20) [5]
> AlexPul
Function ANKLIKE(s1, s2: PChar; var Porog: Longint): Longint; cdecl; export;
DECLARE EXTERNAL FUNCTION ANKLIKE
cstring(100),
cstring(100),
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT "ANKLIKE" MODULE_NAME "ankudf";
← →
Val (2003-09-10 10:07) [6]>Digitman © (10.09.03 08:20) [5]
var Porog: Longint
почему по ссылке?
← →
Digitman (2003-09-10 10:19) [7]
> Val
> почему по ссылке?
потому что IB-сервер (и его клоны) всегда передает фактические параметры в UDF не по их значениям, а по ссылкам на временно создаваемые их копии
← →
Val (2003-09-10 10:22) [8]Digitman © (10.09.03 10:19) [7]
спасибо
← →
Digitman (2003-09-10 10:50) [9]
> Val
крайне важно понимать, что каждый передаваемый в UDF факт.параметр является временной копией, а не оригиналом.
уничтожение врем.копии происходит автоматически ПОСЛЕ получения сервером результата вызова UDF.
Т.о., если декларировать рез-т UDF как возвращаемый по ссылке (а не по значению), то во многих случаях можно избежать лишних операций с памятью, реализовав, например, тело UDF след.образом :
DECLARE EXTERNAL FUNCTION SUMMMA
INTEGER BY REFERENCE,
INTEGER BY REFERENCE,
RETURNS INTEGER
ENTRY_POINT "SUMMMA" MODULE_NAME "myudf.dll";
Function SUMMA(var Value1, Value2: Integer): PInteger; cdecl; export;
begin
// поскольку тип результата совпадает с типом одного из форм.параметров, смело возвращаем ссылку на область памяти, временно выделенную сервером для передачи, например, 1-го параметра
Result := @Value1;
// и записываем в эту область памяти результат ф-ции - сумму двух факт. Integer-параметров
// ибо серверу безразличен факт изменения содержимого области памяти, выделенной им перед вызовом UDF, под любой из факт.параметров
// результат он возьмет по той ссылке, которую мы вернули ему
// поскольку ссылка достоверна вплоть до чтения сервером результата по ней, никаких проблем не будет : прочитав результат, сервер только после этого автомат-ки уничтожит копию.параметра, на область памяти которого мы здесь сослались
Result^ := Value1 + Value2;
end;
← →
Val (2003-09-10 12:36) [10]>Digitman © (10.09.03 10:50) [9]
здOрово, еще раз спасибо.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.09.29;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.018 c