/[mws]/trunk/MWS.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/MWS.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 12 - (hide annotations)
Thu May 6 12:40:11 2004 UTC (20 years ago) by dpavlin
File size: 3162 byte(s)
switch search engine to swish-e. It's stil slow, but usable.

1 dpavlin 2 #!/usr/bin/perl -w
2    
3     package MWS;
4    
5     use strict;
6     use warnings;
7     use Carp;
8    
9 dpavlin 3 use Mail::Box::Manager;
10 dpavlin 4 use Config::IniFiles;
11 dpavlin 12 #use MWS_plucene;
12     use MWS_swish;
13 dpavlin 3
14 dpavlin 2 require Exporter;
15    
16     our @ISA = qw(Exporter);
17    
18     our %EXPORT_TAGS = ();
19     our @EXPORT_OK;
20     our @EXPORT;
21    
22     our $VERSION = '1.00';
23    
24    
25     my $folder; # placeholder for folders
26    
27     my $debug = 1;
28    
29     sub new {
30     my $class = shift;
31     my $self = {};
32     bless($self, $class);
33    
34 dpavlin 4 my $config_file = shift || die "need index file";
35 dpavlin 2
36 dpavlin 4 $self->{config} = new Config::IniFiles( -file => $config_file );
37 dpavlin 2
38 dpavlin 4 my $index_file = $self->{config}->val('global', 'index') || croak "can't find [index] section in config file with path of index";
39    
40 dpavlin 12 $self->{mgr} = Mail::Box::Manager->new(access => 'r');
41     $self->{index_file} = $index_file;
42 dpavlin 4
43 dpavlin 2 # placeholder for opened folders
44     $self->{folder} = {};
45    
46     return $self;
47     }
48    
49 dpavlin 7 sub open_folder {
50 dpavlin 2 my $self = shift;
51    
52 dpavlin 7 my $mbox = shift || croak "open_folder needs mbox name";
53 dpavlin 2
54     if (! $self->{folder}->{$mbox}) {
55 dpavlin 4 my $mbox_path = $self->{config}->val('folders', $mbox) || croak "comeone removed folder $mbox from config?";
56     $self->{folder}->{$mbox} = $self->{mgr}->open($mbox_path) || croak "can't open folder $mbox at '$mbox_path': $!";
57 dpavlin 2 print STDERR "## open($mbox)\n" if ($debug);
58     }
59    
60 dpavlin 7 return $self->{folder}->{$mbox};
61    
62     }
63    
64     sub fetch_message {
65     my $self = shift;
66    
67     my $mbox_id = shift || die "need mbox_id!";
68     my ($mbox,$id) = split(/ /,$mbox_id);
69    
70     # return message with ID
71     return $self->open_folder($mbox)->find($id) ||
72 dpavlin 2 print STDERR "can't find message $id in $mbox. Time to re-index?\n";
73     }
74    
75    
76     sub search {
77     my $self = shift;
78    
79     my $s = shift || carp "search called without argument!";
80    
81 dpavlin 9 my @index_ids = $self->search_index($s);
82 dpavlin 2
83     $self->{'index_ids'} = \@index_ids;
84    
85     my $results = $#index_ids + 1;
86     $self->{'results'} = $results;
87    
88     $self->{'curr_result'} = 0;
89    
90     return $results || 'error';
91     }
92    
93     sub unroll($$$) {
94     my ($message,$part,$sub) = @_;
95    
96     my @arr;
97    
98     foreach my $from ($message->$part) {
99 dpavlin 7 my $tmp = $from->$sub;
100     $tmp =~ s/^\s*["'](.*)["']\s*$/$1/;
101     push @arr, $tmp;
102 dpavlin 2 }
103     return \@arr;
104     }
105 dpavlin 4
106     sub fetch_all_results {
107     my $self = shift;
108    
109     croak "results called before search!" if (! $self->{'index_ids'});
110    
111     my @arr;
112    
113     foreach my $id (@{$self->{'index_ids'}}) {
114     push @arr, $self->fetch_result_by_id($id);
115     }
116    
117     return @arr;
118     }
119    
120 dpavlin 2 sub fetch_result {
121     my $self = shift;
122    
123 dpavlin 3 my $args = {@_};
124    
125 dpavlin 2 croak "results called before search!" if (! $self->{'index_ids'});
126    
127     my $curr = $self->{'curr_result'}++;
128    
129     my $id = $self->{'index_ids'}->[$curr];
130    
131 dpavlin 4 return $self->fetch_result_by_id($id);
132     }
133 dpavlin 2
134 dpavlin 7 sub plain_text_body {
135     my $self = shift;
136     my $message = shift || croak "plain_text_body needs message!";
137    
138     if (! $message->isMultipart) {
139     return $message->decoded->string;
140     } else {
141     foreach my $part ($message->parts) {
142     if ($part->body->mimeType eq 'text/plain') {
143     return $part->decoded->string;
144     }
145     }
146     }
147     }
148    
149    
150 dpavlin 4 sub fetch_result_by_id {
151     my $self = shift;
152    
153     my $id = shift || return;
154    
155 dpavlin 2 my $message = $self->fetch_message($id);
156    
157     my $row;
158    
159 dpavlin 7 $row->{'id'} = $id;
160 dpavlin 2 $row->{'from'} = unroll($message,'from','phrase');
161 dpavlin 7 $row->{'subject'} = $message->subject;
162     $row->{'body'} = $self->plain_text_body($message);
163 dpavlin 2
164     return $row;
165    
166     }

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26