package LIMS::DB;
# default Rose::DB default_connect_options() sets ChopBlanks => 1 which auto-trims
# trailing spaces from data retrieved from CHAR fields (but is also incorrectly
# applied to request_lab_test_results.result VARCHAR(255) field)
use strict;
use warnings;
BEGIN {
use Rose::DB;
# set locale for DateTime objects so it parses EU date format correctly:
# don't need this if passing DateTime objects internally:
# Rose::DateTime::Util->european_dates(1);
use DateTime; DateTime->DefaultLocale('en_GB'); # set default locale for app
use LIMS::Local::Config;
our @ISA = qw(Rose::DB);
# safely default to test db - requires env variable setting (lims_server.pl to change db):
#__PACKAGE__->default_domain( $ENV{RDB_DOMAIN} || 'test' );
}
my $cfg = LIMS::Local::Config->instance;
my ($dsn, $userid, $pwd) = @{ $cfg->{dbh_params} }; # arrayref
my $db = 'lims_test'; # overridden in config/rosedb_devinit.pl
# Use a private registry for this class
__PACKAGE__->use_private_registry;
# default data source (test) using the default type and domain:
# modified for production/devel using $ENV{ROSEDB_DEVINIT} in lims_server.pl
__PACKAGE__->register_db(
domain => __PACKAGE__->default_domain, # not strictly necessary as ..
type => __PACKAGE__->default_type, # they are default settings anyway
driver => 'mysql',
host => 'localhost',
database => $db,
username => $userid, # or could define in ROSEDBRC file
password => $pwd,
);
__PACKAGE__->auto_load_fixups; # loads defs in rosedb_devinit.pl
1;
__END__
=begin # to monitor dbh construction dynamics:
sub dbi_connect {
warn "Initializing dbh ".Carp::longmess unless $ENV{HARNESS_ACTIVE};
shift->SUPER::dbi_connect(@_);
}
=cut
=begin
sub new_or_cached {
warn 'new_or_cached() called';
shift->SUPER::new_or_cached(@_);
}
=cut
=begin # defined in rosedb_init.pl using ROSEDB_DEVINIT env flag
# data source for development - switched on my env var in lims_server.pl:
__PACKAGE__->register_db(
domain => 'development',
# type => 'mysql', # probably don't need this - not used
driver => 'mysql',
host => 'localhost',
database => $db,
username => $userid,
password => $pwd,
);
# data source for production - not used yet but will need flag somewhere to activate (mod_perl / fastcgi ?)
__PACKAGE__->register_db(
domain => 'production',
# type => 'mysql', # probably don't need this - not used
driver => 'mysql',
host => 'localhost',
database => 'some_production_db',
username => $userid,
password => $pwd,
);
=cut
=begin # override default dbi_connect for DBI->trace:
sub dbi_connect {
my $self = shift;
my @dsn = ($self->dsn, $self->username, $self->password); # warn $self->dsn;
my %attr = (
PrintError => 0,
RaiseError => 1,
ChopBlanks => 0, # default RDBO setting is on, causes auto-trimming of values
);
# for fastcgi, this can be set in .fcgi script
# DBI->trace(1, '/home/raj/apps/HILIS4/logs/trace.log');
my $dbh = DBI->connect_cached(@dsn, \%attr);
#=begin # this works, but don't get bind_params (sth method):
$dbh->{Callbacks}->{prepare} = sub {
my ($dbh, $sql, $attr) = @_;
#warn 'SQL:'.$sql;
#warn Dumper $self->user_profile; # doesn't exist:
# object is 'LIMS::DB::__RoseDBPrivate__::Rose::DB::MySQL'
return;
};
#=cut
return $dbh;
}
=cut
=begin # override default dbi_connect to initialise Log4perl:
sub dbi_connect {
my $self = shift;
use Log::Log4perl qw(:easy); # use with Log::Log4perl->easy_init for logging to console
use DBIx::Log4perl;
# Log::Log4perl->init("$path_to_app/config/settings/log4perl.conf");
Log::Log4perl->easy_init(
{
level => $DEBUG,
file => '>' . "$path_to_app/logs/dbi.log",
}
);
my @dsn = ($self->dsn, $self->username, $self->password); # warn $self->dsn;
my %attr = (
PrintError => 0,
RaiseError => 1,
);
my $dbh = $ENV{ROSEDB_DEVINIT} ? # only want sql output for devel/production:
DBIx::Log4perl->connect(@dsn, \%attr) :
DBI->connect(@dsn, \%attr) ;
return $dbh;
}
=cut