Ambrosia
view release on metacpan or search on metacpan
lib/Ambrosia/DataProvider/DBIDriver.pm view on Meta::CPAN
package Ambrosia::DataProvider::DBIDriver;
use strict;
use warnings;
use Carp;
use DBI;
use Ambrosia::core::Nil;
use Ambrosia::Utils::Container;
use Ambrosia::error::Exceptions;
use Ambrosia::Meta;
class abstract
{
extends => [qw/Ambrosia::DataProvider::BaseDriver/],
private => [qw/
user
password
engine_params
additional_params
additional_action
__sth
/]
};
sub _init
{
my $self = shift;
$self->SUPER::_init(@_);
$self->_cache ||= new Ambrosia::Utils::Container;
}
our $VERSION = 0.010;
sub reset
{
my $self = shift;
if ( $self->__sth )
{
$self->__sth->finish;
$self->__sth = undef;
}
$self->SUPER::reset();
return $self;
}
sub _name :Abstract :Protected {}
sub _connection_params
{
my $self = shift;
return 'dbi:'
. $self->_name()
. ':' . ($self->engine_params
|| ('database=' . $self->schema
. ($self->host ? ';host=' . $self->host : '')
. ($self->port ? ';port=' . $self->port : '')));
}
sub open_connection
{
my $self = shift;
$self->close_connection;
$self->_handler = DBI->connect (
$self->_connection_params(),
$self->user, $self->password,
($self->additional_params || {})
)
or throw Ambrosia::core::Exception(DBI->errstr);
if ( defined $self->additional_action && ref $self->additional_action eq 'CODE' )
{
$self->additional_action->($self->_handler);
}
$self->begin_transaction();
return $self->_handler;
}
sub close_connection
{
my $self = shift;
if ( defined $self->_handler )
{
if ( $self->__sth )
{
$self->__sth->finish;
$self->__sth = undef;
}
$self->_handler->disconnect;
$self->_handler = undef;
$self->_cache = new Ambrosia::core::Nil();
1;
}
}
################################################################################
sub begin_transaction
{
$_[0]->_cache ||= new Ambrosia::Utils::Container;
return $_[0];
( run in 1.149 second using v1.01-cache-2.11-cpan-13bb782fe5a )