mysql/core_cities_merge.sql
[Pman.Core] / mysql / core_cities_merge.sql
1
2 DROP FUNCTION IF EXISTS core_cities_merge_country;
3 DELIMITER $$
4 CREATE FUNCTION core_cities_merge_country()  RETURNS INT DETERMINISTIC
5     BEGIN
6         DECLARE co_done INT DEFAULT FALSE;
7
8         DECLARE v_count INT DEFAULT 0;
9         DECLARE v_total INT DEFAULT 0;
10
11         DECLARE v_id INT DEFAULT 0;
12         DECLARE v_iso TEXT DEFAULT '';
13         DECLARE v_local_name TEXT DEFAULT '';
14 --         DECLARE v_type TEXT DEFAULT '';
15         DECLARE v_in_location INT DEFAULT 0;
16         DECLARE v_geo_lat INT DEFAULT 0;
17         DECLARE v_geo_lng INT DEFAULT 0;
18
19         DECLARE v_id_tmp INT DEFAULT 0;
20         DECLARE v_iso_tmp TEXT DEFAULT '';
21         DECLARE v_local_name_tmp TEXT DEFAULT '';
22         DECLARE v_type_tmp TEXT DEFAULT '';
23         DECLARE v_in_location_tmp INT DEFAULT 0;
24
25         DECLARE v_id_tmp_tmp INT DEFAULT 0;
26
27         DECLARE co_csr CURSOR FOR 
28         SELECT 
29             id,iso,local_name,in_location
30         FROM 
31             meta_location
32         WHERE
33             type = 'CO';
34         
35         SELECT COUNT(id) INTO v_total FROM meta_location WHERE type = 'CO';
36
37         SET v_count = 0;
38
39         OPEN co_csr;
40         co_loop: LOOP
41             FETCH co_csr INTO v_id,v_iso,v_local_name,v_in_location;
42             
43             SET v_count = v_count + 1;
44
45             SET v_id_tmp = 0;
46
47             SELECT id INTO v_id_tmp FROM core_geoip_country WHERE code = v_iso;
48
49             IF(v_id_tmp = 0) THEN
50                 INSERT INTO core_geoip_country (code, name, continent_id) VALUES (v_iso, v_local_name, 0);
51             END IF;
52                 
53             IF v_count = v_total THEN
54               LEAVE co_loop;
55             END IF;
56
57         END LOOP;
58         CLOSE co_csr;
59
60
61         RETURN v_count;
62     END $$
63 DELIMITER ; 
64
65
66
67
68 DROP FUNCTION IF EXISTS core_cities_merge_division;
69 DELIMITER $$
70 CREATE FUNCTION core_cities_merge_division()  RETURNS INT DETERMINISTIC
71     BEGIN
72         DECLARE re_done INT DEFAULT FALSE;
73         
74         DECLARE v_count INT DEFAULT 0;
75         DECLARE v_total INT DEFAULT 0;
76
77         DECLARE v_id INT DEFAULT 0;
78         DECLARE v_iso TEXT DEFAULT '';
79         DECLARE v_local_name TEXT DEFAULT '';
80 --         DECLARE v_type TEXT DEFAULT '';
81         DECLARE v_in_location INT DEFAULT 0;
82         DECLARE v_geo_lat INT DEFAULT 0;
83         DECLARE v_geo_lng INT DEFAULT 0;
84
85         DECLARE v_country_id INT DEFAULT 0;
86         DECLARE v_iso_tmp TEXT DEFAULT '';
87         DECLARE v_local_name_tmp TEXT DEFAULT '';
88         DECLARE v_type_tmp TEXT DEFAULT '';
89         DECLARE v_in_location_tmp INT DEFAULT 0;
90
91         DECLARE v_division_id INT DEFAULT 0;
92
93         DECLARE re_csr CURSOR FOR 
94         SELECT 
95             id,iso,local_name,in_location
96         FROM 
97             meta_location
98         WHERE
99             type = 'RE';
100         
101         SELECT COUNT(id) INTO v_total FROM meta_location WHERE type = 'RE';
102
103         SET v_count = 0;
104
105         OPEN re_csr;
106         re_loop: LOOP
107             FETCH re_csr INTO v_id,v_iso,v_local_name,v_in_location;
108             
109             SET v_count = v_count + 1;
110
111             SET v_country_id = 0;
112             SET v_division_id = 0;
113             SET v_iso_tmp = '';
114             SET v_local_name_tmp = '';
115             SET v_type_tmp = '';
116
117             IF v_in_location IS NOT NULL THEN
118                 SELECT iso, local_name, type INTO v_iso_tmp, v_local_name_tmp, v_type_tmp FROM meta_location WHERE id = v_in_location;
119
120                 SELECT id INTO v_country_id FROM core_geoip_country WHERE code = v_iso_tmp;
121                 
122             END IF;
123
124             SELECT id INTO v_division_id FROM core_geoip_division WHERE (name = v_local_name OR (name LIKE (CONCAT('%', v_local_name, '%')) AND code = SUBSTRING_INDEX(v_iso, '-', -1)) AND country_id = v_country_id;
125
126             IF(v_division_id = 0) THEN
127                 
128                 INSERT INTO core_geoip_division (code, name, country_id) VALUES (v_iso, v_local_name, v_country_id);
129             END IF;
130
131 --             ITERATE re_loop;
132                 
133             IF v_count = v_total THEN
134               LEAVE re_loop;
135             END IF;
136
137         END LOOP;
138         CLOSE re_csr;
139
140         RETURN v_count;
141     END $$
142 DELIMITER ; 
143
144
145
146 DROP FUNCTION IF EXISTS core_cities_merge_city;
147 DELIMITER $$
148 CREATE FUNCTION core_cities_merge_city()  RETURNS INT DETERMINISTIC
149     BEGIN
150         DECLARE ci_done INT DEFAULT FALSE;
151
152         DECLARE v_count INT DEFAULT 0;
153         DECLARE v_total INT DEFAULT 0;
154
155         DECLARE v_id INT DEFAULT 0;
156         DECLARE v_iso TEXT DEFAULT '';
157         DECLARE v_local_name TEXT DEFAULT '';
158 --         DECLARE v_type TEXT DEFAULT '';
159         DECLARE v_in_location INT DEFAULT 0;
160         DECLARE v_geo_lat INT DEFAULT 0;
161         DECLARE v_geo_lng INT DEFAULT 0;
162
163         DECLARE v_id_tmp INT DEFAULT 0;
164         DECLARE v_iso_tmp TEXT DEFAULT '';
165         DECLARE v_local_name_tmp TEXT DEFAULT '';
166         DECLARE v_type_tmp TEXT DEFAULT '';
167         DECLARE v_in_location_tmp INT DEFAULT 0;
168
169         DECLARE v_id_tmp_tmp INT DEFAULT 0;
170
171         DECLARE ci_csr CURSOR FOR 
172         SELECT 
173             id,iso,local_name,in_location,geo_lat,geo_lng
174         FROM 
175             meta_location
176         WHERE
177             type = 'CI';
178
179         SELECT COUNT(id) INTO v_total FROM meta_location WHERE type = 'CI';
180
181         SET v_count = 0;
182
183         OPEN ci_csr;
184         ci_loop: LOOP
185             FETCH ci_csr INTO v_id,v_iso,v_local_name,v_in_location,v_geo_lat,v_geo_lng;
186             
187             SET v_count = v_count + 1;
188
189             SET v_id_tmp = 0;
190             SET v_id_tmp_tmp = 0;
191
192             SELECT id INTO v_id_tmp FROM core_geoip_city WHERE name = v_local_name LIMIT 1;
193
194             IF(v_id_tmp = 0) THEN
195                 IF v_in_location IS NOT NULL THEN
196
197                     SELECT iso, local_name, type, in_location INTO v_iso_tmp, v_local_name_tmp, v_type_tmp, v_in_location_tmp FROM meta_location WHERE id = v_in_location;
198                     
199                     IF v_type_tmp = 'CO' THEN
200                         SELECT id INTO v_id_tmp FROM core_geoip_country WHERE code = v_iso_tmp;
201                         
202                         INSERT INTO core_geoip_city (name, country_id) VALUES (v_local_name, v_id_tmp);
203                     END IF;
204
205                     IF v_type_tmp = 'RE' THEN
206                         SELECT id INTO v_id_tmp FROM core_geoip_division WHERE name = v_local_name_tmp;
207                         
208                         SELECT iso, local_name, type INTO v_iso_tmp, v_local_name_tmp, v_type_tmp FROM meta_location WHERE id = v_in_location_tmp;
209                         
210                         SELECT id INTO v_id_tmp_tmp FROM core_geoip_country WHERE code = v_iso_tmp;
211                         
212                         INSERT INTO core_geoip_city (name, country_id, division_id) VALUES (v_local_name, v_id_tmp_tmp, v_id_tmp);
213                     END IF;
214                     
215                 END IF;
216
217                 IF v_geo_lat IS NOT NULL OR v_geo_lng IS NOT NULL THEN
218                     SET v_id_tmp = LAST_INSERT_ID();
219
220                     INSERT INTO core_geoip_location (latitude, longitude, city_id) VALUES (v_geo_lat, v_geo_lng, v_id_tmp);
221                 END IF;
222                 
223                 
224             END IF;
225
226             IF v_count = v_total THEN
227               LEAVE ci_loop;
228             END IF;
229
230         END LOOP;
231         CLOSE ci_csr;
232
233         RETURN v_count;
234     END $$
235 DELIMITER ; 
236
237
238 -----------------------------------------------------------------------------------------------------------------
239
240
241 DROP FUNCTION IF EXISTS core_country_locations;
242 DELIMITER $$
243 CREATE FUNCTION core_country_locations()  RETURNS INT DETERMINISTIC
244     BEGIN
245         DECLARE v_count INT DEFAULT 0;
246         DECLARE v_total INT DEFAULT 0;
247
248         DECLARE v_geoname_id INT DEFAULT 0;
249         DECLARE v_continent_code TEXT DEFAULT '';
250         DECLARE v_continent_name TEXT DEFAULT '';
251         DECLARE v_country_iso_code TEXT DEFAULT '';
252         DECLARE v_country_name TEXT DEFAULT '';
253
254         DECLARE v_country_id INT DEFAULT 0;
255         DECLARE v_continent_id INT DEFAULT 0;
256
257         DECLARE csr CURSOR FOR 
258         SELECT 
259             geoname_id,continent_code,continent_name,country_iso_code,country_name
260         FROM 
261             country_locations;
262         
263         SELECT COUNT(geoname_id) INTO v_total FROM country_locations;
264
265         SET v_count = 0;
266
267         OPEN csr;
268         read_loop: LOOP
269             FETCH csr INTO v_geoname_id,v_continent_code,v_continent_name,v_country_iso_code,v_country_name;
270             
271             SET v_count = v_count + 1;
272             
273             SET v_country_id = 0;
274             SET v_continent_id = 0;
275             
276             IF (v_continent_code != '') THEN
277                 SELECT id INTO v_continent_id FROM core_geoip_continent WHERE code = v_continent_code;
278
279                 IF v_continent_id = 0 THEN
280                     INSERT INTO core_geoip_continent (code, name) VALUES (v_continent_code, v_continent_name);
281                     SET v_continent_id = LAST_INSERT_ID();
282                 END IF;
283                 
284             END IF;
285
286             IF (v_country_iso_code != '') THEN
287                 
288                 SELECT id INTO v_country_id FROM core_geoip_country WHERE code = v_country_iso_code;
289
290                 IF v_country_id = 0 THEN
291                     INSERT INTO core_geoip_country (code, name, continent_id) VALUES (v_country_iso_code, v_country_name, v_continent_id);
292                 END IF;
293                 
294             END IF;
295     
296             IF v_count = v_total THEN
297               LEAVE read_loop;
298             END IF;
299
300         END LOOP;
301         CLOSE csr;
302
303
304         RETURN v_count;
305     END $$
306 DELIMITER ; 
307
308
309 DROP FUNCTION IF EXISTS core_country_blocks;
310 DELIMITER $$
311 CREATE FUNCTION core_country_blocks()  RETURNS INT DETERMINISTIC
312     BEGIN
313         DECLARE v_count INT DEFAULT 0;
314         DECLARE v_total INT DEFAULT 0;
315         
316         DECLARE v_geoname_id INT DEFAULT 0;
317         DECLARE v_network_start_ip TEXT DEFAULT '';
318         DECLARE v_network_mask_length INT DEFAULT 0;
319         DECLARE v_is_anonymous_proxy INT DEFAULT 0;
320         DECLARE v_is_satellite_provider INT DEFAULT 0;
321
322         DECLARE v_country_iso_code TEXT DEFAULT '';
323
324         DECLARE v_country_id INT DEFAULT 0;
325
326         DECLARE csr CURSOR FOR 
327         SELECT 
328             network_start_ip,network_mask_length,geoname_id,is_anonymous_proxy,is_satellite_provider
329         FROM 
330             country_blocks
331         WHERE 
332                 geoname_id != 0 
333             AND 
334                 registered_country_geoname_id != 0 
335             AND 
336                 geoname_id = registered_country_geoname_id
337             AND
338                 network_start_ip REGEXP '::ffff:[0-9]+.[0-9]+.[0-9]+.[0-9]+$';
339         
340         SELECT COUNT(network_start_ip) INTO v_total FROM country_blocks WHERE geoname_id != 0 AND registered_country_geoname_id != 0 AND geoname_id = registered_country_geoname_id AND network_start_ip REGEXP '::ffff:[0-9]+.[0-9]+.[0-9]+.[0-9]+$';
341
342         SET v_count = 0;
343
344         OPEN csr;
345         read_loop: LOOP
346             FETCH csr INTO v_network_start_ip,v_network_mask_length,v_geoname_id,v_is_anonymous_proxy,v_is_satellite_provider;
347             
348             SET v_count = v_count + 1;
349             
350             SET v_country_id = 0;
351
352             SELECT country_iso_code INTO v_country_iso_code FROM country_locations WHERE geoname_id = v_geoname_id;
353
354             IF v_country_iso_code != '' THEN
355                 SELECT id INTO v_country_id FROM core_geoip_country WHERE code = v_country_iso_code;
356
357                 IF v_country_id != 0 THEN
358                     INSERT INTO core_geoip_country_network_mapping (start_ip, mask_length, country_id, is_anonymous_proxy, is_satellite_provider) VALUES (SUBSTRING_INDEX(v_network_start_ip,':','-1'), POW(2, 128-v_network_mask_length),v_country_id,v_is_anonymous_proxy,v_is_satellite_provider);
359                 END IF;
360
361             END IF;
362             
363             IF v_count = v_total THEN
364               LEAVE read_loop;
365             END IF;
366
367         END LOOP;
368         CLOSE csr;
369
370
371         RETURN v_count;
372     END $$
373 DELIMITER ; 
374
375
376
377
378
379 DROP FUNCTION IF EXISTS core_city_locations;
380 DELIMITER $$
381 CREATE FUNCTION core_city_locations()  RETURNS INT DETERMINISTIC
382     BEGIN
383         DECLARE v_count INT DEFAULT 0;
384         DECLARE v_total INT DEFAULT 0;
385
386         DECLARE v_country_iso_code TEXT DEFAULT '';
387         DECLARE v_subdivision_iso_code TEXT DEFAULT '';
388         DECLARE v_subdivision_name TEXT DEFAULT '';
389         DECLARE v_city_name TEXT DEFAULT '';
390         DECLARE v_metro_code TEXT DEFAULT '';
391         DECLARE v_time_zone TEXT DEFAULT '';
392
393         DECLARE v_country_id INT DEFAULT 0;
394         DECLARE v_division_id INT DEFAULT 0;
395         DECLARE v_city_id INT DEFAULT 0;
396
397         DECLARE csr CURSOR FOR 
398         SELECT 
399             country_iso_code,subdivision_iso_code,subdivision_name,city_name,metro_code,time_zone
400         FROM 
401             city_locations
402         WHERE
403             subdivision_name != '' OR city_name != '';
404         
405         SELECT COUNT(geoname_id) INTO v_total FROM city_locations WHERE subdivision_name != '' OR city_name != '';;
406
407         SET v_count = 0;
408
409         OPEN csr;
410         read_loop: LOOP
411             FETCH csr INTO v_country_iso_code,v_subdivision_iso_code,v_subdivision_name,v_city_name,v_metro_code,v_time_zone;
412             
413             SET v_count = v_count + 1;
414             
415             SET v_country_id = 0;
416             SET v_division_id = 0;
417             SET v_city_id = 0;
418             
419             
420             IF (v_country_iso_code != '') THEN
421                 SELECT id INTO v_country_id FROM core_geoip_country WHERE code = v_country_iso_code;
422             END IF;
423     
424             IF v_subdivision_name != '' THEN
425                 SELECT id INTO v_division_id FROM core_geoip_division WHERE name = v_subdivision_name AND country_id = v_country_id;
426
427                 IF v_division_id = 0 THEN
428                     INSERT INTO core_geoip_division (code, name, country_id) VALUES (v_subdivision_iso_code, v_subdivision_name, v_country_id);
429                     SET v_division_id = LAST_INSERT_ID();
430                 END IF;
431                 
432
433             END IF;
434
435             IF v_city_name != '' THEN
436                 
437                 SELECT id INTO v_city_id FROM core_geoip_city WHERE name = v_city_name AND country_id = v_country_id AND division_id = v_division_id;
438                 
439                 IF v_city_id = 0 THEN
440                     INSERT INTO core_geoip_city (name, country_id, division_id, metro_code, time_zone) VALUES (v_city_name, v_country_id, v_division_id, v_metro_code, v_time_zone);
441
442                 END IF;
443
444             END IF;
445
446             IF v_count = v_total THEN
447               LEAVE read_loop;
448             END IF;
449
450         END LOOP;
451         CLOSE csr;
452
453
454         RETURN v_count;
455     END $$
456 DELIMITER ; 
457
458
459
460 DROP FUNCTION IF EXISTS core_city_blocks_mapping;
461 DELIMITER $$
462 CREATE FUNCTION core_city_blocks_mapping()  RETURNS INT DETERMINISTIC
463     BEGIN
464         DECLARE v_count INT DEFAULT 0;
465         DECLARE v_total INT DEFAULT 0;
466         
467         
468         DECLARE v_geoname_id INT DEFAULT 0;
469
470         DECLARE v_country_id INT DEFAULT 0;
471         DECLARE v_divison_id INT DEFAULT 0;
472         DECLARE v_city_id INT DEFAULT 0;
473         DECLARE v_mapping_id INT DEFAULT 0;
474         DECLARE v_country_iso_code TEXT DEFAULT '';
475         DECLARE v_subdivision_name TEXT DEFAULT '';
476         DECLARE v_city_name TEXT DEFAULT '';
477
478         DECLARE csr CURSOR FOR 
479         SELECT 
480             DISTINCT(geoname_id)
481         FROM 
482             city_blocks
483         WHERE 
484                 geoname_id != 0
485             AND
486                 network_start_ip REGEXP '::ffff:[0-9]+.[0-9]+.[0-9]+.[0-9]+$';
487         
488         SELECT COUNT(DISTINCT(geoname_id)) INTO v_total FROM city_blocks WHERE geoname_id != 0  AND network_start_ip REGEXP '::ffff:[0-9]+.[0-9]+.[0-9]+.[0-9]+$';
489
490         SET v_count = 0;
491
492         OPEN csr;
493         read_loop: LOOP
494             FETCH csr INTO v_geoname_id;
495             
496             SET v_count = v_count + 1;
497             
498             SET v_country_id = 0;
499             SET v_divison_id = 0;
500             SET v_city_id = 0;
501             SET v_mapping_id = 0;
502
503             SET v_country_iso_code = '';
504             SET v_subdivision_name = '';
505             SET v_city_name = '';
506
507             SELECT id INTO v_mapping_id FROM city_blocks_mapping WHERE geoname_id = v_geoname_id AND city_id = v_city_id;
508             
509             IF v_mapping_id = 0 THEN
510                 SELECT country_iso_code,subdivision_name,city_name INTO v_country_iso_code, v_subdivision_name, v_city_name FROM city_locations WHERE geoname_id = v_geoname_id;
511
512                 IF v_country_iso_code != '' THEN
513                     SELECT id INTO v_country_id FROM core_geoip_country WHERE code = v_country_iso_code;
514                 END IF;
515
516                 IF v_subdivision_name != '' THEN
517                     SELECT id INTO v_divison_id FROM core_geoip_division WHERE name = v_subdivision_name AND country_id = v_country_id;
518                 END IF;
519
520                 SELECT id INTO v_city_id FROM core_geoip_city WHERE name = v_city_name AND country_id = v_country_id AND division_id = v_divison_id;
521
522                 IF v_city_id != 0 THEN
523                     INSERT INTO city_blocks_mapping (geoname_id, city_id) VALUES (v_geoname_id, v_city_id);
524                     
525                 END IF;
526
527             END IF;
528             
529             
530             IF v_count = v_total THEN
531               LEAVE read_loop;
532             END IF;
533
534         END LOOP;
535         CLOSE csr;
536
537         RETURN v_count;
538     END $$
539 DELIMITER ; 
540
541
542 -- 
543 -- 
544 -- DROP FUNCTION IF EXISTS core_city_blocks;
545 -- DELIMITER $$
546 -- CREATE FUNCTION core_city_blocks()  RETURNS INT DETERMINISTIC
547 --     BEGIN
548 --         DECLARE v_count INT DEFAULT 0;
549 --         DECLARE v_total INT DEFAULT 0;
550 --         
551 --         DECLARE v_network_start_ip TEXT DEFAULT '';
552 --         DECLARE v_network_mask_length INT DEFAULT 0;
553 --         DECLARE v_geoname_id INT DEFAULT 0;
554 --         DECLARE v_latitude DECIMAL(11,8) DEFAULT 0;
555 --         DECLARE v_longitude DECIMAL(11,8) DEFAULT 0;
556 --         DECLARE v_is_anonymous_proxy INT DEFAULT 0;
557 --         DECLARE v_is_satellite_provider INT DEFAULT 0;
558 -- 
559 --         
560 --         DECLARE v_city_id INT DEFAULT 0;
561 --         DECLARE v_mapping_id INT DEFAULT 0;
562 -- 
563 --         DECLARE csr CURSOR FOR 
564 --         SELECT 
565 --             network_start_ip,network_mask_length,geoname_id,latitude, longitude, is_anonymous_proxy,is_satellite_provider
566 --         FROM 
567 --             city_blocks
568 --         WHERE 
569 --                 geoname_id != 0
570 --             AND
571 --                 network_start_ip REGEXP '::ffff:[0-9]+.[0-9]+.[0-9]+.[0-9]+$';
572 --         
573 --         SELECT COUNT(network_start_ip) INTO v_total FROM city_blocks WHERE geoname_id != 0  AND network_start_ip REGEXP '::ffff:[0-9]+.[0-9]+.[0-9]+.[0-9]+$';
574 -- 
575 --         SET v_count = 0;
576 -- 
577 --         OPEN csr;
578 --         read_loop: LOOP
579 --             FETCH csr INTO v_network_start_ip,v_network_mask_length,v_geoname_id,v_latitude,v_longitude,v_is_anonymous_proxy,v_is_satellite_provider;
580 --             
581 --             SET v_count = v_count + 1;
582 --             
583 --             SET v_city_id = 0;
584 --             SET v_mapping_id = 0;
585 -- 
586 --             SELECT id, city_id INTO v_mapping_id, v_city_id FROM city_blocks_mapping WHERE geoname_id = v_geoname_id;
587 -- 
588 --             IF v_mapping_id != 0 THEN
589 -- 
590 --                 INSERT INTO core_geoip_location (latitude, longitude, city_id) VALUES (v_latitude, v_longitude, v_city_id);
591 -- 
592 --                 INSERT INTO core_geoip_city_network_mapping (start_ip, mask_length, city_id, is_anonymous_proxy, is_satellite_provider) VALUES (SUBSTRING_INDEX(v_network_start_ip,':','-1'), POW(2, 128-v_network_mask_length),v_city_id,v_is_anonymous_proxy,v_is_satellite_provider);
593 --                 
594 --             END IF;
595 --             
596 --             IF v_count = v_total THEN
597 --               LEAVE read_loop;
598 --             END IF;
599 -- 
600 --         END LOOP;
601 --         CLOSE csr;
602 -- 
603 --         RETURN v_count;
604 --     END $$
605 -- DELIMITER ;