Создание управляющей структуры BLOB
Управляющая структура BLOB является структурой языка С, определенной в функциональном модуле в виде typedef. Программисты должны описать такую управляющую структуру на языке С, т. е. должны написать следующее:
typedef struct blob {
short (*blob_get_segment)();
isc_blob_handle blob_handle;
long number_segments;
long max_seglen;
long total_size;
void (*blob_put_segment)();
} *Blob;
Табл. 36.1 описывает поля в управляющей структуре BLOB.
Таблица 36.1. Поля в управляющей структуре BLOB [145] Определена в ibase.h как blobcallback (структурный тип) и BLOBCALLBACK (указатель на структурный тип). Это объявление дает полное определение для функций чтения/записи указателей, которые упрощают использование их в современных компиляторах. См. также примечания перед объявлением в ibase.h.
Поле
|
Описание
|
blob get segment
|
NULL, если внешняя функция не принимает BLOB в качестве входного аргумента. Иначе это поле является указателем на функцию, которая вызывается для чтения сегмента BLOB. Данная функция получает четыре аргумента: дескриптор BLOB, адрес буфера для сегмента BLOB, размер буфера и адрес переменной для хранения размера сегмента BLOB
|
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. Множество толковых статей можно найти в базах знаний и через поисковые машины.
В главе 12 мы коснулись специального типа внешних функций, которые могут быть использованы в Firebird для преобразования данных BLOB между двумя форматами, способными представлять совместимые данные. Фильтры BLOB являются определенными пользователем служебными подпрограммами на стороне сервера - фактически, специализированными UDF - способными получать данные BLOB В одном формате, преобразовывать их и возвращать в виде BLOB другого формата. Один раз скомпилированный и объявленный в базе данных, фильтр BLOB может быть использован в обычных операторах DML в клиентских приложениях, хранимых процедурах, триггерах и в isql.
В SQL Firebird фильтр BLOB распознается по его подтипу SUB_TYPE. Вы уже хорошо знакомы с двумя подтипами: 0 (для BLOB любого формата) и 1 (для неформатированного или минимально форматированного текста). Они предварительно определены внутренне вместе с множеством других, которые все являются положительными числами, их Firebird использует внутренне для метаданных и синтаксического разбора. Другие фильтры BLOB определяются пользователем, и могут иметь любое отрицательное число в качестве своего подтипа.
Сервер Firebird не имеет никакого "внутреннего знания" о том, что хранится (или может храниться) в BLOB заданного подтипа: ноль или меньше нуля. Задача приложения - обеспечить, чтобы вход и выход соответствовали целям подтипов, и какие фильтры BLOB будут написаны для их обработки.
Пары фильтров BLOB могут быть использованы для управления полезным диапазоном обычных преобразований данных, требуемых вашим приложениям, приведем примеры.
Читать дальше