dovadi/data_store

View on GitHub
lib/data_store/connector.rb

Summary

Maintainability
A
0 mins
Test Coverage
module DataStore

  class Connector

    # Create the data_stores table with the following attributes
    #
    # * primary_key :id
    # * Integer     :identifier, unique: true, null: false
    # * String      :name, null: false
    # * String      :type, null: false
    # * String      :description
    # * DateTime    :created_at
    # * DateTime    :updated_at
    #
    def create_table!
      migrate_table!(:up)
    end

    # Drop data_stores table and recreate it
    def reset!
      migrate_table!(:down)
      migrate_table!(:up)
      disconnect
    end

    # Return the dataset associated with data_stores
    def dataset
      @dataset ||= begin
        create_table!
        database[:data_stores]
      end
    end

    # Return the database object to which its connected.
    def database
      @database ||= begin
        if ENV['DATABASE_URL']
          Sequel.connect(ENV['DATABASE_URL'])
        elsif RUBY_PLATFORM == 'java'
          Sequel.connect(jdbc_settings)
        else
          Sequel.connect(database_settings)
        end
      end
    end

    private

    def jdbc_settings
      settings = database_settings
      db =  case settings['adapter']
            when 'postgres'
              'postgresql'
            when 'mysql2'
              'mysql'
            else
              settings['adapter']
            end
      if db == 'sqlite'
        uri = "jdbc:#{db}:#{settings['database']}"
      else
        uri = "jdbc:#{db}://#{settings['host']}/#{settings['database']}?user=#{settings['username']}"
      end
      settings['password'] ? uri + "&password=#{settings['password']}" : uri
    end

    def disconnect
      database.disconnect
      @database = nil
    end
 
    def drop_table!
      DataStore.create_data_stores.apply(database, :down)
    rescue Sequel::DatabaseError => e
      raise e if e.message.include?('FATAL')
    end

    def migrate_table!(direction)
      DataStore.create_data_stores.apply(database, direction.to_sym)
    rescue Sequel::DatabaseError => e
      raise e if e.message.include?('FATAL')
    end


    def database_settings
      config_file = DataStore.configuration.database_config_file
      settings = YAML.load(File.open(config_file))[DataStore.configuration.database.to_s]
      settings['adapter'] = 'postgres' if settings['adapter'] == 'postgresql'
      settings
    end

  end

end