DBF (Структура базы данных)

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

Байты
Описание

00
Типы файлов с данными:
FoxBASE+/dBASE III +, без memo — 0х03
FoxBASE+/dBASE III +, с memo — 0х83
FoxPro/dBASE IV, без memo — 0х03
FoxPro с memo — 0хF5
dBASE IV с memo — 0x8B

01-03
Последнее изменение (ГГММДД)

04-07
Число записей в файле

08-09
Положение первой записи с
данными

10-11
Длина одной записи с данными (включая
признак удаления)

12-27
Зарезервированы

28
1-есть структ.составной инд.файл
(типа .CDX),0-нет

29-31
Зарезервированы

32-n
Подзаписи полей**

n+1
Признак завершения записи
заголовка (0х01)

Подзаписи полей

Байты
Описание

00-10
Название поля (максимально — 10
символов, если меньше 10, то дополняется
пустым символом (0х00))

11
Тип данных
C — символьное
N — числовое
L — логическое
M — типа memo
D — дата
F — с плавающей точкой
P — шаблон

12-15
Расположение поля внутри записи

16
Длина поля (в байтах)

18-32
Зарезервированы

Примечания по структуре файла с данными.

* Данные в файле с данными начинаются с позиции, указываемой в записи заголовка в байтах 08-09. Записи с данными начинаются с байта, содержащего признак удаления. Если в этот байт занесен пробел в коде ASCII (0х20), то запись не удалялась; если же в первом байте — звездочка (0х2A), то запись удалена. За признаком удаления следуют данные из полей, названия которых находятся в подзаписях полей.

** Количество полей определяет число подзаписей полей. В базе данных для каждого поля существует одна подзапись поля.

*** Ограничения по количеству знаков в записи, максимальному числу полей и т.д.  смотрите в данном приложении в таблице «Системные возможности».

Структура файла типа memo (.FPT) Файл типа memo содержит одну запись заголовка и произвольное число блочных структур. В записи заголовка располагается указатель на следующий свободный блок и размер блока в байтах. Размер устанавливается командой SET BLOCKSIZE при создании файла. Запись заголовка начинается с нулевой позиции файла и занимает 512 байтов.

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

Блок memo может занимать более, чем один последовательный блок. Запись заголовка файла типа memo

Байты
Описание

00-03
Расположение следующего
свободного блока*

04-05
Не используются

06-07
Размер блока (число байтов в
блоке)

08-511
Не используются

Заголовок блока memo и текст memo

Байты
Описание

00-03
Сигнатура блока* (указывает тип
данных в блоке)
а. 0 — шаблон (поле типа шаблон)
б. 1 — текст (поле типа memo)

04-07
Длина* memo (в байтах)

08-n
Текст memo (n=длина)

Структура файла memo в системе FoxBASE+ (типа .DBT)

Файлы memo в системе FoxBASE+ не обладают многосторонностью файлов memo системы FoxPro. В них могут содержаться только текстовые данные в коде ASCII.

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

Блоки, которые следуют за первым блоком, содержат текст полей memo из связанной базы данных. В поле memo в файле базы данных содержится номер блока в файле типа memo, который содержит настоящий текст. Все блоки memo начинаются с адресов, границы которых кратны 512 байтам.

Структура индексного файла (.IDX) В индексных файлах располагается одна запись заголовка и одна или больше записей вершин. В записи заголовка находится информация о корневой вершине, текущем размере файла, длине ключа, особенностях индекса и сигнатура, а также представление ключа* в коде ASCII, которое можно вывести на печать, и выражения FOR. Запись заголовка начинается с нулевой позиции файла.
Во всех других записях вершин содержится атрибут, количество существующих ключей и указатели на вершины, располагающиеся слева и справа (на том же уровне) от данной вершины. Помимо этого, в них находится группа символов, представляющая значение ключа, и либо указатель на вершину нижнего уровня, либо подлинный номер записи в базе данных. Размер каждой записи, которая выведена в файл, равен 512 байтам.
В приведенных ниже таблицах показан пример упорядоченной структуры дерева.
Запись заголовка индексного файла

Байты Описание

00-03 Указатель на корневую вершину

04-07 Указатель на свободную в списке вершину (-1, если таковая отсутствует)

08-11 Указатель на конец файла (размер файла)

12-13 Длина ключа

14 Особенности индекса (любое из нижеследующих числовых значений либо их сумма)
а. 1 — уникальный индекс
б. 8 — индекс имеет дополнительный оператор FOR

15 Сигнатура индекса(для использования в будущем)

16-235 Ключевое выражение (не компилируется; до 220 символов)*,***

