НАЧАЛО >> Нативный провайдер данных DP_Irbis64Native >> Формат файла .mst (Мастер-файл базы данных ИРБИС64)📄 Скачать в DOCX
Файл .mst (Master file) является основным хранилищем данных в системе ИРБИС64. В нем хранятся непосредственно сами записи: заголовки, директории меток (полей) и строковые данные значений полей/подполей.
Файл структурно разделен на две логические части:
0) и имеет фиксированный размер 36 байт.Все 32-битные бинарные числовые значения в файле записываются на диск в формате Big-Endian (Network byte order, старший байт по меньшему адресу).
64-битные значения (структура TInt64) записываются в виде двух 32-битных Big-Endian чисел: сначала младшие 4 байта (LowWord), затем старшие 4 байта (HiWord).
Управляющая запись располагается по смещению 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 байта | Резерв. Отрицательные значения не используются. |
Сама запись состоит из трех секций, которые всегда следуют строго друг за другом: Маркер (Лидер), Директория полей и Строковые данные полей.
Лидер записи занимает 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):
1 (BIT_LOG_DEL) — Запись логически удалена (Logically deleted)2 (BIT_PHYS_DEL) — Запись физически удалена (Physically deleted)32 (BIT_LAST_REC) — В мастере означает "Последняя (актуальная) версия записи".64 (BIT_LOCK_REC) — Запись заблокирована для редактированияСразу после Tlider идет массив директории полей. Количество элементов соответствует значению nvf. Каждая запись директории занимает 12 байт.
| Поле | Тип | Размер | Описание |
|---|---|---|---|
tag |
int |
4 байта | Метка поля (например, 200). ИРБИС позволяет использовать метки любой длины, конвертируемые в число. Отрицательные значения не используются (всегда >= 0). |
pos |
int |
4 байта | Смещение начала текстовых данных этого поля относительно области данных (base). Отрицательные значения не используются (всегда >= 0). |
len |
int |
4 байта | Длина текстовых данных поля в байтах. Отрицательные значения не используются (всегда >= 0). |
Текстовый блок располагается по смещению base от начала Лидера.
В нём последовательно встык идут значения полей (без терминальных нулей или символов переноса строки, разделение строго по смещениям pos и длинам len из директории).
Формат символов (Windows-1251 или UTF-8) зависит от настроек базы. Разделителями подполей обычно являются сочетания символов: традиционный "дельта" (^) или системный разделитель (например, % в некоторых внутренних процедурах ядра).
При изменении записи ИРБИС не пытается «раздвинуть» существующий блок, если размер новой версии превышает размер старой (да и в целом перезапись «на месте» практически не используется для сохранности истории). Вместо этого измененная запись целиком записывается в конец файла по смещению EOF (Tcntmst.nxt).
В поле nxt нового Лидера записывается смещение на предыдущую версию записи, создавая связанный исторический список (History/Undo Log). Файлы .mst подвержены фрагментации и со временем требуют реорганизации (Сжатия/Дефрагментации), чтобы удалить мертвые старые версии и физически удаленные записи.