Страница 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
);