Спецификация формата файла SxGeo v2.1

Файл базы данных Sypex Geo версии 2.1 (сокращенно SxGeo v2.1) состоит из:

  1. Заголовок
  2. Индекс первых октетов (байт)
  3. Основной индекс
  4. Диапазоны IP
  5. Справочник регионов (опционально)
  6. Справочник городов (опционально)

Рассмотрим их подробнее.

1. Заголовок

Заголовок содержит 32 байта информации о содержимом БД. Структура заголовка, а также значения для примера, представлены в следующей таблице.

Смещение Размер Значение Описание
1 0 3 SxG Идентификатор файла, "SxG"
2 3 1 21 Версия файла (21 => 2.1)
3 4 4 0 Время создания (Unix timestamp)
4 8 1 2 Парсер (0 - Universal, 1 - SxGeo Country, 2 - SxGeo City, 11 - GeoIP Country, 12- GeoIP City, 21 - ipgeobase)
5 9 1 0 Кодировка (0 - UTF-8, 1 - latin1, 2 - cp1251)
6 10 1 224 Элементов в индексе первых байт (до 255)
7 11 2 2840 Элементов в основном индексе (до 65 тыс.)
8 13 2 1034 Блоков в одном элементе индекса (до 65 тыс.)
9 15 4 1 877 608 Количество диапазонов (до 4 млрд.)
10 19 1 Размер ID-блока в байтах (1 для стран, 3 для городов)
11 20 2 46  Максимальный размер записи региона (до 64 КБ)
12 22 2 51 Максимальный размер записи города (до 64 КБ)
13 24 4 30 936 Размер справочника регионов
14 28 4 2 820 691 Размер справочника городов

Примечание: для хранения чисел используется порядок байт - от старшего к младшему (big-endian). Все числа являются беззнаковыми целыми.

2. Индекс первых байт (октетов)

Индекс первых байт состоит из 4-байтных чисел содержащих смещение в базе для каждого первого байта. 4 байта вместо 3-х выбрано в силу значительно большей скорости преобразования 4-байтных чисел и незначительном увеличении занимаемого места. Содержит 224 значения от 0 до 223, так как адреса с 224 и выше зарезервированы (но предусмотрена возможножность увеличения этого значения до 255).

3. Основной индекс

Основной индекс делит базу данных на равные фрагменты. Количество таких фрагментов может меняться и равняется значению "Элементов в основном индексе" в Заголовке. Каждый элемент индекса состоит из 4-байт, представляющих собой первый IP каждого фрагмента базы данных. Количество диапазонов в каждом полном фрагменте "Блоков в одном элементе индекса", последний фрагмент может быть не полным, и содержать меньшее количество диапазонов.

Размер основного индекса подбирается из расчета, чтобы размер Заголовок + Индекс первых байт + Основной индекс  был кратен 4096, и чтобы количество блоков в одном элементе индекса было не более 2000. По умолчанию, для баз данных с городами в основном индексе - 2840 элементов. Указанные значения рекомендуемые, но не обязательные.

4. Диапазоны

Диапазоны хранятся в виде 3 байт (IP начала диапазона без первого байта) + от 1 до 4 байт хранящих ID объекта либо смещение записи в справочнике. Конечные диапазоны не хранятся. Во время создания базы данных при обнаружении "дырок" между двумя диапазонами - между ними автоматически вставляется пустой диапазон со значением ID равным 0. Таким образом база данных покрывает абсолютно все IP, и концом текущего диапазона всегда является начало следующего диапазона.

Размер ID указывается в Заголовке (Размер ID-блока), а возвращать этот ID или нужно смотреть справочник зависит от типа базы данных указанного в Заголовке.

5. Справочник регионов

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

Справочник регионов является опциональным.

6. Справочник городов

Города хранятся в виде чисел в бинарном виде, после которых идут строки с нулевым символом в конце. По полученному смещению считывается строка максимальной для города длины, после чего из начала строки преобразуется в заданное количество чисел, а остаток строки разбивается по нулевому символу.

Справочник городов является опциональным.