Skip to content

Commit 6100d23

Browse files
committed
Fix schema cache and lowercase schema setting.
1 parent 579d57c commit 6100d23

File tree

7 files changed

+71
-49
lines changed

7 files changed

+71
-49
lines changed

‎lib/active_record/connection_adapters/sqlserver/schema_cache.rb

+49-26
Original file line numberDiff line numberDiff line change
@@ -7,59 +7,78 @@ class SchemaCache < ActiveRecord::ConnectionAdapters::SchemaCache
77

88
def initialize(conn)
99
super
10-
@table_names = nil
11-
@view_names = nil
10+
@views = {}
1211
@view_information = {}
1312
end
1413

1514
# Superclass Overrides
1615

16+
def primary_keys(table_name)
17+
super(table_name_key(table_name))
18+
end
19+
1720
def table_exists?(table_name)
18-
return false if table_name.blank?
19-
key = table_name_key(table_name)
20-
return @tables[key] if @tables.key? key
21-
@tables[key] = connection.table_exists?(table_name)
21+
name = table_name_key(table_name)
22+
super(name) || view_exists?(name)
23+
end
24+
25+
def add(table_name)
26+
super(table_name_key(table_name))
27+
end
28+
29+
def tables(name)
30+
super(table_name_key(name))
31+
end
32+
33+
def columns(table_name)
34+
super(table_name_key(table_name))
35+
end
36+
37+
def columns_hash(table_name)
38+
super(table_name_key(table_name))
2239
end
2340

2441
def clear!
2542
super
26-
@table_names = nil
27-
@view_names = nil
43+
@views.clear
2844
@view_information.clear
2945
end
3046

47+
def size
48+
super + [@views, @view_information].map{ |x| x.size }.inject(:+)
49+
end
50+
3151
def clear_table_cache!(table_name)
32-
key = table_name_key(table_name)
33-
super(key)
52+
table_name = table_name_key(table_name)
3453
super(table_name)
35-
# SQL Server Specific
36-
if @table_names
37-
@table_names.delete key
38-
@table_names.delete table_name
39-
end
40-
if @view_names
41-
@view_names.delete key
42-
@view_names.delete table_name
43-
end
44-
@view_information.delete key
54+
@views.delete table_name
55+
@view_information.delete table_name
4556
end
4657

47-
# SQL Server Specific
58+
def marshal_dump
59+
super + [@views, @view_information]
60+
end
4861

49-
def table_names
50-
@table_names ||= connection.tables
62+
def marshal_load(array)
63+
@views, @view_information = array[-2..-1]
64+
super(array[0..-3])
5165
end
5266

67+
# SQL Server Specific
68+
5369
def view_names
54-
@view_names ||= connection.views
70+
@views.select{ |k,v| v }.keys
5571
end
5672

5773
def view_exists?(table_name)
58-
table_exists?(table_name)
74+
name = table_name_key(table_name)
75+
prepare_views if @views.empty?
76+
return @views[name] if @views.key? name
77+
@views[name] = connection.views.include?(name)
5978
end
6079

6180
def view_information(table_name)
62-
key = table_name_key(table_name)
81+
name = table_name_key(table_name)
6382
return @view_information[key] if @view_information.key? key
6483
@view_information[key] = connection.send(:view_information, table_name)
6584
end
@@ -71,6 +90,10 @@ def table_name_key(table_name)
7190
SQLServer::Utils.extract_identifiers(table_name).object
7291
end
7392

93+
def prepare_views
94+
connection.views.each { |view| @views[view] = true }
95+
end
96+
7497
end
7598
end
7699
end

‎test/cases/adapter_test_sqlserver.rb

+11-12
Original file line numberDiff line numberDiff line change
@@ -118,29 +118,28 @@ class AdapterTestSQLServer < ActiveRecord::TestCase
118118
describe 'testing #lowercase_schema_reflection' do
119119

120120
before do
121-
UpperTestDefault.delete_all
122-
UpperTestDefault.create COLUMN1: 'Got a minute?', COLUMN2: 419
123-
UpperTestDefault.create COLUMN1: 'Favorite number?', COLUMN2: 69
121+
SSTestUpper.delete_all
122+
SSTestUpper.create COLUMN1: 'Got a minute?', COLUMN2: 419
123+
SSTestUpper.create COLUMN1: 'Favorite number?', COLUMN2: 69
124124
end
125125

126126
after do
127127
connection.lowercase_schema_reflection = false
128128
end
129129

130130
it 'not lowercase schema reflection by default' do
131-
assert UpperTestDefault.columns_hash['COLUMN1']
132-
assert_equal 'Got a minute?', UpperTestDefault.first.COLUMN1
133-
assert_equal 'Favorite number?', UpperTestDefault.last.COLUMN1
134-
assert UpperTestDefault.columns_hash['COLUMN2']
131+
assert SSTestUpper.columns_hash['COLUMN1']
132+
assert_equal 'Got a minute?', SSTestUpper.first.COLUMN1
133+
assert_equal 'Favorite number?', SSTestUpper.last.COLUMN1
134+
assert SSTestUpper.columns_hash['COLUMN2']
135135
end
136136

137137
it 'lowercase schema reflection when set' do
138138
connection.lowercase_schema_reflection = true
139-
UpperTestLowered.reset_column_information
140-
assert UpperTestLowered.columns_hash['column1']
141-
assert_equal 'Got a minute?', UpperTestLowered.first.column1
142-
assert_equal 'Favorite number?', UpperTestLowered.last.column1
143-
assert UpperTestLowered.columns_hash['column2']
139+
assert SSTestUppered.columns_hash['column1']
140+
assert_equal 'Got a minute?', SSTestUppered.first.column1
141+
assert_equal 'Favorite number?', SSTestUppered.last.column1
142+
assert SSTestUppered.columns_hash['column2']
144143
end
145144

146145
end

‎test/models/sqlserver/upper.rb

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class SSTestUpper < ActiveRecord::Base
2+
self.table_name = 'sst_upper_tests'
3+
end

‎test/models/sqlserver/uppered.rb

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class SSTestUppered < ActiveRecord::Base
2+
self.table_name = 'SST_UPPER_TESTS'
3+
end

‎test/models/upper_test_default.rb

-3
This file was deleted.

‎test/models/upper_test_lowered.rb

-3
This file was deleted.

‎test/schema/sqlserver_specific_schema.rb

+5-5
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@
22

33
execute File.read(ARTest::SQLServer.schema_datatypes_2012_file)
44

5-
create_table :datatypes_migration, force: true do |t|
5+
create_table :sst_datatypes_migration, force: true do |t|
66
t.column :real, :real
77
end
88

9-
10-
11-
12-
create_table :UPPER_TESTS, force: true do |t|
9+
create_table :SST_UPPER_TESTS, force: true do |t|
1310
t.column :COLUMN1, :string
1411
t.column :COLUMN2, :integer
1512
end
1613

14+
15+
16+
1717
create_table :float_data, force: true do |t|
1818
t.float :temperature
1919
t.float :temperature_8, limit: 8

0 commit comments

Comments
 (0)