Файл бази даних Sypex Geo версії 2.1 (скорочено SxGeo v2.1) складається з:
- Заголовок
- Індекс перших октетів (байт)
- Основний індекс
- Діапазони IP
- Довідник регіонів (опціонально)
- Довідник міст (опціонально)
Розглянемо їх докладніше.
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 | 3 | Розмір ID-блоку в байтах (1 для країн, 3 для міст) |
11 | 20 | 2 | 46 | Максимальний розмір запису регіону (до 64 КБ) |
12 | 22 | 2 | 51 | Максимальний розмір запису міста (до 64 КБ) |
13 | 24 | 4 | 30936 | Розмір довідника регіонів |
14 | 28 | 4 | 2 820 691 | Розмір довідника міст |
Примітка: для зберігання чисел використовується порядок байт - від старшого до молодшого (big-endian). Усі числа є беззнаковими цілими.
2. Індекс перших байт (октетів)
Індекс перших байт складається з 4-байтних чисел, що містять зміщення в базі для кожного першого байта. 4 байти замість 3-х вибрано з значно більшої швидкості перетворення 4-байтних чисел і незначному збільшенні займаного місця. Містить 224 значення від 0 до 223, так як адреси з 224 і вище зарезервовані (але передбачена можливість збільшення цього значення до 255).
3. Основний індекс
Основний індекс ділить базу даних на рівні фрагменти. Кількість таких фрагментів може змінюватись і дорівнює значенню "Елементів в основному індексі" в Заголовку. Кожен елемент індексу складається з 4-байт, що є першим IP кожного фрагмента бази даних. Кількість діапазонів у кожному повному фрагменті "Блоків в одному елементі індексу", останній фрагмент може бути не повним і містити меншу кількість діапазонів.Розмір основного індексу підбирається з розрахунку, щоб розмір Заголовок + Індекс перших байт + Основний індекс nbsp; був кратний 4096, і щоб кількість блоків в одному елементі індексу було не більше 2000. За замовчуванням, для баз даних з містами в основному індексі -2840 елементів. Вказані значення рекомендовані, але не є обов'язковими.
4. Діапазони
Діапазони зберігаються у вигляді 3 байт (IP початку діапазону без першого байта) + від 1 до 4 байт зберігають ID об'єкта або зміщення запису в довіднику. Кінцеві діапазони не зберігаються. Під час створення бази даних при виявленні "дірок" між двома діапазонами - між ними автоматично вставляється порожній діапазон зі значенням ID рівним 0. Таким чином база даних покриває абсолютно всі IP, і кінцем поточного діапазону завжди є початок наступного діапазону.
Розмір ID вказується в Заголовку (Розмір ID-блоку), а повертати цей ID або потрібно дивитися довідник залежить від типу бази даних, зазначеного в Заголовку.
5. Довідник регіонів
Регіони зберігаються у вигляді рядків з нульовим символом наприкінці. За отриманим зміщенням зчитується рядок максимального для запису регіону довжини (зазначено в Заголовку), після чого рядок розбивається за нульовим символом і видається необхідна кількість елементів.
Довідник регіонів є опціональним.
6. Довідник міст
Міста зберігаються у вигляді чисел у бінарному вигляді, після яких йдуть рядки з нульовим символом наприкінці. За отриманим зміщенням зчитується рядок максимальної для міста довжини, після чого з початку рядка перетворюється на задану кількість чисел, а залишок рядка розбивається за нульовим символом.
Довідник міст є опціональним.