chiark / gitweb /
Message confirmation loop thing
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Mon, 31 Aug 2009 16:57:42 +0000 (17:57 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Mon, 31 Aug 2009 16:57:42 +0000 (17:57 +0100)
yarrg/yppedia-chart-parser

index df350a7..8eafa4c 100755 (executable)
@@ -1,6 +1,11 @@
 #!/usr/bin/perl
 #!/usr/bin/perl
-
-# Updater for island topology
+#
+# Normally run from
+#  update-master-info
+#
+# usage: ./yppedia-chart-parser <Oceanname>
+#  updates OCEAN-Oceanname.db and _ocean-<oceanname>.txt
+#  from YPPedia (chart and ocean page) and source-info.txt
 
 # This is part of ypp-sc-tools, a set of third-party tools for assisting
 # players of Yohoho Puzzle Pirates.
 
 # This is part of ypp-sc-tools, a set of third-party tools for assisting
 # players of Yohoho Puzzle Pirates.
@@ -24,8 +29,6 @@
 # are used without permission.  This program is not endorsed or
 # sponsored by Three Rings.
 
 # are used without permission.  This program is not endorsed or
 # sponsored by Three Rings.
 
-# usage: ./yppedia-chart-parser OCEAN
-
 use strict (qw(vars));
 use warnings;
 
 use strict (qw(vars));
 use warnings;
 
@@ -45,19 +48,27 @@ my %wiccix2arch;
 my $wialldists;
 my %wtisland2arch;
 
 my $wialldists;
 my %wtisland2arch;
 
-my $dbdists= Graph::Undirected->new();
+my $dbdists;
 my %dbisland2arch;
 
 my %dbisland2arch;
 
+my @msgkinds= qw(change warning error);
 my %msgs;
 my %msgs;
+my %msgprinted;
+my %msgkindprinted;
 sub pmsg ($$) { push @{ $msgs{$_[0]} }, "$_[0]: $_[1]\n"; }
 sub warning ($) { pmsg("warning",$_[0]); }
 sub error   ($) { pmsg("error",  $_[0]); }
 sub change  ($) { pmsg("change", $_[0]); }
 sub print_messages () {
 sub pmsg ($$) { push @{ $msgs{$_[0]} }, "$_[0]: $_[1]\n"; }
 sub warning ($) { pmsg("warning",$_[0]); }
 sub error   ($) { pmsg("error",  $_[0]); }
 sub change  ($) { pmsg("change", $_[0]); }
 sub print_messages () {
-    foreach my $k (qw(change warning error)) {
-       my $m= $msgs{$k};
-       next unless $m;
-       print sort @$m or die $!;
+    foreach my $k (@msgkinds) {
+       my $ms= $msgs{$k};
+       next unless $ms;
+       foreach my $m (sort @$ms) {
+           next if $msgprinted{$m};
+           print $m or die $!;
+           $msgprinted{$m}++;
+           $msgkindprinted{$k}++;
+       }
     }
 }
 sub progress ($) { print "($_[0])\n"; }
     }
 }
 sub progress ($) { print "($_[0])\n"; }
@@ -142,29 +153,6 @@ sub yppedia_chart_parse () {
     }
 }
 
     }
 }
 
-sub database_fetch_ocean () {
-    my ($row,$sth);
-    $sth= $dbh->prepare('SELECT islandname, archipelago FROM islands');
-    $sth->execute();
-    while ($row= $sth->fetchrow_hashref) {
-       print DEBUG "database-island $row->{'islandname'}".
-                    " $row->{'archipelago'}\n";
-       $dbisland2arch{$row->{'islandname'}}= $row->{'archipelago'};
-    }
-    $sth= $dbh->prepare('SELECT dist, a.islandname a, b.islandname b
-                               FROM dists
-                               JOIN islands AS a ON dists.aiid==a.islandid
-                               JOIN islands AS b ON dists.biid==b.islandid');
-    $sth->execute();
-    while ($row= $sth->fetchrow_hashref) {
-       $dbdists->add_weighted_edge($row->{'a'}, $row->{'b'}, $row->{'dist'});
-    }
-}                       
-
-sub database_graph_spr () {
-    $dbspr= shortest_path_reduction('db',$dbdists);
-}
-
 sub yppedia_graphs_add_shortcuts () {
     # We add edges between LPs we know about, as you can chart
     # between them.  Yppedia often lacks these edges.
 sub yppedia_graphs_add_shortcuts () {
     # We add edges between LPs we know about, as you can chart
     # between them.  Yppedia often lacks these edges.
@@ -604,15 +592,36 @@ sub compare_distances () {
     }
 }
 
     }
 }
 
