class Ensembl::DBRegistry::Base

The Ensembl::Registry::Base is a super class providing general methods to get database and connection info.

Public Class Methods

generic_connect(db_type, species, release, args = {}) click to toggle source
# File lib/bio-ensembl/db_connection.rb, line 100
def self.generic_connect(db_type, species, release, args = {})
  
  # check which release is used and load the correct VariationFeature version
  require (release < 62) ? File.dirname(__FILE__) + '/variation/variation_feature.rb' : File.dirname(__FILE__) + '/variation/variation_feature62.rb'
  Ensembl::SESSION.reset
  Ensembl::SESSION.release = release
  db_name = nil
  # if the connection is established with Ensembl Genomes, set the default port and host
  if args[:ensembl_genomes] then
    args[:port] = EG_PORT
    args[:host] = EG_HOST
  end    
  if args[:port].nil? then
    args[:port] = ( release > 47 ) ? 5306 : 3306
  end
  if args[:database]
    db_name = args[:database]
  else 
    db_name = self.get_name_from_db(db_type,species,release,args) # try to find the corresponding database
  end 
  establish_connection(
                      :adapter => args[:adapter] || Ensembl::DB_ADAPTER,
                      :host => args[:host] || Ensembl::DB_HOST,
                      :database => db_name,
                      :username => args[:username] || Ensembl::DB_USERNAME,
                      :password => args[:password] || Ensembl::DB_PASSWORD,
                      :port => args[:port]
                    )
  
  self.retrieve_connection # Check if the connection is working

end
get_info() click to toggle source
# File lib/bio-ensembl/db_connection.rb, line 58
def self.get_info
  host,user,password,db_name,port = self.retrieve_connection.instance_values["connection_options"]
  db_name =~/(\w+_\w+)_(core|variation|funcgen|compara)_(\d+)_\S+/
  species,release = $1,$3 # just works for standard Ensembl database names
  if species.nil? and release.nil? then
    raise NameError, "Can't get database name from #{db_name}. Are you using non conventional names?"
  else
    return host,user,password,db_name,port,species,release.to_i
  end
end
get_name_from_db(db_type,species,release,args) click to toggle source

Method to retrieve the name of a database, using species, release and connection parameters passed by the user.

# File lib/bio-ensembl/db_connection.rb, line 71
def self.get_name_from_db(db_type,species,release,args)
  species = species.underscore.tr(' ','_') # Always in lowercase. This keeps things simple when dealing with complex species names like in Ensembl Genomes database
  dummy_db = DummyDBConnection.connect(args)
  dummy_connection = dummy_db.connection
  # check if a database exists with exactly the species name passed (regular way)
  db_name = dummy_connection.select_values("SHOW DATABASES LIKE '%#{species}_#{db_type}_#{release.to_s}%'")[0]
  # if a database is not found and we are working on Ensembl Genomes database...
  if db_name.nil? and args[:ensembl_genomes] then
    words = species.split(/_/)
    first = words.shift
    # ...try to find a collection database using the first name of the species passed (convention used for collection databases)
    db_name = dummy_connection.select_values("SHOW DATABASES").select {|d| d=~/#{first}.*_collection_#{db_type}_#{release.to_s}/}[0]
    # if a collection database match is found, then look inside to find the species
    if db_name != nil then
      dummy_db.disconnect! # close the generic connection with the host
      args[:database] = db_name
      dummy_db = DummyDBConnection.connect(args) # open a new connection directly with the collection database
      species_name = species.gsub(first,first[0..0]) # transform the species name, so it can match the species names stored in the collection database
      Ensembl::SESSION.collection_species = species_name # set the species used for this session, so it's easier to fetch slices from the genome of that species
      
      # check that the species passed is present in the collection database, otherwise returns a warning
      exists = dummy_db.connection.select_values("SELECT species_id FROM meta WHERE LOWER(meta_value) = '#{species_name}' AND meta_key = 'species.db_name'")[0]
      warn "WARNING: No species '#{species}' found in the database. Please check that the name is correct." if !exists
    end
  end
  warn "WARNING: No connection to database established. Check that the species is in snake_case (was: #{species})." if db_name.nil?
  return db_name
end