From 7fbaab37275f70a7d0006e21858667c7b4f1126f Mon Sep 17 00:00:00 2001 From: Joiey Seeley Date: Mon, 8 Dec 2014 11:43:12 -0600 Subject: [PATCH 1/6] Created ActiveRecord::Tasks::SQLServerDatabaseTasks class which addresses compatibility issues with Rails v4.1.8. This is not yet a complete implementation of the ActiveRecord::Tasks interface. Adds test cases in test/cases/tasks/sqlserver_rake_test_sqlserver.rb requires the new sqlserver_database_tasks from lib/activerecord-sqlserver-adapter.rb Updates to test/cases/(associations_test_sqlserver & resolver_test_sqlserver) to address failing tests. Added tags to .gitignore so ctags index files won't be checked in. Fixed typo in RUNNING_UNIT_TESTS.md. --- .gitignore | 5 +- RUNNING_UNIT_TESTS.md | 2 +- lib/activerecord-sqlserver-adapter.rb | 1 + lib/tasks/sqlserver_database_tasks.rb | 42 ++++++++++++++ test/cases/associations_test_sqlserver.rb | 5 ++ test/cases/resolver_test_sqlserver.rb | 4 ++ .../tasks/sqlserver_rake_test_sqlserver.rb | 58 +++++++++++++++++++ 7 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 lib/tasks/sqlserver_database_tasks.rb create mode 100644 test/cases/tasks/sqlserver_rake_test_sqlserver.rb diff --git a/.gitignore b/.gitignore index 511d7d68d..7eca4a872 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,7 @@ test/profile/output/* .idea coverage/* .flooignore -.floo \ No newline at end of file +.floo +.ruby-gemset +.ruby-version +tags diff --git a/RUNNING_UNIT_TESTS.md b/RUNNING_UNIT_TESTS.md index 8ebe4bc40..dd9a1d697 100644 --- a/RUNNING_UNIT_TESTS.md +++ b/RUNNING_UNIT_TESTS.md @@ -36,7 +36,7 @@ The tests of this adapter depend on the existence of the Rails which under the 3 $ git clone git://github.com/rails-sqlserver/activerecord-sqlserver-adapter.git ``` -Optionally, you an just let bundler do all the work and assuming there is a git tag for the Rails version, you can set `RAILS_VERSION` before bundling. +Optionally, you can just let bundler do all the work and assuming there is a git tag for the Rails version, you can set `RAILS_VERSION` before bundling. ``` $ export RAILS_VERSION='3.2.13' diff --git a/lib/activerecord-sqlserver-adapter.rb b/lib/activerecord-sqlserver-adapter.rb index b420ca178..3162b3835 100644 --- a/lib/activerecord-sqlserver-adapter.rb +++ b/lib/activerecord-sqlserver-adapter.rb @@ -1 +1,2 @@ require 'active_record/connection_adapters/sqlserver_adapter' +require 'tasks/sqlserver_database_tasks' diff --git a/lib/tasks/sqlserver_database_tasks.rb b/lib/tasks/sqlserver_database_tasks.rb new file mode 100644 index 000000000..faa9645cc --- /dev/null +++ b/lib/tasks/sqlserver_database_tasks.rb @@ -0,0 +1,42 @@ +module ActiveRecord + module Tasks # :nodoc: + class SQLServerDatabaseTasks # :nodoc: + delegate :connection, :establish_connection, to: ActiveRecord::Base + + def initialize(configuration) + @configuration = configuration + end + + def drop + establish_connection configuration + connection.drop_database configuration['database'] + end + + def purge + establish_connection configuration + connection.recreate_database + end + + private + + def configuration + @configuration + end + + def creation_options + Hash.new.tap do |options| + options[:charset] = configuration['encoding'] if configuration.include? 'encoding' + options[:collation] = configuration['collation'] if configuration.include? 'collation' + + # Set default charset only when collation isn't set. + options[:charset] ||= DEFAULT_CHARSET unless options[:collation] + + # Set default collation only when charset is also default. + options[:collation] ||= DEFAULT_COLLATION if options[:charset] == DEFAULT_CHARSET + end + end + + ActiveRecord::Tasks::DatabaseTasks.register_task(/sqlserver/, ActiveRecord::Tasks::SQLServerDatabaseTasks) + end + end +end diff --git a/test/cases/associations_test_sqlserver.rb b/test/cases/associations_test_sqlserver.rb index eb2fbee61..797104eaa 100644 --- a/test/cases/associations_test_sqlserver.rb +++ b/test/cases/associations_test_sqlserver.rb @@ -1,5 +1,7 @@ require 'cases/sqlserver_helper' require 'models/owner' +require 'models/pet' +require 'models/toy' class HasManyThroughAssociationsTest < ActiveRecord::TestCase COERCED_TESTS = [:test_has_many_through_obeys_order_on_through_association] @@ -7,6 +9,9 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase # Until that patch is made to rails we are preventing this test from running in this gem. include SqlserverCoercedTest + + fixtures :owners, :pets, :toys + def test_coerced_has_many_through_obeys_order_on_through_association owner = owners(:blackbeard) # assert owner.toys.to_sql.include?("pets.name desc") # What's currently in rails diff --git a/test/cases/resolver_test_sqlserver.rb b/test/cases/resolver_test_sqlserver.rb index 5718a3f11..0e19b5faa 100644 --- a/test/cases/resolver_test_sqlserver.rb +++ b/test/cases/resolver_test_sqlserver.rb @@ -8,6 +8,10 @@ class ResolverTest < ActiveRecord::TestCase include SqlserverCoercedTest + def resolve(spec, config={}) + Resolver.new(config).resolve(spec) + end + COERCED_TESTS = [ :test_url_host_no_db, :test_url_host_db, diff --git a/test/cases/tasks/sqlserver_rake_test_sqlserver.rb b/test/cases/tasks/sqlserver_rake_test_sqlserver.rb new file mode 100644 index 000000000..6a27c89b7 --- /dev/null +++ b/test/cases/tasks/sqlserver_rake_test_sqlserver.rb @@ -0,0 +1,58 @@ +require 'cases/helper' +require(Dir.pwd + '/lib/tasks/sqlserver_database_tasks') + +module ActiveRecord + class SQLServerDropTest < ActiveRecord::TestCase + def setup + @connection = stub(:drop_database => true) + @configuration = { + 'adapter' => 'sqlserver', + 'database' => 'activerecord_unittest' + } + + ActiveRecord::Base.stubs(:connection).returns(@connection) + ActiveRecord::Base.stubs(:establish_connection).returns(true) + ActiveRecord::Tasks::DatabaseTasks.register_task(/sqlserver/, ActiveRecord::Tasks::SQLServerDatabaseTasks) + end + + def test_establishes_connection_to_sqlserver_database + ActiveRecord::Base.expects(:establish_connection).with @configuration + + ActiveRecord::Tasks::DatabaseTasks.drop @configuration + end + + def test_drops_database + @connection.expects(:drop_database).with('activerecord_unittest') + + ActiveRecord::Tasks::DatabaseTasks.drop @configuration + end + end + + class SQLServerPurgeTest < ActiveRecord::TestCase + def setup + @connection = stub(:recreate_database => true) + @configuration = { + 'adapter' => 'sqlserver', + 'database' => 'activerecord_unittest' + } + + ActiveRecord::Base.stubs(:connection).returns(@connection) + ActiveRecord::Base.stubs(:establish_connection).returns(true) + ActiveRecord::Tasks::DatabaseTasks.register_task(/sqlserver/, ActiveRecord::Tasks::SQLServerDatabaseTasks) + end + + def test_establishes_connection_to_test_database + ActiveRecord::Base.expects(:establish_connection).with(@configuration) + + ActiveRecord::Tasks::DatabaseTasks.purge @configuration + end + + def test_recreates_database + @connection.expects(:recreate_database) + + ActiveRecord::Tasks::DatabaseTasks.purge @configuration + end + + end + +end From 81b452989b8b5c47fd79c9bf5e1e98fc04678d0d Mon Sep 17 00:00:00 2001 From: Joiey Seeley Date: Fri, 12 Dec 2014 09:21:44 -0600 Subject: [PATCH 2/6] Refactor following Ken's input. Moved tags out of .gitignore. Moved SQLServerDatabaseTasks under the active_record sub-directory where it belongs. Updated locations where sqlserver_database_tasks was being required to use the new path. --- .gitignore | 1 - lib/{ => active_record}/tasks/sqlserver_database_tasks.rb | 0 lib/activerecord-sqlserver-adapter.rb | 2 +- test/cases/tasks/sqlserver_rake_test_sqlserver.rb | 2 +- 4 files changed, 2 insertions(+), 3 deletions(-) rename lib/{ => active_record}/tasks/sqlserver_database_tasks.rb (100%) diff --git a/.gitignore b/.gitignore index 7eca4a872..140a8d505 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,3 @@ coverage/* .floo .ruby-gemset .ruby-version -tags diff --git a/lib/tasks/sqlserver_database_tasks.rb b/lib/active_record/tasks/sqlserver_database_tasks.rb similarity index 100% rename from lib/tasks/sqlserver_database_tasks.rb rename to lib/active_record/tasks/sqlserver_database_tasks.rb diff --git a/lib/activerecord-sqlserver-adapter.rb b/lib/activerecord-sqlserver-adapter.rb index 3162b3835..865fdbb84 100644 --- a/lib/activerecord-sqlserver-adapter.rb +++ b/lib/activerecord-sqlserver-adapter.rb @@ -1,2 +1,2 @@ require 'active_record/connection_adapters/sqlserver_adapter' -require 'tasks/sqlserver_database_tasks' +require 'active_record/tasks/sqlserver_database_tasks' diff --git a/test/cases/tasks/sqlserver_rake_test_sqlserver.rb b/test/cases/tasks/sqlserver_rake_test_sqlserver.rb index 6a27c89b7..0bbbe5ede 100644 --- a/test/cases/tasks/sqlserver_rake_test_sqlserver.rb +++ b/test/cases/tasks/sqlserver_rake_test_sqlserver.rb @@ -1,5 +1,5 @@ require 'cases/helper' -require(Dir.pwd + '/lib/tasks/sqlserver_database_tasks') +require(Dir.pwd + '/lib/active_record/tasks/sqlserver_database_tasks.rb') module ActiveRecord class SQLServerDropTest < ActiveRecord::TestCase From a0d3eda3c2f897b2aa1960ce0900242372d7d012 Mon Sep 17 00:00:00 2001 From: Jonathan Frazier Date: Thu, 18 Dec 2014 15:51:17 -0500 Subject: [PATCH 3/6] Add task for db:create --- lib/active_record/tasks/sqlserver_database_tasks.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/active_record/tasks/sqlserver_database_tasks.rb b/lib/active_record/tasks/sqlserver_database_tasks.rb index faa9645cc..3148c5b9c 100644 --- a/lib/active_record/tasks/sqlserver_database_tasks.rb +++ b/lib/active_record/tasks/sqlserver_database_tasks.rb @@ -7,6 +7,11 @@ def initialize(configuration) @configuration = configuration end + def create + establish_connection configuration + connection.create_database configuration['database'] + end + def drop establish_connection configuration connection.drop_database configuration['database'] From eae64114d65dcff74b3121dc3257c20f5d0c527a Mon Sep 17 00:00:00 2001 From: Jonathan Frazier Date: Thu, 18 Dec 2014 16:01:42 -0500 Subject: [PATCH 4/6] Use connection to master database when creating new database. --- lib/active_record/tasks/sqlserver_database_tasks.rb | 11 +++++++++-- test/profile/query_plan_complex.rb | 0 test/profile/query_plan_simple.rb | 0 3 files changed, 9 insertions(+), 2 deletions(-) mode change 100755 => 100644 test/profile/query_plan_complex.rb mode change 100755 => 100644 test/profile/query_plan_simple.rb diff --git a/lib/active_record/tasks/sqlserver_database_tasks.rb b/lib/active_record/tasks/sqlserver_database_tasks.rb index 3148c5b9c..511e861ac 100644 --- a/lib/active_record/tasks/sqlserver_database_tasks.rb +++ b/lib/active_record/tasks/sqlserver_database_tasks.rb @@ -7,9 +7,10 @@ def initialize(configuration) @configuration = configuration end - def create - establish_connection configuration + def create(master_established = false) + establish_master_connection unless master_established connection.create_database configuration['database'] + establish_connection configuration end def drop @@ -41,6 +42,12 @@ def creation_options end end + def establish_master_connection + establish_connection configuration.merge( + 'database' => 'master' + ) + end + ActiveRecord::Tasks::DatabaseTasks.register_task(/sqlserver/, ActiveRecord::Tasks::SQLServerDatabaseTasks) end end diff --git a/test/profile/query_plan_complex.rb b/test/profile/query_plan_complex.rb old mode 100755 new mode 100644 diff --git a/test/profile/query_plan_simple.rb b/test/profile/query_plan_simple.rb old mode 100755 new mode 100644 From 472b75c45d48c364a1618734bfe1b79bcfcc77f7 Mon Sep 17 00:00:00 2001 From: Jonathan Frazier Date: Fri, 19 Dec 2014 10:26:32 -0500 Subject: [PATCH 5/6] Handle error for database already exists. --- lib/active_record/tasks/sqlserver_database_tasks.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/active_record/tasks/sqlserver_database_tasks.rb b/lib/active_record/tasks/sqlserver_database_tasks.rb index 511e861ac..da24d449b 100644 --- a/lib/active_record/tasks/sqlserver_database_tasks.rb +++ b/lib/active_record/tasks/sqlserver_database_tasks.rb @@ -11,6 +11,13 @@ def create(master_established = false) establish_master_connection unless master_established connection.create_database configuration['database'] establish_connection configuration + + rescue ActiveRecord::StatementInvalid => error + if /Database .* already exists/ === error.message + raise DatabaseAlreadyExists + else + raise + end end def drop From e5276df00c9c75572a487e55e774fb75c84a1a89 Mon Sep 17 00:00:00 2001 From: Jonathan Frazier Date: Tue, 23 Dec 2014 14:16:52 -0500 Subject: [PATCH 6/6] Use master connection to drop database. --- lib/active_record/tasks/sqlserver_database_tasks.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/active_record/tasks/sqlserver_database_tasks.rb b/lib/active_record/tasks/sqlserver_database_tasks.rb index da24d449b..d5d523e56 100644 --- a/lib/active_record/tasks/sqlserver_database_tasks.rb +++ b/lib/active_record/tasks/sqlserver_database_tasks.rb @@ -20,9 +20,10 @@ def create(master_established = false) end end - def drop - establish_connection configuration + def drop(master_established = false) + establish_master_connection unless master_established connection.drop_database configuration['database'] + establish_connection configuration end def purge