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 позволяет изменить ограничения доступа к библиотекам фильтрам.

Пример 1.

Создание BLOB фильтра с использованием номеров подтипов.

DECLARE FILTER DESC_FILTER
INPUT_TYPE 1
OUTPUT_TYPE -4
ENTRY_POINT 'desc_filter'
MODULE_NAME 'FILTERLIB';
Пример 2.

Создание 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.