Skip to content

Commit 1fbf3c6

Browse files
committed
Organizing SCHEMA STATEMENTS to support #remove_column. Added force to_s in #quote_string. Stub out #query_values which will be used for non logging, self closing private queries like the PostgreSQL adapter does.
1 parent ea8f5dc commit 1fbf3c6

File tree

1 file changed

+46
-43
lines changed

1 file changed

+46
-43
lines changed

lib/active_record/connection_adapters/sqlserver_adapter.rb

Lines changed: 46 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ def quote(value, column = nil)
322322
end
323323

324324
def quote_string(string)
325-
string.gsub(/\'/, "''")
325+
string.to_s.gsub(/\'/, "''")
326326
end
327327

328328
def quote_column_name(column_name)
@@ -522,7 +522,7 @@ def remove_column(table_name, column_name)
522522
remove_check_constraints(table_name, column_name)
523523
remove_default_constraint(table_name, column_name)
524524
remove_indexes(table_name, column_name)
525-
execute "ALTER TABLE [#{table_name}] DROP COLUMN #{quote_column_name(column_name)}"
525+
execute "ALTER TABLE #{quote_table_name(table_name)} DROP COLUMN #{quote_column_name(column_name)}"
526526
remove_sqlserver_columns_cache_for(table_name)
527527
end
528528

@@ -551,12 +551,6 @@ def rename_column(table_name, column_name, new_column_name)
551551
end
552552
end
553553

554-
def remove_indexes(table_name, column_name)
555-
__indexes(table_name).select {|idx| idx.columns.include? column_name }.each do |idx|
556-
remove_index(table_name, {:name => idx.name})
557-
end
558-
end
559-
560554
def remove_index(table_name, options = {})
561555
execute "DROP INDEX #{table_name}.#{quote_column_name(index_name(table_name, options))}"
562556
end
@@ -568,22 +562,6 @@ def indexes(table_name, name = nil)
568562
ActiveRecord::Base.connection.instance_variable_get("@connection")["AutoCommit"] = true
569563
end
570564

571-
def __indexes(table_name, name = nil)
572-
indexes = []
573-
execute("EXEC sp_helpindex '#{table_name}'", name) do |handle|
574-
if handle.column_info.any?
575-
handle.each do |index|
576-
unique = index[1] =~ /unique/
577-
primary = index[1] =~ /primary key/
578-
if !primary
579-
indexes << IndexDefinition.new(table_name, index[0], unique, index[2].split(", ").map {|e| e.gsub('(-)','')})
580-
end
581-
end
582-
end
583-
end
584-
indexes
585-
end
586-
587565
def add_order_by_for_association_limiting!(sql, options)
588566
return sql if options[:order].blank?
589567

@@ -662,22 +640,6 @@ def pk_and_sequence_for(table_name)
662640
@connection["AutoCommit"] = true
663641
end
664642

665-
def remove_default_constraint(table_name, column_name)
666-
constraints = select "SELECT def.name FROM sysobjects def, syscolumns col, sysobjects tab WHERE col.cdefault = def.id AND col.name = '#{column_name}' AND tab.name = '#{table_name}' AND col.id = tab.id"
667-
constraints.each do |constraint|
668-
execute "ALTER TABLE #{table_name} DROP CONSTRAINT #{constraint["name"]}"
669-
end
670-
end
671-
672-
def remove_check_constraints(table_name, column_name)
673-
# TODO remove all constraints in single method
674-
constraints = select "SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = '#{table_name}' and COLUMN_NAME = '#{column_name}'"
675-
constraints.each do |constraint|
676-
execute "ALTER TABLE #{table_name} DROP CONSTRAINT #{constraint["CONSTRAINT_NAME"]}"
677-
end
678-
end
679-
680-
681643
# CONNECTION MANAGEMENT ====================================#
682644

683645
def active?
@@ -703,7 +665,6 @@ def finish_statement_handle(handle)
703665
handle.finish if handle && handle.respond_to?(:finish) && !handle.finished?
704666
handle
705667
end
706-
707668

708669
# RAKE UTILITY METHODS =====================================#
709670

@@ -816,11 +777,15 @@ def raw_select(sql, name = nil)
816777
return fields, rows
817778
end
818779

819-
def query(sql, name = nil)
820-
handle = raw_execute(sql,name)
780+
def query(sql)
781+
handle = raw_execute(sql)
821782
handle_as_array(handle)
822783
end
823784

785+
def query_values()
786+
787+
end
788+
824789
def handle_as_array(handle)
825790
array = handle.inject([]) do |rows,row|
826791
rows << row.inject([]){ |values,value| values << value }
@@ -829,6 +794,44 @@ def handle_as_array(handle)
829794
array
830795
end
831796

797+
# SCHEMA STATEMENTS ========================================#
798+
799+
def remove_check_constraints(table_name, column_name)
800+
constraints = select_values("SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE where TABLE_NAME = '#{quote_string(table_name)}' and COLUMN_NAME = '#{quote_string(column_name)}'")
801+
constraints.each do |constraint|
802+
execute "ALTER TABLE #{quote_table_name(table_name)} DROP CONSTRAINT #{quote_column_name(constraint)}"
803+
end
804+
end
805+
806+
def remove_default_constraint(table_name, column_name)
807+
constraints = select_values("SELECT def.name FROM sysobjects def, syscolumns col, sysobjects tab WHERE col.cdefault = def.id AND col.name = '#{quote_string(column_name)}' AND tab.name = '#{quote_string(table_name)}' AND col.id = tab.id")
808+
constraints.each do |constraint|
809+
execute "ALTER TABLE #{quote_table_name(table_name)} DROP CONSTRAINT #{quote_column_name(constraint)}"
810+
end
811+
end
812+
813+
def remove_indexes(table_name, column_name)
814+
__indexes(table_name).select {|idx| idx.columns.include? column_name }.each do |idx|
815+
remove_index(table_name, {:name => idx.name})
816+
end
817+
end
818+
819+
def __indexes(table_name, name = nil)
820+
indexes = []
821+
execute("EXEC sp_helpindex #{quote_table_name(table_name)}", name) do |handle|
822+
if handle.column_info.any?
823+
handle.each do |index|
824+
unique = index[1] =~ /unique/
825+
primary = index[1] =~ /primary key/
826+
if !primary
827+
indexes << IndexDefinition.new(table_name, index[0], unique, index[2].split(", ").map {|e| e.gsub('(-)','')})
828+
end
829+
end
830+
end
831+
end
832+
indexes
833+
end
834+
832835
# IDENTITY INSERTS =========================================#
833836

834837
def with_identity_insert_enabled(table_name, &block)

0 commit comments

Comments
 (0)