-parse_info_serverside();
+#========== database handling ==========
+
+sub database_fetch_ocean () {
+    my ($row,$sth);
+    $sth= $dbh->prepare('SELECT islandname, archipelago FROM islands');
+    $sth->execute();
+    undef %dbisland2arch;
+    $dbdists= Graph::Undirected->new();
+    while ($row= $sth->fetchrow_hashref) {
+       print DEBUG "database-island $row->{'islandname'}".
+                    " $row->{'archipelago'}\n";
+       $dbisland2arch{$row->{'islandname'}}= $row->{'archipelago'};
+    }
+    $sth= $dbh->prepare('SELECT dist, a.islandname a, b.islandname b
+                               FROM dists
+                               JOIN islands AS a ON dists.aiid==a.islandid
+                               JOIN islands AS b ON dists.biid==b.islandid');
+    $sth->execute();
+    while ($row= $sth->fetchrow_hashref) {
+       $dbdists->add_weighted_edge($row->{'a'}, $row->{'b'}, $row->{'dist'});
+    }
+}                       
 
 
-progress("reading database");
+sub database_graph_spr () {
+    $dbspr= shortest_path_reduction('db',$dbdists);
+}
 
 
-db_setocean($ocean);
-db_connect();
-database_fetch_ocean();
+#========== main program ==========
 
 
-progress("computing database spr");         database_graph_spr();
+parse_info_serverside();
 
 progress("fetching yppedia chart");         yppedia_ocean_fetch_chart();
 progress("adding shortcuts");               yppedia_graphs_add_shortcuts();
 
 progress("fetching yppedia chart");         yppedia_ocean_fetch_chart();
 progress("adding shortcuts");               yppedia_graphs_add_shortcuts();
@@ -623,10 +632,58 @@ progress("computing shortest paths");       yppedia_graph_shortest_paths();
 progress("setting archs from labels");      yppedia_archs_chart_labels();
 progress("setting archs from nearby");      yppedia_archs_fillbynearest();
 progress("computing yppedia spr");          yppedia_graph_spr();
 progress("setting archs from labels");      yppedia_archs_chart_labels();
 progress("setting archs from nearby");      yppedia_archs_fillbynearest();
 progress("computing yppedia spr");          yppedia_graph_spr();
-
 progress("fetching yppedia ocean text");    yppedia_ocean_fetch_text();
 
 progress("fetching yppedia ocean text");    yppedia_ocean_fetch_text();
 
-progress("comparing islands");              compare_island_lists();
-progress("comparing distances");            compare_distances();
+db_setocean($ocean);
+db_connect();
+my $iteration=0;
+for (;;) {
+    progress("reading database");
+    database_fetch_ocean();
+    progress("computing database spr");         database_graph_spr();
+
+    progress("comparing islands");              compare_island_lists();
+    progress("comparing distances");            compare_distances();
+
+    print "\n";
+    print_messages();
+
+    foreach my $k (@msgkinds) {
+       my $n= $msgkindprinted{$k};
+       next unless $n;
+       printf STDERR "*** %d%s %ss\n", $n, $iteration?' additional':'', $k;
+    }
+    
+    if ($msgs{'error'}) {
+       print STDERR "*** errors, aborting update\n";
+       exit 1;
+    }
+
+    if (!%msgkindprinted) {
+       progress("updating database");         database_do_updates();
+       progress("updating _ocean-*.txt");     localtopo_rewrite();
+       progress("committing database");       $dbh->commit();
+       progress("committing _ocean-*.txt");   localtopo_commit();
+       exit 0;
+    }
+    $dbh->rollback();
+    
+    my $default= !$msgkindprinted{'warning'};
+    printf STDERR "*** confirm update %s ? ", $default?'(y/n)':'(n/y)';
+
+    $!=0; my $result= <STDIN>;  defined $result or die $!;
+    $result =~ s/\s//g;
+    $result= $default?'y':'n' if !length $result;
+    $result= $result =~ m/^y/i;
+
+    if (!$result) {
+       printf STDERR "*** updated abandoned at your request\n";
+       exit 1;
+    }
+
+    print "\n";
+    undef %msgkindprinted;
+    $iteration++;
+}
 
 print_messages();
 
 print_messages();