В Firebird уже достаточно давно существует возможность расширениявозможностей языка PSQL с помощью написания внешних функций — UDF (UserDefined Functions). UDF можно писать практически на любом компилируемомязыке программирования.
В Firebird 3.0 была введена плагинная архитектура для расширениявозможностей Firebird. Одним из таких плагинов является External Engine(внешние движки). Механизм UDR (User Defined Routines — определяемыепользователем подпрограммы) добавляет слой поверх интерфейса движкаFirebirdExternal. UDR имеют следующие преимущества по сравнению с UDF:
можно писать не только функции возвращающие скалярный результат, но ихранимые процедуры (как выполняемые, так и селективные), а так жетриггеры;
улучшенный контроль входных и выходных параметров. В ряде случаев(передача по дескриптору) типы и другие свойства входных параметроввообще не контролировались, однако вы могли получить эти свойства внутриUDF. UDR предоставляют более унифицированный способ объявления входных ивыходных параметров, так как это делается в случае с обычными PSQLфункциями и процедурами;
в UDR доступен контекст текущего соединения или транзакции, чтопозволяет выполнять некоторые манипуляции с текущей базой данных в этомконтексте;
внешние процедуры и функции (UDR) можно группировать в PSQL пакетах;
UDR могут быть написаны на любом языке программирования (необязательнокомпилируемые в объектные коды), для этого необходим соответствующийExternal Engine плагин. Например, существуют плагины длянаписания внешних модулей на Java или на любом из .NET языков.
В данном руководстве мы расскажем как объявлять UDR, об их внутреннихмеханизмах, возможностях и приведём примеры написания UDR на языкеPascal. Кроме того, будут затронуты некоторые аспекты использованиянового объектно-ориентированного API.
Далее в различных главах этого руководства при употреблении терминоввнешняя процедура, функция или триггер мы будем иметь в виду именно UDR,а не UDF.
Note
|
Все наши примеры работают на Delphi 2009 и старше, а так же на FreePascal. Все примеры могут быть скомпилированы как в Delphi, так и в FreePascal, если это не оговорено отдельно. |
Для написания внешних процедур, функций или триггеров на компилируемыхязыках программирования нам потребуются знания о новом объектноориентированном API Firebird. Данное руководство не включает полногоописания Firebird API. Вы можете ознакомиться с ним в каталогедокументации, распространяемой вместе с Firebird(doc/Using_OO_API.html
). Для русскоязычных пользователей существуетперевод данного документа доступный по адресуhttps://github.com/sim1984/fbooapi/releases/download/1.0/fbapi30.pdf иhttps://github.com/sim1984/fbooapi/releases/download/1.0/fbapi40.pdf.
Подключаемые файлы для различных языков программирования, содержащиеинтерфейсы API, не распространяются в составе дистрибутива Firebird подWindows, однако вы можете извлечь их из распространяемых под Linuxсжатых tarbar файлов (путь внутри архива/opt/firebird/include/firebird/Firebird.pas
).
CLOOP — Cross Language Object Oriented Programming. Этот инструмент невходит в поставку Firebird. Его можно найти в исходных кодахhttps://github.com/FirebirdSQL/firebird/tree/B3_0_Release/extern/cloop.После того как инструмент будет собран, можно на основе файла описанияинтерфейсов include/firebird/FirebirdInterface.idl
сгенерировать APIдля вашего языка программирования (IdlFbInterfaces.h
илиFirebird.pas
).
Для Object pascal это делается следующей командой:
cloop FirebirdInterface.idl pascal Firebird.pas Firebird --uses SysUtils \
--interfaceFile Pascal.interface.pas \
--implementationFile Pascal.implementation.pas \
--exceptionClass FbException --prefix I \
--functionsFile fb_get_master_interface.pas
Файлы Pascal.interface.pas
, Pascal.implementation.pas
иfb_get_master_interface.pas
можно найти по адресуhttps://github.com/FirebirdSQL/firebird/tree/B3_0_Release/src/misc/pascal.
Note
|
Замечание
В данном случае для интерфейсов Firebird API будет добавлен префикс I, так как это принято в Object Pascal. |