Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions lib/active_record/connection_adapters/sqlserver/quoting.rb
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ def _quote(value)
"0x#{value.hex}"
when ActiveRecord::Type::SQLServer::Char::Data
value.quoted
when ActiveRecord::Type::SQLServer::Date::Data,
ActiveRecord::Type::SQLServer::DateTime::Data,
ActiveRecord::Type::SQLServer::DateTime2::Data
value.quoted
when String, ActiveSupport::Multibyte::Chars
"#{QUOTED_STRING_PREFIX}#{super}"
else
Expand All @@ -94,6 +98,10 @@ def _type_cast(value)
_quote(value)
when ActiveRecord::Type::SQLServer::Char::Data
value.quoted
when ActiveRecord::Type::SQLServer::Date::Data,
ActiveRecord::Type::SQLServer::DateTime::Data,
ActiveRecord::Type::SQLServer::DateTime2::Data
value.quoted
else super
end
end
Expand Down
25 changes: 22 additions & 3 deletions lib/active_record/connection_adapters/sqlserver/type/date.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,31 @@ def sqlserver_type

def serialize(value)
return unless value.present?
return value if value.acts_like?(:string)
value.to_s(:_sqlserver_dateformat)
return value if value.is_a?(Data)
Data.new(super)
end

def deserialize(value)
return value.value if value.is_a?(Data)
super
end

def type_cast_for_schema(value)
serialize(value).inspect
serialize(value).quoted
end

class Data

attr_reader :value

def initialize(value)
@value = value
end

def quoted
Utils.quote_string_single @value.to_s(:_sqlserver_dateformat)
end

end

end
Expand Down
34 changes: 29 additions & 5 deletions lib/active_record/connection_adapters/sqlserver/type/datetime.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,48 @@ def sqlserver_type

def serialize(value)
return super unless value.acts_like?(:time)
value = zone_conversion(value)
Data.new super, self
end

def deserialize(value)
datetime = value.is_a?(Data) ? value.value : super
return unless datetime
zone_conversion(datetime)
end

def type_cast_for_schema(value)
serialize(value).quoted
end

def quoted(value)
datetime = value.to_s(:_sqlserver_datetime)
"#{datetime}".tap do |v|
datetime = "#{datetime}".tap do |v|
fraction = quote_fractional(value)
v << ".#{fraction}" unless fraction.to_i.zero?
end
Utils.quote_string_single(datetime)
end

def type_cast_for_schema(value)
serialize(value).inspect
class Data

attr_reader :value, :type

def initialize(value, type)
@value, @type = value, type
end

def quoted
type.quoted(@value)
end

end

private

def cast_value(value)
value = value.acts_like?(:time) ? value : super
return unless value
cast_fractional(value)
apply_seconds_precision(value)
end

def zone_conversion(value)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ def sqlserver_type

private

def fast_string_to_time(string)
dateformat = ::Time::DATE_FORMATS[:_sqlserver_dateformat]
::Time.strptime string, "#{dateformat} %H:%M:%S.%N %:z"
end

def zone_conversion(value)
value
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def sqlserver_type

private

def cast_fractional(value)
def apply_seconds_precision(value)
value.change usec: 0
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def cast_value(value)
value = value.acts_like?(:time) ? value : super
return if value.blank?
value = value.change year: 2000, month: 01, day: 01
cast_fractional(value)
apply_seconds_precision(value)
end

def fractional_scale
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ module TimeValueFractional

private

def cast_fractional(value)
def apply_seconds_precision(value)
return value if !value.respond_to?(fractional_property) || value.send(fractional_property).zero?
frac_seconds = if fractional_scale == 0
0
Expand Down