Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
Как из UDF вернуть строку BY DESCRIPTOR? Как выделить память под саму структуру и под данные?

С уважением, Vasilisk
19 авг 19, 17:26    [21952715]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30321

19.08.2019 17:26, _Vasilisk_ пишет:
> Как из UDF вернуть строку BY DESCRIPTOR? Как выделить память под саму структуру и под данные?

дык статья же есть, с примерами

Posted via ActualForum NNTP Server 1.5

19 авг 19, 17:28    [21952717]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
Мимопроходящий
дык статья же есть, с примерами
Эта? Набор функций IFNULL и возвращаются те же параметрі, что были переданы.

Вот пример оттуда
function idNvl( v,v2:PDSC):PDSC;cdecl; export;
begin
	if not isnull(v) then
		result:= v else
	result:= v2;
end;
19 авг 19, 17:32    [21952721]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
Оттуда же
procedure copyparam( v,rc:PDSC);
  begin
       //code provided by Rudy Velthuis (TeamB)
       rc^ := v^;
       //GetMem(rc^.dsc_address, v^.dsc_length);
       Move(v^.dsc_address^, rc.dsc_address^, v^.dsc_length);
  end;
19 авг 19, 17:36    [21952725]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
_Vasilisk_,

http://www.ibphoenix.com/files/Writing-External-Functions.pdf
19 авг 19, 17:43    [21952731]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
Симонов Денис
http://www.ibphoenix.com/files/Writing-External-Functions.pdf
Нашел такое
FREE_IT
If the parameter is returned by descriptor, however, we have two elements that were created dynamically: the descriptor and the data. Firebird 1 only freed the data, making it useless for most needs. Firebird 2 deallocates both the descriptor and the data
Теперь бы понять как ведет себя Interbase
19 авг 19, 17:59    [21952748]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48163

_Vasilisk_
Нашел такое

И тут же выкинь. С FREE_IT ты вернёшь только строку как значение.

Дескриптор со строкой можно вернуть исключительно через возврат значения во входном
параметре. Ищи недокументированную фичу RETURNS PARAMETER.

Posted via ActualForum NNTP Server 1.5

19 авг 19, 18:34    [21952778]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
hvlad
Member

Откуда:
Сообщений: 10531
_Vasilisk_
Теперь бы понять как ведет себя Interbase
А что - поддержка не отвечает ? В документации не расжёвано ?
19 авг 19, 19:08    [21952801]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
Dimitry Sibiryakov
С FREE_IT ты вернёшь только строку как значение.
Я думал вызвать дважды ib_malloc. Один раз для структуры, второй раз для данных.

Но сейчас увидел, что BY DESCRIPTOR вернуть результат нельзя. Значит вопрос с выделением памяти под структуру решился. Будем надеяться (сейчас буду проверять), что FREE_IT освободит память под данные
19 авг 19, 19:52    [21952846]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
hvlad
В документации не расжёвано ?
Нет. Там две странички на все
19 авг 19, 19:52    [21952848]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
Dimitry Sibiryakov,

Объявляю функцию
DECLARE EXTERNAL FUNCTION UR_TEST
    DESCRIPTOR,
    DESCRIPTOR
RETURNS PARAMETER 2
ENTRY_POINT 'Test' MODULE_NAME 'Test.dll';

Реализация
procedure Test(AParam: PISC_DSC; ARes: PISC_DSC); cdecl;
begin
  WriteToLogFmt('Param: %p', [AParam]);
  WriteToLogFmt('Res  : %p', [ARes]);
end;
Вызываю
SELECT ur_test('ABC') FROM rdb$database;

Видим в логе, что AParam = ARes, dsc_dtype = 9 (dtype_long), PLong(dsc_address)^ = 0

ЧЯДНТ?
19 авг 19, 20:33    [21952883]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
И при вызове еще и ошибка
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements. message length error (encountered 16, expected 20).
Вызов
SELECT ur_test(99) FROM rdb$database;
дает тот же эффект
19 авг 19, 20:40    [21952891]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
_Vasilisk_
ЧЯДНТ?
Проверял на IB2009. Посмотрел на IB XE3 x64 - адреса передаются разные и входной параметр корректен.

А FREE_IT с конструкцией
RETURNS PARAMETER 2
объявить не разрешает.

При таком объявлении
declare external function UR_TEST
descriptor,
CSTRING(1024) BY DESCRIPTOR
RETURNS PARAMETER 2
entry_point 'Test' module_name 'Test.dll';
Token unknown - line 3, char 13. BY.

