X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FDB%2FLoad.pm;h=1af6c6517162517e3afa757f6ba01e8580178395;hb=e0e2e093dbab85fafa41c4549483aa744fc68014;hp=d208b89a7672a421bf81404d4f60514be89e20b3;hpb=0c2305d4c89d165140bc955a50f3248c9c9ba7ad;p=debbugs.git diff --git a/Debbugs/DB/Load.pm b/Debbugs/DB/Load.pm index d208b89..1af6c65 100644 --- a/Debbugs/DB/Load.pm +++ b/Debbugs/DB/Load.pm @@ -183,7 +183,9 @@ sub load_bug { $param{packages}, ); $b->set_related_packages('srcpackages', - [grep {defined $_ and + [map {s/src://; + $_} + grep {defined $_ and $_ =~ /^src:/} make_list($data->{package})], $param{packages}, @@ -196,7 +198,9 @@ sub load_bug { $param{packages}, ); $b->set_related_packages('affects_srcpackages', - [grep {defined $_ and + [map {s/src://; + $_} + grep {defined $_ and $_ =~ /^src:/} make_list($data->{affects})], $param{packages}, @@ -353,17 +357,19 @@ sub load_bug_log { next if defined $msg_id and $msg_id =~ /handler\..+\.ack(?:info)?\@/; my $entity = parse_to_mime_entity($record); # search for a message with this message id in the database - $msg_id = $entity->head->get('Message-Id:'); + $msg_id = $entity->head->get('Message-Id') // + $entity->head->get('Resent-Message-ID') // + ''; $msg_id =~ s/^\s*\\s*$//; # check to see if the subject, to, and from match. if so, it's # probably the same message. - my $subject = decode_rfc1522($entity->head->get('Subject:')); - $subject =~ s/\n(?:(\s)\s*|\s*$)/$1/g; - my $to = decode_rfc1522($entity->head->get('To:')); - $to =~ s/\n(?:(\s)\s*|\s*$)/$1/g; - my $from = decode_rfc1522($entity->head->get('From:')); - $from =~ s/\n(?:(\s)\s*|\s*$)/$1/g; + my $subject = decode_rfc1522($entity->head->get('Subject')//''); + $subject =~ s/\n(?:(\s)\s*|\s*$)//g; + my $to = decode_rfc1522($entity->head->get('To')//''); + $to =~ s/\n(?:(\s)\s*|\s*$)//g; + my $from = decode_rfc1522($entity->head->get('From')//''); + $from =~ s/\n(?:(\s)\s*|\s*$)//g; my $m = $s->resultset('Message')-> find({msgid => $msg_id, from_complete => $from, @@ -379,24 +385,30 @@ sub load_bug_log { subject => $subject }); eval { - $m->sent_date(DateTime::Format::Mail-> - parse_datetime($entity->head->get('Date:',0))); + my $date = DateTime::Format::Mail-> + parse_datetime($entity->head->get('Date',0)); + if (abs($date->offset) >= 60 * 60 * 12) { + $date = $date->set_time_zone('UTC'); + } + $m->sent_date($date); }; - my $spam = $entity->head->get('X-Spam-Status:',0); + my $spam = $entity->head->get('X-Spam-Status',0)//''; if ($spam=~ /score=([\d\.]+)/) { $m->spam_score($1); } my %corr; @{$corr{from}} = getparsedaddrs($from); @{$corr{to}} = getparsedaddrs($to); - @{$corr{cc}} = getparsedaddrs($entity->head->get('Cc:')); + @{$corr{cc}} = getparsedaddrs($entity->head->get('Cc')); # add correspondents if necessary my @cors; for my $type (keys %corr) { for my $addr (@{$corr{$type}}) { + my $cor = $s->resultset('Correspondent')-> + get_correspondent_id($addr); + next unless defined $cor; push @cors, - {correspondent => $s->resultset('Correspondent')-> - get_correspondent_id($addr), + {correspondent => $cor, correspondent_type => $type, }; } @@ -404,12 +416,13 @@ sub load_bug_log { $m->update(); $s->txn_do(sub { $m->message_correspondents()->delete(); - $m->add_to_message_correspondents(@cors); + $m->add_to_message_correspondents(@cors) if + @cors; } ); } my $recv; - if ($entity->head->get('Received:',0) + if ($entity->head->get('Received',0) =~ /via spool by (\S+)/) { $recv = $s->resultset('Correspondent')-> get_correspondent_id($1); @@ -441,23 +454,58 @@ Commands to handle src and package version loading from debinfo files =cut sub load_debinfo { - my ($schema,$binname, $binver, $binarch, $srcname, $srcver) = @_; - my $sp = $schema->resultset('SrcPkg')->find_or_create({pkg => $srcname}); - my $sv = $schema->resultset('SrcVer')->find_or_create({src_pkg=>$sp->id(), - ver => $srcver}); - my $arch = $schema->resultset('Arch')->find_or_create({arch => $binarch}); - my $bp = $schema->resultset('BinPkg')->find_or_create({pkg => $binname}); - $schema->resultset('BinVer')->find_or_create({bin_pkg_id => $bp->id(), - src_ver_id => $sv->id(), - arch_id => $arch->id(), - ver => $binver, - }); + my ($s,$binname, $binver, $binarch, $srcname, $srcver,$ct_date,$cache) = @_; + $cache //= {}; + my $sp; + if (not defined $cache->{sp}{$srcname}) { + $cache->{sp}{$srcname} = + $s->resultset('SrcPkg')->find_or_create({pkg => $srcname}); + } + $sp = $cache->{sp}{$srcname}; + # update the creation date if the data we have is earlier + if (defined $ct_date and + (not defined $sp->creation or + $ct_date < $sp->creation)) { + $sp->creation($ct_date); + $sp->last_modified(DateTime->now); + $sp->update; + } + my $sv; + if (not defined $cache->{sv}{$srcname}{$srcver}) { + $cache->{sv}{$srcname}{$srcver} = + $s->resultset('SrcVer')-> + find_or_create({src_pkg =>$sp->id(), + ver => $srcver}); + } + $sv = $cache->{sv}{$srcname}{$srcver}; + if (defined $ct_date and + (not defined $sv->upload_date() or $ct_date < $sv->upload_date())) { + $sv->upload_date($ct_date); + $sv->update; + } + my $arch; + if (not defined $cache->{arch}{$binarch}) { + $cache->{arch}{$binarch} = + $s->resultset('Arch')-> + find_or_create({arch => $binarch}, + )->id(); + } + $arch = $cache->{arch}{$binarch}; + my $bp; + if (not defined $cache->{bp}{$binname}) { + $cache->{bp}{$binname} = + $s->resultset('BinPkg')-> + get_bin_pkg_id($binname); + } + $bp = $cache->{bp}{$binname}; + $s->resultset('BinVer')-> + get_bin_ver_id($bp,$binver,$arch,$sv->id()); } =back -=head Packages +=head2 Packages =over @@ -571,8 +619,15 @@ sub load_packages { } # remove associations for packages not in this suite if (@sa_to_del) { - $schema->resultset('SrcAssociation')-> - search_rs({id => \@sa_to_del})->delete(); + $it = natatime 1000, @sa_to_del; + while (my @v = $it->()) { + $schema-> + txn_do(sub { + $schema->resultset('SrcAssociation')-> + search_rs({id => \@v})-> + delete(); + }); + } } # update packages in this suite to have a modification time of now $schema->resultset('SrcAssociation')-> @@ -635,8 +690,15 @@ sub load_packages { scalar @v) if defined $p; } if (@bin_to_del) { - $schema->resultset('BinAssociation')-> - search_rs({id => \@bin_to_del})->delete(); + $it = natatime 1000, @bin_to_del; + while (my @v = $it->()) { + $schema-> + txn_do(sub { + $schema->resultset('BinAssociation')-> + search_rs({id => \@v})-> + delete(); + }); + } } $schema->resultset('BinAssociation')-> search_rs({suite => $suite_id})-> @@ -649,7 +711,7 @@ sub load_packages { =cut -=head Suites +=head2 Suites =over @@ -683,3 +745,7 @@ sub load_suite { __END__ +# Local Variables: +# indent-tabs-mode: nil +# cperl-indent-level: 4 +# End: