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