236-455 Выражение FOR (не компилируется; до 220 символов, оканчивающееся пустым символом)

456-511 Не используются

Запись вершины индекса

Байты Описание

00-01 Атрибуты вершины (любое из нижеследующих числовых значений либо их сумма):
а. 0 — вершина индекса
б. 1 — корневая вершина
в. 2 — лист

02-03 Количество существующих ключей (0, 1 или больше)

04-07 Указатель на вершину, расположенную непосредственно слева от данной вершины (на том же уровне; -1, если отсутствует)

08-11 Указатель на вершину, расположенную непосредственно справа от данной вершины (на том же уровне; -1, если отсутствует)

12-511 До 500 символов, включающих в себя значение ключа для длины ключа с четырехбайтовым шестнадцатиричным числом (хранящемся в обычном формате слева направо): Если вершина является листом (атрибут = 02 или 03), тогда четыре байта содержат подлинный номер номер в базе данных в шестнадцатиричном формате иначе 4 байта содержат внутрииндексный указатель.**

Примечания по структуре индексного файла.
* Тип ключа не запоминается в индексе. Он должен определяться индексным выражением.
** В вершине-листе все, что отлично от символьных строк, числа, используемые в качестве значений ключей и четырехбайтовые номера представляются в байтах, порядок которых изменен на противоположный (в формате Intel 8086). *** Если числа используются в качестве ключей, то они подвергаются специальной обработке. Они преобразовываются согласно нижеследующему способу таким образом, чтобы их можно было отсортировать с помощью такой же схемы упорядочения в коде ASCII, что и символы:
а. Преобразовать число в формат с плавающей точкой IEEE.
б. Изменить на противоположный порядок байтов с порядка Intel на порядок слева направо.
в. Если число отрицательное, взять логическое дополнение числа (изменить на противоположные все 64 бита, 1 на 0 и 0 на 1), иначе инвертировать только самый левый бит. Пример упорядоченной структуры дерева Поиск ключа в приведенной ниже структуре потребует просмотра единственного пути между корневой вершиной и листом. Вершины на самом нижнем уровне являются вершинами-листьями.
Так как ключи отсортированы, то все ключи в поддереве меньше либо равны родительской вершине.

            Корневая вершина
                          :
                    --------------
                    :  :      :  :
   Указатель на --- :-1:  F,H :-1: --- Указатель на
   левую вершину    :  :      :  :     правую вершину
                    --------------
                         :  :
                  .......:  :......
                 :                 :
                 v                 v
          --------------    --------------
          :  :      :  ---->:  :      :  :
          :-1:  C,F :  :    :  :   H  :-1: --- Индексная
          :  :      :  :<----  :      :  :     вершина
          --------------    --------------
               :  :               :  :
        .......:  :......  .......:  :......
       :                 ::                 :
       v                 vv                 v
 --------------    --------------     --------------
 :  :      :  ----->:  :      :  ---->:  :      :  :
 :-1:A,B,C :  :     :  :D,E,F :  :    :  :  G,H :-1:
 :  :      :  :<-----  :      :  :<----  :      :  :
 --------------     --------------    --------------
        :                  :               :
        :..................:...............:
                           :
                   Вершины-листья

На приведенном выше рисунке в качестве значений ключей используются буквы. Обычно каждый ключ имеет четырехбайтовый шестнадцатиричный номер. Номера, соответствующие ключам в листьях, — это подлинные номера базы данных, все ключи в других вершинах — это внутрииндексные указатели, им соответствующие. Байты 12-511 в записях индексных вершин могли бы выглядеть следующим образом:

   Длина ключа (в байтах)     4 байта
                    :                  :
             .......:........ .........:.........
             :              : :                 :
                             .....................
              Значение ключа : шестнадцатиричный :
 Байт 12 --->:               :      номер        :
 записи      :...............:...................:
                             .....................
              Значение ключа : шестнадцатиричный :
             :               :      номер        :
             :...............:...................:
                             .....................
              Значение ключа : шестнадцатиричный :
             :               :      номер        :
             :...............:...................:

Комбинация из значения ключа и шестнадцатиричного номера будет заноситься в байты 12-511 n раз, где n — число существующих ключей.
Структура компактного индексного файла (типа
.IDX)
Запись заголовка компактного индексного файла

Байты
Описание

00-03
Указатель на корневую
вершину

04-07
Указатель на свободную в
списке вершину (-1, если таковая
отсутствует)

08-11
Резервируются для
внутреннего использования

12-13
Длина ключа

