Доступные версии документации

Дать порцию BLOB-данных

Назначение
 

Команда GBLB предназначена для чтения заданной порции BLOB-данных.

Параметры вызова

inter(CBL, NULL, NULL, [CondBuf], RowBuf);

Входные данные

Входными данными является контрольный блок CBL.

В нем должны быть заполнены поля:

Имя поля Значение
NumChan Номер канала
Command "GBLB"
RowId Начало требуемой порции BLOB-данных
LnBufRow Длина буфера выборки данных (размер требуемой порции данных в байтах)
Node Имя ЛИНТЕР-сервера
RowCount Порядковый номер BLOB-столбца
Выходные данные

Выходными данными являются:

  • контрольный блок CBL;

  • буфер выборки данных RowBuf.

В контрольном блоке будут возвращены:

Имя поля Значение
CodErr Код завершения запроса к СУБД ЛИНТЕР
LnBufRow Фактическая длина буфера выборки данных
SysErr Код состояния ОС
Описание

Максимальный размер порции BLOB-значения – 16*4048 байт.

Команда GBLB читает порцию BLOB-данных из указанного по номеру столбца текущей записи канала. Если номер BLOB-столбца не задан, то поведение команды не определено.

 

Примечания

  1. Номер столбца должен ссылаться на BLOB-столбец. Нумерация столбцов записи начинается с 1 и является абсолютной, то есть нумеруются столбцы всех типов данных, а не только BLOB. Это касается всех BLOB-команд.

  2. Команда GOBJ, используемая для выборки порции BLOB-данных из записи с одним BLOB-столбцом (т.е. без указания номера BLOB-столбца), устарела и не рекомендуется для применения.

Текущей записью в канале является последняя выбранная, добавленная или измененная запись. Таким образом, команда GBLB имеет смысл только после выполнения следующих запросов:

  • SELECT;

  • INSERT;

  • UPDATE.

Началом первой порции BLOB-значения считается 1.

Если при считывании получена неполная порция (считывание остатка), то поле LnBufRow в контрольном блоке будет равно реальному числу принятых байтов.

Команда GBLB не изменяет текущее положение записи в канале.

Примечание

Не допускается смешивать в канале обработку BLOB-команд данной таблицы и работу с иными таблицами. Это сбивает текущие настройки интерфейса нижнего уровня. Если одновременно с обработкой BLOB-данных какой-либо таблицы необходима работа с другой (другими) таблицами, то для этого следует использовать отдельный канал. Замечание касается всех BLOB-команд.

Для получения информации о типе BLOB-данных (текст, графика, музыка и т.п.) следует выполнить SELECT-запрос на чтение BLOB-столбца. При выполнении этого запроса в буфере RowBuf данные будут представлены в следующем виде:

struct BLOB_ATR
   {
   L_LONG Size;
   L_LONG Adr_First_Pag;
   L_LONG Adr_Last_Pag;
   L_BYTE NmrFil;
   L_BYTE Pad[1];
   L_BYTE modTime[6];
   L_LONG TypeObj;
   };

Поле modTime содержит время последнего обновления BLOB-значения. Сравнивается с временем последнего обновления фразового индекса в случае, когда нужно определить, следует ли использовать это BLOB-значение при очередном обновлении фразового индекса или нет.

Если BLOB-столбец имеет не NULL-значение, то в полях буфера выборки данных будет содержаться:

Имя поля Значение
Size Размер BLOB-данных
Adr_First_Pag Номер первой страницы BLOB-файла (в единицах 4 Кбайт)
Adr_Last_Pag Номер последней страницы BLOB-файла (в единицах 4 Кбайт)
NmrFil Логический номер BLOB-файла (значение от 1 до 63)
TypeObj Тип BLOB-данных (задается пользователем при загрузке этих данных; это значение СУБД ЛИНТЕР не контролирует)
Pad Резерв
modTime Дата/время последнего обновления BLOB-значения
Коды завершения
Код Описание
NORMAL Нормальное завершение
EORR Начало порции превышает размер BLOB-данных
ERRSEQCOM Неправильная последовательность команд (команда GBLB подана вне контекста текущего запроса канала)
COLNOTBLOB Заданный столбец не является BLOB-столбцом
ERRVALRANGE Неправильный номер столбца
Пример формирования команды
#include <string.h>
#include <stdlib.h>
#include "inter.h"

L_LONG LinterGBLB(TCBL *pCBL, L_LONG Position, void *Out, L_WORD OutLen,
    L_WORD numCol)
   {
   memcpy(pCBL->Command, "GBLB", 4);
   pCBL->LnBufRow=OutLen;
   pCBL->RowId=Position;
   pCBL->RowCount = numCol;
   pCBL->PrzExe &= ~Q_ASYNC;
   inter(pCBL, NULL, NULL, NULL, Out);
   return pCBL->CodErr;
   }
Пример использования команды
Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter