powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Написание UDR
94 сообщений из 94, показаны все 4 страниц
Написание UDR
    #39135082
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Подскажите где что можно посмотреть про UDR в FB3, не знаю с какой стороны подойти.
У кого-то с "не разработчиков" есть опыт их написания?
Как воспрользоваться примером в ...\examples\udr ?

P.S. Начинаю посматривать в сторону 3-ки x64 SS, будет необходимость избавится от х86 UDF
...
Рейтинг: 0 / 0
Написание UDR
    #39135083
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

для начала определись на каком языке ты хочешь писать UDR.
...
Рейтинг: 0 / 0
Написание UDR
    #39135102
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, сначала лучше всё-таки проверить, нет ли встроенных функций с тем же функционалом как
у замещаемых UDF.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написание UDR
    #39135110
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

ну это само собой
...
Рейтинг: 0 / 0
Написание UDR
    #39135144
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисдля начала определись на каком языке ты хочешь писать UDR.а там что, на java уже можно ваять ?!
...
Рейтинг: 0 / 0
Написание UDR
    #39135147
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

официально пока нет. Но Адриано чего-то там упорно мастерит. На C++ и Delphi можно
...
Рейтинг: 0 / 0
Написание UDR
    #39135186
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, C++ и Delphi в отношении vtable используют один и тот же ABI. И не только они, но и древнююющий Borland Tasm времен NT4.0 для flat модели также совместим с точки зрения виртуальных методов.
...
Рейтинг: 0 / 0
Написание UDR
    #39135192
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructorC++ и Delphi в отношении vtable используют один и тот же ABI. И не
только они, но и древнююющий Borland Tasm времен NT4.0 для flat модели также совместим с
точки зрения виртуальных методов.
Учитывая, что это стандарт COM, ничего удивительного. Но есть ещё совершенно безумный FPC...

PS: Откуда вдруг объекты в ассемблере?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написание UDR
    #39135201
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovPS: Откуда вдруг объекты в ассемблере?..
Borland TASM был весьма продвинутым. Там не только описывались классы, но и был реализован вызов функций без всяких муторных "mov ebp, esp", push/pop и далее по "тексту". Причем с учетом соглашений о вызовах. Что-то типа "invoke stdcall myfunc, eax, ebx, [myvar]". Точного синтаксиса, естественно, не помню, так как с тех пор прошло почти 20 лет.
Так что вполне можно было цеплять какую-нибудь cstdlib и во всю юзать стандартные сишные функции.
...
Рейтинг: 0 / 0
Написание UDR
    #39135206
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНет, сначала лучше всё-таки проверить, нет ли встроенных функций с тем же функционалом как
у замещаемых UDF.

Нет, таких UDF точно нет.
Может кто-то дать простенький пример на Delphi?
...
Рейтинг: 0 / 0
Написание UDR
    #39135213
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs, держи 18594051 .
...
Рейтинг: 0 / 0
Написание UDR
    #39135504
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructorViktor_bs, держи 18594051 .
Спасибо.
Кхм, а функции сложения 2-х чисел на Delphi ни у кого нет
...
Рейтинг: 0 / 0
Написание UDR
    #39135598
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

а на фига для этого UDR?
...
Рейтинг: 0 / 0
Написание UDR
    #39135692
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисViktor_bs,

а на фига для этого UDR?
:)) Я пример прошу как это сделать.
А вообще нужно, например, переписать набор функций работы с полиномом или матрицей, запихнув их в пакеты с "человеческой" обработкой исключений. Это как минимум...
...
Рейтинг: 0 / 0
Написание UDR
    #39135713
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

каких чисел? С плавающей точкой DOUBLE PRECISION или NUMERIC(n, m) или INTEGER?
...
Рейтинг: 0 / 0
Написание UDR
    #39135726
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисViktor_bs,

каких чисел? С плавающей точкой DOUBLE PRECISION или NUMERIC(n, m) или INTEGER?
Та без разницы. Нужен пример функции, а не процедуры.
Так чтобы она скомпилилась и работала.
...
Рейтинг: 0 / 0
Написание UDR
    #39135814
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

Вот тут лежит. Но рассчитан на Delphi XE5.
...
Рейтинг: 0 / 0
Написание UDR
    #39135842
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНо есть ещё совершенно безумный FPC...

Для него кстати есть пример COM-сервера ,но виджимо никому оказалось не надо, так и лежит почти никем не использованный
...
Рейтинг: 0 / 0
Написание UDR
    #39135929
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochно виджимо никому оказалось не надо
Вспоминая сколько мне пришлось доказывать, что (не) возврат интерфейса из функции в 64-х
разрядной версии это именно баг и именно FPC, я ничему не удивляюсь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написание UDR
    #39135952
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

кстати в FPC это UDR всё равно не компилируется
...
Рейтинг: 0 / 0
Написание UDR
    #39135955
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисViktor_bs,

Вот тут лежит. Но рассчитан на Delphi XE5.
Спасибо!

А как ее подключить?
Переименовал в udr.dll и кинул в папку plugins.

При создании функции в IBExpert получаю
Error loading plugin UDR.
Standard plugin entrypoint does not exist in module C:\Firebird3\plugins/UDR.

Игрища с конфигом не помогли.
А вообще есть хоть какой-то драфт доки, кроме исходников Adriano?
...
Рейтинг: 0 / 0
Написание UDR
    #39135956
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Симонов Денис!
You wrote on 23 декабря 2015 г. 13:40:23:

