* Упаковка и распаковка данных. Один подтип хранит упакованные данные, в то время как другой обрабатывает их в распакованном виде. Фильтр BLOB может быть разработан для получения BLOB подтипа 1 (неизвестный формат) и преобразования его в сжатый формат (например, zip или гаг) и распаковки его для обработки как
SUB_TYPE 0.
* Вы можете использовать один подтип для хранения собственного кода приложения и другие для специфического системного кода и фильтр BLOB для добавления системных дополнений в собственный код, когда он требуется в запросе.
* Вы можете иметь подтип для хранения текста формата XML и фильтры BLOB для трансформации его в заданные выходные форматы - HTML, RTF, PDF, файлы UNIX, формат текстового процессора - для вывода в виде другого подтипа.
Возможности фильтров BLOB в Firebird позволяют уменьшить "разбухание", связанное с преобразованием данных для внешних процессоров. Преобразование кода в подпрограмме фильтра может быть настолько простым или сложным, насколько это требуется. Фильтры при необходимости могут вызывать другие модули, предоставляя в ваше распоряжение возможность включения существующих конвертирующих подпрограмм в ваши операции на сервере. Поскольку сам сервер имеет дело лишь с входом и выходом, в то время как ваш код фильтра поддерживается внешне, ваши фильтры могут быть изменены с учетом новейших технологий без воздействия на сервер.
Написание фильтров BLOB требует точно таких же усилий по управлению памятью и потоками, а также того же порядка действий, что и другие внешние функции, а именно:
1. Напишите фильтры и скомпилируйте их в объектные коды.
2. Создайте совместно используемую библиотеку фильтров (совместно используемый объект или DLL).
3. Сконфигурируйте сервер Firebird, чтобы он знал, где отыскать библиотеку во время выполнения.
4. Используйте DECLARE FILTER для объявления фильтров в базе данных.
5. Объявите столбцы в таблицах для хранения BLOB С тем подтипом, который "известен" фильтру.
6. Пишите приложения или модули PSQL, которым требуется фильтрация.
На уровне базы данных фильтр распознается при объявлении метаданных с использованием следующего синтаксиса:
DECLARE FILTER <���имя-фильтра>
INPUT_TYPE <���подтип>
/* идентифицирует подтип конвертируемого объекта */
OUTPUT_TYPE <���подтип>
/* идентифицирует подтип создаваемого объекта */
ENTRY_POINT '<���имя-точки-входа>'
/* имя экспортируемой функции */
MODULE_NAME '<���имя-внешней-библиотеки>';
/* имя библиотеки фильтров 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. Большое количество документов, описывающих как это делать, можно при минимальных затратах отыскать на сайтах сообщества.
Читать дальше