class DbMeta::Oracle::Oracle

Public Class Methods

new(args = {}) click to toggle source
Calls superclass method
# File lib/db_meta/oracle/oracle.rb, line 20
def initialize(args = {})
  super(args)

  Connection.instance.set(@username, @password, @instance, @worker)

  @objects = Objects.new
end

Public Instance Methods

extract(args = {}) click to toggle source
# File lib/db_meta/oracle/oracle.rb, line 48
def extract(args = {})
  format = args[:format] || :sql

  # validate args
  raise "Format [#{format}] is not supported" unless EXTRACT_FORMATS.include?(format)

  remove_folder(@base_folder)
  create_folder(@base_folder)

  @objects.detect_system_objects
  @objects.merge_synonyms
  @objects.merge_grants
  @objects.embed_indexes
  @objects.embed_constraints
  @objects.merge_constraints
  @objects.embed_triggers
  @objects.handle_table_data(args)

  extract_summary
  extract_create_all(args)
  extract_drop_all(args)

  # extract all default objects
  @objects.default_each do |object|
    folder = File.join(@base_folder, "#{"%02d" % type_sequence(object.type)}_#{object.type}")
    create_folder(folder)

    filename = File.join(folder, "#{object.name}.#{format}")
    write_buffer_to_file(object.extract(args), filename)
  end
end
fetch(args = {}) click to toggle source
# File lib/db_meta/oracle/oracle.rb, line 28
def fetch(args = {})
  @include_pattern = args[:include]
  @exclude_pattern = args[:exclude]

  Objects.all.each do |object|
    if @exclude_pattern
      next if @exclude_pattern&.match?(object.name)
    end
    if @include_pattern
      next unless @include_pattern&.match?(object.name)
    end
    @objects << object
  end

  # parallel fetching of object details
  @objects.fetch
ensure
  Connection.instance.disconnect
end

Private Instance Methods

compile_invalid_script() click to toggle source
# File lib/db_meta/oracle/oracle.rb, line 164
def compile_invalid_script
  buffer = [block("Compile invalid objects if needed", 40)]
  buffer << "declare"
  buffer << "begin"
  buffer << "  for rec in (select object_name, object_type from user_objects where status = 'INVALID') loop"
  buffer << "    if rec.object_type = 'PACKAGE' or rec.object_type = 'PACKAGE BODY' then"
  buffer << "      execute immediate 'alter PACKAGE ' || rec.object_name || ' compile';"
  buffer << "      execute immediate 'alter PACKAGE ' || rec.object_name || ' compile body';"
  buffer << "    else"
  buffer << "      execute immediate 'alter ' || rec.object_type || ' ' || rec.object_name || ' compile';"
  buffer << "    end if;"
  buffer << "  end loop;"
  buffer << "end;"
  buffer << "/"
  buffer.join("\n")
end
extract_create_all(args = {}) click to toggle source
# File lib/db_meta/oracle/oracle.rb, line 118
def extract_create_all(args = {})
  Log.info("Extracting create all script...")

  buffer = [block("#{@username} - CREATE ALL")]

  current_type = nil
  @objects.default_each do |object|
    if current_type != object.type
      buffer << nil
      buffer << block(object.type, 40)
    end

    folder = "#{"%02d" % type_sequence(object.type)}_#{object.type}"
    file = "#{object.name}.sql"
    buffer << "@#{File.join(folder, file).downcase.tr(" ", "_")}"
    current_type = object.type
  end
  buffer << nil
  buffer << compile_invalid_script
  buffer << nil

  filename = File.join(@base_folder, "#{"%02d" % type_sequence("CREATE")}_create_all.sql")
  write_buffer_to_file(buffer, filename)
end
extract_drop_all(args = {}) click to toggle source
# File lib/db_meta/oracle/oracle.rb, line 143
def extract_drop_all(args = {})
  Log.info("Extracting drop all script...")

  buffer = [block("#{@username} - DROP ALL")]

  current_type = nil
  @objects.reverse_default_each do |object|
    if current_type != object.type
      buffer << nil
      buffer << block(object.type, 40)
    end

    buffer << object.ddl_drop
    current_type = object.type
  end
  buffer << nil

  filename = File.join(@base_folder, "#{"%02d" % type_sequence("DROP")}_drop_all.sql")
  write_buffer_to_file(buffer, filename)
end
extract_summary() click to toggle source
# File lib/db_meta/oracle/oracle.rb, line 82
def extract_summary
  Log.info("Summarizing...")

  buffer = [block("Summary of #{@username}"), nil]

  total = 0
  @objects.summary_each do |type, count|
    next if count == 0
    total += count
    buffer << "#{SUMMARY_COLUMN_FORMAT_NAME % type.upcase.to_s}#{"%5d" % count} #{"(#{@objects.summary_system_object[type]} system #{pluralize(@objects.summary_system_object[type], "object")})" if @objects.summary_system_object[type] > 0}"
  end
  buffer << nil

  buffer << "#{SUMMARY_COLUMN_FORMAT_NAME % "Total Objects"}#{"%5d" % total}"
  buffer << nil
  buffer << nil

  # invalid objects
  if @objects.invalids?
    buffer << "Invalid/Disabled Objects"
    @objects.invalid_each do |type, objects|
      buffer << "#{SUMMARY_COLUMN_FORMAT_NAME % type.upcase.to_s}#{"%5d" % objects.size}"
      objects.each do |object|
        buffer << (SUMMARY_COLUMN_FORMAT_NAME_RIGHT % object.name).to_s
      end
      buffer << nil
    end
  else
    buffer << "No invalid/disabled objects"
  end
  buffer << nil

  filename = File.join(@base_folder, "#{"%02d" % type_sequence("SUMMARY")}_summary.txt")
  write_buffer_to_file(buffer, filename)
end