Симонов Денис> кстати в FPC это UDR всё равно не компилируетсяиз-за?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написание UDR
    #39135960
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

ну дык в ошибке английским языком сказано что она должна лежать в plugins/udr
...
Рейтинг: 0 / 0
Написание UDR
    #39135966
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
...
	MessageMetadata = class(ReferenceCounted)
		const VERSION = 17;

		function getCount(status: Status): Cardinal;
		function getField(status: Status; index: Cardinal): PAnsiChar;
		function getRelation(status: Status; index: Cardinal): PAnsiChar;
		function getOwner(status: Status; index: Cardinal): PAnsiChar;
		function getAlias(status: Status; index: Cardinal): PAnsiChar;
		function getType(status: Status; index: Cardinal): Cardinal;
		function isNullable(status: Status; index: Cardinal): Boolean;
		function getSubType(status: Status; index: Cardinal): Integer;
		function getLength(status: Status; index: Cardinal): Cardinal;
		function getScale(status: Status; index: Cardinal): Integer;
		function getCharSet(status: Status; index: Cardinal): Cardinal;
		function getOffset(status: Status; index: Cardinal): Cardinal;
		function getNullOffset(status: Status; index: Cardinal): Cardinal;
		function getBuilder(status: Status): MetadataBuilder;
		function getMessageLength(status: Status): Cardinal;
...
	end;



константы внутри классов он не умеет переопределять. Возможно можно вывернуться, но для этого надо весь модуль FbApi.pas переписать. Или понять как Адриано автоматом генеририровал этот файл с помощью idl
...
Рейтинг: 0 / 0
Написание UDR
    #39135975
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисViktor_bs,

ну дык в ошибке английским языком сказано что она должна лежать в plugins/udr
Ложил, не помогло...
External engine UDR not found.
...
Рейтинг: 0 / 0
Написание UDR
    #39135995
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Симонов Денис!
You wrote on 23 декабря 2015 г. 13:50:28:

Симонов Денис> константы внутри классов он не умеет переопределять.
> Возможно можно вывернуться, но для этого надо весь модуль FbApi.pas переписать.
> Или понять как Адриано автоматом генеририровал этот файл с помощью idlай, йохонабаден!
крепка в бразилии конопля.
губительно воздействие её на некрепший мозг студиозов...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написание UDR
    #39135996
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

1. Должна совпадать разрядность udr.dll и сервера
2. Конфиг насчёт udr верни в дефолт
3. Объявлял так?
Код: sql
1.
2.
3.
4.
5.
6.
  create function sum_args (
    n1 integer not null,
    n2 integer not null
  ) returns integer
  external name 'udr!sum_args'
  engine udr;
...
Рейтинг: 0 / 0
Написание UDR
    #39136025
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисViktor_bs,

1. Должна совпадать разрядность udr.dll и сервера
2. Конфиг насчёт udr верни в дефолт
3. Объявлял так?
Код: sql
1.
2.
3.
4.
5.
6.
  create function sum_args (
    n1 integer not null,
    n2 integer not null
  ) returns integer
  external name 'udr!sum_args'
  engine udr;


Все совпадает.

1.



2. Конфиг дефолтный


3. Объявление функции взято из файла UdrSumArgs.pas
Код: plsql
1.
2.
3.
4.
5.
6.
  create function sum_args (
    n1 integer not null,
    n2 integer not null
  ) returns integer
  external name 'udr!sum_args'
  engine udr;
...
Рейтинг: 0 / 0
Написание UDR
    #39136038
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

udr_engine.dll в папке plugins есть?
...
Рейтинг: 0 / 0
Написание UDR
    #39136045
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисViktor_bs,

udr_engine.dll в папке plugins есть?
Да, ставил инсталятором, ничего не трогал :)

P.S. Если что, с FB работаю очень давно :)
...
Рейтинг: 0 / 0
Написание UDR
    #39136080
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не так давно Адриано ныл в девеле, что с текущей системой плагинов UDR-ки так просто не
инсталлируются и грозился всё переделать напрочь. Ему дали по шустрым лапкам и правильно
сделали.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написание UDR
    #39136085
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

копай processmonitor
...
Рейтинг: 0 / 0
Написание UDR
    #39136305
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисViktor_bs,

ну дык в ошибке английским языком сказано что она должна лежать в plugins/udr
Денис, а Вы собирали эту DLL? У Вас есть опыт их написания?

Посмотрел Procmon-ом Русиновича, так к папке plugins/udr вообще никаких обращений нет. udr.dll пытается подняться с папки plugins и сваливается с ошибкой

В ночной сборке:
"Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
Entry point not found."

В RC1 была ошибка:
Error loading plugin UDR.
Standard plugin entrypoint does not exist in module C:\Firebird3\plugins/UDR.

Вот что происходит на коммите создания функции
...
Рейтинг: 0 / 0
Написание UDR
    #39136312
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В продолжение...
depends видит точку входа firebird_udr_plugin
...
Рейтинг: 0 / 0
Написание UDR
    #39136347
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bsДенис, а Вы собирали эту DLL? У Вас есть опыт их написания?


собирал. Грузится и работает нормально.
Ну какой на фиг опыт. Сам занимаюсь этим вторую неделю. Но уже смог что-то понять и даже написать. Это скорее для тренировки нежели для реального использования. Надо научится всё-таки. То, что смог понять подскажу.

