powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Трассировка вызова UDF в Firebird 2.5
25 сообщений из 54, страница 2 из 3
Трассировка вызова UDF в Firebird 2.5
    #39158457
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanврубай откладку из дельфей
Ошибка появляется нестабильно, при отладке все нормально.

wadmanЕсли пытаешься модифицировать входные параметры, то получаешь по рукам.
Не пытаюсь, могу поставить const
function UserFunc(const Value1, Value2: PChar): PChar; cdecl; export;

wadmanПочему не PAnsiChar?
Delphi 2007, PChar = PAnsiChar

DBConstructor может в блоке try криво обработано исключение, возникающее при выходе за пределы страницы выделенной памяти при копировании строки в буфер результата?
Результирующая строка всегда обрезается на 255 символов

hvladкак ф-ция объявлена на SQL ?
В IBExpert'е так:
Имя | Имя библиотеки | Точка входа | Входные аргументы | Возвращает |Механизм возвращения |FreeIt
USERFUNC | UserUDF.dll | UserFunc | CSTRING(32000),CSTRING(80) | CSTRING(32000) | By Reference | Х
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158461
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosВ IBExpert'е так:DDL покажи, не надо на IBE ссылаться...
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158468
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladDDL покажи, не надо на IBE ссылаться...
DECLARE EXTERNAL FUNCTION USERFUNC
CSTRING(32000),
CSTRING(80)
RETURNS CSTRING(32000) FREE_IT
ENTRY_POINT 'UserFunc' MODULE_NAME 'UserUDF.dll';
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158491
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryМожет, ты не заметил, но диплома телепата у меня нет, и догадываться, что ты подразумевал, я не могу. А потому и задал простой и конкретный вопрос. На который ты до сих пор не ответил, и не уточнил дополнительными словами своё некорректное первое высказывание.
То, на что ты в очередной раз сагрился: 18741936
DBConstructor"free" недоступен, есть только ib_util_malloc, который используется для передачи серверу результата по ссылке и затем, выделенная память подчищается сервером.
было ответом на: 18741658
AriochDBConstructor,
...и вроде как ещё malloc/free нужно использовать специальные FB-шные
Угадай с одного раза - о каких "FB-шные функциях malloc/free" шла речь?
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158495
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

база utf?
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158498
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

нет, WIN1251
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158499
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos, не понятно... Вы описываете udf функцию в базе с параметрами типа CSTRING, а саму функцию в библиотеке с параметрами PChar (по сути, VARCHAR). Вы, при этом, завершаете строку "нулевым" символом, чтобы указать серверу конец строки "си стринг".
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158507
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructorс параметрами PChar (по сути, VARCHAR).
PChar это совсем не VARCHAR.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158509
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Dbconstructor!
You wrote on 29 января 2016 г. 14:32:09:

Dbconstructor> Вы описываете udf функцию в базе с параметрами типа CSTRING, а саму функцию в библиотеке с параметрами PChar (по сути, VARCHAR).
какой пафосный бред! восхитительно!
вася, ты зачем сюда пришел ваще?
сидел бы на своём мыскулле.
там твой бред не так заметен.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158525
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, перепутал "паскалевского" указателя на символ с типом строки. 20 лет не садился за Delphi, бывает...
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158527
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий, у тебя опять оверхед говна? Сходи, просрись чтоль...
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158533
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

ну код-то показывать будешь или это секрет?
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158547
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
function MakeResultString(Source: PChar): PChar;
var Len: DWORD;
begin
  result := nil;
  Len := StrLen(Source) + 1;
  result := ib_util_malloc(Len);
  if (Source = nil) or (Len = 1) then
    result[0] := #0
  else
    Move(Source^, result^, Len);
end;

function ValidateStr(Value, KodType : PChar): PChar; cdecl; export;
var
  res: string;
  r: Extended;
  pos_m, l_len, r_len, mant: integer;

  procedure GetLRLen(Value: string; out l_len, r_len: integer);
  var
    pos_, l_val: integer;
  begin
    pos_ := pos('.', Value);
    if pos_ > 0 then begin
      l_val := StrToInt(copy(Value, 1, pos_-1));
      if l_val = 0 then l_len := 0
      else l_len := length(IntToStr(l_val));
      r_len := length(copy(Value, pos_+1,length(Value)-pos_));
    end
    else begin
      l_len := length(Value);
      r_len := 0;
    end;
  end;

