package Email::Store::DBI; use strict; use warnings; use base 'Class::DBI'; require Class::DBI::DATA::Schema; sub columns { my $self = shift; if (@_ && $self->__driver && $self->__driver eq 'Pg') { #warn "do that sequence thing white boy"; if ($_[0] eq 'Primary' or $_[0] eq 'All') { # Class::DBI::Pg does this properly, as part of its # set_up_table call, but that requires the table to exist # at compile time. For the general case we can guess $self->sequence( $self->table . "_" . $_[1] . "_seq" ); } } $self->SUPER::columns( @_ ); } sub import { my ($self, @params) = @_; if (@params) { $self->set_db(Main => @params); $self->translate(mysql => $self->__driver); if ($self->__driver =~ /SQLite/) { $self->db_Main->{sqlite_handle_binary_nulls} = 1; } elsif ($self->__driver =~ /PostgreSQL|Pg|Oracle/) { $self->db_Main->{AutoCommit} = 1; } } } my %map = ( # Why SQL::Translator doesn't provide this I don't know mysql => "MySQL", Pg => "PostgreSQL", SQLite2 => "SQLite", ); sub translate { my ($self, $from, $to) = @_; $from = exists $map{$from} ? $map{$from} : $from; $to = exists $map{$to} ? $map{$to} : $to; Class::DBI::DATA::Schema->import( ($from eq $to) ? () : (translate => [$from => $to ], cache => "emailstore_sqlcache" ) ); } 1; =head1 NAME Email::Store::DBI - Database backend to Email::Store =head1 SYNOPSIS use Email::Store 'dbi:...'; =head1 DESCRIPTION This class is a subclass of L and contains means for C-based programs to register what DSN they wish to use. It also provides for building database tables from schemas embedded in the DATA section of plug-in modules, using L. =cut