Специфікація формату файлу 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 30936 Розмір довідника регіонів
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 кожного фрагмента бази даних. Кількість діапазонів у кожному повному фрагменті "Блоків в одному елементі індексу", останній фрагмент може бути не повним і містити меншу кількість діапазонів.

Розмір основного індексу підбирається з розрахунку, щоб розмір Заголовок + Індекс перших байт + Основний індекс nbsp; був кратний 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 Ціле число від -8388608 до 8388607
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 Рядок завершується нульовим символів