Skip to content

Commit 2590776

Browse files
author
Anna Carey
committed
Merge branch 'database_names_with_dots' of https://github.com/eirc/activerecord-sqlserver-adapter into eirc-database_names_with_dots
2 parents fda0412 + 64f63e2 commit 2590776

File tree

5 files changed

+32
-11
lines changed

5 files changed

+32
-11
lines changed

lib/active_record/connection_adapters/sqlserver/database_statements.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ def execute_procedure(proc_name, *variables)
128128
def use_database(database=nil)
129129
return if sqlserver_azure?
130130
database ||= @connection_options[:database]
131-
do_execute "USE #{quote_table_name(database)}" unless database.blank?
131+
do_execute "USE #{quote_database_name(database)}" unless database.blank?
132132
end
133133

134134
def user_options
@@ -267,7 +267,7 @@ def drop_database(database)
267267
retry_count = 0
268268
max_retries = 1
269269
begin
270-
do_execute "DROP DATABASE #{quote_table_name(database)}"
270+
do_execute "DROP DATABASE #{quote_database_name(database)}"
271271
rescue ActiveRecord::StatementInvalid => err
272272
if err.message =~ /because it is currently in use/i
273273
raise if retry_count >= max_retries
@@ -284,9 +284,9 @@ def drop_database(database)
284284

285285
def create_database(database, collation=@connection_options[:collation])
286286
if collation
287-
do_execute "CREATE DATABASE #{quote_table_name(database)} COLLATE #{collation}"
287+
do_execute "CREATE DATABASE #{quote_database_name(database)} COLLATE #{collation}"
288288
else
289-
do_execute "CREATE DATABASE #{quote_table_name(database)}"
289+
do_execute "CREATE DATABASE #{quote_database_name(database)}"
290290
end
291291
end
292292

lib/active_record/connection_adapters/sqlserver/quoting.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ def quote_table_name(name)
4949
quote_column_name(name)
5050
end
5151

52+
def quote_database_name(name)
53+
schema_cache.quote_name(name, false)
54+
end
55+
5256
def substitute_at(column, index)
5357
if column.respond_to?(:sql_type) && column.sql_type == 'timestamp'
5458
nil

lib/active_record/connection_adapters/sqlserver/schema_cache.rb

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,22 @@ def view_information(table_name)
6565
return @view_information[key] if @view_information.key? key
6666
@view_information[key] = connection.send(:view_information, table_name)
6767
end
68-
69-
def quote_name(name)
68+
69+
def quote_name(name, split_on_dots = true)
7070
return @quoted_names[name] if @quoted_names.key? name
71-
@quoted_names[name] = name.to_s.split('.').map{ |n| n =~ /^\[.*\]$/ ? n : "[#{n.to_s.gsub(']', ']]')}]" }.join('.')
71+
72+
@quoted_names[name] = if split_on_dots
73+
name.to_s.split('.').map{ |n| quote_name_part(n) }.join('.')
74+
else
75+
quote_name_part(name.to_s)
76+
end
7277
end
73-
74-
78+
7579
private
80+
81+
def quote_name_part(part)
82+
part =~ /^\[.*\]$/ ? part : "[#{part.to_s.gsub(']', ']]')}]"
83+
end
7684

7785
def table_name_key(table_name)
7886
Utils.unqualify_table_name(table_name)

lib/active_record/connection_adapters/sqlserver_adapter.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -494,11 +494,11 @@ def initialize_dateformatter
494494

495495
def remove_database_connections_and_rollback(database=nil)
496496
database ||= current_database
497-
do_execute "ALTER DATABASE #{quote_table_name(database)} SET SINGLE_USER WITH ROLLBACK IMMEDIATE"
497+
do_execute "ALTER DATABASE #{quote_database_name(database)} SET SINGLE_USER WITH ROLLBACK IMMEDIATE"
498498
begin
499499
yield
500500
ensure
501-
do_execute "ALTER DATABASE #{quote_table_name(database)} SET MULTI_USER"
501+
do_execute "ALTER DATABASE #{quote_database_name(database)} SET MULTI_USER"
502502
end if block_given?
503503
end
504504

test/cases/database_statements_test_sqlserver.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,15 @@ class DatabaseStatementsTestSqlserver < ActiveRecord::TestCase
1919
database_name = @connection.select_value "SELECT name FROM master.dbo.sysdatabases WHERE name = 'activerecord_unittest3'"
2020
assert_equal nil, database_name
2121
end
22+
23+
should 'create/use/drop database with name with dots' do
24+
@connection.create_database 'activerecord.unittest'
25+
database_name = @connection.select_value "SELECT name FROM master.dbo.sysdatabases WHERE name = 'activerecord.unittest'"
26+
assert_equal 'activerecord.unittest', database_name
27+
@connection.use_database 'activerecord.unittest'
28+
@connection.use_database 'master'
29+
@connection.drop_database 'activerecord.unittest'
30+
end
2231

2332
context 'with collation' do
2433
teardown do

0 commit comments

Comments
 (0)