Skip to content

Commit 9e3c468

Browse files
committed
Re-implement our own columns cache since we have to use it excessively with the query_requires_identity_insert?
* At some point rails will start using #exec_query more which has the binds and hence we can tell if the query requires and id insert by reflecting on the binds columns vs raw SQL regexp and columns calls.
1 parent 94c102f commit 9e3c468

File tree

1 file changed

+21
-1
lines changed

1 file changed

+21
-1
lines changed

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,31 @@ def indexes(table_name, name = nil)
4444

4545
def columns(table_name, name = nil)
4646
return [] if table_name.blank?
47-
column_definitions(table_name).collect do |ci|
47+
@sqlserver_columns_cache[table_name] ||= column_definitions(table_name).collect do |ci|
4848
sqlserver_options = ci.except(:name,:default_value,:type,:null).merge(:database_year=>database_year)
4949
SQLServerColumn.new ci[:name], ci[:default_value], ci[:type], ci[:null], sqlserver_options
5050
end
5151
end
5252

53+
def create_table(table_name, options = {})
54+
super
55+
clear_cache!
56+
end
57+
5358
def rename_table(table_name, new_name)
5459
do_execute "EXEC sp_rename '#{table_name}', '#{new_name}'"
5560
end
61+
62+
def drop_table(table_name, options = {})
63+
super
64+
clear_cache!
65+
end
5666

67+
def add_column(table_name, column_name, type, options = {})
68+
super
69+
clear_cache!
70+
end
71+
5772
def remove_column(table_name, *column_names)
5873
raise ArgumentError.new("You must specify at least one column name. Example: remove_column(:people, :first_name)") if column_names.empty?
5974
column_names.flatten.each do |column_name|
@@ -62,6 +77,7 @@ def remove_column(table_name, *column_names)
6277
remove_indexes(table_name, column_name)
6378
do_execute "ALTER TABLE #{quote_table_name(table_name)} DROP COLUMN #{quote_column_name(column_name)}"
6479
end
80+
clear_cache!
6581
end
6682

6783
def change_column(table_name, column_name, type, options = {})
@@ -77,16 +93,19 @@ def change_column(table_name, column_name, type, options = {})
7793
sql_commands << "ALTER TABLE #{quote_table_name(table_name)} ADD CONSTRAINT #{default_constraint_name(table_name,column_name)} DEFAULT #{quote(options[:default])} FOR #{quote_column_name(column_name)}"
7894
end
7995
sql_commands.each { |c| do_execute(c) }
96+
clear_cache!
8097
end
8198

8299
def change_column_default(table_name, column_name, default)
83100
remove_default_constraint(table_name, column_name)
84101
do_execute "ALTER TABLE #{quote_table_name(table_name)} ADD CONSTRAINT #{default_constraint_name(table_name, column_name)} DEFAULT #{quote(default)} FOR #{quote_column_name(column_name)}"
102+
clear_cache!
85103
end
86104

87105
def rename_column(table_name, column_name, new_column_name)
88106
detect_column_for!(table_name,column_name)
89107
do_execute "EXEC sp_rename '#{table_name}.#{column_name}', '#{new_column_name}', 'COLUMN'"
108+
clear_cache!
90109
end
91110

92111
def remove_index!(table_name, index_name)
@@ -335,6 +354,7 @@ def views_real_column_name(table_name,column_name)
335354
# === SQLServer Specific (Column/View Caches) =================== #
336355

337356
def initialize_sqlserver_caches
357+
@sqlserver_columns_cache = {}
338358
@sqlserver_views_cache = nil
339359
@sqlserver_view_information_cache = {}
340360
@sqlserver_quoted_column_and_table_names = {}

0 commit comments

Comments
 (0)