Буфер записи (буфер выборки данных) RowBuf

Буфер RowBuf предназначен для размещения в нем записей (выборки данных), получаемых при обработке SELECT-запроса. Записи в RowBuf могут передаваться в двоичном формате или в специфицированном. Вид представления записей устанавливается в поле PrzExe контрольного блока: значение M_BINARY (M_SPEC) задает представление выборки данных без спецификаций (со спецификациями) полей записи.

Использование значения M_BINARY (без спецификаций полей записи) предполагает знание структуры хранимой в БД информации. Такой формат выборки данных называется неспецифицированным (таблицы 3 и 4). В этом случае буфер выборки данных можно описать как структуру (с жестким типом), которая будет заполнена реальной информацией после завершения обработки запроса.

Примечание

При использовании для выборки данных структур данных необходимо помнить, что СУБД ЛИНТЕР подготавливает записи выборки данных в упакованном виде, т.е. без выравнивания полей, каждое следующее поле начинается с байта, непосредственно следующего за концом предыдущего поля.

При задании значения M_SPEC (со спецификациями полей записи) в буфер выборки данных данные помещаются вместе с их спецификацией – указанием типа данных и длины (таблица 5). Этот формат представления удобно использовать в тех случаях, когда приложение определяет структуру данных и генерирует запрос на их выборку в процессе выполнения.

Такой формат выборки данных называется специфицированным.

Специфицированный формат выборки данных удобен в том случае, когда запросы прикладной программы разнообразны (а, возможно, генерируются), и трудно отследить состав полей буфера выборки данных.

Таблица 3. Неспецифицированный формат типов данных в выборке данных
Тип данных в БДТип данных в C/C++Возвращаемое в буфере выборки данных значение
CHAR(N) char data[N] Последовательность ASCII-символов, дополненная справа пробелами до ширины поля
VARCHAR(N)
struct { L_WORD
len; char data[N]; }
Первые 2 байта – длина значения, далее последовательность ASCII-символов
BYTE(N) char data[N] Последовательность байтов, дополненная справа двоичными нулями до ширины поля
VARBYTE(N)
struct { L_WORD
len; char data[N]; }
Первые 2 байта – длина значения, далее – последовательность байтов
NCHAR(N) L_WORD data[N] Последовательность шестнадцатеричных значений UNICODE-символов, дополненная справа пробелами до ширины поля
NCHAR VARYING(N)
struct {
L_WORD len;
L_WORD data[N];
}
Первые 2 байта – длина значения, далее последовательность шестнадцатеричных значений UNICODE-символов. Длина равна 2*N, где N – число символов UNICODE
DECIMAL, NUMERICПрямого соответствия нет16 байт (см. файл decimals.h и документ «СУБД ЛИНТЕР. Библиотеки специальных типов данных», раздел «Библиотека Decimals»)
BIGINTВ 64-разрядных ОС long long/__int648-байтовое знаковое целое (от -9 223 372 036 854 775 808 до +9 223 372 036 854 775 807) (см. L_DLONG в файле int64.h)
INTВ 32-разрядных ОС long, в некоторых 64-разрядных ОС – int4-байтовое знаковое целое (от -2 147 483 648 до +2 147 483 647) (см. L_LONG в файле lintypes.h)
SMALLINTshort2-байтовое знаковое целое (от -32 768 до +32 767) (см. L_WORD в файле lintypes.h)
REALfloat4-байтовое число с плавающей точкой
DOUBLE PRECISIONdouble8-байтовое число с плавающей точкой
DATEПрямого соответствия нет16 байт, соответствует типу данных DECIMAL СУБД ЛИНТЕР (см. файл decimals.h и документ «СУБД ЛИНТЕР. Библиотеки специальных типов данных», раздел «Библиотека Decimals»)
BOOLEAN char[1] 1 байт
BLOBПрямого соответствия нет Описатель BLOB-данных (24 байта) (структура BLOB_ATR;)
EXTFILE
struct {
L_LONG filterid;
L_BYTE indextime[6];
char filename[512];
}
Описание внешнего файла (522 байта)

Таблица 4. Неспецифицированный формат псевдозначений в выборке данных

