Skip to content

Commit

Permalink
Extract Oracle database tasks.
Browse files Browse the repository at this point in the history
  • Loading branch information
kennyj committed Apr 2, 2013
1 parent 0f313fc commit 742d090
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 31 deletions.
1 change: 1 addition & 0 deletions activerecord/lib/active_record.rb
Expand Up @@ -146,6 +146,7 @@ module Tasks

autoload :FirebirdDatabaseTasks, 'active_record/tasks/firebird_database_tasks'
autoload :SqlserverDatabaseTasks, 'active_record/tasks/sqlserver_database_tasks'
autoload :OracleDatabaseTasks, 'active_record/tasks/oracle_database_tasks'
end

autoload :TestCase
Expand Down
29 changes: 3 additions & 26 deletions activerecord/lib/active_record/railties/databases.rake
Expand Up @@ -274,13 +274,7 @@ db_namespace = namespace :db do
task :dump => [:environment, :load_config] do
filename = ENV['DB_STRUCTURE'] || File.join(Rails.root, "db", "structure.sql")
current_config = ActiveRecord::Tasks::DatabaseTasks.current_config
case current_config['adapter']
when 'oci', 'oracle'
ActiveRecord::Base.establish_connection(current_config)
File.open(filename, "w:utf-8") { |f| f << ActiveRecord::Base.connection.structure_dump }
else
ActiveRecord::Tasks::DatabaseTasks.structure_dump(current_config, filename)
end
ActiveRecord::Tasks::DatabaseTasks.structure_dump(current_config, filename)

if ActiveRecord::Base.connection.supports_migrations?
File.open(filename, "a") do |f|
Expand All @@ -294,15 +288,7 @@ db_namespace = namespace :db do
task :load => [:environment, :load_config] do
current_config = ActiveRecord::Tasks::DatabaseTasks.current_config
filename = ENV['DB_STRUCTURE'] || File.join(Rails.root, "db", "structure.sql")
case current_config['adapter']
when 'oci', 'oracle'
ActiveRecord::Base.establish_connection(current_config)
IO.read(filename).split(";\n\n").each do |ddl|
ActiveRecord::Base.connection.execute(ddl)
end
else
ActiveRecord::Tasks::DatabaseTasks.structure_load(current_config, filename)
end
ActiveRecord::Tasks::DatabaseTasks.structure_load(current_config, filename)
end

task :load_if_sql => ['db:create', :environment] do
Expand Down Expand Up @@ -357,16 +343,7 @@ db_namespace = namespace :db do

# desc "Empty the test database"
task :purge => [:environment, :load_config] do
abcs = ActiveRecord::Base.configurations
case abcs['test']['adapter']
when "oci", "oracle"
ActiveRecord::Base.establish_connection(:test)
ActiveRecord::Base.connection.structure_drop.split(";\n\n").each do |ddl|
ActiveRecord::Base.connection.execute(ddl)
end
else
ActiveRecord::Tasks::DatabaseTasks.purge abcs['test']
end
ActiveRecord::Tasks::DatabaseTasks.purge ActiveRecord::Base.configurations['test']
end

# desc 'Check for pending migrations and load the test schema'
Expand Down
11 changes: 6 additions & 5 deletions activerecord/lib/active_record/tasks/database_tasks.rb
Expand Up @@ -15,12 +15,13 @@ def register_task(pattern, task)
@tasks[pattern] = task
end

register_task(/mysql/, ActiveRecord::Tasks::MySQLDatabaseTasks)
register_task(/postgresql/, ActiveRecord::Tasks::PostgreSQLDatabaseTasks)
register_task(/sqlite/, ActiveRecord::Tasks::SQLiteDatabaseTasks)
register_task(/mysql/, ActiveRecord::Tasks::MySQLDatabaseTasks)
register_task(/postgresql/, ActiveRecord::Tasks::PostgreSQLDatabaseTasks)
register_task(/sqlite/, ActiveRecord::Tasks::SQLiteDatabaseTasks)

