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