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