Если объявить так
declare external function UR_TEST
descriptor,
DESCRIPTOR
RETURNS PARAMETER 2
entry_point 'Test' module_name 'Test.dll';
то второй параметр приходит с типом dtype_long и dsc_length = 4
19 авг 19, 21:09    [21952909]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
Vlad F
Member

Откуда:
Сообщений: 874
_Vasilisk_,

И что, есть действительно серьезные основания пытаться прошибать лбом стены именно на IB?
19 авг 19, 21:48    [21952931]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28117
_Vasilisk_
А FREE_IT с конструкцией
RETURNS PARAMETER 2
объявить не разрешает.

что за ересь - free_it только для возвращаемых значений, где память аллокирована внутри udf через ib_util_malloc.
returns parameter означает вернуть ссылку на входной параметр. Входные параметры всегда аллокируются ИБ ФБ самостоятельно, ДО вызова udf. Поэтому free_it тут вообще не аллё.

p.s. в ИБ периодически что-то ломают. например, давно поломали вывод page reads/writes для isc_database_info. В результате, например, ИБЕ после выполнения запроса для reads/writes/fetches выводит какую-то ахинею.
Правда, может там что поменяли, о чем ИБЕ не знает, но...
19 авг 19, 21:56    [21952940]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 9831
kdv
В результате, например, ИБЕ после выполнения запроса для reads/writes/fetches выводит какую-то ахинею.


это случается и для Firebird. Правда не понятно при каких условиях
19 авг 19, 22:09    [21952948]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
Vlad F
Member

Откуда:
Сообщений: 874
Просто для FB нынче есть куда как более интересные альтернативы.
19 авг 19, 22:20    [21952951]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
Vlad F
И что, есть действительно серьезные основания пытаться прошибать лбом стены именно на IB?
Заказчик. На FB не хочет переходить принципиально
kdv
что за ересь - free_it только для возвращаемых значений,
Исходный вопрос был - как возвратить строку? Как под нее выделить память и кто ее должен освободить
kdv
Входные параметры всегда аллокируются ИБ ФБ самостоятельно
Это замечательно. А память под данные?

Сейчас попробовал такой вызов
CREATE PROCEDURE SP_D_TEST (
  in_param VARCHAR(64))
RETURNS (
  out_param VARCHAR(64))
AS
BEGIN
  out_param = ur_test(:in_param);
END
все равно выходной параметр dtype_long и длина 4 байта
20 авг 19, 14:54    [21953507]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48163

_Vasilisk_
Исходный вопрос был - как возвратить строку?

Строку вернуть просто. Вернуть её BY DESCRIPTOR - совсем другой вопрос.

Posted via ActualForum NNTP Server 1.5

20 авг 19, 14:56    [21953512]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
Dimitry Sibiryakov
Строку вернуть просто.
Отож. Мне нужно вернуть или строку или NULL. Из-за этого и возня
20 авг 19, 15:04    [21953528]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30321

20.08.2019 15:04, _Vasilisk_ пишет:
> Отож. Мне нужно вернуть или строку или NULL. Из-за этого и возня

а обернуть в NULLIF(UDF_str(), '') ?

Posted via ActualForum NNTP Server 1.5

20 авг 19, 15:06    [21953532]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
Мимопроходящий
а обернуть в NULLIF(UDF_str(), '') ?
Хотелось по людски сделать.

Сейчас еще проверю на XE7, а потом забью
20 авг 19, 15:11    [21953538]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
_Vasilisk_
Сейчас еще проверю на XE7,
Не взлетело. То же, что и на XE3
20 авг 19, 15:19    [21953548]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30321

20.08.2019 15:19, _Vasilisk_ пишет:
> Не взлетело. То же, что и на XE3

возьми попробуй пример из fdudf, что идёт в комплекте с FB.
каталог examples, функции sNvl, sNullif и т.п.

Posted via ActualForum NNTP Server 1.5

20 авг 19, 15:29    [21953554]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
Мимопроходящий
возьми попробуй пример из fdudf, что идёт в комплекте с FB.
каталог examples, функции sNvl, sNullif и т.п.
Я же уже отвечал 21952721
20 авг 19, 15:31    [21953555]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30321

видимо таки нужно писать в саппорт.
х.з. какие неонки у них там погорели...

Posted via ActualForum NNTP Server 1.5

20 авг 19, 15:38    [21953562]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
Мимопроходящий
видимо таки нужно писать в саппорт.
Мне тебе рассказать про багтреккинг Эмбаркадеры?
Мимопроходящий
х.з. какие неонки у них там погорели...
Я перепробовал три последних версии. Похоже, что неонки никогда и не работали
20 авг 19, 15:47    [21953569]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30321

