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 )