FirebirdSQL logo
Введение 

Введение

В 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, если это не оговорено отдельно.

Firebird API

Для написания внешних процедур, функций или триггеров на компилируемыхязыках программирования нам потребуются знания о новом объектноориентированном 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

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.