Module: DatabaseLoader

Defined in:
lib/database_loader.rb,
lib/database_loader/railtie.rb,
lib/database_loader/version.rb,
lib/database_loader/sql_file.rb,
lib/database_loader/template.rb,
lib/database_loader/ruby_file.rb,
lib/database_loader/sql_statement.rb

Defined Under Namespace

Classes: Railtie, RubyFile, SqlFile, SqlStatement, Template

Constant Summary collapse

VERSION =
"0.1.1"

Class Method Summary collapse

Class Method Details

.connect_as(schema) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/database_loader.rb', line 85

def self.connect_as(schema)
  begin
    connection_config = ActiveRecord::Base.connection.raw_connection.instance_variable_get("@config").symbolize_keys
    connection_name = nil
    # When running rake test|spec RAILS_ENV is development by default,
    # so we need to guess config from current connection.
    ActiveRecord::Base.configurations.each do |name, config|
      # current configuration?
      if connection_config.symbolize_keys == config.symbolize_keys
        # current configuration has also _apps configuration?
        if ActiveRecord::Base.configurations.any? { |other_name, _| other_name.to_s == "#{name}_#{schema}" }
          connection_name = name
          break
        end
      end
    end
    if schema != :local
      unless connection_name
        raise "Missing database.yml configuration for <RAILS_ENV>_#{schema}."
      end
      puts "* Loading SQL statements in #{connection_name.downcase}_apps"
      ActiveRecord::Base.establish_connection("#{connection_name}_#{schema}".to_sym)
    end
    yield connection_config
  ensure
    if schema != :local
      # Set back the original connection
      ActiveRecord::Base.establish_connection(connection_name)
    end
  end
end

.dbms_outputObject



77
78
79
80
81
82
83
# File 'lib/database_loader.rb', line 77

def self.dbms_output
  loop do
    result = plsql.dbms_output.get_line(:line => '', :status => 0)
    break unless result[:status] == 0
    yield result[:line]
  end
end

.enable_dbms_outputObject



73
74
75
# File 'lib/database_loader.rb', line 73

def self.enable_dbms_output
  plsql.dbms_output.enable(10_000)
end

.errorsObject



64
65
66
67
68
69
70
71
# File 'lib/database_loader.rb', line 64

def self.errors
  ActiveRecord::Base.connection.select_all(%{
    SELECT *
    FROM USER_ERRORS
    WHERE name LIKE '#{ActiveRecord::Base.table_name_prefix[0..-2].upcase}%'
    ORDER BY name, type, sequence
  })
end

.files(schema, type = nil, name = nil) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/database_loader.rb', line 37

def self.files(schema, type = nil, name = nil)
  type ||= "**"
  name ||= "*"
  files = []
  Dir[File.expand_path("#{Rails.root}/db/sql/#{schema}/#{type}")].each do |dir_path|
    if DatabaseLoader.types.include?(File.basename(dir_path).to_sym)
      Dir["#{dir_path}/#{name}.sql"].sort.each do |path|
        files << SqlFile.new(path)
      end
      Dir["#{dir_path}/#{name}.rb"].sort.each do |path|
        files << RubyFile.new(path)
      end
    end
  end
  files
end

.invalid_objectsObject



54
55
56
57
58
59
60
61
62
# File 'lib/database_loader.rb', line 54

def self.invalid_objects
  ActiveRecord::Base.connection.select_all(%{
    SELECT object_name AS name, object_type AS type, status
    FROM user_objects
    WHERE object_name LIKE '#{ActiveRecord::Base.table_name_prefix[0..-2].upcase}%'
      AND status = 'INVALID'
      AND object_type like 'PACKAGE%'
  })
end

.set_schemasObject



9
10
11
12
13
14
15
# File 'lib/database_loader.rb', line 9

def self.set_schemas
  if Rails.root
    self.schemas = Dir[File.expand_path("#{Rails.root}/db/sql/*")].select { |d| File.directory?(d) }.map { |d| File.basename(d).to_sym }
  else
    self.schemas = [:local]
  end
end