Здесь тех кто пытался сделать udr почти нет. Разве что fb_user и NickDee их чуток трогали.
dimitr и hvlad могут подсказать побольше.

Viktor_bsПосмотрел Procmon-ом Русиновича, так к папке plugins/udr вообще никаких обращений нет. udr.dll пытается подняться с папки plugins и сваливается с ошибкой

В ночной сборке:
"Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
Entry point not found."

В RC1 была ошибка:
Error loading plugin UDR.
Standard plugin entrypoint does not exist in module C:\Firebird3\plugins/UDR.

Вот что происходит на коммите создания функции

Оно у вас не в той директории udr.dll ищет. Почему хз. Советую скачать заново снапшот и заменить все *.conf файлы на дефолтные. Ну может быть за исключением параметров кеша, порта и т.д.

У меня всё работает.

d:\fb\fb30\plugins\udr\udr.dll - это моя UDR

d:\fb\fb30\plugins\ должен содержать
udr_engine.conf
engine12.dll
fbtrace.dll
legacy_auth.dll
legacy_usermanager.dll
srp.dll
udr_engine.dll

А и ещё. У меня FB3 запущен как сервис. И подключаюсь я к нему через TCP/IP. Ну это на всякий случай. Мало-ли в других способах вызова баг есть.
...
Рейтинг: 0 / 0
Написание UDR
    #39136405
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисА и ещё. У меня FB3 запущен как сервис. И подключаюсь я к нему через TCP/IP. Ну это на всякий случай. Мало-ли в других способах вызова баг есть.
Та все аналогично. Единственное что кроме 3-ки есть еще 2.5, но на разных портах.
Проверил на 2-х операционках. На Win7 x64 начало поднимать ст plugins/udr, но ошибка та-же.
Какая у вас операционка и разрядность?
...
Рейтинг: 0 / 0
Написание UDR
    #39136410
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

Windows 7 x64. Firebird 3.0.0.32246 x64. Ну и библиотека компилировалась на Delphi XE5 под x64.
...
Рейтинг: 0 / 0
Написание UDR
    #39136418
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

попробуй готовые dll'ки
Udr32.dll
Udr64.dll
...
Рейтинг: 0 / 0
Написание UDR
    #39136441
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисViktor_bs,

попробуй готовые dll'ки
Udr32.dll
Udr64.dll

Спасибо!
Заработало :)

Что изменилось в исходниках, а то я буду ставить ХЕ5 и сам компилить, чтобы опять головой о стенку не биться.
...
Рейтинг: 0 / 0
Написание UDR
    #39136451
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

да ничего не менялось
...
Рейтинг: 0 / 0
Написание UDR
    #39136456
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

какие-нибудь настройки компилятора по умолчанию? вплоть до релиз/дебаг ?

вам бы обоим нажать в проекте Ctrl+O,O и сравнить дампы настроек
...
Рейтинг: 0 / 0
Написание UDR
    #39136459
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисViktor_bs,

да ничего не менялось
Размер DLL изменился :) Был 1 183 232 байт стал 1 186 304 байт
В любом случае спасибо за помощь.
...
Рейтинг: 0 / 0
Написание UDR
    #39136460
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochСимонов Денис,

какие-нибудь настройки компилятора по умолчанию? вплоть до релиз/дебаг ?

вам бы обоим нажать в проекте Ctrl+O,O и сравнить дампы настроек
Я вообще ничего не компилил. Брал готовую либу из примера (уже скомпиленую) и пытался ее заюзать.
...
Рейтинг: 0 / 0
Написание UDR
    #39136469
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

а там не было md5/sha1 - просто проверить что не побилось при скачивании?
...
Рейтинг: 0 / 0
Написание UDR
    #39136472
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

а... ну там да косячная была 32 битная сборка. В ней вообще этой функции не было.
Я думал что не включил в архив только исходники.
XE5 необязательно. Я не знаю под какую версию этот пример создавал Адриано. У меня стояла Delphi XE5, скомпилировал, вроде завелось. На Delphi 7 не компилится.
...
Рейтинг: 0 / 0
Написание UDR
    #39136476
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

где там? Этот пример я придумал. У Адриано только исходники выложены. И только для процедуры. Функцию я дописал по просьбе Viktor_bs.
md5 мне в лом создавать было
...
Рейтинг: 0 / 0
Написание UDR
    #39136478
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochViktor_bs,

а там не было md5/sha1 - просто проверить что не побилось при скачивании?
Там в архиве, архив живой. md5/sha1 нет.
Сама dll живая, ее и точку входа depends видит.
...
Рейтинг: 0 / 0
Написание UDR
    #39136503
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, в пакет запихнуть "в чистом виде" мне ее тоже не удалось.

README.packages.txt нашел следующее:
UDFs (DECLARE EXTERNAL FUNCTION) are currently not supported inside packages.

Я так понимаю это касается не только udf но и udr

Под "в чистом виде" я имею ввиду не

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
RECREATE PACKAGE BODY test
AS
BEGIN
  FUNCTION SUM_ARGS_NEW(N1 INTEGER, N2 INTEGER) RETURNS INTEGER
  AS
  BEGIN
    RETURN SUM_ARGS(N1, N2);
  END
END


а что-то типа
Код: sql
1.
2.
3.
4.
5.
6.
RECREATE PACKAGE BODY test
AS
BEGIN
  FUNCTION SUM_ARGS_NEW(N1 INTEGER, N2 INTEGER) RETURNS INTEGER
  EXTERNAL NAME 'udr!sum_args' ENGINE UDR;