register_task(/firebird/, ActiveRecord::Tasks::FirebirdDatabaseTasks)
register_task(/sqlserver/, ActiveRecord::Tasks::SqlserverDatabaseTasks)
register_task(/firebird/, ActiveRecord::Tasks::FirebirdDatabaseTasks)
register_task(/sqlserver/, ActiveRecord::Tasks::SqlserverDatabaseTasks)
register_task(/(oci|oracle)/, ActiveRecord::Tasks::OracleDatabaseTasks)

def current_config(options = {})
options.reverse_merge! :env => Rails.env
Expand Down
44 changes: 44 additions & 0 deletions activerecord/lib/active_record/tasks/oracle_database_tasks.rb
@@ -0,0 +1,44 @@
module ActiveRecord
module Tasks # :nodoc:
class OracleDatabaseTasks # :nodoc:
delegate :connection, :establish_connection, to: ActiveRecord::Base

def initialize(configuration)
@configuration = configuration
end

def create
$stderr.puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
end

def drop
$stderr.puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
end

def purge
establish_connection(:test)
connection.structure_drop.split(";\n\n").each { |ddl| connection.execute(ddl) }
end

def charset
$stderr.puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
end

def structure_dump(filename)
establish_connection(configuration)
File.open(filename, "w:utf-8") { |f| f << connection.structure_dump }
end

def structure_load(filename)
establish_connection(configuration)
IO.read(filename).split(";\n\n").each { |ddl| connection.execute(ddl) }
end

private

def configuration
@configuration
end
end
end
end
86 changes: 86 additions & 0 deletions activerecord/test/cases/tasks/oracle_rake_test.rb
@@ -0,0 +1,86 @@
require 'cases/helper'

module ActiveRecord
module OracleSetupper
def setup
@database = 'db.oracle'
@connection = stub :connection
@configuration = {
'adapter' => 'oracle',
'database' => @database
}
ActiveRecord::Base.stubs(:connection).returns(@connection)
ActiveRecord::Base.stubs(:establish_connection).returns(true)
end
end

class OracleDBCreateTest < ActiveRecord::TestCase
include OracleSetupper

def test_db_retrieves_create
message = capture(:stderr) do
ActiveRecord::Tasks::DatabaseTasks.create @configuration
end
assert_match(/not supported/, message)
end
end

class OracleDBDropTest < ActiveRecord::TestCase
include OracleSetupper

def test_db_retrieves_drop
message = capture(:stderr) do
ActiveRecord::Tasks::DatabaseTasks.drop @configuration
end
assert_match(/not supported/, message)
end
end

class OracleDBCharsetAndCollationTest < ActiveRecord::TestCase
include OracleSetupper

def test_db_retrieves_collation
assert_raise NoMethodError do
ActiveRecord::Tasks::DatabaseTasks.collation @configuration
end
end

def test_db_retrieves_charset
message = capture(:stderr) do
ActiveRecord::Tasks::DatabaseTasks.charset @configuration
end
assert_match(/not supported/, message)
end
end

class OracleStructureDumpTest < ActiveRecord::TestCase
include OracleSetupper

def setup
super
@connection.stubs(:structure_dump).returns("select sysdate from dual;")
end

def test_structure_dump
filename = "oracle.sql"
ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
assert File.exists?(filename)
ensure
FileUtils.rm_f(filename)
end
end

class OracleStructureLoadTest < ActiveRecord::TestCase
include OracleSetupper

def test_structure_load
filename = "oracle.sql"

open(filename, 'w') { |f| f.puts("select sysdate from dual;") }
@connection.stubs(:execute).with("select sysdate from dual;\n")
ActiveRecord::Tasks::DatabaseTasks.structure_load(@configuration, filename)
ensure
FileUtils.rm_f(filename)
end
end
end

0 comments on commit 742d090

Please sign in to comment.