Raw content of BioMart::Configuration::DBLocation # $Id: # # BioMart module for BioMart::Configuration::DBLocation # # You may distribute this module under the same terms as perl itself # POD documentation - main docs before the code =head1 NAME BioMart::Configuration::DBLocation =head1 SYNOPSIS A Location that represents the configuration for a mart database accessed directly from the DB server =head1 DESCRIPTION =head1 AUTHOR - Arek Kasprzyk, Damian Smedley =head1 CONTACT This module is part of the BioMart project http://www.biomart.org Questions can be posted to the mart-dev mailing list: mart-dev@ebi.ac.uk =head1 METHODS =cut package BioMart::Configuration::DBLocation; use base qw(BioMart::Configuration::Location); use strict; use warnings; use BioMart::Exception; use DBI; use constant ORACLEDSNTEMPLATE => q(dbi:Oracle:host=%s;sid=%s;port=%s); use constant MYSQLDNSTEMPLATE => q(dbi:mysql:database=%s;host=%s;port=%s); use constant POSTGRESTEMPLATE => q(dbi:Pg:dbname=%s;host=%s;port=%s); use constant ODBCDNSTEMPLATE => q(dbi:odbc:%s); =head2 _new Usage : see Usage for BioMart::Configuration::Location. Description: creates a new MartDBLocation object which ... Returntype : BioMart::Configuration::MartDBLocation Exceptions : none Caller : general =cut sub _new { my ($self, @param) = @_; $self->SUPER::_new(@param); $self->attr('dbh', undef); $self->openConnection(); } sub openConnection { my $self = shift; unless (defined($self->host ) && defined ($self->databaseType) && defined($self->database) && defined($self->user)) { BioMart::Exception::Database->throw("Database Specifications must contain at least the database type (".$self->databaseType.") host (".$self->host."), database (".$self->database."), and user (".$self->user.")"); } my $dsn; if ($self->databaseType eq 'oracle'){ $dsn=sprintf(ORACLEDSNTEMPLATE, $self->host, $self->database, $self->port); } elsif ($self->databaseType eq 'mysql') { $dsn=sprintf(MYSQLDNSTEMPLATE, $self->database, $self->host, $self->port); } elsif ($self->databaseType eq 'postgres') { $dsn=sprintf(POSTGRESTEMPLATE, $self->database, $self->host, $self->port); } elsif ($self->databaseType eq 'odbc') { $dsn=sprintf(ODBCDNSTEMPLATE, $self->database); } else { warn("unsupported RDBMS type: \"$self->databaseType\" - please use the correct name or supported RDBMS ...... skipping connection"); } $self->dsn($dsn); my $dbh; eval { $dbh = DBI->connect( $dsn, $self->user, $self->password, {InactiveDestroy => 1, RaiseError => 1, PrintError => 1} ); }; if($@ || !$dbh) { BioMart::Exception::Database->throw("Could not connect to ".$self->databaseType." database ".$self->database.": ".$@); } $self->dbh($dbh); } sub dbh { my ($self, $dbh) = @_; if ($dbh) { $self->set('dbh',$dbh); } return $self->get('dbh'); } sub dbhDC { my ($self, $dbh) = @_; $dbh = $self->get('dbh'); $dbh->disconnect();##->disconnect; assuming all statement handles have already called respective ->finish() $self->set('dbh',undef); } 1;