Выбрать главу

В SQL Firebird фильтр BLOB распознается по его подтипу SUB_TYPE. Вы уже хорошо знакомы с двумя подтипами: 0 (для BLOB любого формата) и 1 (для неформатированного или минимально форматированного текста). Они предварительно определены внутренне вместе с множеством других, которые все являются положительными числами, их Firebird использует внутренне для метаданных и синтаксического разбора. Другие фильтры BLOB определяются пользователем, и могут иметь любое отрицательное число в качестве своего подтипа.

Сервер Firebird не имеет никакого "внутреннего знания" о том, что хранится (или может храниться) в BLOB заданного подтипа: ноль или меньше нуля. Задача приложения - обеспечить, чтобы вход и выход соответствовали целям подтипов, и какие фильтры BLOB будут написаны для их обработки.

Пары фильтров BLOB могут быть использованы для управления полезным диапазоном обычных преобразований данных, требуемых вашим приложениям, приведем примеры.

* Упаковка и распаковка данных. Один подтип хранит упакованные данные, в то время как другой обрабатывает их в распакованном виде. Фильтр BLOB может быть разработан для получения BLOB подтипа 1 (неизвестный формат) и преобразования его в сжатый формат (например, zip или гаг) и распаковки его для обработки как

SUB_TYPE 0.

* Вы можете использовать один подтип для хранения собственного кода приложения и другие для специфического системного кода и фильтр BLOB для добавления системных дополнений в собственный код, когда он требуется в запросе.

* Вы можете иметь подтип для хранения текста формата XML и фильтры BLOB для трансформации его в заданные выходные форматы - HTML, RTF, PDF, файлы UNIX, формат текстового процессора - для вывода в виде другого подтипа.

Возможности фильтров BLOB в Firebird позволяют уменьшить "разбухание", связанное с преобразованием данных для внешних процессоров. Преобразование кода в подпрограмме фильтра может быть настолько простым или сложным, насколько это требуется. Фильтры при необходимости могут вызывать другие модули, предоставляя в ваше распоряжение возможность включения существующих конвертирующих подпрограмм в ваши операции на сервере. Поскольку сам сервер имеет дело лишь с входом и выходом, в то время как ваш код фильтра поддерживается внешне, ваши фильтры могут быть изменены с учетом новейших технологий без воздействия на сервер.

Написание фильтров BLOB

Написание фильтров BLOB требует точно таких же усилий по управлению памятью и потоками, а также того же порядка действий, что и другие внешние функции, а именно:

1. Напишите фильтры и скомпилируйте их в объектные коды.

2. Создайте совместно используемую библиотеку фильтров (совместно используемый объект или DLL).

3. Сконфигурируйте сервер Firebird, чтобы он знал, где отыскать библиотеку во время выполнения.

4. Используйте DECLARE FILTER для объявления фильтров в базе данных.

5. Объявите столбцы в таблицах для хранения BLOB С тем подтипом, который "известен" фильтру.

6. Пишите приложения или модули PSQL, которым требуется фильтрация.

Объявление фильтров BLOB

На уровне базы данных фильтр распознается при объявлении метаданных с использованием следующего синтаксиса:

DECLARE FILTER <имя-фильтра>

INPUT_TYPE <подтип>

/* идентифицирует подтип конвертируемого объекта */

OUTPUT_TYPE <подтип>

/* идентифицирует подтип создаваемого объекта */

ENTRY_POINT '<имя-точки-входа>'

/* имя экспортируемой функции */

MODULE_NAME '<имя-внешней-библиотеки>';

/* имя библиотеки фильтров BLOB */

Вызов фильтров BLOB

Преобразование из INPUT_TYPE В OTPUT_TYPE происходит автоматически, когда вызывается модуль MODULE_NAME с параметрами, которые были определены с корректными номерами подтипов.

