Файл бази даних 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 | 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 | Рядок завершується нульовим символів |