20.08.2019 15:47, _Vasilisk_ пишет:
> Я перепробовал три последних версии. Похоже, что неонки никогда и не работали

вообще-то фича FB-шная.
можно копнуть поглубже.
если в IB6.5 не фурычит,
то наверное напрасны ожидания.

Posted via ActualForum NNTP Server 1.5

20 авг 19, 15:52    [21953576]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28117
Мимопроходящий,

https://quality.embarcadero.com/browse/IBP-34
https://quality.embarcadero.com/browse/IBP-37
https://quality.embarcadero.com/browse/IBP-35

три шоу-стоппера ХЕ7, update 6. Какой-то из них "не могли воспроизвести", хотя я воспроизвел без проблем на 4х разных компах.
В итоге ... выпустили IB 2017, а апдейтов к XE7 больше не выходило.
А это значит, что "клиент должен сделать апгрейд (платный) до 2017, надеясь, что эти ошибки исправлены там".
20 авг 19, 15:57    [21953578]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
Мимопроходящий
вообще-то фича FB-шная.
Вот ее описание в IB

А вот пример декларации
DECLARE EXTERNAL FUNCTION name [data_type ;
| CSTRING (int) | DESCRIPTOR [, data_type | CSTRING (int) ...] DESCRIPTOR]
RETURNS {data_type [BY VALUE] | CSTRING (int) | PARAMETER n}
[FREE_IT]
ENTRY_POINT 'entryname'
MODULE_NAME 'modulename';
Как видишь, синтаксис немного отличается от FB-шного
20 авг 19, 15:59    [21953580]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30321

20.08.2019 15:59, _Vasilisk_ пишет:
> Как видишь, синтаксис немного отличается от FB-шного

ну, пощупай на ихнем 2017-м, как говорит kdv

Posted via ActualForum NNTP Server 1.5

20 авг 19, 16:03    [21953583]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
_Vasilisk_
_Vasilisk_
Сейчас еще проверю на XE7,
Не взлетело. То же, что и на XE3
Ошибся. Проверял на 2017 (WI-V13.3.0.328)
Итого:
2009: адреса входного и выходного параметров совпадают. Получить значение входного параметра невозможно
XE3, 2017 - адреса разные и входной параметр приходит, но выходной имеет тип long с выделенными 4 байтами
20 авг 19, 16:07    [21953590]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28117
kdv,

жаль, что я ту базу test2.ib кокнул на ЯД осенью 2018 года. А на дисках не могу найти.
20 авг 19, 16:12    [21953600]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28117
kdv,

нашел! Надо кому? Выложу на ЯД опять.
20 авг 19, 16:29    [21953628]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30321

20.08.2019 16:29, kdv пишет:
> нашел! Надо кому? Выложу на ЯД опять.

дык, это ж твой файл.
откуда ж нам знать что там?

Posted via ActualForum NNTP Server 1.5

20 авг 19, 16:33    [21953634]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48163

_Vasilisk_
Как видишь, синтаксис немного отличается от FB-шного

Ну так чего ж ты в 21952909 удивляешься, что она ругается на FB-шный синтаксис?..

Posted via ActualForum NNTP Server 1.5

20 авг 19, 16:40    [21953645]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
Dimitry Sibiryakov
Ну так чего ж ты в 21952909 удивляешься, что она ругается на FB-шный синтаксис?..
Потому что на тот момент еще не рассмотрел отличий. Был не прав.
20 авг 19, 16:47    [21953654]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28117
Мимопроходящий,

там файл для воспроизведения багов ИБ ХЕ7, в соответствии с моими багрепортами.
Не надо - не выложу.
20 авг 19, 18:01    [21953714]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
kdv
https://quality.embarcadero.com/browse/IBP-34
Похоже? https://quality.embarcadero.com/browse/IBP-80
internal gds software consistency check (inconsistent LATCH_mark call (295), file: cch.c line: 7070)
Это я репортил уже на 2017
20 авг 19, 18:36    [21953733]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28117
_Vasilisk_,

да этот LATCH у них лез уже давно, я так и не знаю, вывели или нет.
20 авг 19, 20:48    [21953806]     Ответить | Цитировать Сообщить модератору
 Re: Возвращение результата BY DESCRIPTOR  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11163
kdv
я так и не знаю, вывели или нет.
Мой баг повторяется на WI-V13.3.0.328. Это 2017 Update 3. Последняя вышедшея версия.
21 авг 19, 15:15    [21954515]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Firebird, InterBase Ответить