Skip to content

Commit

Permalink
New profile rake task that looks for any qualified file. Organize key…
Browse files Browse the repository at this point in the history
… schema statement methods to be key/symbol agnostic so underlying raw connection returns can optionally return rows of hashes in either.
  • Loading branch information
metaskills committed Aug 29, 2010
1 parent 68de6ca commit f3439ee
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 30 deletions.
16 changes: 11 additions & 5 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,17 @@ namespace :profile do
['odbc','adonet'].each do |mode|
namespace mode.to_sym do

Rake::TestTask.new('connection') do |t|
t.libs = test_libs(mode)
t.test_files = ["test/profile/connection.rb"]
t.verbose = true
end
Dir.glob("test/profile/*_profile_case.rb").sort.each do |test_file|

profile_case = File.basename(test_file).sub('_profile_case.rb','')

Rake::TestTask.new(profile_case) do |t|
t.libs = test_libs(mode)
t.test_files = [test_file]
t.verbose = true
end

end

end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,13 @@ def table_exists?(table_name)
def indexes(table_name, name = nil)
unquoted_table_name = unqualify_table_name(table_name)
select("EXEC sp_helpindex #{quote_table_name(unquoted_table_name)}",name).inject([]) do |indexes,index|
if index['index_description'] =~ /primary key/
index = index.with_indifferent_access
if index[:index_description] =~ /primary key/
indexes
else
name = index['index_name']
unique = index['index_description'] =~ /unique/
columns = index['index_keys'].split(',').map do |column|
name = index[:index_name]
unique = index[:index_description] =~ /unique/
columns = index[:index_keys].split(',').map do |column|
column.strip!
column.gsub! '(-)', '' if column.ends_with?('(-)')
column
Expand All @@ -60,8 +61,8 @@ def columns(table_name, name = nil)
return [] if table_name.blank?
cache_key = unqualify_table_name(table_name)
@sqlserver_columns_cache[cache_key] ||= column_definitions(table_name).collect do |ci|
sqlserver_options = ci.except('name','default_value','type','null').merge('database_year'=>database_year)
SQLServerColumn.new ci['name'], ci['default_value'], ci['type'], ci['null'], sqlserver_options
sqlserver_options = ci.except(:name,:default_value,:type,:null).merge(:database_year=>database_year)
SQLServerColumn.new ci[:name], ci[:default_value], ci[:type], ci[:null], sqlserver_options
end
end

Expand Down Expand Up @@ -196,30 +197,31 @@ def column_definitions(table_name)
}.gsub(/[ \t\r\n]+/,' ')
results = info_schema_query { select(sql,nil) }
results.collect do |ci|
ci['type'] = case ci['type']
ci = ci.symbolize_keys
ci[:type] = case ci[:type]
when /^bit|image|text|ntext|datetime$/
ci['type']
ci[:type]
when /^numeric|decimal$/i
"#{ci['type']}(#{ci['numeric_precision']},#{ci['numeric_scale']})"
"#{ci[:type]}(#{ci[:numeric_precision]},#{ci[:numeric_scale]})"
when /^char|nchar|varchar|nvarchar|varbinary|bigint|int|smallint$/
ci['length'].to_i == -1 ? "#{ci['type']}(max)" : "#{ci['type']}(#{ci['length']})"
ci[:length].to_i == -1 ? "#{ci[:type]}(max)" : "#{ci[:type]}(#{ci[:length]})"
else
ci['type']
ci[:type]
end
if ci['default_value'].nil? && views.include?(table_name)
if ci[:default_value].nil? && views.include?(table_name)
real_table_name = table_name_or_views_table_name(table_name)
real_column_name = views_real_column_name(table_name,ci['name'])
real_column_name = views_real_column_name(table_name,ci[:name])
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}'"
ci['default_value'] = info_schema_query { select_value(col_default_sql) }
ci[:default_value] = info_schema_query { select_value(col_default_sql) }
end
ci['default_value'] = case ci['default_value']
ci[:default_value] = case ci[:default_value]
when nil, '(null)', '(NULL)'
nil
else
match_data = ci['default_value'].match(/\A\(+N?'?(.*?)'?\)+\Z/m)
match_data = ci[:default_value].match(/\A\(+N?'?(.*?)'?\)+\Z/m)
match_data ? match_data[1] : nil
end
ci['null'] = ci['is_nullable'].to_i == 1 ; ci.delete('is_nullable')
ci[:null] = ci[:is_nullable].to_i == 1 ; ci.delete(:is_nullable)
ci
end
end
Expand Down Expand Up @@ -293,8 +295,9 @@ def view_information(table_name)
@sqlserver_view_information_cache[table_name] ||= begin
view_info = info_schema_query { select_one("SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = '#{table_name}'") }
if view_info
if view_info['VIEW_DEFINITION'].blank? || view_info['VIEW_DEFINITION'].length == 4000
view_info['VIEW_DEFINITION'] = info_schema_query { select_values("EXEC sp_helptext #{table_name}").join }
view_info = view_info.with_indifferent_access
if view_info[:VIEW_DEFINITION].blank? || view_info[:VIEW_DEFINITION].length == 4000
view_info[:VIEW_DEFINITION] = info_schema_query { select_values("EXEC sp_helptext #{table_name}").join }
end
end
view_info
Expand All @@ -307,7 +310,7 @@ def table_name_or_views_table_name(table_name)
end

def views_real_column_name(table_name,column_name)
view_definition = view_information(table_name)['VIEW_DEFINITION']
view_definition = view_information(table_name)[:VIEW_DEFINITION]
match_data = view_definition.match(/([\w-]*)\s+as\s+#{column_name}/im)
match_data ? match_data[1] : column_name
end
Expand Down
8 changes: 4 additions & 4 deletions lib/active_record/connection_adapters/sqlserver_adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ module ConnectionAdapters
class SQLServerColumn < Column

def initialize(name, default, sql_type = nil, null = true, sqlserver_options = {})
@sqlserver_options = sqlserver_options
@sqlserver_options = sqlserver_options.symbolize_keys
super(name, default, sql_type, null)
end

Expand Down Expand Up @@ -98,15 +98,15 @@ def type_cast_code(var_name)
end

def is_identity?
@sqlserver_options['is_identity']
@sqlserver_options[:is_identity]
end

def is_utf8?
sql_type =~ /nvarchar|ntext|nchar/i
end

def table_name
@sqlserver_options['table_name']
@sqlserver_options[:table_name]
end

def table_klass
Expand All @@ -119,7 +119,7 @@ def table_klass
end

def database_year
@sqlserver_options['database_year']
@sqlserver_options[:database_year]
end


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
require 'models/topic'
require 'models/reply'

class ProfileConnectionCase < ActiveRecord::TestCase
class ConnectionProfileCase < ActiveRecord::TestCase

fixtures :topics

Expand Down
18 changes: 18 additions & 0 deletions test/profile/finder_profile_case.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
require 'profile/helper'
require 'models/topic'
require 'models/reply'

class FinderProfileCase < ActiveRecord::TestCase

fixtures :topics

def test_find_all
ruby_profile :finder_find_all do
1000.times { Topic.all }
end
end


end


0 comments on commit f3439ee

Please # to comment.