From f98f5aba41d756c851656d88e064d1714458f930 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 31 Aug 2009 17:57:42 +0100 Subject: [PATCH] Message confirmation loop thing --- yarrg/yppedia-chart-parser | 139 ++++++++++++++++++++++++++----------- 1 file changed, 98 insertions(+), 41 deletions(-) diff --git a/yarrg/yppedia-chart-parser b/yarrg/yppedia-chart-parser index df350a7..8eafa4c 100755 --- a/yarrg/yppedia-chart-parser +++ b/yarrg/yppedia-chart-parser @@ -1,6 +1,11 @@ #!/usr/bin/perl - -# Updater for island topology +# +# Normally run from +# update-master-info +# +# usage: ./yppedia-chart-parser +# updates OCEAN-Oceanname.db and _ocean-.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. @@ -24,8 +29,6 @@ # 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; @@ -45,19 +48,27 @@ my %wiccix2arch; my $wialldists; my %wtisland2arch; -my $dbdists= Graph::Undirected->new(); +my $dbdists; my %dbisland2arch; +my @msgkinds= qw(change warning error); 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 () { - 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"; } @@ -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. @@ -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(); @@ -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("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= ; 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(); -- 2.30.2