Ambrosia

 view release on metacpan or  search on metacpan

lib/Ambrosia/DataProvider/DBIDriver.pm  view on Meta::CPAN

    $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];
}

sub save_transaction
{
    my $self = shift;
    defined $self->_handler and ($self->_handler->{AutoCommit} or $self->_handler->commit or die $self->_handler->errstr);
    return $self;
}

sub cancel_transaction
{
    my $self = shift;

    $self->_cache = new Ambrosia::core::Nil();
    if ( defined $self->_handler )
    {
        eval
        {
            $self->_handler->{AutoCommit} or $self->_handler->rollback or die $self->_handler->errstr;
        };
        if ( $@ )
        {
            throw Ambrosia::error::Exception 'ERROR: at ' . __PACKAGE__ . ' in ' . caller() . ' [' . $@ . ']';
        }
    }
    return $self;
}

#!!TODO!! must return hash (cannot save "additional_action")
sub STORABLE_freeze
{
    my ($self, $cloning) = @_;
    return if $cloning;         # Regular default serialization
    return 'empty';
}

#!!TODO!! must recive hash and create new object
sub STORABLE_thaw
{
    my ($self, $cloning) = @_;
    return;
}

sub DESTROY
{
    my $self = shift;

    if ( $self && $self->__sth )
    {
        $self->__sth->finish;
        $self->__sth = undef;
    }
}

################################################################################
sub _make_limit :Protected
{
    return '';
}

sub _make_query
{
    my $self = shift;

    if ( $self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::SELECT] )
    {
        return $self->_make_select . ' '
            . _make_limit($self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::LIMIT]);
    }
    elsif ( $self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::INSERT] )
    {
        return $self->_make_insert;
    }
    elsif ( $self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::UPDATE] )
    {
        return $self->_make_update;
    }
    elsif ( $self->_cql_query->[&Ambrosia::DataProvider::BaseDriver::DELETE] )
    {
        return $self->_make_delete;
    }
}



( run in 2.052 seconds using v1.01-cache-2.11-cpan-97f6503c9c8 )