use strict;
use warnings;
-sub new {
+sub lookup_id {
my $class = shift;
my $dbh = shift;
- my %args = @_;
+ my $id = shift;
+
+ my $sth = $dbh->prepare(q{
+ SELECT messageid,present,subject FROM messages WHERE id = ?
+ });
- my ($msgid, $id);
+ $sth->execute($id);
- my $fresh = 0;
- my $sth;
+ my ($msgid,$present,$subj) = @{$sth->fetch};
- die "MessageID or Headers" if exists $args{MessageID} && exists $args{Headers};
+ $sth->finish;
- # ID -- from ID
- # MessageID -- message id to lookup
- # Insert -- True if we should create, created if non-present
- # Header -- If given then fill in details. Must be non-pressent (or just Inserted)
+ my $self = { dbh => $dbh,
+ present => $present eq "true",
+ id => $id,
+ msgid => $msgid,
+ subject => $subj
+ };
+
+ bless $self, $class;
+ return $self;
+}
+
+sub lookup_msgid {
+ my $class = shift;
+ my $dbh = shift;
+ my $msgid = shift;
+ my %args = @_;
$args{Insert} = 0 unless exists $args{Insert};
- if ( exists $args{ID} ) {
- $id = $args{ID};
- $sth = $dbh->prepare(q{
- SELECT messageid FROM messages WHERE id = ?
+ my $sth = $dbh->prepare(q{
+ SELECT id,present,subject FROM messages WHERE messageid = ?
+ });
+
+ $sth->execute($msgid);
+
+ my $row = $sth->fetch;
+
+ $sth->finish;
+
+ my ($id,$present,$subj);
+ if ( defined $row ) {
+ ($id,$present,$subj) = @{$row};
+ } elsif ( $args{Insert} ) {
+ my $sth = $dbh->prepare(q{
+ INSERT into messages (messageid) VALUES (?)
});
- $sth->execute($id);
- my $r = $sth->fetch;
- $sth->finish;
- $msgid = $r->[0];
- #print STDERR "Create ID $id with msgid $msgid\n";
+ $sth->execute($msgid) or die "Inserting new message";
+ $id = $dbh->sqlite_last_insert_rowid();
+ $present = 0;
} else {
- if ( exists $args{MessageID} ) {
- $msgid = $args{MessageID};
- #print STDERR "Create from Message-ID " . $msgid . "\n";
- } elsif ( exists $args{Header} ) {
- my $header = $args{Header};
- chomp($msgid = $header->get('message-id'));
- #print STDERR "Create from Headers " . $msgid . "\n";
- } else { die "MessageID or Header"; }
-
- $sth = $dbh->prepare(q{
- SELECT id,present,messageid FROM messages WHERE messageid = ?
- });
- $sth->execute($msgid);
- my $row = $sth->fetch;
- $sth->finish;
-
- if ( defined $row ) {
- $id = $row->[0];
- my $present = $row->[1] eq "true";
- $fresh = ! $present;
- } elsif ( $args{Insert} || exists $args{Header} ) {
- my $sth = $dbh->prepare(q{
- INSERT into messages (messageid) VALUES (?)
- });
- $sth->execute($msgid) or die "Inserting new message";
- $id = $dbh->sqlite_last_insert_rowid();
- #print STDERR "New ID is $id\n";
- $fresh = 1;
- }
-
- if ( exists $args{Header} ) {
- my $header = $args{Header};
- die "NOT FRESH" unless $fresh;
- $sth = $dbh->prepare(q{UPDATE messages SET present="true" WHERE id = ?});
- $sth->execute($id) or die "UPDATE";
- $sth->finish or die "FINISH";
+ die "lookup_msgid $msgid";
+ }
+
+ my $self = { dbh => $dbh,
+ present => $present eq "true",
+ id => $id,
+ msgid => $msgid,
+ subject => $subj
+ };
+
+ bless $self, $class;
+ return $self;
+}
+
+sub update {
+ my $self = shift;
+ my $header = shift;
+
+ die "NOT FRESH" unless ! $self->{present};
+
+ chomp(my $subj = $header->get('subject'));
+
+ my $sth = $self->{dbh}->prepare(q{UPDATE messages SET present="true",subject=?2 WHERE id = ?1});
+ $sth->execute($self->{id},$subj) or die "execute insert";
+ $sth->finish or die "finish insert";
- foreach ( $header->get('references') ) {
- foreach our $r ( split(/\s/) ) {
- my $refto = Bugs::Message->new($dbh, MessageID => $r, Insert => 1);
- #print STDERR "Reference $id -> ".$refto->{id}."\n";
- #print STDERR " ".$msgid." => ".$refto->{msgid}."\n";
- $sth = $dbh->prepare(q{INSERT INTO refs (srcid,dstid) VALUES (?1,?2)});
- $sth->execute($refto->{id},$id);
- }
- }
+ foreach ( $header->get('references') ) {
+ foreach our $r ( split(/\s/) ) {
+ my $refto = Bugs::Message->lookup_msgid($self->{dbh}, $r, Insert => 1);
+ $sth = $self->{dbh}->prepare(q{INSERT INTO refs (srcid,dstid) VALUES (?1,?2)});
+ $sth->execute($refto->{id},$self->{id});
}
}
- my $self = { dbh=>$dbh, id=>$id, msgid=>$msgid };
+ $self->{present} = 1;
+ $self->{subject} = $subj;
+}
- bless $self, $class;
+sub insert {
+ my $class = shift;
+ my $dbh = shift;
+ my $header = shift;
+
+ chomp(my $msgid = $header->get('message-id'));
+
+ my $self = lookup_msgid($class, $dbh, $msgid, Insert => 1);
+ $self->update($header);
return $self;
}
my $id = $r->[0];
next if exists $refs->{$id};
$refs->{$id} = 1;
- my $m = Bugs::Message->new($self->{dbh}, ID => $id);
+ my $m = Bugs::Message->lookup_id($self->{dbh}, $id);
#print "REF: $id = " . $m->{msgid} . "\n";
$m->_subthread($refs)
}
$refs{$self->{id}} = 1;
$self->_subthread(\%refs);
for my $r ( keys %refs ) {
- my $m = Bugs::Message->new($self->{dbh}, ID => $r);
+ my $m = Bugs::Message->lookup_id($self->{dbh}, $r);
#print "Ref ".$m->{msgid}."\n";
open F, "xen-devel.ml/" . $m->{msgid} or die "OPEN";
print for ( <F> ) ;