chiark / gitweb /
WIP email processor, now prepares some SQL
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Tue, 28 Jul 2009 17:11:32 +0000 (18:11 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Tue, 28 Jul 2009 17:11:32 +0000 (18:11 +0100)
pctb/commod-email-processor

index 8b38fcf..28a7082 100755 (executable)
@@ -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 {