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

Откуда: Рязань
Сообщений: 10574
Хочу представить для обсуждения предварительную версию статьи про написание UDR на Pascal с примерами.
Исходные коды примеров и текст статьи вы можете найти по ссылке https://github.com/sim1984/udr-book

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

Пишите предложения, замечания и вопросы.
10 мар 19, 17:34    [21828746]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
m7m
Member

Откуда: Украина, Мариуполь
Сообщений: 1394
Симонов Денис,
+ замечания

стр.6
Подсказка
Если вы не знаете как уничтожается объяет посмотрите его иерархию, если в ней есть
интрефейс IReferenceCounted
.
---------
и предложение заканчивается. читая следующее предложение все становится ясным, однако осадок остается
---------
Для интерфейсов с подсчётом ссылок, по завершению
работы с объектом необходимо уменьшить счётчик ссылок вызовом метода release().

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

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


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

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


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


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


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


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


Стр.82
Дополнительный метод MakeScaleInteger предназначен для преоьразование
масштабируемых чисел в строку
11 мар 19, 10:02    [21828907]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

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

да грамматических ошибок там много, надо словарик русский всё таки поставить в oxygen, а то как компьютер поменял руки не дошли.
Спасибо
11 мар 19, 10:16    [21828914]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
sasha27
Member

Откуда: Москва
Сообщений: 178
Симонов Денис,

+

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

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

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

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

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



11 мар 19, 14:15    [21829195]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28878
sasha27
Не звучит... Наверное должно быть позволяют

"В UDR доступен контекст текущего соединения или транзакции для того чтобы выполнять некоторые манипуляции с текущей базой данных в этом контексте."
11 мар 19, 16:26    [21829396]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Vlad F
Member

Откуда:
Сообщений: 1295
Симонов Денис
да грамматических ошибок там много, надо словарик русский всё таки поставить в oxygen, а то как компьютер поменял руки не дошли.

Денис, если не сложно, на каждую рекламацию давай однозначный ответ, когда именно она будет исправлена. Чтобы желающим в свою очередь присоединиться по два раза не вставать.
11 мар 19, 16:37    [21829435]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

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

грамматику я сегодня вечером посмотрю
11 мар 19, 16:46    [21829450]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10574
исправил
11 мар 19, 22:10    [21829804]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
sasha27
Member

Откуда: Москва
Сообщений: 178
Денис, вот тут осталось еще:

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

module name | Имя внешнего модуля, в котором расположена процедурв
11 мар 19, 22:43    [21829826]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

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

поправил
11 мар 19, 22:59    [21829838]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Док
Member

Откуда: Казань
Сообщений: 6693
стр. 5 В данном руководство не включает полного описания Firebird API.

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

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

стр.7 (вероятно, нужна запятая) с помощью DDL команд подобно тому, как вы добавляете
стр.7 (вероятно, нужна запятая) В этом случае, вместо тела триггера...
стр.7 ...оно может быть использовано внешнем модулем...
12 мар 19, 08:43    [21829937]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

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

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

У кого-нибудь есть замечания по содержимому? Что не понятно описано?
19 мар 19, 21:43    [21837794]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Vlad F
Member

Откуда:
Сообщений: 1295
Симонов Денис,

У меня, с вашего позволения, еще будут. Не спеши т.о. выпускать.
19 мар 19, 22:49    [21837866]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

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

да без проблем
19 мар 19, 22:54    [21837870]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
o_v_a
Member

Откуда: Тула
Сообщений: 1120
Я с вашего позволения через полгодика к этой теме обращусь и почитаю.
Я чую, где это может пригодиться в своих существующих проектах.
20 мар 19, 08:45    [21838028]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Vlad F
Member

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

Ты лучше сейчас почитай. Денису, имхо, надо помочь ее вычитать.
20 мар 19, 09:44    [21838067]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
o_v_a
Member

Откуда: Тула
Сообщений: 1120
Семантически я всё равно не найду косяков, потому что не в теме. Надо ж пробовать...
Орфографию и пунктуацию если только.
20 мар 19, 10:40    [21838140]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 61460
Я заметил пару мелких ошибок, но ничего серьёзного.

Posted via ActualForum NNTP Server 1.5

20 мар 19, 11:15    [21838196]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11911
Можно подниму тему?

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. Вызовы, с передачей в функцию, которая принимает интерфейсный объект, только что созданного объекта чреваты утечкой. Я о конструкции
  AUdrPlugin.registerFunction(AStatus, 'sum_args',
    TSumArgsFunctionFactory.Create());
Да, в текущем объявлении
procedure IUdrPlugin.registerFunction(status: IStatus; name: PAnsiChar; factory: IUdrFunctionFactory);
модификатор const отсутствует и утечки не будет, но я бы не закладывал себе грабли и явно передавал бы интерфейс
var LFact: IUdrFunctionFactory;
begin
  LFact := TSumArgsFunctionFactory.Create();
  AUdrPlugin.registerFunction(AStatus, 'sum_args', LFact);
end;
или так
class function TSumArgsFunctionFactory.CreateIntf: IUdrFunctionFactory;
begin
  Result := Self.Create();
end;

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


А вообще считаю отсутствие модификатора const перед интерфейсным параметром ошибкой. Т.к. он блокирует вызов _AddRef/_Release до/после вызова функции
21 май 20, 16:23    [22137145]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11911
_Vasilisk_
5. Вызовы, с передачей в функцию, которая принимает интерфейсный объект, только что созданного объекта чреваты утечкой.
Прошу прощения. Сейчас увидел, что IUdrFunctionFactory это не интерфейс, а класс. Имхо это
В данном случае для интерфейсов Firebird API будет добавлен префикс I, так как это принято в Object Pascal.
обман, вводящий в заблуждение.

Нужно тогда изменить хотя бы эту фразу
Интерфейсы Firebird не основываются на спецификации COM, поэтому управление их временем жизни осуществляется иначе.
на такую
Интерфейсы Firebird не основываются на спецификации COM и, по сути, являются обычными классами. Поэтому управление их временем жизни осуществляется иначе.
21 май 20, 16:35    [22137154]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10574
_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 чисто используя шаблон.
21 май 20, 17:02    [22137176]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Dimitry Sibiryakov
Member

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

_Vasilisk_
Интерфейсы Firebird не основываются на спецификации COM и, по сути, являются обычными
классами.

Они даже классами не являются. Так, убожество, эмулирующее VMT массивом указателей.

Posted via ActualForum NNTP Server 1.5

21 май 20, 17:05    [22137178]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11911
Симонов Денис
по сути интерфейсы это чистые абстрактные классы
Да знаю я о сути. Просто когда в одном контексте упоминаются интерфейсы и Delphi, лично у меня возникает ассоциация с IInterface и автоматическим вызовом _AddRef/_Release

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

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

И еще вопрос - нигде не нашел про обработку ошибок. Плохо искал? Как из UDR возвратить ошибку?
21 май 20, 17:11    [22137185]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Dimitry Sibiryakov
Member

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

_Vasilisk_
Как из UDR возвратить ошибку?

Для этого в параметрах (почти) каждого метода торчит status.

Posted via ActualForum NNTP Server 1.5

21 май 20, 17:20    [22137194]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11911
Dimitry Sibiryakov
Для этого в параметрах (почти) каждого метода торчит status.
Спасибо
21 май 20, 17:25    [22137201]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить