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