Skip to content

Commit f3439ee

Browse files
committed
New profile rake task that looks for any qualified file. Organize key schema statement methods to be key/symbol agnostic so underlying raw connection returns can optionally return rows of hashes in either.
1 parent 68de6ca commit f3439ee

File tree

5 files changed

+57
-30
lines changed

5 files changed

+57
-30
lines changed

Diff for: Rakefile

+11-5
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,17 @@ namespace :profile do
4747
['odbc','adonet'].each do |mode|
4848
namespace mode.to_sym do
4949

50-
Rake::TestTask.new('connection') do |t|
51-
t.libs = test_libs(mode)
52-
t.test_files = ["test/profile/connection.rb"]
53-
t.verbose = true
54-
end
50+
Dir.glob("test/profile/*_profile_case.rb").sort.each do |test_file|
51+
52+
profile_case = File.basename(test_file).sub('_profile_case.rb','')
53+
54+
Rake::TestTask.new(profile_case) do |t|
55+
t.libs = test_libs(mode)
56+
t.test_files = [test_file]
57+
t.verbose = true
58+
end
59+
60+
end
5561

5662
end
5763
end

Diff for: lib/active_record/connection_adapters/sqlserver/schema_statements.rb

+23-20
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,13 @@ def table_exists?(table_name)
4141
def indexes(table_name, name = nil)
4242
unquoted_table_name = unqualify_table_name(table_name)
4343
select("EXEC sp_helpindex #{quote_table_name(unquoted_table_name)}",name).inject([]) do |indexes,index|
44-
if index['index_description'] =~ /primary key/
44+
index = index.with_indifferent_access
45+
if index[:index_description] =~ /primary key/
4546
indexes
4647
else
47-
name = index['index_name']
48-
unique = index['index_description'] =~ /unique/
49-
columns = index['index_keys'].split(',').map do |column|
48+
name = index[:index_name]
49+
unique = index[:index_description] =~ /unique/
50+
columns = index[:index_keys].split(',').map do |column|
5051
column.strip!
5152
column.gsub! '(-)', '' if column.ends_with?('(-)')
5253
column
@@ -60,8 +61,8 @@ def columns(table_name, name = nil)
6061
return [] if table_name.blank?
6162
cache_key = unqualify_table_name(table_name)
6263
@sqlserver_columns_cache[cache_key] ||= column_definitions(table_name).collect do |ci|
63-
sqlserver_options = ci.except('name','default_value','type','null').merge('database_year'=>database_year)
64-
SQLServerColumn.new ci['name'], ci['default_value'], ci['type'], ci['null'], sqlserver_options
64+
sqlserver_options = ci.except(:name,:default_value,:type,:null).merge(:database_year=>database_year)
65+
SQLServerColumn.new ci[:name], ci[:default_value], ci[:type], ci[:null], sqlserver_options
6566
end
6667
end
6768

