Подробный формат страницы данных и записи
Рассмотрим формат страницы данных и записи более подробно.
Выборочно информацию возьмем из файла ods . h ( on disk structure ) из поставки Interbase ( firebird ) и опишем ее более подробно.
/* Page types */
#define pag_data 5 /* Data page */
Указывается, что страница данных идентифицируется номером 5.
#ifdef _CRAY
#define MIN_PAGE_SIZE 4096
#else
#define MIN_PAGE_SIZE 1024
#endif
#define MAX_PAGE_SIZE 16384
#define DEFAULT_PAGE_SIZE 4096
В данном листинге определяются размеры страницы: её максимальный и минимальный размер, а так же размер по умолчанию.
/* Basic page header */
Основной заголовок страницы
typedef struct pag {
SCHAR pag_type;
SCHAR pag_flags;
USHORT pag_checksum;
ULONG pag_generation;
ULONG pag_seqno; /*WAL seqno of last update*/
ULONG pag_offset; /*WAL offset of last update*/
} *PAG;
Определяется: тип страницы, флаги, контрольная сумма, номер последней измененной последовательности и смещение последнего изменения.
/* Data Page */
Определяется заголовок страницы данных
typedef struct dpg {
struct pag dpg_header;
SLONG dpg_sequence;
USHORT dpg_relation;
USHORT dpg_count;
struct dpg_repeat
{
USHORT dpg_offset;
USHORT dpg_length;
} dpg_rpt [1];
} *DPG;
Сначала идет стандартный заголовок страницы, далее следует номер последовательности в отношении, номер отношения, количество записей на странице. Далее следует повторяющаяся структура { смещение, длина } фрагмента записи.
/* Record header */
Заголовок записи
typedef struct rhd {
SLONG rhd_transaction;/* transaction id */
SLONG rhd_b_page; /* back pointer */
USHORT rhd_b_line; /* back line */
USHORT rhd_flags; /* flags, etc */
UCHAR rhd_format; /* format version */
#ifdef _CRAY
UCHAR rhd_pad [7];
#endif
UCHAR rhd_data [1];
} *RHD;
В заголовке записи определен номер транзакции, указатель на старую версию записи, флаги, версию формата записи и непосредственно данные.
Так же из файла ods . h можно узнать структуру фрагментированных записей и структуру записей поля blob . Но в данной статье мы не будем их рассматривать.
Далее определяются флаги записей
# define rhd _ deleted 1
Запись логически удалена
#define rhd_chain 2
Запись является старой версией
#define rhd_fragment 4
Запись является фрагментом
#define rhd_incomplete 8
Запись неполная
#define rhd_blob 16
Поле типа blob
#define rhd_delta 32
Предыдущая версия, различия только
#define rhd_large 64
Объект является большим
#define rhd_damaged 128
Объект известен , как поврежденный
#define rhd_gc_active 256
Мусор, мертвая версия записи