Файл базы данных 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 | Строка завершающаяся нулевым символов |