@@ -196,30 +197,31 @@ def column_definitions(table_name)
196197
}.gsub(/[ \t\r\n]+/,' ')
197198
results = info_schema_query { select(sql,nil) }
198199
results.collect do |ci|
199-
ci['type'] = case ci['type']
200+
ci = ci.symbolize_keys
201+
ci[:type] = case ci[:type]
200202
when /^bit|image|text|ntext|datetime$/
201-
ci['type']
203+
ci[:type]
202204
when /^numeric|decimal$/i
203-
"#{ci['type']}(#{ci['numeric_precision']},#{ci['numeric_scale']})"
205+
"#{ci[:type]}(#{ci[:numeric_precision]},#{ci[:numeric_scale]})"
204206
when /^char|nchar|varchar|nvarchar|varbinary|bigint|int|smallint$/
205-
ci['length'].to_i == -1 ? "#{ci['type']}(max)" : "#{ci['type']}(#{ci['length']})"
207+
ci[:length].to_i == -1 ? "#{ci[:type]}(max)" : "#{ci[:type]}(#{ci[:length]})"
206208
else
207-
ci['type']
209+
ci[:type]
208210
end
209-
if ci['default_value'].nil? && views.include?(table_name)
211+
if ci[:default_value].nil? && views.include?(table_name)
210212
real_table_name = table_name_or_views_table_name(table_name)
211-
real_column_name = views_real_column_name(table_name,ci['name'])
213+
real_column_name = views_real_column_name(table_name,ci[:name])
212214
col_default_sql = "SELECT c.COLUMN_DEFAULT FROM #{db_name_with_period}INFORMATION_SCHEMA.COLUMNS c WHERE c.TABLE_NAME = '#{real_table_name}' AND c.COLUMN_NAME = '#{real_column_name}'"
213-
ci['default_value'] = info_schema_query { select_value(col_default_sql) }
215+
ci[:default_value] = info_schema_query { select_value(col_default_sql) }
214216
end
215-
ci['default_value'] = case ci['default_value']
217+
ci[:default_value] = case ci[:default_value]
216218
when nil, '(null)', '(NULL)'
217219
nil
218220
else
219-
match_data = ci['default_value'].match(/\A\(+N?'?(.*?)'?\)+\Z/m)
221+
match_data = ci[:default_value].match(/\A\(+N?'?(.*?)'?\)+\Z/m)
220222
match_data ? match_data[1] : nil
221223
end
222-
ci['null'] = ci['is_nullable'].to_i == 1 ; ci.delete('is_nullable')
224+
ci[:null] = ci[:is_nullable].to_i == 1 ; ci.delete(:is_nullable)
223225
ci
224226
end
225227
end
@@ -293,8 +295,9 @@ def view_information(table_name)
293295
@sqlserver_view_information_cache[table_name] ||= begin
294296
view_info = info_schema_query { select_one("SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = '#{table_name}'") }
295297
if view_info
296-
if view_info['VIEW_DEFINITION'].blank? || view_info['VIEW_DEFINITION'].length == 4000
297-
view_info['VIEW_DEFINITION'] = info_schema_query { select_values("EXEC sp_helptext #{table_name}").join }
298+
view_info = view_info.with_indifferent_access
299+
if view_info[:VIEW_DEFINITION].blank? || view_info[:VIEW_DEFINITION].length == 4000
300+
view_info[:VIEW_DEFINITION] = info_schema_query { select_values("EXEC sp_helptext #{table_name}").join }
298301
end
299302
end
300303
view_info
@@ -307,7 +310,7 @@ def table_name_or_views_table_name(table_name)
307310
end
308311

309312
def views_real_column_name(table_name,column_name)
310-
view_definition = view_information(table_name)['VIEW_DEFINITION']
313+
view_definition = view_information(table_name)[:VIEW_DEFINITION]
311314
match_data = view_definition.match(/([\w-]*)\s+as\s+#{column_name}/im)
312315
match_data ? match_data[1] : column_name
313316
end

Diff for: lib/active_record/connection_adapters/sqlserver_adapter.rb

+4-4
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ module ConnectionAdapters
5959
class SQLServerColumn < Column
6060

6161
def initialize(name, default, sql_type = nil, null = true, sqlserver_options = {})
62-
@sqlserver_options = sqlserver_options
62+
@sqlserver_options = sqlserver_options.symbolize_keys
6363
super(name, default, sql_type, null)
6464
end
6565

@@ -98,15 +98,15 @@ def type_cast_code(var_name)
9898
end
9999

100100
def is_identity?
101-
@sqlserver_options['is_identity']
101+
@sqlserver_options[:is_identity]
102102
end
103103

104104
def is_utf8?
105105
sql_type =~ /nvarchar|ntext|nchar/i
106106
end
107107

108108
def table_name
109-
@sqlserver_options['table_name']
109+
@sqlserver_options[:table_name]
110110
end
111111

112112
def table_klass
@@ -119,7 +119,7 @@ def table_klass
119119
end
120120

121121
def database_year
122-
@sqlserver_options['database_year']
122+
@sqlserver_options[:database_year]
123123
end
124124

125125

Diff for: test/profile/connection.rb renamed to test/profile/connection_profile_case.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
require 'models/topic'
33
require 'models/reply'
44

5-
class ProfileConnectionCase < ActiveRecord::TestCase
5+
class ConnectionProfileCase < ActiveRecord::TestCase
66

77
fixtures :topics
88

Diff for: test/profile/finder_profile_case.rb

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
require 'profile/helper'
2+
require 'models/topic'
3+
require 'models/reply'
4+
5+
class FinderProfileCase < ActiveRecord::TestCase
6+
7+
fixtures :topics
8+
9+
def test_find_all
10+
ruby_profile :finder_find_all do
11+
1000.times { Topic.all }
12+
end
13+
end
14+
15+
16+
end
17+
18+

0 commit comments

Comments
 (0)