about summary refs log tree commit homepage
path: root/lib/PublicInbox/SearchMsg.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2015-08-15 09:28:33 +0000
committerEric Wong <e@80x24.org>2015-08-15 19:15:40 +0000
commit7edf30e5349ab5566815e5050e9ba0f53e1d0bb9 (patch)
treeaa46cb0560f187e197614a4530efbe23969f27d1 /lib/PublicInbox/SearchMsg.pm
parentd7fcdec712accc212bcfa35e50ade1233eb9beb3 (diff)
downloadpublic-inbox-7edf30e5349ab5566815e5050e9ba0f53e1d0bb9.tar.gz
This will relieve callers of the need to decode the data
we store internally in Xapian
Diffstat (limited to 'lib/PublicInbox/SearchMsg.pm')
-rw-r--r--lib/PublicInbox/SearchMsg.pm81
1 files changed, 77 insertions, 4 deletions
diff --git a/lib/PublicInbox/SearchMsg.pm b/lib/PublicInbox/SearchMsg.pm
index 920804ac..619a19d4 100644
--- a/lib/PublicInbox/SearchMsg.pm
+++ b/lib/PublicInbox/SearchMsg.pm
@@ -5,6 +5,10 @@ package PublicInbox::SearchMsg;
 use strict;
 use warnings;
 use Search::Xapian;
+use Email::Address qw//;
+use POSIX qw//;
+use Date::Parse qw/str2time/;
+use PublicInbox::MID qw/mid_clean mid_compressed/;
 our $PFX2TERM_RE = undef;
 
 sub new {
@@ -20,6 +24,78 @@ sub wrap {
         bless { doc => $doc, mime => undef, mid => $mid }, $class;
 }
 
+sub load_doc {
+        my ($class, $doc) = @_;
+        my ($mid, $subj, $from, $date) = split(/\n/, $doc->get_data);
+        bless {
+                doc => $doc,
+                mid => $mid,
+                subject => $subj,
+                date => $date,
+                from_name => $from,
+        }, $class;
+}
+
+sub subject {
+        my ($self) = @_;
+        my $subj = $self->{subject};
+        return $subj if defined $subj;
+        $subj = $self->{mime}->header('Subject');
+        $subj = '' unless defined $subj;
+        $subj =~ tr/\n/ /;
+        $self->{subject} = $subj;
+}
+
+sub from {
+        my ($self) = @_;
+        my $from = $self->mime->header('From') || '';
+        my @from;
+
+        if ($from) {
+                @from = Email::Address->parse($from);
+                $self->{from} = $from[0];
+                $from = $from[0]->name;
+        }
+        $from =~ tr/\n/ /;
+        $self->{from_name} = $from;
+        $self->{from};
+}
+
+sub from_name {
+        my ($self) = @_;
+        my $from_name = $self->{from_name};
+        return $from_name if defined $from_name;
+        $self->from;
+        $self->{from_name};
+}
+
+sub ts {
+        my ($self) = @_;
+        my $ts = $self->{ts};
+        return $ts if $ts;
+        $self->{date} = undef;
+        $self->date;
+        $self->{ts};
+}
+
+sub date {
+        my ($self) = @_;
+        my $date = $self->{date};
+        return $date if $date;
+        my $ts = eval { str2time($self->mime->header('Date')) } || 0;
+        $self->{ts} = $ts;
+        $self->{date} = POSIX::strftime('%Y-%m-%d %H:%M', gmtime($ts));
+}
+
+sub to_doc_data {
+        my ($self) = @_;
+
+        $self->mid . "\n" .
+        $self->subject . "\n" .
+        $self->from_name . "\n".
+        $self->date;
+}
+
 sub ensure_metadata {
         my ($self) = @_;
         my $doc = $self->{doc};
@@ -60,10 +136,7 @@ sub _extract_mid {
         my ($self) = @_;
 
         my $mid = $self->mime->header('Message-ID');
-        if ($mid && $mid =~ /<([^>]+)>/) {
-                return $1;
-        }
-        return $mid;
+        $mid ? mid_compressed(mid_clean($mid)) : $mid;
 }
 
 sub mime {