Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Возвращение результата BY DESCRIPTOR / 25 сообщений из 41, страница 1 из 2
19.08.2019, 17:26
    #39851231
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
Как из UDF вернуть строку BY DESCRIPTOR? Как выделить память под саму структуру и под данные?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
19.08.2019, 17:28
    #39851233
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
19.08.2019 17:26, _Vasilisk_ пишет:
> Как из UDF вернуть строку BY DESCRIPTOR? Как выделить память под саму структуру и под данные?

дык статья же есть, с примерами
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.08.2019, 17:32
    #39851237
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
Мимопроходящийдык статья же есть, с примерами Эта ? Набор функций IFNULL и возвращаются те же параметрі, что были переданы.

Вот пример оттуда
Код: pascal
1.
2.
3.
4.
5.
6.
function idNvl( v,v2:PDSC):PDSC;cdecl; export;
begin
	if not isnull(v) then
		result:= v else
	result:= v2;
end;
...
Рейтинг: 0 / 0
19.08.2019, 17:36
    #39851240
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
Оттуда же
Код: pascal
1.
2.
3.
4.
5.
6.
7.
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;
...
Рейтинг: 0 / 0
19.08.2019, 17:43
    #39851245
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
...
Рейтинг: 0 / 0
19.08.2019, 17:59
    #39851257
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
Симонов Денис http://www.ibphoenix.com/files/Writing-External-Functions.pdf Нашел такоеFREE_ITIf 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
...
Рейтинг: 0 / 0
19.08.2019, 18:34
    #39851272
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
_Vasilisk_Нашел такое

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

Дескриптор со строкой можно вернуть исключительно через возврат значения во входном
параметре. Ищи недокументированную фичу RETURNS PARAMETER.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.08.2019, 19:08
    #39851285
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
_Vasilisk_Теперь бы понять как ведет себя InterbaseА что - поддержка не отвечает ? В документации не расжёвано ?
...
Рейтинг: 0 / 0
19.08.2019, 19:52
    #39851315
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
Dimitry SibiryakovС FREE_IT ты вернёшь только строку как значение.Я думал вызвать дважды ib_malloc. Один раз для структуры, второй раз для данных.

Но сейчас увидел, что BY DESCRIPTOR вернуть результат нельзя. Значит вопрос с выделением памяти под структуру решился. Будем надеяться (сейчас буду проверять), что FREE_IT освободит память под данные
...
Рейтинг: 0 / 0
19.08.2019, 19:52
    #39851316
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
hvladВ документации не расжёвано ?Нет. Там две странички на все
...
Рейтинг: 0 / 0
19.08.2019, 20:33
    #39851339
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
Dimitry Sibiryakov,

Объявляю функцию
Код: sql
1.
2.
3.
4.
5.
DECLARE EXTERNAL FUNCTION UR_TEST
    DESCRIPTOR,
    DESCRIPTOR
RETURNS PARAMETER 2
ENTRY_POINT 'Test' MODULE_NAME 'Test.dll';


Реализация
Код: pascal
1.
2.
3.
4.
5.
procedure Test(AParam: PISC_DSC; ARes: PISC_DSC); cdecl;
begin
  WriteToLogFmt('Param: %p', [AParam]);
  WriteToLogFmt('Res  : %p', [ARes]);
end;

Вызываю
Код: sql
1.
SELECT ur_test('ABC') FROM rdb$database;


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

ЧЯДНТ?
...
Рейтинг: 0 / 0
19.08.2019, 20:40
    #39851346
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
И при вызове еще и ошибка
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements. message length error (encountered 16, expected 20).Вызов
Код: sql
1.
SELECT ur_test(99) FROM rdb$database;

дает тот же эффект
...
Рейтинг: 0 / 0
19.08.2019, 21:09
    #39851357
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
_Vasilisk_ЧЯДНТ?Проверял на IB2009. Посмотрел на IB XE3 x64 - адреса передаются разные и входной параметр корректен.

А FREE_IT с конструкцией
Код: sql
1.
RETURNS PARAMETER 2

объявить не разрешает.

При таком объявлении
Код: sql
1.
2.
3.
4.
5.
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.
Если объявить так
Код: sql
1.
2.
3.
4.
5.
declare external function UR_TEST
descriptor,
DESCRIPTOR
RETURNS PARAMETER 2
entry_point 'Test' module_name 'Test.dll';

то второй параметр приходит с типом dtype_long и dsc_length = 4
...
Рейтинг: 0 / 0
19.08.2019, 21:48
    #39851363
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
_Vasilisk_,

И что, есть действительно серьезные основания пытаться прошибать лбом стены именно на IB?
...
Рейтинг: 0 / 0
19.08.2019, 21:56
    #39851365
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
_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 выводит какую-то ахинею.
Правда, может там что поменяли, о чем ИБЕ не знает, но...
...
Рейтинг: 0 / 0
19.08.2019, 22:09
    #39851370
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
kdv В результате, например, ИБЕ после выполнения запроса для reads/writes/fetches выводит какую-то ахинею.

это случается и для Firebird. Правда не понятно при каких условиях
...
Рейтинг: 0 / 0
19.08.2019, 22:20
    #39851373
Vlad F
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
Просто для FB нынче есть куда как более интересные альтернативы.
...
Рейтинг: 0 / 0
20.08.2019, 14:54
    #39851642
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
Vlad FИ что, есть действительно серьезные основания пытаться прошибать лбом стены именно на IB?Заказчик. На FB не хочет переходить принципиально
kdvчто за ересь - free_it только для возвращаемых значений,Исходный вопрос был - как возвратить строку? Как под нее выделить память и кто ее должен освободить
kdvВходные параметры всегда аллокируются ИБ ФБ самостоятельноЭто замечательно. А память под данные?

Сейчас попробовал такой вызов
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
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 байта
...
Рейтинг: 0 / 0
20.08.2019, 14:56
    #39851645
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
_Vasilisk_Исходный вопрос был - как возвратить строку?

Строку вернуть просто. Вернуть её BY DESCRIPTOR - совсем другой вопрос.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.08.2019, 15:04
    #39851657
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
Dimitry SibiryakovСтроку вернуть просто.Отож. Мне нужно вернуть или строку или NULL. Из-за этого и возня
...
Рейтинг: 0 / 0
20.08.2019, 15:06
    #39851659
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
20.08.2019 15:04, _Vasilisk_ пишет:
> Отож. Мне нужно вернуть или строку или NULL. Из-за этого и возня

а обернуть в NULLIF(UDF_str(), '') ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.08.2019, 15:11
    #39851665
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
Мимопроходящийа обернуть в NULLIF(UDF_str(), '') ?Хотелось по людски сделать.

Сейчас еще проверю на XE7, а потом забью
...
Рейтинг: 0 / 0
20.08.2019, 15:19
    #39851675
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
_Vasilisk_Сейчас еще проверю на XE7,Не взлетело. То же, что и на XE3
...
Рейтинг: 0 / 0
20.08.2019, 15:29
    #39851681
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
20.08.2019 15:19, _Vasilisk_ пишет:
> Не взлетело. То же, что и на XE3

возьми попробуй пример из fdudf, что идёт в комплекте с FB.
каталог examples, функции sNvl, sNullif и т.п.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.08.2019, 15:31
    #39851682
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возвращение результата BY DESCRIPTOR
Мимопроходящийвозьми попробуй пример из fdudf, что идёт в комплекте с FB.
каталог examples, функции sNvl, sNullif и т.п.Я же уже отвечал 21952721
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Возвращение результата BY DESCRIPTOR / 25 сообщений из 41, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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