From 141373c1c602c67894c97a49f33d8b8cccb0d720 Mon Sep 17 00:00:00 2001 From: Louis Galipeau Date: Wed, 30 Oct 2013 19:17:58 -0300 Subject: [PATCH 1/2] create_database has an additional parameter for collation When creating a database you can now optionally specify the collation used instead of having to rely on the server's default collation. The latter is not always ideal when dealing with legacy systems. --- .../sqlserver/database_statements.rb | 8 ++- .../database_statements_test_sqlserver.rb | 49 +++++++++++++++++++ test/config.yml | 1 + 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 test/cases/database_statements_test_sqlserver.rb diff --git a/lib/active_record/connection_adapters/sqlserver/database_statements.rb b/lib/active_record/connection_adapters/sqlserver/database_statements.rb index 6185e5f1d..c5ebb342d 100644 --- a/lib/active_record/connection_adapters/sqlserver/database_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/database_statements.rb @@ -278,8 +278,12 @@ def drop_database(database) end end - def create_database(database) - do_execute "CREATE DATABASE #{quote_table_name(database)}" + def create_database(database, collation=@connection_options[:collation]) + if collation + do_execute "CREATE DATABASE #{quote_table_name(database)} COLLATE #{collation}" + else + do_execute "CREATE DATABASE #{quote_table_name(database)}" + end end def current_database diff --git a/test/cases/database_statements_test_sqlserver.rb b/test/cases/database_statements_test_sqlserver.rb new file mode 100644 index 000000000..1bacabf0e --- /dev/null +++ b/test/cases/database_statements_test_sqlserver.rb @@ -0,0 +1,49 @@ +require 'cases/sqlserver_helper' + +class DatabaseStatementsTestSqlserver < ActiveRecord::TestCase + + self.use_transactional_fixtures = false + + setup do + @connection = ActiveRecord::Base.connection + end + + should 'create database' do + @connection.create_database 'activerecord_unittest3' #, 'SQL_Latin1_General_CP1_CI_AS' + database_name = @connection.select_value "SELECT name FROM master.dbo.sysdatabases WHERE name = 'activerecord_unittest3'" + puts @connection.select_value "SELECT DATABASEPROPERTYEX('activerecord_unittest3', 'Collation') SQLCollation" + assert_equal 'activerecord_unittest3', database_name + end + + should 'drop database' do + @connection.drop_database 'activerecord_unittest3' + database_name = @connection.select_value "SELECT name FROM master.dbo.sysdatabases WHERE name = 'activerecord_unittest3'" + assert_equal nil, database_name + end + + context 'with collation' do + teardown do + @connection.drop_database 'activerecord_unittest3' + end + + should 'create database with default collation for the server' do + @connection.create_database 'activerecord_unittest3' + default_collation = @connection.select_value "SELECT SERVERPROPERTY('Collation')" + database_collation = @connection.select_value "SELECT DATABASEPROPERTYEX('activerecord_unittest3', 'Collation') SQLCollation" + assert_equal default_collation, database_collation + end + + should 'create database with collation set by the method' do + @connection.create_database 'activerecord_unittest3', 'SQL_Latin1_General_CP1_CI_AS' + collation = @connection.select_value "SELECT DATABASEPROPERTYEX('activerecord_unittest3', 'Collation') SQLCollation" + assert_equal 'SQL_Latin1_General_CP1_CI_AS', collation + end + + should 'create database with collation set by the config' do + @connection.instance_variable_get(:@connection_options)[:collation] = 'SQL_Latin1_General_CP1_CI_AS' + @connection.create_database 'activerecord_unittest3' + collation = @connection.select_value "SELECT DATABASEPROPERTYEX('activerecord_unittest3', 'Collation') SQLCollation" + assert_equal 'SQL_Latin1_General_CP1_CI_AS', collation + end + end +end \ No newline at end of file diff --git a/test/config.yml b/test/config.yml index 553903d79..bd20e22f6 100644 --- a/test/config.yml +++ b/test/config.yml @@ -9,6 +9,7 @@ default_connection_info: &default_connection_info username: <%= ENV['ACTIVERECORD_UNITTEST_USER'] || 'rails' %> password: <%= ENV['ACTIVERECORD_UNITTEST_PASS'] || '' %> azure: <%= !ENV['ACTIVERECORD_UNITTEST_AZURE'].nil? %> + collation: <%= ENV['ACTIVERECORD_UNITTEST_COLLATION'] || nil %> connections: From e200bcfeb7de54e25262130ec2a1e0ee88b0c762 Mon Sep 17 00:00:00 2001 From: Louis Galipeau Date: Fri, 6 Dec 2013 00:26:32 -0400 Subject: [PATCH 2/2] Removed left over puts. Thanks to @annaswims for spotting it. --- test/cases/database_statements_test_sqlserver.rb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/cases/database_statements_test_sqlserver.rb b/test/cases/database_statements_test_sqlserver.rb index 1bacabf0e..3928b6c00 100644 --- a/test/cases/database_statements_test_sqlserver.rb +++ b/test/cases/database_statements_test_sqlserver.rb @@ -11,7 +11,6 @@ class DatabaseStatementsTestSqlserver < ActiveRecord::TestCase should 'create database' do @connection.create_database 'activerecord_unittest3' #, 'SQL_Latin1_General_CP1_CI_AS' database_name = @connection.select_value "SELECT name FROM master.dbo.sysdatabases WHERE name = 'activerecord_unittest3'" - puts @connection.select_value "SELECT DATABASEPROPERTYEX('activerecord_unittest3', 'Collation') SQLCollation" assert_equal 'activerecord_unittest3', database_name end @@ -46,4 +45,4 @@ class DatabaseStatementsTestSqlserver < ActiveRecord::TestCase assert_equal 'SQL_Latin1_General_CP1_CI_AS', collation end end -end \ No newline at end of file +end