![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отладка UDF Firebird
AlexPul © (2003-09-09 17:59:00)
пытаюсь отладить UDF
Посоветовали указать в качестве Run \ Parameters \ Host Application ibserver.exe
Так я и делаю. Только через несколько секунд работа приложения завершается.
Val (2003-09-10 12:36:00) [1]
>Digitman © (10.09.03 10:50) [9]
здOрово, еще раз спасибо.
Digitman (2003-09-10 10:50:00) [2]
> 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 10:22:00) [3]
Digitman © (10.09.03 10:19) [7]
спасибо
Digitman (2003-09-10 10:19:00) [4]
> Val
> почему по ссылке?
потому что IB-сервер (и его клоны) всегда передает фактические параметры в UDF не по их значениям, а по ссылкам на временно создаваемые их копии
Val (2003-09-10 10:07:00) [5]
>Digitman © (10.09.03 08:20) [5]
var Porog: Longint
почему по ссылке?
Digitman (2003-09-10 08:20:00) [6]
> AlexPul
Function ANKLIKE(s1, s2: PChar; varPorog: Longint): Longint; cdecl; export;
DECLARE EXTERNAL FUNCTION ANKLIKE
cstring(100),
cstring(100),
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT "ANKLIKE" MODULE_NAME "ankudf";
Reindeer Moss Eater (2003-09-09 19:21:00) [7]
приводит к тому, что я в функцию получаю мусор.
Как это было установлено?
Как читаются переданные параметры в udf?
kaif (2003-09-09 19:15:00) [8]
Вроде все верно.
А ты пробовал эту функцию отладить просто импортировав ее в обычное приложение? Так проще будет. Может функция неправильно работает.
AlexPul (2003-09-09 18:34:00) [9]
Я написал библиотеку с функцией
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
приводит к тому, что я в функцию получаю мусор.
Подскажите, что я не так делаю
Verg (2003-09-09 18:19:00) [10]
> Посоветовали указать в качестве Run \ Parameters \ Host
> Application ibserver.exe
Да, но только он (ibserver) должен запускаться не сервисом, а обычным консольным приложением (как под 9х).