4 =head1 NAME - DBTestHarness.pm
8 # Add test dir to lib search path
13 my $harness = DBTestHarness->new();
15 # Load some data into the db
16 $ens_test->do_sql_file("some_data.sql");
18 # Get an Overlap db object for the test db
19 my $db = $harness->db();
23 This is a direct copy-and-paste from the Ensembl
26 It provides an encapsulation of creating, loading
27 and dropping databases for testing
33 package DBTestHarness
;
36 use Sys
::Hostname
'hostname';
41 #Package variable for unique database name
45 # This is a list of possible entries in the config
46 # file "EnsTestDB.conf"
47 my %known_field = map {$_, 1} qw(
61 # Get config from file, or use default values
63 if( ! $db || $db eq 'basicseqdb' ) {
64 $self = do 'DBHarness.conf' || {
66 'host' => 'localhost',
70 'schema_sql' => ['./sql/basicseqdb-mysql.sql'],
71 'module' => 'Bio::DB::SQL::DBAdaptor'
73 } elsif ( $db eq 'markerdb' ) {
74 $self = do 'DBHarness.markerdb.conf' || {
76 'host' => 'localhost',
80 'schema_sql' => ['./sql/markerdb.sql'],
81 'module' => 'Bio::DB::Map::SQL::DBAdaptor'
84 foreach my $f (keys %$self) {
85 confess
"Unknown config field: '$f'" unless $known_field{$f};
95 my( $self, $value ) = @_;
98 $self->{'driver'} = $value;
100 return $self->{'driver'} || confess
"driver not set";
104 my( $self, $value ) = @_;
107 $self->{'host'} = $value;
109 return $self->{'host'} || confess
"host not set";
113 my( $self, $value ) = @_;
116 $self->{'user'} = $value;
118 return $self->{'user'} || confess
"user not set";
122 my( $self, $value ) = @_;
125 $self->{'port'} = $value;
127 return $self->{'port'};
131 my( $self, $value ) = @_;
134 $self->{'password'} = $value;
136 return $self->{'password'};
140 my( $self, $value ) = @_;
143 push(@
{$self->{'schema_sql'}}, $value);
145 return $self->{'schema_sql'} || confess
"schema_sql not set";
151 $self->{'_dbname'} ||= $self->_create_db_name();
152 return $self->{'_dbname'};
155 # convenience method: by calling it, you get the name of the database,
156 # which you can cut-n-paste into another window for doing some mysql
157 # stuff interactively
160 my $db = $self->{'_dbname'};
161 print STDERR
"pausing to inspect database; name of databse is: $db\n";
162 print STDERR
"press ^D to continue\n";
167 my ($self, $value) = @_;
168 $self->{'module'} = $value if ($value);
169 return $self->{'module'};
172 sub _create_db_name
{
175 my $host = hostname
();
176 my $db_name = "_test_db_${host}_$$".$counter;
177 $db_name =~ s{\W}{_}g;
184 ### FIXME: not portable between different drivers
185 my $locator = 'dbi:'. $self->driver .':host='. $self->host .';database=mysql';
186 my $db = DBI
->connect(
187 $locator, $self->user, $self->password, {RaiseError
=> 1}
188 ) or confess
"Can't connect to server";
189 my $db_name = $self->dbname;
190 $db->do("CREATE DATABASE $db_name");
193 $self->do_sql_file(@
{$self->schema_sql});
199 my $locator = 'dbi:'. $self->driver .':database='. $self->dbname;
200 foreach my $meth (qw{ host port
}) {
201 if (my $value = $self->$meth()) {
202 $locator .= ";$meth=$value";
212 unless ($self->{'_db_handle'}) {
213 $self->{'_db_handle'} = DBI
->connect(
214 $self->test_locator, $self->user, $self->password, {RaiseError
=> 1}
215 ) or confess
"Can't connect to server";
217 return $self->{'_db_handle'};
223 my $module = $self->module;
226 -dbname
=> $self->dbname,
227 -host
=> $self->host,
228 -user
=> $self->user,
229 -pass
=> $self->password,
236 my( $self, @files ) = @_;
239 my $dbh = $self->db_handle;
241 foreach my $file (@files)
244 open SQL
, $file or die "Can't read SQL file '$file' : $!";
246 s/(#|--).*//; # Remove comments
247 next unless /\S/; # Skip lines which are all space
253 #Modified split statement, only semicolumns before end of line,
254 #so we can have them inside a string in the statement
255 foreach my $s (grep /\S/, split /;\n/, $sql) {
256 $self->validate_sql($s);
265 my ($self, $statement) = @_;
266 if ($statement =~ /insert/i)
268 $statement =~ s/\n/ /g; #remove newlines
269 die ("INSERT should use explicit column names (-c switch in mysqldump)\n$statement\n")
270 unless ($statement =~ /insert.+into.*\(.+\).+values.*\(.+\)/i);
275 my( $self, $file ) = @_;
277 if (my $dbh = $self->db_handle) {
278 my $db_name = $self->dbname;
279 $dbh->do("DROP DATABASE $db_name");
291 James Gilbert B<email> jgrg@sanger.ac.uk