Тип данных

в БД

Тип данных

в СУБД ЛИНТЕР

Возвращаемое в буфере

выборки данных значение

Псевдостолбцы
USERDT_CHARCHAR(MAX_ID_LEN)
SYSDATEDT_DATEDATE
LAST_ROWIDDT_INTEGERINTEGER
ROWNUMDT_INTEGERINTEGER
ROWIDDT_INTEGERINTEGER
ROWTIMEDT_DATEDATE
LAST_AUTOINCDT_INTEGERINTEGER
LEVELDT_INTEGERINTEGER
LINTER_NAME_LENGTHDT_INTEGERINTEGER
TRIGGER_INFO_SIZEDT_INTEGERINTEGER
AUD_OBJ_NAME_LENDT_INTEGERINTEGER
PROC_INFO_SIZEDT_INTEGERINTEGER
PROC_PAR_NAME_LENDT_INTEGERINTEGER
Литералы
СтроковыйDT_CHARCHAR
БайтовыйDT_BYTEBYTE
UNICODEDT_NCHARNCHAR
ВещественныйDT_REALDOUBLE
С фиксированной точкойDT_REAL, DT_DECIMALDECIMAL (если помещается), иначе DOUBLE

Размер буфера для представления NULL-значения СУБД ЛИНТЕР равен длине непустого значения соответствующего типа, а содержимое этого буфера может быть любым. Для идентификации NULL-значений используется дополнительный массив – маска NULL-значений.

Таблица 5. Специфицированный формат выборки данных
ПолеТип поляСодержание
Number_Of_FieldL_WORDЧисло полей в записи буфера выборки данных
Len_Field1L_WORDДлина 1-го поля в записи буфера выборки данных
Type_Field1L_BYTEТип 1-го поля в записи буфера выборки данных
Precision_Field1L_BYTEТочность 1-го поля в записи буфера выборки данных
Scale_Field1L_BYTEМасштаб 1-го поля в записи буфера выборки данных
Reserv_Field1L_BYTEРезерв
CharSet1L_WORDНомер кодовой страницы
Len_Field2L_WORDДлина 2-го поля в записи буфера выборки данных
Type_Field2L_BYTEТип 2-го поля в записи буфера выборки данных
Precision_Field2L_BYTEТочность 2-го поля в записи буфера выборки данных
Scale_Field2L_BYTEМасштаб 2-го поля в записи буфера выборки данных
Reserv_Field2L_BYTEРезерв
CharSet2L_WORDНомер кодовой страницы
.........
Len_FieldNL_WORDДлина N-го поля в записи буфера выборки данных
Type_FieldNL_BYTEТип N-го поля в записи буфера выборки данных
Precision_FieldNL_BYTEТочность N-го поля в записи буфера выборки данных
Scale_FieldNL_BYTEМасштаб N-го поля в записи буфера выборки данных
Reserv_FieldNL_BYTEРезерв
CharSetNL_WORDНомер кодовой страницы
Field № 1Тип 1-го поля в записи буфера выборки данных Значение 1-го поля в записи буфера выборки данных
Field № 2Тип 2-го поля в записи буфера выборки данных Значение 2-го поля в записи буфера выборки данных
.........
Field № NТип N-го поля в записи буфера выборки данных Значение N-го поля в записи буфера выборки данных

Первый элемент буфера выборки данных содержит число полей буфера выборки данных (Number_Of_Field). Далее следуют описатели полей буфера выборки данных, в каждом из которых элемент Type_Field указывает тип данных поля, а элемент Len_FieldN – длину соответствующего поля. Вслед за описателями полей размещаются значения полей в том виде, в каком они представлены в БД. Тип данных полей выборки данных (значение полей Type_Field1,… Type_FieldN) указывается с помощью байтовых типов данных интерфейса нижнего уровня (см. приложение 4, inter.h).

Для получения записи выборки данных в специфицированном формате нужно присвоить флагу выполнения запроса (PrzExe) контрольного блока значение M_SPEC.

Специфицированную запись можно разобрать по отдельным полям последовательно или выборочно.

В приложении 5 приведен пример работы со специфицированным форматом.