14
Особенности индекса (любое
из нижеследующих значений либо их сумма):
а. 1 — уникальный индекс
б. 8 — индекс имеет дополнительный
оператор FOR
в. 32 — формат компактного индекса
г. 64 — заголовок составного индекса.

15
Сигнатура индекса

16-19
Зарезервированы для
внутреннего использования

20-23
Зарезервированы для
внутреннего использования

24-27
Зарезервированы для
внутреннего использования

28-31
Зарезервированы для
внутреннего использования

32-35
Зарезервированы для
внутреннего использования

36-501
Зарезервированы для
внутреннего использования

502-503
По возрастанию или
убыванию: 0=возрастание 1=убывание

504-505
Зарезервированы для
внутреннего использования

506-507
Длина пула выражения FOR*

508-509
Зарезервированы для
внутреннего использования

510-511
Длина пула выражения FOR*

510-1023
Пул выражения ключа (не
компилируется)

 

* В этой информации отслеживается область,
используемая в пуле выражения ключа.
Запись внутренней вершины для
компактного индекса

Байты
Описание

00-01
Атрибуты вершины (любое
из нижеследующих числовых значений либо
их сумма):
0 — индексная вершина
1 — корневая вершина
2 — вершина-лист

02-03
Число существующих
ключей (0, 1 или больше)

04-07
Указатель на вершину,
расположенную непосредственно слева от
данной вершины (на том же уровне; -1 — если
отсутствует)

08-11
Указатель на вершину,
расположенную непосредственно справа
от данной вершины (на том же уровне; -1 —
если отсутствует)

12-511
До 500 символов,
включающих в себя значение ключа для
длины ключа с четырехбайтовым
шестнадцатиричным числом (хранящемся в
обычном формате слева направо):
Эта вершина всегда содержит ключ
индекса, номер записи и внутрииндексный
указатель.**
Комбинация из значения ключа и
четырехбайтового шестнадцатиричного
числа будет повторена столько раз,
количество которых задается в байтах
02-03.

Запись внешней вершины для компактного
индекса

Байты
Описание

00-01
Атрибуты вершины (любое
из нижеследующих числовых значений либо
их сумма):
0 — индексная вершина
1 — корневая вершина
2 — вершина-лист

02-03
Число существующих
ключей (0, 1 или больше)

04-07
Указатель на вершину,
расположенную непосредственно слева от
данной вершины (на том же уровне; -1 — если
отсутствует)

08-11
Указатель на вершину,
расположенную непосредственно справа
от данной вершины (на том же уровне; -1 —
если отсутствует)

12-13
Свободное для
распределения пространство в вершине

14-17
Маска номера записи

18
Маска запасного
байтового счетчика

19
Маска хвостового
байтового счетчика

20
Количество битов,
используемых для номера записи

21
Количество битов,
используемых для запасного счетчика

22
Количество битов,
используемых для хвостового счетчика

23
Количество байтов,
содержащих номер записи, запасной
счетчик и хвостовой счетчик

24-511
Ключи индексов и
информация**

** Каждый элемент состоит из номера записи,
запасного байтового счетчика и хвостового
байтового счетчика, все в сжатом виде. Текст
ключа помещается в логический конец
вершины, обрабатывается он в обратном
направлении, что позволяет находить
элементы предшествующих ключей.
Структура составного индексного файла (типа
.CDX)
Все составные индексы являются
компактными.
Для того, чтобы отслеживать в файле типа
.CDX все теги, применяется единая файловая
структура. Эта структура идентична
структуре компактного индексного файла за
одним исключением — вершины-листья на самом
нижнем уровне данной структуры ссылаются
на один из тегов в составном индексе.
Все теги в индексе имеют свою собственную
завершенную структуру, которая
тождественна структуре компактного
индекса для файла .IDX.
Системные возможности
FoxPro
Усоверш. FoxPo

Файлы индексные и
баз данных

Максимальное число
записей в файле базы данных
1миллиард*
1миллирд*

Максимальное число
символов в записи
4000
4000

Максимальное число полей
в записи
255
255

Максимальное число
одновременно открытых баз данных
25
25

Максимальное число
символов в поле базы данных
254
254

Максимальное число
символов в индексном ключе (.IDX)
100
100

Максимальное число
символов в индексном ключе (.CDX)
254
254

Максимальное число
открытых индексных файлов в базе данных
без ограничения**
без ограничения**

Максимальное число
открытых индексов во всех рабочих
областях
без ограничения**
без ограничения**

Характеристики
полей

Максимальный размер
символьных полей
254
254

Максимальный размер
числовых (и с плавающей точкой) полей
20
20

Максимальное число
символов в названиях полей
10
10

Точность цифр при
числовых │вычислениях
16
16