Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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;
begin
result := PISC_QUAD( malloc( SizeOf( TISC_QUAD ) ) );
result^ := PDate^;
result^.gds_quad_high := 0;
end;
- это дает 1858 год
function fn_ExtractTime( PDate: PISC_QUAD ): PISC_QUAD; cdecl; export;
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;
- это дает 1900 год
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.005 c
7-39876
Brand
2001-11-08 01:02
2002.05.13
IP сетевой платы


6-39817
VELK
2002-02-27 09:24
2002.05.13
Chat без сервера


1-39715
Satrap
2002-04-27 10:13
2002.05.13
Палитра компонентов


1-39774
VCL
2002-04-11 15:40
2002.05.13
RichEdit моргает!!


14-39844
savva
2002-04-04 10:22
2002.05.13
После большого числа веток про единство и борьбу...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский