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

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

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

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

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

стр.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

Откуда: Рязань
Сообщений: 10575
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
Сообщений: 28886
sasha27
Не звучит... Наверное должно быть позволяют

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

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

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

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

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

Откуда: Рязань
Сообщений: 10575
исправил
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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Posted via ActualForum NNTP Server 1.5

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

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

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

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

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

Откуда: Рязань
Сообщений: 10575
_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

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

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

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

Posted via ActualForum NNTP Server 1.5

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

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

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

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

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

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

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

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

Posted via ActualForum NNTP Server 1.5

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

Откуда: Украина, Харьков
Сообщений: 11914
Dimitry Sibiryakov
Для этого в параметрах (почти) каждого метода торчит status.
Спасибо
21 май 20, 17:25    [22137201]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

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

Про ошибки я забыл описать.
Но тут суть именно в этой реализации IStatus реализован как бросающий исключение FbException. Т.е. для методов в которые передаётся IStatus будет сгенерировано исключение в случае ошибки, и выполнение будет немедленно прервано.

Стандартные исключения Delphi тоже будут автоматически перехвачены с isc_random в статус векторе. Генерировать ошибки с другими кодами надо постараться


var
  statusVector: array [0 .. 4] of NativeIntPtr;
....
// исключение будут перехвачены в любом случае с кодом isc_random
// здесь же мы будем выбрасывать стандартную для Firebird
// ошибку isc_convert_error
try
  Output.Id := OutputArray[Counter].ToInteger();
except
  on e: EConvertError do
  begin
    statusVector[0] := NativeIntPtr(isc_arg_gds);
    statusVector[1] := NativeIntPtr(isc_convert_error);
    statusVector[2] := NativeIntPtr(isc_arg_string);
    statusVector[3] := NativeIntPtr(PAnsiChar('Cannot convert string to integer'));
    statusVector[4] := NativeIntPtr(isc_arg_end);
    AStatus.setErrors(@statusVector);
  end;
end;



_Vasilisk_
Понятно. Ну тогда хотя бы указать, что undocumented и делайте так


вообще-то там всё не документировано. Есть только примеры. Так что всё что там написано не есть истина в последней инстанции. Это предмет моих исследований в области UDR.
21 май 20, 17:46    [22137216]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Я не знаю, насколько это интересно широкой общественности, но для меня стало открытием и стоило часа отладки, чтобы понять, что для NUMERIC(9,2) нужно в IMetadataBuilder указывать отрицательный Scale -2.

Передавая 50.12 и указывая положительный Scale 2, я в UDR получал значение 0. И только указав -2 получил 5012
29 май 20, 12:20    [22142114]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Dimitry Sibiryakov
Member

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

_Vasilisk_
Я не знаю, насколько это интересно широкой общественности

Я не знаю насколько широкая общественность читала старый, ещё интербейзовский, API Guide.

Posted via ActualForum NNTP Server 1.5

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

Откуда: Украина, Харьков
Сообщений: 11914
Dimitry Sibiryakov
старый, ещё интербейзовский, API Guide.
В итоге получаем вместо обособленного документа какой-то What's new.

Мне, как человеку не работавшим ранее напрямую с API разбираться с ним крайне сложно.

Описания того же IExternalContext я не нашел вообще нигде в интернете
29 май 20, 13:23    [22142196]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Dimitry Sibiryakov
Member

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

Документация - традиционно слабая сторона птицы.

Влад и Адриано в таких случаях говорят "читайте исходники, там всё написано".
Алекс говорит "задавай вопросы в девеле", но отвечает на эти вопросы через раз.

Posted via ActualForum NNTP Server 1.5

29 май 20, 13:28    [22142201]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28886
_Vasilisk_
Описания того же IExternalContext я не нашел вообще нигде в интернете

Это у Дениса надо спросить.
Потому что в
http://www.ibase.ru/files/firebird/udr.pdf
оно (и не только) часто упоминается, а в
http://www.ibase.ru/files/firebird/fbapi.html
ничего похожего нет (даже слова context).

p.s. я с этим вообще не разбирался, но че-то не очень понимаю, почему firebird.pas не входит в поставку, и его надо "генерить" через CLOOP.
29 май 20, 14:14    [22142240]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Dimitry Sibiryakov
Member

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

kdv
че-то не очень понимаю, почему firebird.pas не входит в поставку, и его надо "генерить"
через CLOOP.

Потому что клоп не включён в процедуру сборки под винду. Потому что он под ней не
собирается. Потому что кому-то было лень это фиксиить.

