diff --git a/activerecord-sqlserver-adapter.gemspec b/activerecord-sqlserver-adapter.gemspec index 9e7b1b57a..b78fe0f0f 100644 --- a/activerecord-sqlserver-adapter.gemspec +++ b/activerecord-sqlserver-adapter.gemspec @@ -24,6 +24,6 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'minitest-spec-rails' spec.add_development_dependency 'mocha' spec.add_development_dependency 'nokogiri' - spec.add_development_dependency 'pry' + spec.add_development_dependency 'pry-byebug' spec.add_development_dependency 'rake' end diff --git a/bin/console b/bin/console new file mode 100755 index 000000000..b4a7988e1 --- /dev/null +++ b/bin/console @@ -0,0 +1,18 @@ +#!/bin/sh +# Run a Ruby REPL. + +set -e + +cd $(dirname "$0")/.. +PRY_PATH=$(which pry) +echo $PRY_PATH + +if [ -x $PRY_PATH ] +then + exec bundle exec $PRY_PATH -Ilib -r activerecord-sqlserver-adapter -r console +else + red='\033[0;31m' + NC='\033[0m' + echo "${red}Pry was not found or not executable. Make sure \`which pry\` returns an executable.${NC}" + +fi \ No newline at end of file diff --git a/lib/active_record/connection_adapters/sqlserver/database_statements.rb b/lib/active_record/connection_adapters/sqlserver/database_statements.rb index 9ea17473b..9ac0a69aa 100644 --- a/lib/active_record/connection_adapters/sqlserver/database_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/database_statements.rb @@ -87,6 +87,22 @@ def case_sensitive_modifier(node, table_attribute) Arel::Nodes::Bin.new(node) end + def case_sensitive_comparison(table, attribute, column, value) + if column.case_sensitive? + table[attribute].eq(value) + else + super + end + end + + def case_insensitive_comparison(table, attribute, column, value) + if column.case_sensitive? + super + else + table[attribute].eq(value) + end + end + # === SQLServer Specific ======================================== # def execute_procedure(proc_name, *variables) diff --git a/lib/active_record/connection_adapters/sqlserver/schema_statements.rb b/lib/active_record/connection_adapters/sqlserver/schema_statements.rb index c9ee206d5..99e3d47e9 100644 --- a/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +++ b/lib/active_record/connection_adapters/sqlserver/schema_statements.rb @@ -45,7 +45,7 @@ def indexes(table_name, name = nil) def columns(table_name, _name = nil) return [] if table_name.blank? column_definitions(table_name).map do |ci| - sqlserver_options = ci.slice :ordinal_position, :is_primary, :is_identity, :default_function, :table_name + sqlserver_options = ci.slice :ordinal_position, :is_primary, :is_identity, :default_function, :table_name, :collation cast_type = lookup_cast_type(ci[:type]) new_column ci[:name], ci[:default_value], cast_type, ci[:type], ci[:null], sqlserver_options end @@ -233,6 +233,7 @@ def column_definitions(table_name) columns.NUMERIC_SCALE AS numeric_scale, columns.NUMERIC_PRECISION AS numeric_precision, columns.DATETIME_PRECISION AS datetime_precision, + columns.COLLATION_NAME AS collation, columns.ordinal_position, CASE WHEN columns.DATA_TYPE IN ('nchar','nvarchar','char','varchar') THEN columns.CHARACTER_MAXIMUM_LENGTH diff --git a/lib/active_record/connection_adapters/sqlserver_column.rb b/lib/active_record/connection_adapters/sqlserver_column.rb index 5cd9fc931..80ba50d5b 100644 --- a/lib/active_record/connection_adapters/sqlserver_column.rb +++ b/lib/active_record/connection_adapters/sqlserver_column.rb @@ -40,6 +40,14 @@ def is_real? @sql_type =~ /real/i end + def collation + @sqlserver_options[:collation] + end + + def case_sensitive? + collation && !collation.match(/_CI/) + end + end end end diff --git a/lib/console.rb b/lib/console.rb new file mode 100644 index 000000000..48cca5ed0 --- /dev/null +++ b/lib/console.rb @@ -0,0 +1,3 @@ +Pry.config.prompt = lambda do |context, nesting, pry| + "[sqlserver] #{context} > " +end \ No newline at end of file