END
...
Рейтинг: 0 / 0
Написание UDR
    #39136535
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисViktor_bs,

Вот тут лежит. Но рассчитан на Delphi XE5.
Код: sql
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.
procedure TSumArgsFunction.execute(status: Status; context: ExternalContext;
  inMsg: Pointer; outMsg: Pointer);
var
  xInMsg: TSumArgsInMessagePtr;
  xOutMsg: TSumArgsOutMessagePtr;
begin
  try
    xInMsg := TSumArgsInMessagePtr(inMsg);
    xOutMsg := TSumArgsOutMessagePtr(outMsg);
    if (xInMsg.n1Null or xInMsg.n2Null) then
    begin
      xOutMsg.result := 0;
      xOutMsg.resultNull := True;
    end
    else
    begin
      xOutMsg.result := xInMsg.n1 + xInMsg.n2;
      xOutMsg.resultNull := False;
    end;
  except
    on E: Exception do
      FbException.catchException(status, E);
  end;

end;


Блок try except вроде не нужен. Там ошибки и так ловятся.
...
Рейтинг: 0 / 0
Написание UDR
    #39136542
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb user,

в принципе да. Потому что исключение перехватывает тот кто зовёт execute
...
Рейтинг: 0 / 0
Написание UDR
    #39136544
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Viktor_bs,

у меня в пакетах всё работает. Ты бы хоть ошибку показал. Ах да, если делаешь через IBE то надо бы его обновить.
Его внутренний парсер только недавно научился распознавать UDR.

Viktor_bsREADME.packages.txt нашел следующее:
UDFs (DECLARE EXTERNAL FUNCTION) are currently not supported inside packages.

нет это качается только UDF.
...
Рейтинг: 0 / 0
Написание UDR
    #39136574
Viktor_bs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисViktor_bs,

у меня в пакетах всё работает. Ты бы хоть ошибку показал. Ах да, если делаешь через IBE то надо бы его обновить.
Его внутренний парсер только недавно научился распознавать UDR.

Viktor_bsREADME.packages.txt нашел следующее:
UDFs (DECLARE EXTERNAL FUNCTION) are currently not supported inside packages.

нет это качается только UDF.

Да, сори, это был IBE
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Написание UDR
    #39377260
vladimiromsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Не могу из udr вернуть varchar.
Делаю так:

create or alter function test_varchar(
aString varchar(255))
returns varchar(255)
EXTERNAL NAME 'test!test_varchar'
ENGINE UDR




type
TVarCharMessage = record
Length: Word;
Value: array [0..0] of ansichar;
end;
PVarCharMessage = ^TVarCharMessage;

procedure TTestVarCharFunction.execute(aStatus: IStatus; aContext: IExternalContext; aInMsg, aOutMsg: Pointer);
begin
try
if (PVarCharMessage(aInMsg)^.Length = 0) then
begin
PVarCharMessage(aOutMsg)^.Length:= 0;
// PVarCharMessage(aOutMsg)^.Value:= nil;
end
else
begin
PVarCharMessage(aOutMsg)^.Length:= PVarCharMessage(aInMsg)^.Length;
Move(PVarCharMessage(aInMsg)^.Value, PVarCharMessage(aOutMsg)^.Value, PVarCharMessage(aOutMsg)^.Length);
end;
except
on E: Exception do
FbException.catchException(aStatus, E);
end;
end;



Вызываем
select test_varchar('hi test') from rdb$database


Смотрим дамп в Delphi
aInMsg: 0700 6869 2074 6573 74 все верно длина 7, строка hi test
aOutMsg: 0700 6869 2074 6573 74 все верно длина 7, строка hi test


Но результат NULL
Подскажите что не так.
За ранее спасибо
...
Рейтинг: 0 / 0
Написание UDR
    #39377262
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где у тебя null indicator в выходном буфере?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написание UDR
    #39377284
vladimiromsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Спасибо получилось, по смещению SizeOf(Word) + 255*4(utf8) как раз IsNull индикатор.
Вопрос тогда напрашивается сам как мне узнать длину входной строки, которая объявлена в FB, или только работа идет с заранее известной длиной строки?

Заранее спасибо за ответ
...
Рейтинг: 0 / 0
Написание UDR
    #39377297
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladimiromskВопрос тогда напрашивается сам как мне узнать длину входной строки, которая объявлена в
FB, или только работа идет с заранее известной длиной строки?

А про это пусть тебе идеолухи "нового API" расскажут: в какое место они спрятали описание
формата буфера.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написание UDR
    #39377301
vladimiromsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Что то, я не понял! В общем нет информации где можно получить максимальную длину входной строки и она должно быть зерлально одинакова как в функции, так и в объявлении FB! Правильно?
...
Рейтинг: 0 / 0
Написание UDR
    #39377306
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladimiromskПравильно?
Нет, неправильно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написание UDR
    #39377307
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vladimiromsk,

получить можно из IMessageMetadata см. метод getLength, а метаданных входного сообщения через metadata.getInputMetadata(status), где metadata: IRoutineMetadata
...
Рейтинг: 0 / 0
Написание UDR
    #39377312
vladimiromsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Спасибо за ответ!

