From e46db4903b59c52a73243e3541cf6eb77fd82b25 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Tue, 28 Jul 2009 18:11:32 +0100 Subject: [PATCH] WIP email processor, now prepares some SQL --- pctb/commod-email-processor | 67 +++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/pctb/commod-email-processor b/pctb/commod-email-processor index 8b38fcf..28a7082 100755 --- a/pctb/commod-email-processor +++ b/pctb/commod-email-processor @@ -50,6 +50,7 @@ use POSIX; use MIME::Parser; use Commods; +use CommodsDatabase; setlocale(LC_CTYPE, "en_GB.UTF-8"); my $parser= new MIME::Parser; @@ -76,32 +77,92 @@ sub main () { $entity= $parser->parse(\*STDIN); my $eff_type= $entity->effective_type(); - die "effective type $eff_type" unless $eff_type eq 'multipart/mixed'; + die "effective type $eff_type\n" unless $eff_type eq 'multipart/mixed'; my $mdpart= find_part('metadata', 'text/plain', sub { my $charset= $_[0]->mime_attr('content-type.charset'); return 1 if grep { $_ eq $charset } qw(utf-8 us-ascii); }); - my $mdh= $mdpart->open('r') or die; + my $mdh= $mdpart->open('r') or die "failed to open metadata $!\n"; my %md; while (defined($_= $mdh->getline())) { m/^([a-z]+)\t(.*)$/ or next; $md{$1}= $2; } + foreach my $needed (qw(ocean island timestamp clientspec serverspec)) { + defined $md{$needed} or die "missing metadata $needed\n"; + } + + my $mid= $entity->head()->get('message-id'); + defined $mid or die "missing Message-ID\n"; + chomp($mid); + $mid !~ m/[^ -~]/ or die "Message-ID has strange character(s)\n"; + my $tsvpart= find_part('deduped.tsv.gz', 'application/octet-stream', undef); my $tsv= pipethrough_prep(); $tsvpart->bodyhandle()->print($tsv); my $pt= pipethrough_run_along($tsv,undef, 'gunzip','gunzip'); + db_setocean($md{'ocean'}); + my $dbfn= db_filename(); + (stat $dbfn) or die "stat database $dbfn failed $!\n"; + db_connect(); + + my ($islandid) = $dbh->selectrow_array( + "SELECT islands.islandid + FROM islands + WHERE islandname == ?; + ", {}, $md{'island'}); + + die "unknown island\n" unless defined $islandid; + + db_doall("DELETE FROM uploads WHERE islandid == $islandid; + DELETE FROM buy WHERE islandid == $islandid; + DELETE FROM sell WHERE islandid == $islandid; + "); + + $dbh->do("INSERT INTO uploads + (islandid, message, + timestamp, clientspec, serverspec) + VALUES (?,?,?,?,?); + ", {}, + $islandid, $mid, + map { $md{$_} } (qw(timestamp clientspec serverspec))); + + my %sth_cs; + foreach my $cs (qw(commod stall)) { + $sth_cs{$cs}= $dbh->prepare( + "INSERT OR IGNORE + INTO ${cs}s + (${cs}id) VALUES (?) + "); + } + + my %sth_bs; + foreach my $bs (qw(buy sell)) { + $sth_bs{$bs}= $dbh->prepare( + "INSERT INTO $bs + (commodid, islandid, stallid, price, qty) + VALUES ( + (SELECT commodid FROM commods WHERE commodname = ?), + $islandid, + (SELECT stallid FROM stalls WHERE stallname = ?), + ?, ? + ) + "); + } + while (<$pt>) { my @v= check_tsv_line($_, \&bad_data_fail); - print "[",join('|',@v),"]\n"; + + } pipethrough_run_finish($pt); + } my $ok= eval { -- 2.30.2