module DataMapper::Migrations::OracleAdapter

Public Class Methods

included(base) click to toggle source

@api private

# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 11
def self.included(base)
  base.extend DataObjectsAdapter::ClassMethods
  base.extend ClassMethods
end

Public Instance Methods

create_model_storage(model) click to toggle source

@api semipublic

# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 67
def create_model_storage(model)
  name       = self.name
  properties = model.properties_with_subclasses(name)
  table_name = model.storage_name(name)
  truncate_or_delete = self.class.auto_migrate_with
  table_is_truncated = truncate_or_delete && @truncated_tables && @truncated_tables[table_name]

  return false if storage_exists?(table_name) && !table_is_truncated
  return false if properties.empty?

  with_connection do |connection|
    # if table was truncated then check if all columns for properties are present
    # TODO: check all other column definition options
    if table_is_truncated && storage_has_all_fields?(table_name, properties)
      @truncated_tables[table_name] = nil
    else
      # forced drop of table if properties are different
      if truncate_or_delete
        destroy_model_storage(model, true)
      end

      statements = [ create_table_statement(connection, model, properties) ]
      statements.concat(create_index_statements(model))
      statements.concat(create_unique_index_statements(model))
      statements.concat(create_sequence_statements(model))

      statements.each do |statement|
        command   = connection.create_command(statement)
        command.execute_non_query
      end
    end

  end

  true
end
destroy_model_storage(model, forced = false) click to toggle source

@api semipublic

# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 105
def destroy_model_storage(model, forced = false)
  table_name = model.storage_name(name)
  klass      = self.class
  truncate_or_delete = klass.auto_migrate_with
  if storage_exists?(table_name)
    if truncate_or_delete && !forced
      case truncate_or_delete
      when :truncate
        execute(truncate_table_statement(model))
      when :delete
        execute(delete_table_statement(model))
      else
        raise ArgumentError, "Unsupported auto_migrate_with option"
      end
      @truncated_tables ||= {}
      @truncated_tables[table_name] = true
    else
      execute(drop_table_statement(model))
      @truncated_tables[table_name] = nil if @truncated_tables
    end
  end
  # added destroy of sequences
  reset_sequences = klass.auto_migrate_reset_sequences
  table_is_truncated = @truncated_tables && @truncated_tables[table_name]
  unless truncate_or_delete && !reset_sequences && !forced
    if sequence_exists?(model_sequence_name(model))
      statement = if table_is_truncated && !forced
        reset_sequence_statement(model)
      else
        drop_sequence_statement(model)
      end
      execute(statement) if statement
    end
  end
  true
end
field_exists?(storage_name, field_name) click to toggle source

@api semipublic

# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 42
      def field_exists?(storage_name, field_name)
        statement = <<-SQL.compress_lines
          SELECT COUNT(*)
          FROM all_tab_columns
          WHERE owner = ?
          AND table_name = ?
          AND column_name = ?
        SQL

        select(statement, schema_name, oracle_upcase(storage_name), oracle_upcase(field_name)).first > 0
      end
sequence_exists?(sequence_name) click to toggle source

@api semipublic

# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 29
      def sequence_exists?(sequence_name)
        return false unless sequence_name
        statement = <<-SQL.compress_lines
          SELECT COUNT(*)
          FROM all_sequences
          WHERE sequence_owner = ?
          AND sequence_name = ?
        SQL

        select(statement, schema_name, oracle_upcase(sequence_name)).first > 0
      end
storage_exists?(storage_name) click to toggle source

@api semipublic

# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 17
      def storage_exists?(storage_name)
        statement = <<-SQL.compress_lines
          SELECT COUNT(*)
          FROM all_tables
          WHERE owner = ?
          AND table_name = ?
        SQL

        select(statement, schema_name, oracle_upcase(storage_name)).first > 0
      end
storage_fields(storage_name) click to toggle source

@api semipublic

# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 55
      def storage_fields(storage_name)
        statement = <<-SQL.compress_lines
          SELECT column_name
          FROM all_tab_columns
          WHERE owner = ?
          AND table_name = ?
        SQL

        select(statement, schema_name, oracle_upcase(storage_name))
      end

Private Instance Methods

oracle_upcase(name) click to toggle source

If table or column name contains just lowercase characters then do uppercase as uppercase version will be used in Oracle data dictionary tables

# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 150
def oracle_upcase(name)
  name =~ /[A-Z]/ ? name : name.upcase
end
storage_has_all_fields?(table_name, properties) click to toggle source
# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 144
def storage_has_all_fields?(table_name, properties)
  properties.map { |property| oracle_upcase(property.field) }.sort == storage_fields(table_name).sort
end