Получается что это надо проверять на NewItem или Setup. Вопрос где лучше? А будут ли не битые ссылки если я запишу эти "а ля Интерфейсы"(Классы) в поля своего класс, предварительно увеличив у них количество ссылок через AddRef.
...
Рейтинг: 0 / 0
Написание UDR
    #39380950
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги, помогайте теперь мне.
Скачал пример с гита
Скомпилированную Udr.dll я должен положить сюда "C:\Program Files (x86)\Firebird\Firebird_3_0\plugins"?
Положил.
Пытаюсь объявить ф-цию:
Код: sql
1.
2.
3.
4.
5.
6.
create function sum_args (
  n1 integer not null,
  n2 integer not null
) returns integer
external name 'Udr!sum_args'
engine udr;



В ответ (после подтверждения транзакции) получаю:
Код: plaintext
1.
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
Module not found.

т.е. udr.dll он не видит, отлуп в при поиске модуля, а не ф-ции в нем?
Где я ошибаюсь?

Прошу канделябром не бить, я еще новичек, официальной информации ноль.

пысы: Win 7*64, firebird3*32, Delphi XE7, IBExpert
...
Рейтинг: 0 / 0
Написание UDR
    #39380955
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
seertrue,

а конфигурировать кто будет?

в udr_engine.conf что написано?
...
Рейтинг: 0 / 0
Написание UDR
    #39381153
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисseertrue,
а конфигурировать кто будет?


Вот об этом где на писано? Хоть комментов бы написали, я же заглядывал в этот файл.

Симонов Денисв udr_engine.conf что написано?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
external_engine = UDR {
	plugin_module = UDR_engine
}

plugin_module = UDR_engine {
	filename = $(this)/udr_engine
	plugin_config = UDR_config
}

plugin_config = UDR_config {
	path = $(this)/udr
}
...
Рейтинг: 0 / 0
Написание UDR
    #39381159
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Написание UDR
    #39381195
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
seertrue,

конфигурация говорит о том что ваша dll должна быть расположена в папке (fbroot)/plugins/udr

Впрочем hvlad дал описание.
...
Рейтинг: 0 / 0
Написание UDR
    #39382024
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисseertrue,

конфигурация говорит о том что ваша dll должна быть расположена в папке (fbroot)/plugins/udr

Впрочем hvlad дал описание.

Все работает, спасибо, ребята!

Разбираюсь дальше, мне нравится продуманность структуры!!!
Если бы было все документировано...
...
Рейтинг: 0 / 0
Написание UDR
    #39383130
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С целыми и другими числами все ок.
А как строки?

Допустим из того же примера объявляю:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create or alter procedure GEN_ROWS (
    START_N integer,
    END_N integer)
returns (
    RESULT integer,
    BINRES double precision,
    STR varchar(200))
EXTERNAL NAME 'udr!gen_rows'
ENGINE UDR;

в delphi:
...
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  TGenRowsOutMessage = record
    result: Integer;
    resultNull: WordBool;
    binRes: Double;
    binResNull: WordBool;
    str: PAnsiChar;
    strNull: WordBool;
  end;


...

Код: pascal
1.
2.
3.
function TGenRowsResultSet.fetch(status: status): Boolean;
var str: string;
begin


...
Код: pascal
1.
2.
3.
4.
5.
      outMessage.strNull:=False;
      str:='Строка № '+FloatToStr(outMessage.result);

      outMessage.str:=malloc(Length(str) + 1);
      StrPCopy(outMessage.str, str);



в запросе:

Код: plaintext
1.
2.
select t.result, t.binres, t.str
from gen_rows(1, 50) t

в str получаю NULL

Что не так?
...
Рейтинг: 0 / 0
Написание UDR
    #39383136
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а там точно maloc должен быть, а не что-то иное?
я не разбирался в UDR, но для UDF это не так.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написание UDR
    #39383150
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри пример тут
...
Рейтинг: 0 / 0
Написание UDR
    #39383166
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
seertrue,

потому что формат для строки у тебя не правильный. Где длина строки?
...
Рейтинг: 0 / 0
Написание UDR
    #39383181
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящийа там точно maloc должен быть, а не что-то иное?
я не разбирался в UDR, но для UDF это не так.


outMessage.str:=ib_util_malloc(Length(str) + 1);

это тоже не помогло
...
Рейтинг: 0 / 0
Написание UDR
    #39383185
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Avenger__Посмотри пример тут

во, спасибо, то что надо
...
Рейтинг: 0 / 0
Написание UDR
    #39384232
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисseertrue,

потому что формат для строки у тебя не правильный. Где длина строки?

Вроде все сделал по примеру, ниже код.

Код: 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.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
unit UdrStrings;

interface

uses
  System.SysUtils, FbApi;

type
  PTestStrInMessage = ^TTestStrInMessage;

  TTestStrInMessage = record
    StrLen: Word;
    Str: array [0 .. 4 * 255 - 1] of AnsiChar;
    StrNull: WordBool;
  end;

  PTestStrOutMessage = ^TTestStrOutMessage;

  TTestStrOutMessage = record
    StrLen: Word;
    Str: array [0 .. 4 * 255 - 1] of AnsiChar;
    StrNull: WordBool;
  end;

  TTestStrFunction = class(ExternalFunctionImpl)
    procedure dispose(); override;
    procedure getCharSet(status: status; context: ExternalContext;
      name: PAnsiChar; nameSize: Cardinal); override;
    procedure execute(status: status; context: ExternalContext; inMsg: Pointer;
      outMsg: Pointer); override;
  end;

  TTestStrFactory = class(UdrFunctionFactoryImpl)
    procedure dispose(); override;
    procedure setup(status: status; context: ExternalContext;
      metadata: RoutineMetadata; inBuilder: MetadataBuilder;
      outBuilder: MetadataBuilder); override;
    function newItem(status: status; context: ExternalContext;
      metadata: RoutineMetadata): ExternalFunction; override;
  end;