begin
  try
    if KodType = 'INTEGER' then res := IntToStr(StrToIntDef(Value, 0))
    else if KodType = 'REAL' then begin
      try
        DecimalSeparator := '.';
        res := ReplaceStr(Value, ',', '.');
        r := StrToFloatDef(res, 0);
        pos_m := pos('E', res);

        if pos_m > 0 then begin
          GetLRLen(copy(res, 1, pos_m-1), l_len, r_len);
          mant := StrToInt(copy(res, pos_m+1, length(res)-pos_m));
          if mant > 0 then begin
            l_len := l_len + mant;
            r_len := r_len - mant;
            if r_len < 0 then r_len := 0;
          end
          else begin
            l_len := l_len + mant;
            r_len := r_len - mant;
            if l_len < 0 then l_len := 0;
          end;
        end
        else GetLRLen(res, l_len, r_len);
        res := FloatToStrF(r, ffFixed, l_len+r_len, r_len)
      except
        res := '0';
      end;
    end
    else if KodType = 'TIMESTAMP' then res := DateTimeToStr(StrToDateTimeDef(Value, Now))
    else if KodType = 'STRING' then res := copy(Value, 1, 254);
    result := MakeResultString(PChar(res));
  except
  end;
end;
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158578
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,
на ibase.ru есть статья, как работать со строками.
Примеры вызова и ddl таблиц, с запросами?

П.С. try except не нужны, не помогут. Тормоза добавляют только.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158618
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лениво разбирать код, ты на словах скажи, что надо, может выкинуть ее нах, эту УДФ и прямо на SQL сделать обертку? потом поправишь вызова с вызова УДФ на left join sp(...) on 1=1

нет тела, нет дела. (с)
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158873
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

при попадании в наружный (пустой) блок except, result остаётся неопределённым (мусором ?)
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158875
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_Pisarevsky,

Функция получает на вход новое значение параметра и название его типа, затем проверяет корректность нового значения согласно указанному типу. Для действительного числа, например, это унификация формата - запятая заменяется точной, экспоненциальная запись преобразуется в обычную.

Если эту функцию еще можно попытаться перевести на SQL, то UDF падает еще иногда на MD5, которое не переведешь.
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158881
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosзатем проверяет корректность нового значения согласно указанному типу.

А при опечатке в типе - падает с AV из-за неинициализированного res. Всё логично. Ну или,
как сказал, Влад, роняет сам движок возвращая ему неинициализированный указатель. Что и
наблюдается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158882
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Nicholaos!
You wrote on 29 января 2016 г. 18:38:05:

Nicholaos> UDF падает еще иногда на MD5используете CryptoAPI, или самописная функция?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158903
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

проверка на то, что это именно один из 4х типов происходит в процедуре SQL из которой вызывается функция.

hvlad,

да, получается, что мусор, но
1. для integer и timestamp используется def-преобразования, безопасные
2. для real со сложной логикой есть еще блок try..except с присваиванием значения при неудаче
3. для строки просто копирование

На всякий случай я поменял UDF так, чтобы гарантированно вылетал в пустой except без присваивания значения и прогнал в цикле 100000 раз. Успешно.

Мимопроходящий,

используется этот модуль:
https://github.com/rofl0r/KOL/blob/master/units/ics/MD5.pas
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158905
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosНа всякий случай я поменял UDF так, чтобы гарантированно вылетал в пустой
except без присваивания значения и прогнал в цикле 100000 раз. Успешно.
Ты понимаешь, что не инициализированные переменные коварны?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158912
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Nicholaos!
You wrote on 29 января 2016 г. 18:58:40:

Nicholaos> используется этот модуль:
> https://github.com/rofl0r/KOL/blob/master/units/ics/MD5.pas
он там злоупотребляет динамическими массивами и паскалёвыми строками.
я бы в таком виде его в UDF тащить не стал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158913
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

понимаю, но не могу придумать ситуацию, при которой мы попадем пустой except

И это не объясняет, почему иногда падает на MD5, которая написана так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function MD5(str:PChar):PChar; cdecl; export;
begin
  try
    result := MakeResultString(PChar(strMD5(str)));
  except
    result := MakeResultString('');
  end;
end;
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158924
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosэто не объясняет, почему иногда падает на MD5, которая написана так

Я бы на твоём месте изменил тип входного параметра у MakeResultString() на String и убрал
приведение к PChar на вызовах. Ибо это создаёт неопределённость времени жизни временных
переменных.

PS: Поведение StrLen() при передаче ей nil я тоже не берусь предсказать.
PPS: Значения параметров в файл лога тебе ничто не мешает писать самостоятельно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Трассировка вызова UDF в Firebird 2.5
    #39158956
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Спасибо за советы.

Dimitry SibiryakovPPS: Значения параметров в файл лога тебе ничто не мешает писать самостоятельно.

Конечно, без проблем можно писать в файл или в бд в автономной транзакции.
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 2 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Трассировка вызова UDF в Firebird 2.5
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]