Файл базы данных Sypex Geo версии 2.2 (сокращенно SxGeo v2.2) состоит из:
- Заголовок
- Индекс первых октетов (байт)
- Основной индекс
- Диапазоны IP
- Справочник регионов (опционально)
- Справочник стран (опционально)
- Справочник городов (опционально)
Рассмотрим их подробнее.
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 | 3 | Размер 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 | Строка завершающаяся нулевым символов |





