powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Написание UDR на Pascal
25 сообщений из 56, страница 1 из 3
Написание UDR на Pascal
    #39784288
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу представить для обсуждения предварительную версию статьи про написание UDR на Pascal с примерами.
Исходные коды примеров и текст статьи вы можете найти по ссылке https://github.com/sim1984/udr-book

В настоящий момент материал может содержать множество ошибок, часть моментов не раскрыта.

Пишите предложения, замечания и вопросы.
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39784370
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
замечания
стр.6
Подсказка
Если вы не знаете как уничтожается объяет посмотрите его иерархию, если в ней есть
интрефейс IReferenceCounted
.
---------
и предложение заканчивается. читая следующее предложение все становится ясным, однако осадок остается
---------
Для интерфейсов с подсчётом ссылок, по завершению
работы с объектом необходимо уменьшить счётчик ссылок вызовом метода release().

стр.7
UDR могут быть добалены или удалены из базы данных с помощью DDL комманд подобно
тому как вы добавляете или удаляете обычные PSQL процедуры, функции или триггеры. В
этом случае

---------
ожидаю что к моменту прочтения этого куска должно быть ясно к чему он относится (читая дальше понимаю что к триггерам, однако малость поздно)
--------
вместо тела триггера указывается место его расположения во внешнем модуле с
помощью предложения EXTERNAL NAME.
Рассмотрим синтаксис этого предложения, оно будет обим для внешних процедур, функций и
триггеров


стр.67
Поскольку размер данных типа BLOB может быть очень большим, то данные BLOB читаются
и пишутся порциями порцияи (сегментами)

стр.70
Примечание
Тип перечеление TFBCharSet не входит в Firebird.pas.


стр.71
BLOB читается порцияи (сегментами),


стр.73
Работоспособность процедуры можно проверисть слеющим образом:


стр.80
Если ваша внешняя процедура, функция или триггер должна получать данные из собственной
базы данных не через входные аргументы, а например через запрос, то вам поребуется
получать контекст текущего соединения и/или транзакции


стр.80
В
этом случае нам придётся работать с интерфейсом IMessageMetadata. Вы уже сталкивались
с ним ранее, но на этот раз придётся работать с ним более основательно
-----
Наверное все-же не "Вы" а "Мы"
-----


Стр.82
Дополнительный метод MakeScaleInteger предназначен для преоьразование
масштабируемых чисел в строку
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39784371
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

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


стр. 4
UDR предоставляют получить контекст текущего соединения или транзакции для того чтобы
выполнять некоторые манипуляции с текущей базой данных в этом контексте

Не звучит... Наверное должно быть позволяют

стр. 10
module name Имя внешнего модуля, в котором расположена процедурв .

стр. 19
В данном случе необходимо экспортировать всего одну функцию firebird_udr_plugin,
которая является точкой входа для плагина внешних модулей UDR. Реализая этой функции
будет находится в модуле UdrInit.

стр, 20
Особенности Free Pascal
...
Директива {$H+} включает поддержку длинный строк.



...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39784571
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sasha27Не звучит... Наверное должно быть позволяют

"В UDR доступен контекст текущего соединения или транзакции для того чтобы выполнять некоторые манипуляции с текущей базой данных в этом контексте."
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39784591
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисда грамматических ошибок там много, надо словарик русский всё таки поставить в oxygen, а то как компьютер поменял руки не дошли.
Денис, если не сложно, на каждую рекламацию давай однозначный ответ, когда именно она будет исправлена. Чтобы желающим в свою очередь присоединиться по два раза не вставать.
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39784596
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

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

стр. 10
Таблица 2.2. Некоторые параметры внешней процедуры
червертая строка в таблице, в поле описание

module name | Имя внешнего модуля, в котором расположена процедурв
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39784713
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sasha27,

поправил
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39784743
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
стр. 5 В данном руководство не включает полного описания Firebird API.

стр.5 (запятая) ... ознакомится с ним в каталоге документации , распространяемой ... и ... перевод данного документа , доступный...

стр. 6 (запятые) Если вы не знаете , как уничтожается объект , посмотрите его иерархию...

стр.7 (вероятно, нужна запятая) с помощью DDL команд подобно тому , как вы добавляете
стр.7 (вероятно, нужна запятая) В этом случае , вместо тела триггера...
стр.7 ...оно может быть использовано внешн е м модулем...
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39788672
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

это исправил.

У кого-нибудь есть замечания по содержимому? Что не понятно описано?
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39788698
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

У меня, с вашего позволения, еще будут. Не спеши т.о. выпускать.
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39788701
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vlad F,

да без проблем
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39788780
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я с вашего позволения через полгодика к этой теме обращусь и почитаю.
Я чую, где это может пригодиться в своих существующих проектах.
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39788810
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o_v_a,

Ты лучше сейчас почитай. Денису, имхо, надо помочь ее вычитать.
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39788857
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Семантически я всё равно не найду косяков, потому что не в теме. Надо ж пробовать...
Орфографию и пунктуацию если только.
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39788886
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я заметил пару мелких ошибок, но ничего серьёзного.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Написание UDR на Pascal
    #39960337
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно подниму тему?

1. CLOOP — Cross Language Object Oriented Programming. Этот инструмент не входит в поставку
Firebird. Его можно найти в исходных кодах https://github.com/FirebirdSQL/firebird/tree/B3_0
_Release/extern/cloop. После того как инструмент будет собран...Может я особо криворукий, но у меня собрать его не получилось. Чем его собирать? make выдает кучу ошибок. Судя по беглому просмотру Makefile он вообще под Windows не собирается

