Форум: "Базы";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];
ВнизUDF в Interbase Найти похожие ветки
← →
Desdechado (2002-04-16 17:11) [0]есть 3 вопроса по написанию UDF для SuperServer (все типы и прототипы взяты из FreeUDFLib):
1. можно ли как-то выделить только время из TIMESTAMP для диалекта 1 и сохранить его? Пробовал 2 способами, но оба не дают нулевого года:
function fn_ExtractTime( PDate: PISC_QUAD ): PISC_QUAD; cdecl; export;
- это дает 1858 год
begin
result := PISC_QUAD( malloc( SizeOf( TISC_QUAD ) ) );
result^ := PDate^;
result^.gds_quad_high := 0;
end;
function fn_ExtractTime( PDate: PISC_QUAD ): PISC_QUAD; cdecl; export;
- это дает 1900 год
var
ibDate: TM;
begin
result := PISC_QUAD( malloc( SizeOf( TISC_QUAD ) ) );
isc_decode_date( PDate, @ibDate );
ibDate.tm_year := 0;
ibDate.tm_mon := 0;
ibDate.tm_mday := 0;
isc_encode_date( @ibDate, result );
end;
2. в описанном выше способе смущает то, что память выделяется явно, а где она освобождается? Есть ли что-то подобное FREE_IT для дат?
3. SQL Explorer показывает БД IB6 как Interbase 4. Это нормально? Просто раньше не обращал внимания, а сейчас задумался, зависит ли от этого работа БДЕ.
← →
Виктор Щербаков (2002-04-16 17:16) [1]
> SQL Explorer показывает БД IB6 как Interbase 4. Это нормально?
>
Это версия драйвера BDE, а не сервера.
← →
Desdechado (2002-04-16 17:19) [2]2 Виктор Щербаков © (16.04.02 17:16)
это-то ясно, но может ли от этого БДЕ что-то недопонимать?
← →
Desdechado (2002-04-16 17:54) [3]>Passowrd:
это по-испански, что ли :))
← →
kaif (2002-04-17 03:24) [4]Видимо 1858 год и есть нулевой.
← →
Digitman (2002-04-17 09:08) [5]2. Память освобождается сервером сразу после корректного возврата из UDF и получения результатов ее работы. Спецификатор FREE_IT в скрипте, декларирующем UDF, как раз и указывает BLR-интерпретатору о необходимости это делать.
При исполнении кл.потоком сервера BLR-токена, соответствующего прекомпилированному спецификатору FREE_IT, происходит вызов msvcrt.free(), параметром которому передается ссылка на область памяти, выделенную в теле UDF вызовом msvcrt.malloc() для возврата результата. При этом менеджеру памяти из msvcrt, фактически исполняющему вызовы malloc() и free(), совершенно безразлично, что будет содержаться/содержалось в областях выделяемой/освобождаемой памяти, поэтому UDF может возвращать результат любого типа в выделенной ей области памяти (лишь бы ссылка на эту область была корректна)
← →
Desdechado (2002-04-17 10:17) [6]2. Судя по описанию команды
DECLARE EXTERNAL FUNCTION name [ datatype | CSTRING (int)
[, datatype | CSTRING ( int) ...]]
RETURNS { datatype [BY VALUE] | CSTRING (int)} [FREE_IT]
ENTRY_POINT "entryname"
MODULE_NAME "modulename";
спецификатор FREE_IT действительно применим к любому типу (причем даже к BY VALUE, что несколько странно!). Спасибо за объяснение. Думал, он только для CSTRING (описания не было).
1. а как же все-таки с нулевым годом или просто выделением времени в 1 диалекте? А то сейчас получается, что присвоив ноль, имеешь 1858/1900 и далее они уже себя ведут не как ноль :((
Например, разница между нулем и 1920 составляет 20 лет, а не 1920.
← →
AlGin (2002-04-17 14:53) [7]To Desdechado
Не верьте глазам своим, смотря описания, а проведите тестирование на проверку корректности освобождения памяти. Мои тесты показали, что память корректно освобождается, если выделяется методом ib_util_malloc с указанием CSTRING FREE_IT, если IB стоит под Windows. Тесты под Linux"ом показывают, что и в этом случае, память, правда очень медленно, но все же отъедается. Лучший метод - писать в ту область памяти, которая выдается извне.
← →
Digitman (2002-04-17 17:31) [8]>AlGin
Это - домыслы. Ты ж наверняак не вникал в поднобности работы менеджера памяти от MSVC. Приведи возможные аргументы в пользу того, что вызываемый сервером msvcrt.free() отрабатывает некорректно, если UDF корректно, по всем правилам в документации на IB, вызвала msvcrt.malloc() и вернула серверу ссылку на распределенную ИМЕННО таким образом область памяти (а не каким-то там ib_util_malloc(), о котором в документации на IB нет ни слова)
← →
AlGin (2002-04-17 17:39) [9]>Digitman
Это не домысли, а результаты тестирования. Конечно, в подробности работы менеджера памяти не вникал.
← →
Digitman (2002-04-17 17:41) [10]>AlGin
тестирования чего ?
приложения, не отвечающего требованиям документации по IB ?
еще раз повторяю - ни о каких ib_utils там речи не идет, есть "чистый" msvcrt.malloc()
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.05.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c