Он входит в пакет с исходниками, поскольку тот собирается на линуксе.

Posted via ActualForum NNTP Server 1.5

29 май 20, 14:18    [22142244]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

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

он есть в дистрибутивах под Linux. Почему не попадает в снапшоты винды хз
29 май 20, 14:18    [22142245]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10575
kdv

http://www.ibase.ru/files/firebird/fbapi.html
ничего похожего нет (даже слова context).


так это только перевод из firebird/doc/Using_OO_API.html
От себя я там ничего не писал, ну разве что про клопа
29 май 20, 14:24    [22142253]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
kdv
не очень понимаю, почему firebird.pas не входит в поставку, и его надо "генерить" через CLOOP.
К слову, в 3.0.5 он обнаружился в папке include\firebird
1 июн 20, 13:32    [22143635]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

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

возможно это правили.
1 июн 20, 13:53    [22143664]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28886
_Vasilisk_
К слову, в 3.0.5 он обнаружился в папке include\firebird

в zip с офсайта ничего такого нет.
1 июн 20, 14:04    [22143675]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Док
Member

Откуда: Казань
Сообщений: 6700
kdv
в zip с офсайта ничего такого нет.

верно, в архивчик его положить забыли от слова совсем
1 июн 20, 17:49    [22143894]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
kdv
в zip с офсайта ничего такого нет.
Я инсталлятор запускал
1 июн 20, 18:06    [22143907]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Док
Member

Откуда: Казань
Сообщений: 6700
_Vasilisk_
kdv
в zip с офсайта ничего такого нет.
Я инсталлятор запускал

я тут по ходу дела проверил - ни в одном архиве с исподниками, начиная с 1.0.3, firebird.pas нет :)
1 июн 20, 18:17    [22143920]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
ъъъъъ
Member

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

клооп не настолько древний.
1 июн 20, 21:18    [22144031]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Dimitry Sibiryakov
Member

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

Кстати, Денис, добавь в сабж копирайты и лицензию какую-нибудь, а то статус непонятен,
Ривз колеблется с переводом.

Posted via ActualForum NNTP Server 1.5

3 июн 20, 14:14    [22144897]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 61467
DS> Ривз колеблется с переводом.

Боится нелицензионности что ли?

Posted via ActualForum NNTP Server 1.5

3 июн 20, 14:20    [22144900]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

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

ну копирайты в примерах и тексте я могу поставить. А вот что там за лицензия хз
3 июн 20, 14:30    [22144911]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Dimitry Sibiryakov
Member

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

Симонов Денис
А вот что там за лицензия хз

Два напрашивающихся варианта: IDPL и Public Domain.

Posted via ActualForum NNTP Server 1.5

3 июн 20, 14:36    [22144919]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10575
что-то типа вот этого что ли?

{
 *	PROGRAM:	Object oriented API samples.
 *	MODULE:		01.create.pas
 *	DESCRIPTION:	A sample of creating new database and new table in it.
 *					Run second time (when database already exists) to see
 *					how FbException is caught and handled by this code.
 *
 *					Example for the following interfaces:
 *					IMaster - main inteface to access all the rest
 *					Status - returns the status of executed command
 *					Provider - main interface to access DB / service
 *					Attachment - database attachment interface
 *					Transaction - transaction interface
 *					Util - helper calls here and there
 *					XpbBuilder - build various parameters blocks
 *
 *					Run something like this to build: fpc -Fu<path-to-Firebird.pas> -Mdelphi 01.create.pas
 *
 *  The contents of this file are subject to the Initial
 *  Developer's Public License Version 1.0 (the "License");
 *  you may not use this file except in compliance with the
 *  License. You may obtain a copy of the License at
 *  http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_idpl.
 *
 *  Software distributed under the License is distributed AS IS,
 *  WITHOUT WARRANTY OF ANY KIND, either express or implied.
 *  See the License for the specific language governing rights
 *  and limitations under the License.
 *
 *  The Original Code was created by Alexander Peshkoff
 *  for the Firebird Open Source RDBMS project.
 *
 *  Copyright (c) 2015 Alexander Peshkoff <peshkoff@mail.ru>
 *  and all contributors signed below.
 *
 *  All Rights Reserved.
 *  Contributor(s): ______________________________________. }
3 июн 20, 14:39    [22144922]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Dimitry Sibiryakov
Member

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

Симонов Денис
что-то типа вот этого что ли?

Да, только я бы лицензию тут же положил в виде отдельного файла, а то URL-ы имеют свойство
протухать.

