14. BLOB фильтр (FILTER)
BLOB фильтр — объект базы данных, являющийся, по сути, специальным видом внешних функций
с единственным назначением: получение объекта BLOB одного формата и преобразования его в объект
BLOB другого формата. Форматы объектов BLOB задаются с помощью подтипов BLOB.
Внешние функции для преобразования BLOB типов хранятся в динамических библиотеках и
загружаются по необходимости.
14.1. Объявление BLOB фильтра
Оператор DECLARE FILTER объявляет существующий BLOB фильтр в базе данных.
Листинг 14.1 Синтаксис оператора объявления BLOB фильтра
DECLARE FILTER <имя фильтра>
INPUT_TYPE <подтип BLOB> OUTPUT_TYPE <подтип BLOB>
ENTRY_POINT 'Имя экспортируемой функции'
MODULE_NAME 'Имя модуля с фильтром'
<подтип BLOB> ::= номер подтипа | <мнемоника подтипа>
<мнемоника подтипа> ::= binary | text | blr | acl | ranges | summary |
format | transaction_description |
external_file_description | <user_defined>
Имя BLOB фильтра должно быть уникальным среди имен BLOB фильтров и может содержать до 63 символов.
Примечание
Создать BLOB фильтр может администратор и пользователь с привилегией CREATE FILTER.
Пользователь, создавший BLOB фильтр, становится его владельцем.
Задание подтипов
Предложение INPUT_TYPE устанавливает подтип BLOB преобразуемого объекта.
Предложение OUTPUT_TYPE устанавливает подтип создаваемого объекта. Подтип задается
в виде номера подтипа или мнемоники подтипа. Пользовательские подтипы должны быть
представлены отрицательными числами (от -1 до -32768).
Примечание
В базе данных не может быть двух и более фильтров BLOB с одинаковыми комбинациями входных
и выходных типов. Объявление фильтра с уже существующими комбинациями входных и выходных
типов BLOB приведет к ошибке.
Для определения мнемоники для собственных подтипов BLOB, можно добавить их в системную таблицу RDB$TYPES:
INSERT INTO RDB$TYPES (RDB$FIELD_NAME, RDB$TYPE, RDB$TYPE_NAME)
VALUES ('RDB$FIELD_SUB_TYPE', -33, 'MIDI');
После подтверждения транзакции мнемоники могут быть использованы для декларации при создании новых фильтров.
Значение поля RDB$FIELD_NAME всегда должно быть подтипа RDB$FIELD_SUB_TYPE. При определении
мнемоники в верхнем регистре можно использовать их без учета регистра и без кавычек при объявлении фильтра.
Другие параметры
Предложение ENTRTY_POINT указывает имя экспортируемой функции (точки входа) в модуле.
Предложение MODULE_NAME задает имя модуля, в котором находится экспортируемая функция.
По умолчанию модули должны располагаться в папке UDF корневого каталога сервера. Параметр
UDFAccess в файле firebird.conf позволяет изменить ограничения доступа к библиотекам фильтрам.
Создание BLOB фильтра с использованием номеров подтипов.
DECLARE FILTER DESC_FILTER
INPUT_TYPE 1
OUTPUT_TYPE -4
ENTRY_POINT 'desc_filter'
MODULE_NAME 'FILTERLIB';
Создание BLOB фильтра с использованием мнемоник подтипов.
DECLARE FILTER FUNNEL
INPUT_TYPE blr
OUTPUT_TYPE text
ENTRY_POINT 'blr2asc'
MODULE_NAME 'myfilterlib';
14.2. Удаление объявления BLOB фильтра
Данный оператор удаляет объявление BLOB фильтра из базы данных.
Листинг 14.2 Синтаксис оператора DROP FILTER
DROP FILTER <имя фильтра>
Удаление BLOB фильтра из базы данных делает его недоступным из базы данных.
Но динамическая библиотека, в которой расположена функция преобразования, остается нетронутой.
Примечание
Удалить объявление BLOB фильтра администратор, владелец фильтра и пользователь с привилегией DROP ANY FILTER.