Описание структуры
файлов Successware Database Engine (SIx)
Структура
таблиц(.DBF)
Файл базы данных
состоит из записи заголовка и записей с данными.
В записи заголовка определяется структура базы
данных и содержится вся другая информация,
относящаяся к базе данных. В файле она начинается
с нулевой позиции.
Записи с данными следуют за заголовком
(байты располагаются последовательно) и включают
в себя фактическое содержимое полей. Длина
записи (в байтах) определяется суммированием
указанных длин всех полей.
Запись
заголовка .DBF файлa
Байты |
Описание |
00 |
Тип файла:
0x03 без memo-поля
0xE5 с мемо полем |
01-03 |
Дата последнего изменения ГГММДД, где ГГ
записывается со смещением -0x30 |
04-07 |
Число записей в файле |
08-09 |
Положение первой записи с данными |
10-11 |
Длина одной записи с данными (включая
признак удаления) |
12-27 |
Зарезервированы |
28 |
0x00 файл НЕ содержит
структурный .NSX
0x01 файл содержит структурный .NSX |
29 |
Зарезервирован |
30-31 |
Зарезервировано, содержит 0x00 |
32..32x(n+1) |
Подзаписи полей, где n - число полей |
32x(n+1)+1 |
Признак завершения записи заголовка 0x0D |
Подзаписи полей
Байты |
Описание |
00-10 |
Название поля (максимально - 10 символов,
если меньше 10, то дополняется пустым символом (0х00)) |
11 |
Тип данных:
C Character (символьный)
N Numeric (числовой)
D Date (дата)
L Logical (логический)
M Memo |
12-15 |
Зарезервировано |
16 |
Длина поля (в байтах) |
17 |
Длина дробной части в байтах |
18 |
Зарезервирован |
19-32 |
Зарезервировано |
|
Примечания по
структуре файла с данными:
- Данные в файле с данными
начинаются с позиции, указываемой в записи
заголовка в байтах 08-09.
- Записи с данными начинаются с
байта, содержащего признак удаления. Если в этот
байт занесен пробел в коде ASCII (0х20), то запись не
удалялась; если же в первом байте - звездочка (0х2A),
то запись удалена.
- За признаком удаления следуют
данные из полей, названия которых находятся в
подзаписях полей.
- Количество полей определяет
число подзаписей полей. В базе данных для каждого
поля существует одна подзапись поля.
- Поле memo состоит из : 0x0008 - 2 байта,
длины записи в файле .SMT - 4 байта, номера блока в
файле .SMT - 4 байта.
Структура memo файла
(.SMT)
Memo файл содержит
одну запись заголовка и произвольное число
блочных структур. В записи заголовка
располагается указатель на следующий свободный
блок и размер блока в байтах. Размер
устанавливается командой SET BLOCKSIZE при создании
файла. Запись заголовка начинается с нулевой
позиции файла и занимает 512 байтов. За записью
заголовка следуют блоки, в которых содержится
и текст memo. В файл базы данных (в memo поле)
включены: длина записи и номер блока, который
используются для ссылки на блоки memo.
Расположение блока в файле memo определяется
умножением номера блока на размер блока. Все
блоки memo начинаются с четных адресов границ
блоков. Блок memo может занимать более, чем один
последовательный блок.
Записи с данными следуют за заголовком
(байты располагаются последовательно) и включают
в себя фактическое содержимое полей.
Запись
заголовка .SMT файлa
Байты |
Описание |
00-03 |
Расположение следующего свободного
блока |
04-07 |
Размер блока (число байт в блоке) |
08-511 |
Произвольное выражение,обычно содержит
строку "SIxMemo" |
512... |
Блочные структуры |
Запись
блока memo
Байты |
Описание |
00-n |
Текст мемо поля, где n - длина текста |
n
-
граница
след.
блока |
Заполняется нулями (0x00) |
|
Структура
индексного файла (.NSX)
В индексных
файлах располагается одна запись заголовка, одна
или больше записей заголовков тагов и одна или
больше записей вершин для каждого тега. В записи
заголовка находится информация о корневой
вершине, текущем размере файла, длине ключа,
особенностях индекса, а также представление
ключа* в коде ASCII, и выражения FOR. Запись заголовка
начинается с нулевой позиции файла. Во всех
других записях вершин содержится атрибут,
количество существующих ключей. Помимо этого, в
них находится группа символов, представляющая
номер записи (в таблице .DBF), значение ключа, и
если это внутренняя вершина указатель на вершину
нижнего уровня. Размер каждой записи вершины
равен 1024 байтам.
Запись
заголовка .NSX файлa
Байты |
Описание |
00-01 |
Атрибут вершины (0x0069) |
02-03 |
Количество тагов в файле |
04-05 |
Зарезервировано |
06-09 |
Указатель на свободную вершину (-1, если
таковая отсутствует) |
10-13 |
Указатель на конец файла (конец файла) |
14..1023 |
Список указателей на заголовок тега |
Запись
указателя на заголовок тега
Байты |
Описание |
00-11 |
Имя тага, заканчивается 0x00 |
12-15 |
Указатель на вершину тега |
Запись
заголовка тега
Байты |
Описание |
00-01 |
Атрибут (0x0069) |
02-05 |
Указатель на корневую вершину |
06-07 |
Тип ключа:
0x4000 - символьный
0x0008 - числовой
0x0020 - дата |
08-09 |
Длина ключа |
10-15 |
Особенности индекса (любое из
нижеследующих значений, либо их сумма):
0x00000001 - индекс имеет дополнительный оператор FOR
0xFFFF0000 - индекс имеет дополнительный оператор DESC |
16-272 |
Выражение ключа(не компилируется) |
273-529 |
Выражение оператора FOR |
530-1023 |
Заполняется нулями (0x00) |
Запись внутренней вершины
Байты |
Описание |
00 |
Атрибут вершины (любое из нижеследующих
числовых значений либо их сумма):
0x00 - внутренняя вершина
0x01 - корневая вершина |
01 |
Число байт, используемых для записи
номеров записей из таблицы .DBF на этой странице |
02-03 |
Количество ключей на странице |
04-07 |
Указатель вершину нижнего уровня слева |
08-1023 |
Список элементов внутренней вершины |
Запись элемента внутренней вершины
Байты |
Описание |
00-03 |
Указатель на вершину нижнего уровня |
03-03+k |
Номер записи в .DBF файле, где k -
количество байт используемых для записи номера
записи |
04+k-04+k+l |
Значение ключа, где l - длина ключа |
Запись внешней вершины
Байты |
Описание |
00 |
Атрибут вершины (любое из нижеследующих
числовых значений либо их сумма):
0x01 - корневая вершина
0x02 - вершина-лист |
01 |
Число байт, используемых для записи
номеров записей из таблицы .DBF на этой странице |
02-03 |
Количество ключей на странице |
04-05 |
Число используемых в вершине байт |
08-1023 |
Список элементов внешней вершины:
номер записи*,число байт занятых данным
элементом, число байт из предыдущего ключа**,
недостающая часть ключа (может быть упакована)*** |
|
* - Количество
байт используемых для номера записи указывает
байт 01 в заголовке внешней вершины
** - Предыдущим ключом для первого
является ключ вершины верхнего уровня
*** - Eсли последовательность повторяющихся
байт больше 3, то эту последовательность
заменяется 3-мя байтами: первый всегда -1 (0xFF),
второй указавает число повторений, третий - это
повторяющееся значение. Если в значении ключа
встречается байт -1(0xFF), то он заменяется
последовательностью из 2-х байт -1 1 (0xFF 0x01).
Примечания по
структуре индексного файла:
Если числа
используются в качестве ключей, или в качестве
ключей используются даты, то они подвергаются
специальной обработке. Они преобразовываются
согласно нижеследующему способу таким образом,
чтобы их можно было отсортировать с помощью
такой же схемы упорядочения в коде ASCII, что и
символы:
а) преобразовать число (или дату) в
формат с плавающей точкой IEEE,
б) если число отрицательное, взять
логическое дополнение числа (изменить на
противоположные все 64 бита, 1 на 0 и 0 на 1), иначе
инвертировать только самый левый бит
в) изменить на противоположный
порядок байтов с порядка Intel на порядок слева
направо.