implementation

uses
  System.AnsiStrings;

{ TTestStrFunction }

procedure TTestStrFunction.dispose();
begin
  destroy;
end;

procedure TTestStrFunction.getCharSet(status: status; context: ExternalContext;
  name: PAnsiChar; nameSize: Cardinal);
begin
end;

procedure TTestStrFunction.execute(status: status; context: ExternalContext;
  inMsg: Pointer; outMsg: Pointer);
var
  AInMsg: PTestStrInMessage;
  AOutMsg: PTestStrOutMessage;
  AStr: UTF8String;
begin
  try
    AInMsg := PTestStrInMessage(inMsg);
    AOutMsg := PTestStrOutMessage(outMsg);
    if AInMsg.StrNull then begin
      with AOutMsg^ do begin
        StrLen := 0;
        StrNull := StrLen = 0;
      end;
    end
    else begin
      AStr := UTF8Encode(System.AnsiStrings.AnsiReverseString(UTF8ToString(AInMsg.Str)));
      with AOutMsg^ do begin
        StrLen := Length(AStr);
        StrNull := StrLen = 0;
        if StrLen > 0 then
          Move(PAnsiChar(AStr)^, Str[0], StrLen * SizeOf(AnsiChar));
      end;
    end;
  except
    on E: Exception do
      FbException.catchException(status, E);
  end;
end;

{ TTestStrFactory }

procedure TTestStrFactory.dispose();
begin
  destroy;
end;

procedure TTestStrFactory.setup(status: status; context: ExternalContext;
  metadata: RoutineMetadata; inBuilder: MetadataBuilder;
  outBuilder: MetadataBuilder);
begin
end;

function TTestStrFactory.newItem(status: status; context: ExternalContext;
  metadata: RoutineMetadata): ExternalFunction;
begin
  Result := TTestStrFunction.create;
end;

end.




функция подключается,
Код: plaintext
1.
2.
3.
4.
create function test_str (
    n1 varchar(200)
  ) returns varchar(200)
  external name 'udr!test_str'
  engine udr;
запрос
Код: plaintext
1.
2.
select test_str('12345')
from rdb$database

отладчик показывает что все поля заполняются правильно:
AInMsg.Str = '12345'
AOutMsg.Str = '54321'
StrLen = 5 в обоих случаях

но в IBExpert упорно NULL.

Коллеги, помогайте.
...
Рейтинг: 0 / 0
Написание UDR
    #39384238
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так:
Код: sql
1.
2.
3.
4.
5.
create function test_str (
    n1 varchar(255) CHARACTER SET UTF8
  ) returns varchar(255) CHARACTER SET UTF8
  external name 'udr!test_str'
  engine udr;



?
...
Рейтинг: 0 / 0
Написание UDR
    #39384240
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот этот код, вас не на какие мысли не наводит?

Код: sql
1.
array [0 .. 4 * 255 - 1] of AnsiChar;
...
Рейтинг: 0 / 0
Написание UDR
    #39384292
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Avenger__А так:
Код: sql
1.
2.
3.
4.
5.
create function test_str (
    n1 varchar(255) CHARACTER SET UTF8
  ) returns varchar(255) CHARACTER SET UTF8
  external name 'udr!test_str'
  engine udr;



?

Это помогло, спасибо

Но база и так была создана в UTF8, посчитал что по умолчанию CHARACTER SET возьмется из базовый.
...
Рейтинг: 0 / 0
Написание UDR
    #39384296
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
seertrue,

ИХМО, с определением чарсета без явного указания оного в определении UDR есть косяки
...
Рейтинг: 0 / 0
Написание UDR
    #39384299
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисseertrue,

ИХМО, с определением чарсета без явного указания оного в определении UDR есть косяки

Я вообще-то на два критерия намекал, 200 <> 255 и 4* (UTF8)
...
Рейтинг: 0 / 0
Написание UDR
    #39384301
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__,

это я просмотрел. Просто когда пробовал udr писать столкнулся с такой проблемой. Ну может сейчас уже всё норм. Это ещё на бете было.
...
Рейтинг: 0 / 0
Написание UDR
    #39385139
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Avenger__
Я вообще-то на два критерия намекал, 200 <> 255 и 4* (UTF8)


В UDR реально ли передать строку более 255 используя такой метод выделения памяти (0 .. 4 * 255 - 1)?
Если нет то можно ли вообще?

во всяком случае
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create or alter procedure GEN_ROWS (
    START_N integer,
    END_N integer)
returns (
    RESULT integer,
    BINRES double precision,
    STR varchar(500))
EXTERNAL NAME 'udr!gen_rows'

с объявлением в XE7 [0 .. 4 * 500 - 1] у меня не прокатило.
...
Рейтинг: 0 / 0
Написание UDR
    #39385140
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
seertrueс объявлением в XE7 [0 .. 4 * 500 - 1] у меня не прокатило.

Delphi XE7
Код: sql
1.
Str: array [0..4*8000 - 1] of AnsiChar;

