Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save metaskills/326099 to your computer and use it in GitHub Desktop.
Save metaskills/326099 to your computer and use it in GitHub Desktop.
--- sqlserver_adapter.rb 2010-02-26 12:30:50.000000000 -0500
+++ sqlserver_adapter_new.rb 2010-02-26 12:44:51.000000000 -0500
@@ -410,7 +410,12 @@
vars = variables.map{ |v| quote(v) }.join(', ')
sql = "EXEC #{proc_name} #{vars}".strip
select(sql,'Execute Procedure',true).inject([]) do |results,row|
- results << row.with_indifferent_access
+ if row.kind_of?(Array)
+ #we have a result set here, not a row
+ results << row.inject([]) { |rs,r| rs << r.with_indifferent_access }
+ else
+ results << row.with_indifferent_access
+ end
end
end
@@ -824,7 +829,16 @@
def select(sql, name = nil, ignore_special_columns = false)
repair_special_columns(sql) unless ignore_special_columns
- fields, rows = raw_select(sql,name)
+
+ fields_and_rows = raw_select(sql,name)
+ final_results = []
+ fields_and_rows.each do |far|
+ final_results << finalize_select_results(far[0], far[1])
+ end
+ final_results.size > 1 ? final_results : final_results.first
+ end
+
+ def finalize_select_results(fields, rows)
rows.inject([]) do |results,row|
row_hash = {}
fields.each_with_index do |f, i|
@@ -859,24 +873,32 @@
def raw_select(sql, name = nil)
handle = raw_execute(sql,name)
- fields = handle.columns(true).map{|c|c.name}
- results = handle_as_array(handle)
- rows = results.inject([]) do |rows,row|
- row.each_with_index do |value, i|
- if value.is_a? ODBC::TimeStamp
- row[i] = value.to_sqlserver_string
+ # handle multiple results
+ fields_and_rows = []
+ loop do
+ fields = handle.columns(true).map{|c|c.name}
+ results = handle_as_array(handle)
+ rows = results.inject([]) do |rows,row|
+ row.each_with_index do |value, i|
+ if value.is_a? ODBC::TimeStamp
+ row[i] = value.to_sqlserver_string
+ end
end
+ rows << row
end
- rows << row
+
+ fields_and_rows << [fields, rows]
+ break unless handle.more_results
end
- return fields, rows
+
+ finish_statement_handle(handle)
+ fields_and_rows
end
def handle_as_array(handle)
array = handle.inject([]) do |rows,row|
rows << row.inject([]){ |values,value| values << value }
end
- finish_statement_handle(handle)
array
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment