Страница 1 из 1

Очередной вопрос по UDF

Добавлено: 13 июн 2007, 13:15
stix-s
есть UDF, получаю день недели из даты в виде строки
Исходник

Код: Выделить всё

function get_DayOfWeek(dt:PChar): integer; cdecl; export;
var
 vdt:string;
 old_format:string;
 old_separator:Char;
begin
 vdt:=string(dt);
 old_separator:=DateSeparator;
 old_format:=ShortDateFormat;
 DateSeparator := '-';
 ShortDateFormat := 'yyyy/mm/dd';
 result:=DayOfWeek(StrTodate(vdt));
 if result=1
  then result:=7
  else result:=result-1;
 DateSeparator :=old_separator;
 ShortDateFormat := old_format;
end;
Объявление

Код: Выделить всё

DECLARE EXTERNAL FUNCTION GET_DAYOFWEEK
    CSTRING(12)
RETURNS INTEGER BY VALUE
ENTRY_POINT 'get_DayOfWeek' MODULE_NAME 'All_my_udf'
И есть сильное подозрение, что валит она у меня FB SS 2.0.1.12810
функция используется в ХП и FB не всегда падает, но это угнетает
Может кто ткнет носом, где я накосячил, только не очень больно.

Добавлено: 13 июн 2007, 14:07
WildSery
На глаз сразу не вижу.
Отладчиком из дельфей не пробовал?

Добавлено: 13 июн 2007, 14:15
stix-s
WildSery писал(а):На глаз сразу не вижу.
Отладчиком из дельфей не пробовал?
пробовал, сначала в приложении гонял вроде все в норме, затем загнал в DLL
В Дельфях опция компиллера huge strings выставлена, так что преобразование
vdt:=string(dt); должно корректно отрабатывать
если память мне не изменяет, FB 1.5 не валился, затем базу на FB 2 перегнал и началось, может я какого ньюанса при переводе базы не учел?

Добавлено: 13 июн 2007, 15:04
WildSery
Скомпилил такую функцию у себя.
select get_dayofweek('2007-06-13') from rdb$database выполняет на ура.
Кстати, почему у тебя 12810, а не 12855?

Добавлено: 13 июн 2007, 15:08
stix-s
WildSery писал(а): Скомпилил такую функцию у себя.
select get_dayofweek('2007-06-13') from rdb$database выполняет на ура.
а у меня вот сервак иногда падает :(
WildSery писал(а): Кстати, почему у тебя 12810, а не 12855?
в отпуске был, ток седне закачал 12855
может плюнуть на свою UDF и попробовать в ХП родное?

Код: Выделить всё

...........
    nday=extract (weekday from :vdate_call);
    if (:nday=0) then nday=7;
.....

Добавлено: 13 июн 2007, 16:16
WildSery
Встроенная функция будет быстрее - нет накладных расходов на вызов UDF.
ХП я бы не писал. Там где нужно, такие вычисления и делал на месте. ХП тоже не бесплатно вызывается.

Добавлено: 14 июн 2007, 07:04
stix-s
WildSery писал(а):Встроенная функция будет быстрее - нет накладных расходов на вызов UDF.
ХП я бы не писал. Там где нужно, такие вычисления и делал на месте. ХП тоже не бесплатно вызывается.
без ХП никак, ибо определение дня недели - всего лишь малая часть процедуры
попробую пока выкинуть свою UDF, посмотрю, что получится

Добавлено: 14 июн 2007, 07:55
Dimitry Sibiryakov
Я бы все-таки убрал преобразование string(dt). Мало ли как оно работает внутри... У дельфийской строки есть данные по отрицательным смещениям и если эта конструкция просто присваивает указатель...

Добавлено: 14 июн 2007, 09:16
stix-s
Dimitry Sibiryakov писал(а):Я бы все-таки убрал преобразование string(dt). Мало ли как оно работает внутри... У дельфийской строки есть данные по отрицательным смещениям и если эта конструкция просто присваивает указатель...
ну в отладчике все в норме было, к тому же считал, что параметр компиллера huge strings указывает, что воспринимать string, как PChar или я не прав?

так, обнаружил еще, что на клиенте версия была 2.0.0.12748
без учета корявости UDF это может повалить FB?

Поменял клиентскую dll на родную, погонял, пока ничего не сыпется - посмотрим дальше

Добавлено: 15 июн 2007, 10:59
_so_
По идее может валить сервер строка:
result:=DayOfWeek(StrTodate(vdt));
Если в vdt сидит что-то хреновое и следовательно возникает Exception.
Я бы лучше использовал функцию TryStrToDate или StrToDateTimeDef.

Добавлено: 15 июн 2007, 11:37
stix-s
_so_ писал(а):По идее может валить сервер строка:
result:=DayOfWeek(StrTodate(vdt));
Если в vdt сидит что-то хреновое и следовательно возникает Exception.
Я бы лучше использовал функцию TryStrToDate или StrToDateTimeDef.
да, согласен, надо это предусматривать в общих случаях, но в моем - ни NULL, ни корявой даты в таблице нет - это я первым делом проверял

Добавлено: 15 июн 2007, 11:42
WildSery
stix-s писал(а):да, согласен, надо это предусматривать в общих случаях, но в моем - ни NULL, ни корявой даты в таблице нет - это я первым делом проверял
UDF пишется как раз для любых случаев, а не под конкретные данные. Ы?

Добавлено: 15 июн 2007, 11:48
stix-s
WildSery писал(а):
stix-s писал(а):да, согласен, надо это предусматривать в общих случаях, но в моем - ни NULL, ни корявой даты в таблице нет - это я первым делом проверял
UDF пишется как раз для любых случаев, а не под конкретные данные. Ы?
так-то оно так :) но когда пишу под конкретную задачу, бывает, про это забываю :)

Добавлено: 15 июн 2007, 15:48
_so_
да, согласен, надо это предусматривать в общих случаях, но в моем - ни NULL, ни корявой даты в таблице нет - это я первым делом проверял
Поправь и посмотри будут ли повторяться падения. Или для теста обложи все try except end и кидай в какой-нибудь лог текст Еxception

Добавлено: 18 июн 2007, 08:40
stix-s
_so_ писал(а):
да, согласен, надо это предусматривать в общих случаях, но в моем - ни NULL, ни корявой даты в таблице нет - это я первым делом проверял
Поправь и посмотри будут ли повторяться падения. Или для теста обложи все try except end и кидай в какой-нибудь лог текст Еxception
после смены версии клиента падений пока не наблюдается, так что пока грешу на несовместимость клиента 2.0.0.12748 и сервера FB SS 2.0.1.12855(ибо уже обновил версию сервера, во время жизни топа)
Выжидаю - повалится, вновь за UDF возьмусь