- полет нормальный.
...
Рейтинг: 0 / 0
Написание UDR
    #39385142
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
seertrue
В UDR реально ли ...

Вопрос снимается, сам дурак!
...
Рейтинг: 0 / 0
Написание UDR
    #39385147
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А для BLOB есть пример?
...
Рейтинг: 0 / 0
Написание UDR
    #39386120
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
seertrueА для BLOB есть пример?
Вот тоже интересно было бы увидеть обработку блоба в UDR и на Delphi.
Пробовал, как в примерах UDR-триггера на С++, но таки не победил. За неимением времени отложил.
...
Рейтинг: 0 / 0
Написание UDR
    #39386780
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нарыл что-то похожее на пример вот тут http://www.sql.ru/forum/1224694/udr-firebird-rabota-s-blob
Но там крохи инфы.

Все приведенные примеры учат обезьянничать, а не мыслить!

Понять принципы работы без минимального описания очень тяжело.

Господа-разработчики, вы понимаете, что задумка ваша интересная, но мертвая без документации!

Что делают эти строки:
inBlob := Context.getAttachment(Status).openBlob(Status, context.getTransaction(Status), inMsg, 0, nil);
outBlob:= Context.getAttachment(Status).createBlob(Status, context.getTransaction(Status), inMsg, 0, nil);
по упомянутой ссылке?
...
Рейтинг: 0 / 0
Написание UDR
    #39387772
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все, фантазия кончилась.

Задача функции, загрузить файл в BLOB поле.

На входе имя файла на выходе сам файл как BLOB.

Объявляю в базе.
Код: sql
1.
2.
3.
4.
5.
create or alter function LOAD_FILE (
    N1 varchar(255) character set UTF8)
returns blob sub_type 0 segment size 80
EXTERNAL NAME 'Udr!load_file'
ENGINE UDR



Все нормально. Ф-ция есть.

Исходники модуля Delphi XE7
Код: 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.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
unit UdrBlob;

interface

uses
  System.SysUtils, FbApi, System.Classes;

const
  SizeField = 255;
  cMaxBufSize: Word = 16384; //= 8192; //  16384;

type
  TLoadBLOBInMessagePtr = ^TLoadBLOBInMessage;

  TLoadBLOBInMessage = record
    StrLen: Word;
    Str: array [0 .. 4 * SizeField - 1] of AnsiChar;
    StrNull: WordBool;
  end;

  TLoadBLOBOutMessagePtr = ^TLoadBLOBOutMessage;

  TLoadBLOBOutMessage = record
    Size: Word;
    dataB: Blob;
    dataBNull: WordBool;
  end;

  TLoadBLOBFunction = class(ExternalFunctionImpl)
    procedure dispose(); override;
    procedure getCharSet(status: status; context: ExternalContext; name: PAnsiChar;
      nameSize: Cardinal); override;
    procedure execute(status: status; context: ExternalContext; inMsg: Pointer;
      outMsg: Pointer); override;
  end;

  TLoadBLOBFactory = class(UdrFunctionFactoryImpl)
    procedure dispose(); override;
    procedure setup(status: status; context: ExternalContext; metadata: RoutineMetadata;
      inBuilder: MetadataBuilder; outBuilder: MetadataBuilder); override;
    function newItem(status: status; context: ExternalContext; metadata: RoutineMetadata)
      : ExternalFunction; override;
  end;

implementation

uses
  System.AnsiStrings, ib_util;

{TLoadBLOBFunction}

procedure TLoadBLOBFunction.dispose();
begin
  destroy;
end;

procedure TLoadBLOBFunction.getCharSet(status: status; context: ExternalContext; name: PAnsiChar;
  nameSize: Cardinal);
begin
end;

procedure TLoadBLOBFunction.execute(status: status; context: ExternalContext; inMsg: Pointer;
  outMsg: Pointer);
var
  AInMsg: TLoadBLOBInMessagePtr;
  AOutMsg: TLoadBLOBOutMessagePtr;

  //inBlob, outBlob: Blob;

  BufSize, ReadLength, StreamSize: Integer;
  Buffer: PAnsiChar;
  Stream: TStream;

  AFileName: String;
begin
  //пример http://www.sql.ru/forum/1224694/udr-firebird-rabota-s-blob
  try
    AInMsg:=TLoadBLOBInMessagePtr(inMsg);
    AOutMsg:=TLoadBLOBOutMessagePtr(outMsg);

    AFileName:=UTF8ToString(AInMsg.Str);

// что делает эта команда?
    AOutMsg.dataB:=context.getAttachment(status).createBlob(status, context.getTransaction(status),
      outMsg {было inMsg}, 0, nil);

    Stream:=TFileStream.Create(AFileName, fmOpenRead or fmShareDenyNone);
    try
      StreamSize:=Stream.Size; //размер файла
      if StreamSize > cMaxBufSize then //если размер файла больше размера сегмента
        BufSize:=cMaxBufSize//размер под буфер равен размеру сегмента
      else
        BufSize:=StreamSize; //иначе размер под буфер равен размеру файла

      GetMem(Buffer, BufSize); //выделение памяти под сегмент

      try
        while StreamSize <> 0 do begin
          if StreamSize > BufSize then
            ReadLength:=BufSize
          else
            ReadLength:=StreamSize;

          Stream.ReadBuffer(Buffer^, ReadLength);

          AOutMsg.dataB.putSegment(status, ReadLength, Buffer);

          Dec(StreamSize, ReadLength);

        end;
      finally
        FreeMem(Buffer, BufSize);
      end;
    finally
      Stream.Free;
    end;
    AOutMsg.Size:=Stream.Size;
    AOutMsg.dataBNull:=Stream.Size > 0;
  except
    on E: Exception do
      FbException.catchException(status, E);
  end;
