X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-live.git;a=blobdiff_plain;f=yarrg%2Fcommod-email-processor;h=e65b2b6a91fcfe2237f6d8c123e0891a0ec5cebd;hp=bf42c0d65ef4b8344f29963de36080b35f664535;hb=6c12b260489687e82eaa1c6fed353dd2a40da838;hpb=7d2fec305c9bdc622a41a343332331b25472fa20 diff --git a/yarrg/commod-email-processor b/yarrg/commod-email-processor index bf42c0d..e65b2b6 100755 --- a/yarrg/commod-email-processor +++ b/yarrg/commod-email-processor @@ -25,25 +25,6 @@ # are used without permission. This program is not endorsed or # sponsored by Three Rings. -# Emails are: -# multipart/mixed, containing -# text/plain; name="metadata"; charset="utf-8" -# Content-Disposition: inline; filename="metadata" -# ocean\t canonical mixed case -# island\t canonical mixed case -# timestamp\t time_t (non-leap secs since start of 1970 UTC) -# clientname\t may contain spaces -# clientversion\t may contain spaces -# clientfixes\t space-delimited list -# clientspec\t \t\t -# servername\t may contain spaces -# serverversion\t may contain spaces -# serverfixes\t space-delimited list -# serverspec\t \t\t -# application/octet-stream; name="deduped.tsv.gz" -# Content-Disposition: attachment; filename="deduped.tsv.gz" -# - use strict (qw(vars)); use POSIX; @@ -58,7 +39,7 @@ BEGIN { use Commods; use CommodsDatabase; -setlocale(LC_CTYPE, "en_GB.UTF-8"); +set_ctype_utf8(); my $parser= new MIME::Parser; our $entity; @@ -117,7 +98,9 @@ sub main () { db_setocean($md{'ocean'}); my $dbfn= db_filename(); (stat $dbfn) or die "stat database $dbfn failed $!\n"; + db_writer(); db_connect(); + db_onconflict(sub { print STDERR "temporary failure: @_\n"; exit 75; }); my ($islandid) = $dbh->selectrow_array( "SELECT islands.islandid @@ -140,33 +123,38 @@ sub main () { $islandid, $mid, map { $md{$_} } (qw(timestamp clientspec serverspec))); - my (%sth, %sub_cs, %cache_cs, %sth_insert); + my (%sth, %sub_cs, %cache_cs, %sth_insert, %sth_lookup); $sth_insert{'stall'}= $dbh->prepare( "INSERT OR IGNORE INTO stalls (islandid, stallname) VALUES ($islandid, ?) "); - $sth_insert{'commods'}= $dbh->prepare( + $sth_lookup{'stall'}= $dbh->prepare( + "SELECT stallid FROM stalls + WHERE islandid == $islandid AND stallname == ? + "); + $sth_insert{'commod'}= $dbh->prepare( "INSERT OR IGNORE INTO commods (commodname) VALUES (?) "); + $sth_lookup{'commod'}= $dbh->prepare( + "SELECT commodid FROM commods + WHERE commodname == ? + "); foreach my $cs (qw(stall commod)) { - my $sth_lookup= $dbh->prepare( - "SELECT ${cs}id FROM ${cs}s WHERE ${cs}name == ?; - "); $sub_cs{$cs}= sub { my ($name)= @_; my $r= $cache_cs{$cs}{$name}; return $r if defined $r; - $sth_lookup->execute($name) or die; - ($r)= $sth_lookup->fetchrow_array(); + $sth_lookup{$cs}->execute($name) or die; + ($r)= $sth_lookup{$cs}->fetchrow_array(); if (!defined $r) { $sth_insert{$cs}->execute($name); - $sth_lookup->execute($name) or die; - ($r)= $sth_lookup->fetchrow_array(); + $sth_lookup{$cs}->execute($name) or die; + ($r)= $sth_lookup{$cs}->fetchrow_array(); die unless defined $r; } $cache_cs{$cs}{$name}= $r; @@ -206,9 +194,10 @@ sub main () { pipethrough_run_finish($pt, 'gunzip <$deduped_tsv.gz'); - print "\n"; - $dbh->commit(); +# print "\n"; + db_chkcommit(0); + # Warning! Below runes are bogus. Do not use NATURAL JOIN! # select * from ((buy natural join commods) natural join stalls) natural join islands; # select * from ((sell natural join commods) natural join stalls) natural join islands;