Читать интересную книгу Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 165 166 167 168 169 170 171 172 173 ... 238

blob handle

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

number segments

NULL, если внешняя функция не принимает BLOB в качестве входного аргумента. В противном случае задает общее количество сегментов в BLOB

max seglen

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

total size

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

blob_put segment

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

Объявление функции BLOB

Функция BLOB объявляется в базе данных с использованием DECLARE EXTERNAL FUNCTION с тем отличием, что тип ее объявления помещается перед ключевым словом RETURNS в качестве последнего аргумента в списке параметров вместо возвращаемого значения. Для аргумента RETURNS используйте ключевое слово PARAMETER и порядковый номер последнего параметра. Например, следующий оператор объявляет функцию BLOB, biob_pius_biob в модуле внешних функций с именем MyExtLib:

DECLARE EXTERNAL FUNCTION blob_plus_blob

Blob,

Blob,

Blob

RETURNS PARAMETER 3

ENTRY_POINT 'blob_concat' MODULE_NAME 'MyExtLib';

Дополнительная информация

Учебник по написанию внешних функций доступен на сайте сообщества Firebird. Множество толковых статей можно найти в базах знаний и через поисковые машины.

Фильтры BLOB

В главе 12 мы коснулись специального типа внешних функций, которые могут быть использованы в Firebird для преобразования данных BLOB между двумя форматами, способными представлять совместимые данные. Фильтры BLOB являются определенными пользователем служебными подпрограммами на стороне сервера - фактически, специализированными UDF - способными получать данные BLOB В одном формате, преобразовывать их и возвращать в виде BLOB другого формата. Один раз скомпилированный и объявленный в базе данных, фильтр BLOB может быть использован в обычных операторах DML в клиентских приложениях, хранимых процедурах, триггерах и в isql.

В 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.

1 ... 165 166 167 168 169 170 171 172 173 ... 238
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри.
Книги, аналогичгные Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри

Оставить комментарий