end;

{TLoadBLOBFactory}

procedure TLoadBLOBFactory.dispose();
begin
  destroy;
end;

procedure TLoadBLOBFactory.setup(status: status; context: ExternalContext;
  metadata: RoutineMetadata; inBuilder: MetadataBuilder; outBuilder: MetadataBuilder);
begin
end;

function TLoadBLOBFactory.newItem(status: status; context: ExternalContext;
  metadata: RoutineMetadata): ExternalFunction;
begin
  Result:=TLoadBLOBFunction.Create;
end;

end.



пытаюсь выполнить (IBExpert):
Код: sql
1.
2.
3.
select 'D:\tmpFirebird\'||i.name||'.'||i.ext,  load_file('D:\tmpFirebird\'||i.name||'.'||i.ext)
from ins_pict i
where i.id_pict = 3



отрабатывает без ошибок, даже что то выводит, но попытка посмотреть BLOB выдает:

Код: plaintext
1.
2.
3.
4.
5.
6.
Error Message:
----------------------------------------
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
invalid BLOB ID.

[00540F1F] FIB.IBError (Line 539, "FIB.pas" + 55) + $2

Ну естественно попытка записать в поле:
Код: sql
1.
2.
3.
4.
[src]update ins_pict
--from ins_pict i
set pict = load_file('D:\tmpFirebird\'||name||'.'||ext)
where id_pict = 3

[/SRC]

приводит к тому же:
Код: plaintext
1.
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
invalid BLOB ID.

Где ж я накосячил?

Считываемый файл на диске присутствует, в поток загружается...
...
Рейтинг: 0 / 0
Написание UDR
    #39387790
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
seertrue,

Ты путаешь Blob как объект и ISC_QUAD, как id блоба

вот тут
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  TLoadBLOBOutMessage = record
    Size: Word;
    dataB: Blob;
    dataBNull: WordBool;
  end;
...
// что делает эта команда?
    AOutMsg.dataB:=context.getAttachment(status).createBlob(status, context.getTransaction(status), outMsg {было inMsg}, 0, nil);



по идее должно быть
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  TLoadBLOBOutMessage = record
    Size: Word;
    dataB: ISC_QUAD;
    dataBNull: WordBool;
  end;
...

var
  outBlob : Blob;
...
// что делает эта команда?
// Блоб создаёт,  а ты что думал ???
    outBlob := context.getAttachment(status).createBlob(status, context.getTransaction(status), AOutMsg.dataB, 0, nil);

...
    AOutMsg.Size := sizeof(ISC_QUAD); // не уверен, что это поле вообще нужно
    AOutMsg.dataBNull := false;
...
Рейтинг: 0 / 0
Написание UDR
    #39387799
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и конечно не
Код: pascal
1.
AOutMsg.dataB.putSegment(status, ReadLength, Buffer);


а
Код: pascal
1.
outBlob.putSegment(status, ReadLength, Buffer);


и в конце
Код: pascal
1.
outBlob.Release;
...
Рейтинг: 0 / 0
Написание UDR
    #39387802
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
seertrueИсходники модуля Delphi XE7
Потрясающий по глубине нечтения даже той жалкой документации, которая есть, бред.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написание UDR
    #39387993
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovПотрясающий по глубине нечтения даже той жалкой документации, которая есть, бред.


Если это
doc/README.plugins.html
и это
doc/README.external_routines.txt
считается документацией то это я написал "войну и мир"

Спросил тут про документацию:

Симонов Денис:
автордокументации по UDR пока нет, можно в исходниках примеры глянуть. Планирую написать статью, но позже.
Ты попробуй написать, если что не будет получаться спроси здесь, поможем.
...
Рейтинг: 0 / 0
Написание UDR
    #39388005
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там есть ещё Using_OO_API.html
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написание UDR
    #39388149
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad
по идее должно быть
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  TLoadBLOBOutMessage = record
    Size: Word;
    dataB: ISC_QUAD;
    dataBNull: WordBool;
  end;
...

var
  outBlob : Blob;
...
// что делает эта команда?
// Блоб создаёт,  а ты что думал ???
    outBlob := context.getAttachment(status).createBlob(status, context.getTransaction(status), AOutMsg.dataB, 0, nil);



может так?
Код: pascal
1.
    outBlob := context.getAttachment(status).createBlob(status, context.getTransaction(status), @AOutMsg.dataB, 0, nil);


CreateBlob просит ISC_QUADPtr
...
Рейтинг: 0 / 0
Написание UDR
    #39388160
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad AOutMsg.Size := sizeof(ISC_QUAD); // не уверен, что это поле вообще нужно
[/src]

Нужно! Без него получаю ошибку:
Код: plaintext
1.
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
invalid BLOB ID.
...
Рейтинг: 0 / 0
Написание UDR
    #39388537
seertrue
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovТам есть ещё Using_OO_API.html


Вот я ламер!
Уже читаю...

авторAfter finishing with blob do not forget top close it:

может быть очепятка и надо так?

авторAfter finishing with blob do not forget to close it:
...
Рейтинг: 0 / 0
94 сообщений из 94, показаны все 4 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Написание UDR
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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