Дать порцию 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-столбца не задан, то поведение команды не определено.
Примечания
-
Номер столбца должен ссылаться на BLOB-столбец. Нумерация столбцов записи начинается с 1 и является абсолютной, то есть нумеруются столбцы всех типов данных, а не только BLOB. Это касается всех BLOB-команд.
-
Команда
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; }