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

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

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

Ответить
stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

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

Сообщение stix-s » 13 июн 2007, 13:15

есть 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 не всегда падает, но это угнетает
Может кто ткнет носом, где я накосячил, только не очень больно.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 13 июн 2007, 14:07

На глаз сразу не вижу.
Отладчиком из дельфей не пробовал?

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 13 июн 2007, 14:15

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

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 13 июн 2007, 15:04

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

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 13 июн 2007, 15:08

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;
.....

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 13 июн 2007, 16:16

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

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 14 июн 2007, 07:04

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

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 14 июн 2007, 07:55

Я бы все-таки убрал преобразование string(dt). Мало ли как оно работает внутри... У дельфийской строки есть данные по отрицательным смещениям и если эта конструкция просто присваивает указатель...

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 14 июн 2007, 09:16

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

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

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

_so_
Сообщения: 144
Зарегистрирован: 04 ноя 2004, 22:17

Сообщение _so_ » 15 июн 2007, 10:59

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

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 15 июн 2007, 11:37

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

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 15 июн 2007, 11:42

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

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 15 июн 2007, 11:48

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

_so_
Сообщения: 144
Зарегистрирован: 04 ноя 2004, 22:17

Сообщение _so_ » 15 июн 2007, 15:48

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

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Сообщение stix-s » 18 июн 2007, 08:40

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

Ответить