source: subversion/applications/rendering/history/import.pl @ 34399

Last change on this file since 34399 was 3494, checked in by frederik, 12 years ago

new

File size: 2.1 KB
Line 
1#!/usr/bin/perl
2
3use DBI;
4use strict;
5
6my $planet = int($ARGV[0]);
7if ($planet<1)
8{
9    die "please specify planet filedate on cmd line";
10}
11
12my $dsn="DBI:mysql:host=localhost:database=osmhistory";
13my $dbh = DBI->connect($dsn) or die;
14
15$dbh->do(<<EOF) or die;
16create table if not exists planets
17(
18    filedate integer,
19    importdate integer,
20    comment varchar(255)
21);
22EOF
23
24$dbh->do(<<EOF) or die;
25create table if not exists nodes
26(
27    id integer,
28    lat integer,
29    lon integer,
30    bucket integer,
31    fromdate integer,
32    todate integer,
33    key(id),
34    key(bucket)
35);
36EOF
37
38my $query = "select max(filedate) from planets";
39my $sth = $dbh->prepare($query) or die;
40my $lastfiledate;
41$sth->execute() or die;
42if (my $row = $sth->fetchrow_arrayref)
43{
44    $lastfiledate = $row->[0];
45}
46
47if ($lastfiledate >= $planet)
48{
49    printf "last planet in db is %06d, refusing to process %06d\n",
50        $lastfiledate, $planet;
51    exit;
52}
53
54my $uquery = "update nodes set todate=? where id=? and todate=?";
55my $usth = $dbh->prepare($uquery) or die;
56my $iquery = "insert into nodes (id,lat,lon,bucket,fromdate,todate) values(?,?,?,?,?,?)";
57my $isth = $dbh->prepare($iquery) or die;
58
59printf "";
60$| = 1;
61printf "running...";
62
63my $c = 1;
64my $i;
65my $u;
66
67while(<STDIN>)
68{
69    last if (/<segment/);
70    if (/^\s*<node id=.(\d+).+lat=.([0-9.Ee-]+).+lon=.([0-9.-Ee-]+)./)
71    {
72        my ($id, $lat, $lon) = ($1, $2, $3);
73        my $bucket = (int($lat*2)+180) * 720 + int($lon*2) + 360;
74        my $do_insert=1;
75        if (defined($lastfiledate))
76        {
77            if ($usth->execute($planet, $id, $lastfiledate) > 0)
78            {
79                $u++;
80                $do_insert=0;
81            }
82        }
83        if ($do_insert)
84        {
85            $i++;
86            $isth->execute($id,int($lat*10000),int($lon*10000),$bucket,$planet,$planet) or die;
87        }
88
89        if ($c++ % 1000 == 0)
90        {
91            printf "\r%dk nodes processed...", $c/1000;
92        }
93    }
94}
95
96printf "\rdone - %d nodes processed, %d inserts, %d updates\n", $c, $i, $u;
97
98$query = "insert into planets (filedate,importdate) values($planet,".time().")";
99$sth = $dbh->prepare($query) or die;
100$sth->execute() or die;
101
Note: See TracBrowser for help on using the repository browser.