utilize DBIx::Class
[p5sagit/Email-Archive.git] / lib / Email / Archive / Storage / DBI.pm
CommitLineData
8581da38 1package Email::Archive::Storage::DBI;
8a5453ad 2use Moo;
c5f5125c 3use Carp;
5e15a8a0 4use Email::MIME;
8581da38 5use Email::Abstract;
d5161b4d 6use Email::Archive::Schema;
8581da38 7use autodie;
d5161b4d 8use Try::Tiny;
8581da38 9with q/Email::Archive::Storage/;
10
d5161b4d 11has schema => (
12 is => 'rw',
8a5453ad 13 isa => sub {
d5161b4d 14 ref $_[0] eq 'Email::Archive::Schema' or die "schema must be a Email::Archive schema",
8a5453ad 15 },
8581da38 16);
17
8581da38 18sub store {
19 my ($self, $email) = @_;
8581da38 20 $email = Email::Abstract->new($email);
d5161b4d 21 $self->schema->resultset('Messages')->update_or_create({
22 message_id => $email->get_header('Message-ID'),
23 from_addr => $email->get_header('From'),
24 to_addr => $email->get_header('To'),
25 date => $email->get_header('Date'),
26 subject => $email->get_header('Subject'),
27 body => $email->get_body,
28 });
8581da38 29}
30
31sub search {
d5161b4d 32 my ($self, $attribs) = @_;
33 my $message = $self->schema
34 ->resultset('Messages')
35 ->find($attribs);
5e15a8a0 36 return Email::MIME->create(
8581da38 37 header => [
d5161b4d 38 From => $message->from_addr,
39 To => $message->to_addr,
40 Subject => $message->subject,
8581da38 41 ],
d5161b4d 42 body => $message->body,
8581da38 43 );
44}
45
46sub retrieve {
d5161b4d 47 my ($self, $message_id) = @_;
48 $self->search({ message_id => $message_id });
8581da38 49}
50
51sub _deploy {
52 my ($self) = @_;
d5161b4d 53 $self->schema->deploy;
8581da38 54}
55
c5f5125c 56sub _deployed {
8581da38 57 my ($self) = @_;
d5161b4d 58 my $deployed = 1;
59 try {
60 # naive check if table metadata exists
61 $self->schema->resultset('Metadata')->all;
c5f5125c 62 }
d5161b4d 63 catch {
64 $deployed = 0;
65 };
66
67 return $deployed;
c5f5125c 68}
69
d5161b4d 70sub storage_connect_dbic {
c5f5125c 71 my ($self, $dsn) = @_;
d5161b4d 72 $self->schema(Email::Archive::Schema->connect($dsn));
73 my $deployed = $self->_deployed;
74 $self->_deploy unless $deployed;
8581da38 75}
76
8581da38 771;
d5161b4d 78