2. Я так понимаю, что любая UDR должна экспортировать ровно одну функцию с жестко заданным именем firebird_udr_plugin. Я прав? Просто из фразыВ данном случае необходимо экспортировать всего одну функцию firebird_udr_plugin, которая является точкой входа для плагина внешних модулей UDR.это не следует. К чему здесь фраза "В данном случае"?

3. Не описаны параметры функции firebird_udr_plugin. Особенно я не понял манипуляций с AUnloadFlagLocal: BooleanPtr и возвращаемым результатом.

4. Не знаю, на сколько критично, но я бы добавил еще упоминание про IsMultiThread := True

5. Вызовы, с передачей в функцию, которая принимает интерфейсный объект, только что созданного объекта чреваты утечкой. Я о конструкции
Код: pascal
1.
2.
  AUdrPlugin.registerFunction(AStatus, 'sum_args',
    TSumArgsFunctionFactory.Create());

Да, в текущем объявлении
Код: sql
1.
procedure IUdrPlugin.registerFunction(status: IStatus; name: PAnsiChar; factory: IUdrFunctionFactory);

модификатор const отсутствует и утечки не будет, но я бы не закладывал себе грабли и явно передавал бы интерфейс
Код: pascal
1.
2.
3.
4.
5.
var LFact: IUdrFunctionFactory;
begin
  LFact := TSumArgsFunctionFactory.Create();
  AUdrPlugin.registerFunction(AStatus, 'sum_args', LFact);
end;

или так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
class function TSumArgsFunctionFactory.CreateIntf: IUdrFunctionFactory;
begin
  Result := Self.Create();
end;

AUdrPlugin.registerFunction(AStatus, 'sum_args',
  TSumArgsFunctionFactory.CreateIntf());



А вообще считаю отсутствие модификатора const перед интерфейсным параметром ошибкой. Т.к. он блокирует вызов _AddRef/_Release до/после вызова функции
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39960342
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
5. Вызовы, с передачей в функцию, которая принимает интерфейсный объект, только что созданного объекта чреваты утечкой.
Прошу прощения. Сейчас увидел, что IUdrFunctionFactory это не интерфейс, а класс. Имхо это В данном случае для интерфейсов Firebird API будет добавлен префикс I, так как это принято в Object Pascal.обман, вводящий в заблуждение.

Нужно тогда изменить хотя бы эту фразу Интерфейсы Firebird не основываются на спецификации COM, поэтому управление их временем жизни осуществляется иначе.на такуюИнтерфейсы Firebird не основываются на спецификации COM и, по сути, являются обычными классами. Поэтому управление их временем жизни осуществляется иначе.
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39960357
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

по сути интерфейсы это чистые абстрактные классы. Это в COM к ним прилепили счётчики ссылок и всё такое. В Object Pascal отдельное ключевое слово выдумали interface (именно под COM интерфейсы), а в C++ они все классы и есть

_Vasilisk_Может я особо криворукий, но у меня собрать его не получилось. Чем его собирать? make выдает кучу ошибок. Судя по беглому просмотру Makefile он вообще под Windows не собирается

я собирал visual studio community 2019. Впрочем зачем тебе это? Возьми готовый firebird.pas в дистрибутивах под Linux

_Vasilisk_2. Я так понимаю, что любая UDR должна экспортировать ровно одну функцию с жестко заданным именем firebird_udr_plugin. Я прав? Просто из фразы

потому что когда пишешь обычные udf на каждую функцию делаешь новый экспорт. Здесь точка входа всего одна


_Vasilisk_Особенно я не понял манипуляций с AUnloadFlagLocal: BooleanPtr и возвращаемым результатом.
оно так в примере поставляемым с Firebird было. Если бы я знал для чего описал бы. Это нигде не задокументировано.
Так там собственно все пераметры кроме AUnloadFlagLocal и так понятны.

Тем не менее не знание для чего это нужно не мешает писать UDR чисто используя шаблон.
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39960359
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Интерфейсы Firebird не основываются на спецификации COM и, по сути, являются обычными
классами.

Они даже классами не являются. Так, убожество, эмулирующее VMT массивом указателей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39960366
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис
по сути интерфейсы это чистые абстрактные классы
Да знаю я о сути. Просто когда в одном контексте упоминаются интерфейсы и Delphi, лично у меня возникает ассоциация с IInterface и автоматическим вызовом _AddRef/_Release

Симонов Денис
потому что когда пишешь обычные udf на каждую функцию делаешь новый экспорт. Здесь точка входа всего одна
Вот в документе как-то это и не обозначено
Симонов Денис
оно так в примере поставляемым с Firebird было. Если бы я знал для чего описал бы. Это нигде не задокументировано.
Понятно. Ну тогда хотя бы указать, что undocumented и делайте так
Симонов Денис
Так там собственно все пераметры кроме AUnloadFlagLocal и так понятны.
AUnloadFlagLocal и возвращаемый результат

Симонов Денис
Тем не менее не знание для чего это нужно не мешает писать UDR чисто используя шаблон.
Не мешает. Но хотелось бы разобраться

И еще вопрос - нигде не нашел про обработку ошибок. Плохо искал? Как из UDR возвратить ошибку?
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39960373
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Как из UDR возвратить ошибку?

Для этого в параметрах (почти) каждого метода торчит status.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Написание UDR на Pascal
    #39960380
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Для этого в параметрах (почти) каждого метода торчит status.
Спасибо
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Написание UDR на Pascal
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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