FB 1.5: Некорректная работа с UDF

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
WAKE-UP
Сообщения: 20
Зарегистрирован: 17 ноя 2004, 12:26

FB 1.5: Некорректная работа с UDF

Сообщение WAKE-UP » 30 ноя 2004, 10:55

Вопрос 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;
Помогите советом

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: FB 1.5: Некорректная работа с UDF

Сообщение kdv » 30 ноя 2004, 17:44

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

WAKE-UP
Сообщения: 20
Зарегистрирован: 17 ноя 2004, 12:26

Сообщение WAKE-UP » 30 ноя 2004, 18:52

Спасибо. До самой UDF я дошел сам, а вот с технологией загрузки - спасибо

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 01 дек 2004, 09:25

я не помню, описано это в документации или нет.
выгрузка, кстати, происходит когда этот пользователь закрывает коннект, в котором было обращение к udf. т.е. как обычно, стоит счетчик dll usage, которому делается +1 на каждый вызов udf, и -1 на каждый disconnect откуда был такой вызов.

про суперсервер и классик, надеюсь, объяснять не надо? :)

WAKE-UP
Сообщения: 20
Зарегистрирован: 17 ноя 2004, 12:26

Сообщение WAKE-UP » 01 дек 2004, 09:56

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 01 дек 2004, 10:53

superserver - 1 процесс на всех пользователей. Classic - 1 процесс на 1 пользователя. Соответственно, все что написано выше, актуально только для SuperServer. потому что udf это обычная dll (shared library).

noisy
Сообщения: 25
Зарегистрирован: 27 окт 2004, 13:21

Сообщение noisy » 06 апр 2005, 10:30

Не хочеться создавать новый топ..

У меня есть проблема с 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
региональные параметры: Русский

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 06 апр 2005, 21:14

noisy писал(а):У меня есть проблема с UDF DNVL из FBUDF.DLL.
DNVL возвращает всегда 0
У меня все нормально. Сообщи тип столбца PAY_SUM и диалект базы.

ЗЫ. А COALESCE заюзать религия не позволяет?

noisy
Сообщения: 25
Зарегистрирован: 27 окт 2004, 13:21

Сообщение noisy » 07 апр 2005, 10:16

сообщаю:
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
);

Ответить