my ($self, $opts, $single_species_opt, $prefix) = @_;
$prefix ||= '';
my ($host, $port, $user, $pass, $dbname,
$pattern, $driver, $species, $species_id)
qw(host port user pass dbname pattern driver species species_id);
my @db_args;
if (defined $opts->{$host}) {
my $dbc =
-PASS => $opts->{$pass},
-HOST => $opts->{$host},
-PORT => $opts->{$port},
-DRIVER => $opts->{$driver}
);
my @dbnames;
if (defined $opts->{$dbname}) {
push @dbnames, $opts->{$dbname};
}
elsif (defined $opts->{$pattern}) {
# get a basic DBConnection and use to find out which dbs are involved
@dbnames = grep { m/$opts->{$pattern}/smx }
}
else {
croak 'dbname or dbpattern arguments required';
}
for my $dbname (@dbnames) {
#Decipher group of DBAdaptor by capturing the name_name(_name?)_core_ code. Otherwise we don't know
my ($group) = $dbname =~
/^[a-z]+_[a-z0-9]+(?:_[a-z0-9]+)?_([a-z]+)(?:_\d+)?_\d+/;
# set multi where we have collections
my $multi = $dbname =~ m/_collection_/ ? 1 : 0;
my $species_ids;
my $single_species = $single_species_opt;
if (!defined $single_species) {
# if we're dealing with a collection, turn off single species mode by default
$single_species = $dbname =~ m/_collection_/ ? 0 : 1;
}
if ($single_species != 1) {
# for multispecies, get the list of species from meta
$species_ids =
$dbc->sql_helper()
->execute(
"SELECT species_id,meta_value FROM $dbname.meta WHERE meta_key='species.production_name'"
);
if (!defined $opts->{$species_id} &&
scalar(@{$species_ids}) == 0)
{
croak "No species.production_name found in database";
}
}
# if we didn't get a list from meta, go ahead and use the supplied arguments if we have them
if (defined $opts->{$species_id}) {
$species_ids = [[$opts->{$species_id}, $opts->{$species}]];
}
# otherwise assume the default species
elsif(!defined $species_ids) {
$species_ids = [[1, undef]];
}
# deal with each species in turn
for my $species_id (@{$species_ids}) {
my $args = {-HOST => $opts->{$host},
-USER => $opts->{$user},
-PORT => $opts->{$port},
-PASS => $opts->{$pass},
-DBNAME => $dbname,
-DRIVER => $opts->{$driver},
-SPECIES_ID => $species_id->[0],
-SPECIES => $species_id->[1],
-MULTISPECIES_DB => $multi};
$args->{-GROUP} = $group if $group;
push(@db_args, $args);
}
} ## end for my $dbname (@dbnames)
} ## end if (defined $opts->{$host...})
else {
croak '(db)host arguments required';
}
return \@db_args;