From 1962011feaffaa9b530ebf71218e93042ca89c16 Mon Sep 17 00:00:00 2001 From: "Michael J. Cohen" Date: Sun, 1 Jun 2014 21:17:49 -0400 Subject: [PATCH 1/2] Throwing exceptions in the hot path results in slow code --- lib/arjdbc/mssql/column.rb | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/arjdbc/mssql/column.rb b/lib/arjdbc/mssql/column.rb index 32d9db680..4499b7807 100644 --- a/lib/arjdbc/mssql/column.rb +++ b/lib/arjdbc/mssql/column.rb @@ -50,7 +50,18 @@ def default_value(value) def type_cast(value) return nil if value.nil? case type - when :integer then value.delete('()').to_i rescue unquote(value).to_i rescue value ? 1 : 0 + when :integer + if value.respond_to?(:delete) + value.delete('()').to_i + else + if value.is_a?(Fixnum) + value + elsif value.respond_to?(:to_s) + unquote(value).to_i + else + value ? 1 : 0 + end + end when :primary_key then value == true || value == false ? value == true ? 1 : 0 : value.to_i when :decimal then self.class.value_to_decimal(unquote(value)) when :date then self.class.string_to_date(value) From 4d3b3f6f8ce07cbea8832446262b0d3aa407e0c2 Mon Sep 17 00:00:00 2001 From: "Michael J. Cohen" Date: Tue, 3 Jun 2014 12:40:20 -0400 Subject: [PATCH 2/2] some other minor performance improvements to mssql type_cast suggested by @tduehr --- lib/arjdbc/mssql/column.rb | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/lib/arjdbc/mssql/column.rb b/lib/arjdbc/mssql/column.rb index 4499b7807..c8958420e 100644 --- a/lib/arjdbc/mssql/column.rb +++ b/lib/arjdbc/mssql/column.rb @@ -51,24 +51,19 @@ def type_cast(value) return nil if value.nil? case type when :integer - if value.respond_to?(:delete) - value.delete('()').to_i + case value + when String + unquote value else - if value.is_a?(Fixnum) - value - elsif value.respond_to?(:to_s) - unquote(value).to_i - else - value ? 1 : 0 - end - end - when :primary_key then value == true || value == false ? value == true ? 1 : 0 : value.to_i + value || 0 + end.to_i + when :primary_key then value.respond_to?(:to_i) ? value.to_i : ((value && 1) || 0) when :decimal then self.class.value_to_decimal(unquote(value)) when :date then self.class.string_to_date(value) when :datetime then self.class.string_to_time(value) when :timestamp then self.class.string_to_time(value) when :time then self.class.string_to_dummy_time(value) - when :boolean then value == true || (value =~ /^t(rue)?$/i) == 0 || unquote(value) == '1' + when :boolean then !!(value ? value =~ /^t(?:rue)?$/i || unquote(value) == '1' : value) when :binary then unquote value else value end