Posted via ActualForum NNTP Server 1.5

3 июн 20, 14:47    [22144933]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Я правильно понимаю, что для каждого вызова процедуры/функции/триггера создается свой экземпляр IExternalProcedure/IExternalFunction/IExternalTrigger?

Или хотя бы обращение к одному экземпляру не идет одновременно из разных потоков?

Другими словами, я могу безболезненно сохранить аргументы, передаваемые в IExternalProcedure.open в поля класса и безопасно к ним обращаться из любого места. А не передавать нужные мне параметры как аргументы в мои методы.
10 июн 20, 14:39    [22148797]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

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

нет, не правильно. Экземпляр процедуры создаётся в момент её загрузки в кэш метаданных

автор
Метод newItem вызывается для создания экземпляра внешней процедуры, функции или
триггера. Создание экземпляров UDR происходит в момент её загрузки в кэш метаданных, т.е.
при первом вызове процедуры, функции или триггера. В настоящий момент кэш метаданных
раздельный для каждого соединения для всех архитектур сервера.

Кэш метаданных процедур и функция связан с их именами в базе данных. Например,
две внешние функции с разными именами, но одинаковыми точками входа, будут разными
экземплярами IExternalFunction. Точка входа состоит из имени внешнего модуля и имени
под которым зарегистрирована фабрика. Как это можно использовать покажем позже.


Если у тебя процедура выбора, передавай сохраняй аргументы в экземляр класса реализующий IExternalResultSet, если нет то можешь создать свой отдельный класс, раз там такая сложная логика
10 июн 20, 15:18    [22148821]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Симонов Денис
создать свой отдельный класс
Мысль. Спасибо.
10 июн 20, 15:25    [22148827]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

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

глянь пример Triggers.cpp

Там как раз эту особенность грамотно использовали. Соединение с внешней БД делается один раз и подготовливается запрос, в момент создания экземпляра триггера. А в методе execute подготовленный запрос просто многократно выполняют
10 июн 20, 15:34    [22148833]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Симонов Денис
глянь пример Triggers.cpp
Глаза вытекают от макросов
Симонов Денис
Там как раз эту особенность грамотно использовали
Там внутри IExternalTrigger создается два поля
AutoRelease<IMessageMetadata> triggerMetadata;
AutoRelease<IStatement> stmt;
эти поля инициализируются в конструкторе, а потом используются в execute. Т.е. конкурентного доступа из разных потоков не планируется

Сообщение было отредактировано: 10 июн 20, 17:03
10 июн 20, 17:04    [22148887]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

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

каких на фиг потоков? Я же писал что экземпляр процедуры/функции/триггера создаётся в момент загрузки в кеш метаданных. В трёшке он (кеш метаданных) раздельный для коннектов. Т.е в том примере экземпляр триггера, внешний коннект и препарированный запрос создаётся однократно в пределах текущей сессии. Но при каждом вызове триггера в текущей сессии подготовленный статмент используется повторно. Естественно, там нет никакого конкурентного доступа
10 июн 20, 17:30    [22148908]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Симонов Денис
Естественно, там нет никакого конкурентного доступа
Т.е. идея
Другими словами, я могу безболезненно сохранить аргументы, передаваемые в IExternalProcedure.open в поля класса и безопасно к ним обращаться из любого места. А не передавать нужные мне параметры как аргументы в мои методы.
жизнеспособна и работающая?

И еще, могу я в IUdrProcedureFactory.newItem(), на основании переданного мне IExternalContext подготовить запросы к своей базе, чтобы потом в IExternalProcedure.open() просто вызвать IStatement.openCursor()?
10 июн 20, 17:57    [22148940]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10575
_Vasilisk_
жизнеспособна и работающая?


нет. Процедура может вызываться многократно. Состояние процедуры при новом вызове, не должно зависеть от предыдущего.
Например если вздумается вызывать процедуру рекурсивно, то будет жопа.

_Vasilisk_
И еще, могу я в IUdrProcedureFactory.newItem(), на основании переданного мне IExternalContext подготовить запросы к своей базе, чтобы потом в IExternalProcedure.open() просто вызвать IStatement.openCursor()?


можешь. Вообще давно бы уже проверил
10 июн 20, 18:12    [22148947]     Ответить | Цитировать Сообщить модератору
 Re: Написание UDR на Pascal  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
Симонов Денис
вызывать процедуру рекурсивно,
Уговорил :)
10 июн 20, 18:57    [22148972]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / Firebird, InterBase Ответить