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

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

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

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

1. Заголовок

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

Смещение Размер Значение Описание
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 1756 Элементов в основном индексе (до 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 Размер справочника городов
15 32 2 62 Максимальный размер записи страны(до 64 КБ)
16 34 4 4 959 Размер справочника стран
17 38 2 140 Размер описания формата упаковки города/региона/страны
18 40 N Описания формата упаковки города/региона/страны

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

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

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

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

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

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

4. Диапазоны

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

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

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

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

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

6. Справочник стран

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

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

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

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

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

Универсальный формат упаковки данных

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

Код Тип Размер Описание
t tinyint signed 1 Целое число от -128 до 127
T tinyint unsigned 1 Целое число от 0 до 255
s smallint signed 2 Целое число от -32 768 до 32 767
S smallint unsigned 2 Целое число от 0 до 65 535
m mediumint signed 3 Целое число от -8 388 608 до 8 388 607
M mediumint unsigned 3 Целое число от 0 до 16 777 215
i integer signed 4 Целое число от -2 147 483 648 до 2 147 483 647
I integer unsigned 4 Целое число от 0 до 4 294 967 295
f float 4 4-байтовое число одиночной точности с плавающей запятой
d double 8 8-байтовое число двойной точности с плавающей запятой
n# number 16bit 2 Число (2 байта) с фиксированным количеством знаков после запятой. После n указывается количество цифр после запятой
N# number 32bit 4 Число (4 байта) с фиксированным количеством знаков после запятой. После N указывается количество цифр после запятой
c# char N Строка фиксированного размера. После с указывается количество символов
b blob N Строка завершающаяся нулевым символов