package Email::Store::Date; use strict; use warnings; use Email::Store::DBI; use base 'Email::Store::DBI'; use Email::Store::Mail; use Email::Date 1.10 (); Email::Store::Date->table("mail_date"); Email::Store::Date->columns( All => qw/mail date year month day/ ); Email::Store::Date->columns( Primary => qw/mail/ ); Email::Store::Date->has_a( date => 'Time::Piece' ); Email::Store::Date->has_a( mail => "Email::Store::Mail" ); Email::Store::Mail->might_have( mail_date => "Email::Store::Date" => qw(date year month day) ); sub on_store_order { 80 } sub on_store { my ($self, $mail) = @_; my $simple = $mail->simple; my $tp = Email::Date::find_date($simple); # This mirrors old behavior, but seems stupid. -- rjbs, 2006-07-23 $tp = Time::Piece->new unless defined $tp; Email::Store::Date->create( { mail => $mail->id, date => $tp->epoch, year => $tp->year, month => $tp->mon, day => $tp->mday, } ); } sub on_gather_plucene_fields_order { 80 } sub on_gather_plucene_fields { my ($self, $mail, $hash) = @_; if ($mail->date) { $hash->{'date'} = $mail->date->ymd; } } =head1 NAME Email::Store::Date - Provides a Time::Piece object representing a date for the mail =head1 SYNOPSIS Remember to create the database table: % make install % perl -MEmail::Store="..." -e 'Email::Store->setup' And now: print $mail->date->ymd,"\n"; or $mail->year; $mail->month; $mail->day; You can also search for all mails between two unix epochs # get all mails in the last day my $time = time(); my $day = 24*60*60; Email::Store::Mail->search_between($time, $time-$day); =head1 SEE ALSO L, L. =head1 AUTHOR Simon Wistow, C This module is distributed under the same terms as Perl itself. =cut Email::Store::Mail->set_sql(between => qq{ SELECT mail.message_id FROM mail_date, mail WHERE mail.message_id = mail_date.mail AND mail_date.date >= ? AND mail_date.date <= ? ORDER BY mail_date.date DESC }); 1; __DATA__ CREATE TABLE IF NOT EXISTS mail_date ( mail varchar(255) NOT NULL PRIMARY KEY, date int, year int, month int, day int );