Предположим, вы создаете библиотеку с именем filters.so или filters.dll, которая находится в допустимом для библиотек фильтров BLOB месте на сервере. В этой библиотеке у вас есть функция xmi_to_rtf, которая принимает BLOB, принимает текст, размеченный как XML, передает его программе, которая преобразует его в документ RTF, и, наконец, возвращает результат в новый BLOB. Вы сохраняете документы XML в BLOB SOB_TYPE -10, а тексты RTF в BLOB SUB_TYPE -15.

Во-первых, вы должны объявить фильтр BLOB В базе данных:

DECLARE FILTER XML2RTF /* ваш выбор имени */

INPUT_TYPE -10 /* текст, размеченный как XML */

OUTPUT_TYPE -15

/* текст RTF, форматированный по правилам компании */

ENTRY_POINT 'xml_to_rtf'

/* точка входа для подпрограммы преобразования */

MODULE_NAME 'filters';

/* имя библиотеки фильтров BLOB */

Теперь в вашем SQL или PSQL все, что вам нужно для автоматического вызова преобразования, это переменная или столбец базы данных, определенный как BLOB SUB_TYPE -10, содержащий ваш замечательный, правильный документ XML, и переменная или столбец подтипа -15 для получения конвертированного документа.

! ! !

СОВЕТ. Включенные в набор Firebird специальные внутренние фильтры BLOB выполняют преобразование подтипа 0 в подтип 1 (текст) и подтипа 1 в подтип 0. Эти фильтры также могут преобразовывать данные BLOB любого подтипа Firebird - например, BLR=2 в подтип 1 (текст), что может быть полезным для получения содержимого столбца системной таблицы в приложении управления базой данных. В подтипе 1 блоки сегментированы с первого символа до символа начала новой строки, со следующего символа до другого символа начала строки и т.д.

. ! .

Инструменты для написания фильтров

API Firebird содержит группу макрофункций, начинающихся с isc_biob_fiiter_, которые являются "инструментом программиста" для написания фильтров BLOB. Документы API Guide и Embedded SQL Guide из набора документов Borland по InterBase версии 6 бета имеют разделы по написанию фильтров BLOB. Большое количество документов, описывающих как это делать, можно при минимальных затратах отыскать на сайтах сообщества.

API Firebird также содержит структуры - с их заголовками в ibase.h - для передачи и чтения информации относительно BLOB. Если у вас разыгралось любопытство, посмотрите дескрипторы BLOB и буфер параметров BLOB (BPB). Группа связанных

функций может быть использована в вашем коде фильтра BLOB, а также для прямого обращения к фильтрам BLOB из вашего кода приложения.

Модули интернациональных языков

Firebird поставляется с постоянно расширяющейся библиотекой поддержки интернациональных языков и последовательностей сортировки. Четыре "базовых" языка поставляются в библиотеке fbintl (для POSIX) или fbintl.dll (для Windows). Firebird отыскивает языковые библиотеки в каталоге инсталляции /intl.

Можно писать ваши собственные наборы символов и порядки сортировки и сделать так, чтобы сервер Firebird загружал их из библиотеки совместного использования, которая должна быть названа fbintl2, чтобы ее можно было распознать и загрузить. David Brookestone Schnepper, разработчик fbintl2, подготовил языковой пакет "сделай сам", свободно доступный на http://www.ibcolIate.com.

В Firebird 1.5 и выше также возможно реализовывать пользовательские наборы символов и порядки сортировки с использованием внешних функций. Поскольку комплект поставки fbintl2 включает ясные инструкции по каждому набору символов, он также может служить справочником, если вы планируете использовать внешние функции для реализации пользовательских наборов символов.

Конфигурирование внешних размещений

Существующий внешний код и данные, к которым обращается сервер, могут оказаться слабым местом в безопасности, если файловая система сервера неадекватно защищена от вторжений или хорошо видна из сети. Такие внешние фрагменты могут быть сделаны менее уязвимыми посредством конфигурирования ограничений при доступе к ним сервера Firebird. Возможность запрета доступа к нераспознаваемому размещению помогает в обеспечении безопасности файловой системы и сети.