Pour la mise en place d'un système de géolocalisation sous FirebirdSQL via les données de IPLIGENCE vous avez besoins d'une table dont la structure est représenté ci-dessous :
1: CREATE TABLE MP_IPLIGENCEMAX (
2: IP_FROM NUMERIC(11, 0) NOT NULL,
3: IP_TO NUMERIC(11, 0) NOT NULL,
4: COUNTRY_CODE VARCHAR(10),
5: COUNTRY_NAME VARCHAR(255),
6: CONTINENT_CODE VARCHAR(10),
7: CONTINENT_NAME VARCHAR(255),
8: TIME_ZONE VARCHAR(10),
9: REGION_CODE VARCHAR(10),
10: REGION_NAME VARCHAR(255),
11: OWNER VARCHAR(255),
12: CITY_NAME VARCHAR(255),
13: COUNTY_NAME VARCHAR(255),
14: LATITUDE FLOAT,
15: LONGITUDE FLOAT);
16:
17:
18: CREATE INDEX IDX_MP_IPLIGENCEMAX ON MP_IPLIGENCEMAX(IP_FROM);
19:
20: CREATE INDEX IDX_MP_IPLIGENCEMAX1 ON MP_IPLIGENCEMAX(IP_TO);
21:
22: CREATE INDEX IDX_MP_IPLIGENCEMAX2 ON MP_IPLIGENCEMAX(COUNTRY_CODE);
23:
24: CREATE INDEX IDX_MP_IPLIGENCEMAX3 ON MP_IPLIGENCEMAX(CONTINENT_CODE);
25:
26: CREATE INDEX IDX_MP_IPLIGENCEMAX4 ON MP_IPLIGENCEMAX(IP_FROM,IP_TO);
et pour ne pas perdre une journée à attendre que les deux millions d'enregistrements s'importent à leurs aise, je vous conseille de créer un table externe comme ci-dessous:
1: CREATE TABLE EXT_IPLIGENCE6 EXTERNAL '/fbdatas/ipligence-max.txt' (
2: IP_FROM CHAR(11),
3: IP_TO CHAR(11),
4: COUNTRY_CODE CHAR(10),
5: COUNTRY_NAME CHAR(255),
6: CONTINENT_CODE CHAR(10),
7: CONTINENT_NAME CHAR(255),
8: TIME_ZONE CHAR(10),
9: REGION_CODE CHAR(10),
10: REGION_NAME CHAR(255),
11: OWNER CHAR(255),
12: CITY_NAME CHAR(255),
13: COUNTY_NAME CHAR(255),
14: LATITUDE CHAR(18),
15: LONGITUDE CHAR(18),
16: CTRL CHAR(2));
ensuite l'insertion ne prends que moins de cinq minutes via la requête suivant :
1: insert into MP_IPLIGENCEMAX
2: SELECT
3: cast(trim(IP_FROM) as numeric(11)),
4: cast(trim(IP_TO) as numeric(11)),
5: trim(COUNTRY_CODE),
6: trim(COUNTRY_NAME),
7: trim(CONTINENT_CODE),
8: trim(CONTINENT_NAME),
9: trim(TIME_ZONE),
10: trim(REGION_CODE),
11: trim(REGION_NAME),
12: trim(OWNER),
13: trim(CITY_NAME),
14: trim(COUNTY_NAME),
15: cast(trim(LATITUDE) as float),
16: cast(trim(LONGITUDE) as float)
17: from EXT_IPLIGENCE6
ensuite, pour tester si tout est correct vous pouvez effectuer la requête suivante :
1: SELECT *
2: FROM MP_IPLIGENCEMAX
3: WHERE
4: fnIPTOLONGIP('217.112.189.18') between IP_FROM and IP_TO
IP_FROM | IP_TO | COUNTRY_CODE | COUNTRY_NAME | CONTINENT_CODE | CONTINENT_NAME | TIME_ZONE | REGION_CODE | REGION_NAME | OWNER | CITY_NAME | COUNTY_NAME | LATITUDE | LONGITUDE |
3648043264 | 3648044543 | BE | BELGIUM | EU | EUROPE | GMT+1 | | | BELCENTER ADSL NETWORK | BRUSSELS | | 50,83000183 | 4,329999924 |
Plan:
PLAN (MP_IPLIGENCEMAX INDEX (IDX_MP_IPLIGENCEMAX1, IDX_MP_IPLIGENCEMAX))
Adapted plan:
PLAN (MP_IPLIGENCEMAX INDEX (IDX_MP_IPLIGENCEMAX1, IDX_MP_IPLIGENCEMAX))
------ QUERY PERFORMANCE ------
Prepare : 15 ms
Execute : 15 ms
Avg fetch time : 85 ms
----------- MEMORY ------------
Current : 22,27 MB
Max : 35,36 MB
Buffers : 2048
------ TABLE OPERATIONS -------
Table name : MP_IPLIGENCEMAX
Idx reads : 1
Non-idx reads : 0
Updates : 0
Deletes : 0
Inserts : 0