Страница 1 из 1
FB 1.5: Некорректная работа с UDF
Добавлено: 30 ноя 2004, 10:55
WAKE-UP
Вопрос 1:
Как FB/IB работаю с UDF?
1. Загружают DLL разово на момент подключения пользователя?
2. Загружают DLL разово при старте сервера?
3. Загружают DLL каждый раз при вызове UDF из этой DLL?
(сервер установлен по default-у)
Вопрос 2:
Написал свою DLL с UDF. В UDF корректно освобождаю память, но при работе с базой (select по 250 тысяцам записей с использованием UDF) у меня память неимоверно быстро растёт до 400 мегабайт (база ~420 мег). ОС WINDOWS 2003 Server
P.S.:
Работа со строками:
Код: Выделить всё
DECLARE EXTERNAL FUNCTION CSTR
CHAR(30000),
CHAR(30000),
INTEGER,
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'CHECKSTR' MODULE_NAME 'f'
Внутри просто PChar
Его нужно/нет как-то освобождать.
функция вида
Код: Выделить всё
function CHECKSTR(var S,P: PChar; var i,j: integer): integer;
begin
Проверка(S,P) и результат Result = (Integer ....)
end;
Помогите советом
Re: FB 1.5: Некорректная работа с UDF
Добавлено: 30 ноя 2004, 17:44
kdv
WAKE-UP писал(а):Вопрос 1:
Как FB/IB работаю с UDF?
1. Загружают DLL разово на момент подключения пользователя?
нет. разово в момент вызова пользователем этой udf.
2. Загружают DLL разово при старте сервера?
нет. сервер сам ни к каким базам не коннектится, а udf объявлены в базах.
3. Загружают DLL каждый раз при вызове UDF из этой DLL?
нет, ибо это мазохизм.
Написал свою DLL с UDF. В UDF корректно освобождаю память, но при работе с базой (select по 250 тысяцам записей с использованием UDF) у меня память неимоверно быстро растёт до 400 мегабайт (база ~420 мег). ОС WINDOWS 2003 Server
Код: Выделить всё
DECLARE EXTERNAL FUNCTION CSTR
CHAR(30000),
CHAR(30000),
INTEGER,
INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'CHECKSTR' MODULE_NAME 'f'
где ты взял что надо параметры CHAR писать?
CSTRING надо, а не CHAR.
Внутри просто PChar
pchar это не CHAR.
Его нужно/нет как-то освобождать.
нет.
возьми в качестве примера
www.ibase.ru/download/safeudf.zip
Добавлено: 30 ноя 2004, 18:52
WAKE-UP
Спасибо. До самой UDF я дошел сам, а вот с технологией загрузки - спасибо
Добавлено: 01 дек 2004, 09:25
kdv
я не помню, описано это в документации или нет.
выгрузка, кстати, происходит когда этот пользователь закрывает коннект, в котором было обращение к udf. т.е. как обычно, стоит счетчик dll usage, которому делается +1 на каждый вызов udf, и -1 на каждый disconnect откуда был такой вызов.
про суперсервер и классик, надеюсь, объяснять не надо?

Добавлено: 01 дек 2004, 09:56
WAKE-UP
Пока нет

Я не знаю их отличия, предназначения и т.п. потому как пока не надо было. Стоит думаю почитать на эту тему. А так я вроде SS ставлю всё время

Добавлено: 01 дек 2004, 10:53
kdv
superserver - 1 процесс на всех пользователей. Classic - 1 процесс на 1 пользователя. Соответственно, все что написано выше, актуально только для SuperServer. потому что udf это обычная dll (shared library).
Добавлено: 06 апр 2005, 10:30
noisy
Не хочеться создавать новый топ..
У меня есть проблема с UDF DNVL из FBUDF.DLL.
DNVL возвращает всегда 0
например запрос по пустой таблице
select sum(P.PAY_SUM) from PAYMENT P
результат : <null>
select DNVL(sum(P.PAY_SUM),1) from PAYMENT P
результат : 0
select INVL(sum(P.PAY_SUM),1) from PAYMENT P
результат : 1
в чем дело?
проблему я решил заменой DNVL на ROUND из RFUNC
но как быть с DNVL
Windows XP SP2 Rus
FB 1.5.2
региональные параметры: Русский
Добавлено: 06 апр 2005, 21:14
dimitr
noisy писал(а):У меня есть проблема с UDF DNVL из FBUDF.DLL.
DNVL возвращает всегда 0
У меня все нормально. Сообщи тип столбца PAY_SUM и диалект базы.
ЗЫ. А COALESCE заюзать религия не позволяет?
Добавлено: 07 апр 2005, 10:16
noisy
сообщаю:
SET SQL DIALECT 3;
SET NAMES WIN1251;
CREATE TABLE PAYMENT (
PAY_DOC_ID NUMERIC(15,0) NOT NULL,
CUSTOMER_ID NUMERIC(15,0) NOT NULL,
PAYMENT_ID NUMERIC(15,0) NOT NULL,
SERV_ID NUMERIC(15,0) NOT NULL,
PAY_DATE DATE NOT NULL,
PAY_SUM NUMERIC(15,2) NOT NULL
);