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