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 )