Формат файла .mst (Мастер-файл базы данных ИРБИС64)


НАЧАЛО >> Нативный провайдер данных DP_Irbis64Native >> Формат файла .mst (Мастер-файл базы данных ИРБИС64)📄 Скачать в DOCX


Файл .mst (Master file) является основным хранилищем данных в системе ИРБИС64. В нем хранятся непосредственно сами записи: заголовки, директории меток (полей) и строковые данные значений полей/подполей.

1. Физическая структура

Файл структурно разделен на две логические части:

  1. Управляющая запись базы данных (Header / Master File Control Record), которая всегда находится в самом начале файла (смещение 0) и имеет фиксированный размер 36 байт.
  2. Массив записей (Record Data), которые последовательно дописываются в файл. Размер каждой записи варьируется в зависимости от объема данных.

1.1. Порядок байт (Endianness)

Все 32-битные бинарные числовые значения в файле записываются на диск в формате Big-Endian (Network byte order, старший байт по меньшему адресу). 64-битные значения (структура TInt64) записываются в виде двух 32-битных Big-Endian чисел: сначала младшие 4 байта (LowWord), затем старшие 4 байта (HiWord).


2. 1. Управляющая запись (Tcntmst)

Управляющая запись располагается по смещению 0 и занимает 36 байт.

Поле Тип Размер Описание
ctlmfn int 4 байта Максимальный (или контрольный) выделенный MFN (Master File Number) в базе данных. Отрицательные значения не используются (всегда >= 0).
nxtmfn int 4 байта Следующий MFN, который будет присвоен новой записи при её создании. Отрицательные значения не используются (всегда > 0).
nxt TInt64 (struct) 8 байт 64-битное смещение на конец файла (EOF) или первую свободную позицию, куда будет осуществляться физическая дозапись новых данных. На диске сначала записывается LowWord (младшие 4 байта), а затем HiWord (старшие 4 байта). Значение всегда >= 0.
netdb int 4 байта Флаг сетевого представления базы (для преобразования в формат net). Отрицательные значения не используются (обычно 0 или 1).
reccnt int 4 байта Количество записей в базе данных (введено с 01.07.2015). Отрицательные значения не используются (всегда >= 0).
mfcxx1 int 4 байта Резервное поле, традиционно используемое для хранения флага версии БД (например, содержит младшие биты 16 для обычных баз и 64 для полнотекстовых баз ИРБИС64+). Отрицательные значения не используются.
mfcxx2 int 4 байта Дополнительное поле (исторически: смещение для блокировок/мьютексов, 29.06.2015). Отрицательные значения не используются.
mfcxx3 int 4 байта Резерв. Отрицательные значения не используются.

3. 2. Структура записи в MST

Сама запись состоит из трех секций, которые всегда следуют строго друг за другом: Маркер (Лидер), Директория полей и Строковые данные полей.

3.1. 2.1 Маркер записи / Лидер (Tlider)

Лидер записи занимает 32 байта и содержит базовую информацию о её составе и статусе.

Поле Тип Размер Описание
mfn int 4 байта Номер записи в базе данных (MFN). Отрицательные значения не используются (всегда > 0).
mfrl int 4 байта Физическая длина записи в байтах (Лидер + Директория + Текстовые данные). Разница между смещением начала записи и её концом. Отрицательные значения не используются (всегда > 0).
nxt TInt64 (struct) 8 байт Смещение на предыдущую физическую копию записи в .mst файле. Используется для механизма истории изменений (Undo) и откатов. На диске сначала записывается LowWord, затем HiWord. Если предыдущей версии нет, равно 0. Отрицательные значения не используются.
base int 4 байта Базовое смещение от начала Tlider до области текстовых данных. Вычисляется как: 32 + (nvf * 12). Отрицательные значения не используются (всегда > 0).
nvf int 4 байта Число полей в записи (количество элементов в Директории записи). Отрицательные значения не используются (всегда >= 0).
version int 4 байта Номер версии записи (инкрементируется при каждом сохранении/изменении). Отрицательные значения не используются (всегда >= 0).
status int 4 байта Битовые флаги статуса записи. Отрицательные значения не используются (всегда >= 0).

Основные флаги статуса (совпадают с флагами XRF):

3.2. 2.2 Директория (Tenter)

Сразу после Tlider идет массив директории полей. Количество элементов соответствует значению nvf. Каждая запись директории занимает 12 байт.

Поле Тип Размер Описание
tag int 4 байта Метка поля (например, 200). ИРБИС позволяет использовать метки любой длины, конвертируемые в число. Отрицательные значения не используются (всегда >= 0).
pos int 4 байта Смещение начала текстовых данных этого поля относительно области данных (base). Отрицательные значения не используются (всегда >= 0).
len int 4 байта Длина текстовых данных поля в байтах. Отрицательные значения не используются (всегда >= 0).

3.3. 2.3 Строковые данные (Fields Data)

Текстовый блок располагается по смещению base от начала Лидера. В нём последовательно встык идут значения полей (без терминальных нулей или символов переноса строки, разделение строго по смещениям pos и длинам len из директории).

Формат символов (Windows-1251 или UTF-8) зависит от настроек базы. Разделителями подполей обычно являются сочетания символов: традиционный "дельта" (^) или системный разделитель (например, % в некоторых внутренних процедурах ядра).

4. Принцип добавления и изменения записей

При изменении записи ИРБИС не пытается «раздвинуть» существующий блок, если размер новой версии превышает размер старой (да и в целом перезапись «на месте» практически не используется для сохранности истории). Вместо этого измененная запись целиком записывается в конец файла по смещению EOF (Tcntmst.nxt). В поле nxt нового Лидера записывается смещение на предыдущую версию записи, создавая связанный исторический список (History/Undo Log). Файлы .mst подвержены фрагментации и со временем требуют реорганизации (Сжатия/Дефрагментации), чтобы удалить мертвые старые версии и физически удаленные записи.