Skip to content

Commit 4692c57

Browse files
committed
All date/times use Data type cast wrapper.
1 parent 96e734e commit 4692c57

File tree

10 files changed

+70
-72
lines changed

10 files changed

+70
-72
lines changed

lib/active_record/connection_adapters/sqlserver/quoting.rb

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ def unquoted_false
6262

6363
def quoted_date(value)
6464
if value.acts_like?(:date)
65-
Type::Date.new.serialize(value)
65+
Type::Date.new.serialize(value).quoted
6666
else value.acts_like?(:time)
67-
Type::DateTime.new.serialize(value)
67+
Type::DateTime.new.serialize(value).quoted
6868
end
6969
end
7070

@@ -75,11 +75,7 @@ def _quote(value)
7575
case value
7676
when Type::Binary::Data
7777
"0x#{value.hex}"
78-
when ActiveRecord::Type::SQLServer::Char::Data
79-
value.quoted
80-
when ActiveRecord::Type::SQLServer::Date::Data,
81-
ActiveRecord::Type::SQLServer::DateTime::Data,
82-
ActiveRecord::Type::SQLServer::DateTime2::Data
78+
when ActiveRecord::Type::SQLServer::Data
8379
value.quoted
8480
when String, ActiveSupport::Multibyte::Chars
8581
"#{QUOTED_STRING_PREFIX}#{super}"
@@ -94,14 +90,12 @@ def _type_cast(value)
9490
"NULL"
9591
when Symbol
9692
_quote(value.to_s)
97-
when String, ActiveSupport::Multibyte::Chars, Type::Binary::Data
93+
when String, ActiveSupport::Multibyte::Chars
94+
_quote(value)
95+
when Type::Binary::Data
96+
_quote(value)
97+
when ActiveRecord::Type::SQLServer::Data
9898
_quote(value)
99-
when ActiveRecord::Type::SQLServer::Char::Data
100-
value.quoted
101-
when ActiveRecord::Type::SQLServer::Date::Data,
102-
ActiveRecord::Type::SQLServer::DateTime::Data,
103-
ActiveRecord::Type::SQLServer::DateTime2::Data
104-
value.quoted
10599
else super
106100
end
107101
end

lib/active_record/connection_adapters/sqlserver/type.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
require 'active_record/type'
22
# Behaviors
3+
require 'active_record/connection_adapters/sqlserver/type/data'
34
require 'active_record/connection_adapters/sqlserver/type/time_value_fractional'
45
# Exact Numerics
56
require 'active_record/connection_adapters/sqlserver/type/integer'

lib/active_record/connection_adapters/sqlserver/type/char.rb

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def type
1111
def serialize(value)
1212
return if value.nil?
1313
return value if value.is_a?(Data)
14-
Data.new(super)
14+
Data.new super, self
1515
end
1616

1717
def sqlserver_type
@@ -20,22 +20,9 @@ def sqlserver_type
2020
end
2121
end
2222

23-
class Data
24-
25-
def initialize(value)
26-
@quoted_id = value.respond_to?(:quoted_id)
27-
@value = @quoted_id ? value.quoted_id : value.to_s
28-
end
29-
30-
def quoted
31-
@quoted_id ? @value : "'#{Utils.quote_string(@value)}'"
32-
end
33-
34-
def to_s
35-
@value
36-
end
37-
alias_method :to_str, :to_s
38-
23+
def quoted(value)
24+
return value.quoted_id if value.respond_to?(:quoted_id)
25+
Utils.quote_string_single(value)
3926
end
4027

4128
end
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
module ActiveRecord
2+
module ConnectionAdapters
3+
module SQLServer
4+
module Type
5+
class Data
6+
7+
attr_reader :value, :type
8+
9+
def initialize(value, type)
10+
@value, @type = value, type
11+
end
12+
13+
def quoted
14+
type.quoted(@value)
15+
end
16+
17+
def to_s
18+
@value
19+
end
20+
alias_method :to_str, :to_s
21+
22+
end
23+
end
24+
end
25+
end
26+
end

lib/active_record/connection_adapters/sqlserver/type/date.rb

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ def sqlserver_type
1111
def serialize(value)
1212
return unless value.present?
1313
return value if value.is_a?(Data)
14-
Data.new(super)
14+
Data.new super, self
1515
end
1616

1717
def deserialize(value)
@@ -23,18 +23,9 @@ def type_cast_for_schema(value)
2323
serialize(value).quoted
2424
end
2525

26-
class Data
27-
28-
attr_reader :value
29-
30-
def initialize(value)
31-
@value = value
32-
end
33-
34-
def quoted
35-
Utils.quote_string_single @value.to_s(:_sqlserver_dateformat)
36-
end
37-
26+
def quoted(value)
27+
date = value.to_s(:_sqlserver_dateformat)
28+
Utils.quote_string_single(date)
3829
end
3930

4031
end

lib/active_record/connection_adapters/sqlserver/type/datetime.rb

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,6 @@ def quoted(value)
3434
Utils.quote_string_single(datetime)
3535
end
3636

37-
class Data
38-
39-
attr_reader :value, :type
40-
41-
def initialize(value, type)
42-
@value, @type = value, type
43-
end
44-
45-
def quoted
46-
type.quoted(@value)
47-
end
48-
49-
end
50-
5137
private
5238

5339
def cast_value(value)

lib/active_record/connection_adapters/sqlserver/type/datetimeoffset.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,6 @@ def type
88
:datetimeoffset
99
end
1010

11-
def serialize(value)
12-
return super unless value.acts_like?(:time)
13-
value.to_s :_sqlserver_datetimeoffset
14-
end
15-
1611
def type_cast_for_schema(value)
1712
serialize(value).inspect
1813
end
@@ -21,6 +16,11 @@ def sqlserver_type
2116
"datetimeoffset(#{precision.to_i})"
2217
end
2318

19+
def quoted(value)
20+
datetime = value.to_s(:_sqlserver_datetimeoffset)
21+
Utils.quote_string_single(datetime)
22+
end
23+
2424
private
2525

2626
def fast_string_to_time(string)

lib/active_record/connection_adapters/sqlserver/type/time.rb

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,24 @@ class Time < ActiveRecord::Type::Time
88

99
def serialize(value)
1010
return super unless value.acts_like?(:time)
11-
time = value.to_s(:_sqlserver_time)
12-
"#{time}".tap do |v|
13-
fraction = quote_fractional(value)
14-
v << ".#{fraction}" unless fraction.to_i.zero?
15-
end
11+
Data.new super, self
1612
end
1713

1814
def type_cast_for_schema(value)
19-
serialize(value).inspect
15+
serialize(value).quoted
2016
end
2117

2218
def sqlserver_type
2319
"time(#{precision.to_i})"
2420
end
2521

22+
def quoted(value)
23+
time = value.to_s(:_sqlserver_time).tap do |v|
24+
fraction = quote_fractional(value)
25+
v << ".#{fraction}" unless fraction.to_i.zero?
26+
end
27+
Utils.quote_string_single(time)
28+
end
2629

2730
private
2831

lib/active_record/connection_adapters/sqlserver/type/uuid.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,19 @@ def sqlserver_type
1616
'uniqueidentifier'.freeze
1717
end
1818

19+
def serialize(value)
20+
return unless value
21+
Data.new super, self
22+
end
23+
1924
def cast(value)
2025
value.to_s[ACCEPTABLE_UUID, 0]
2126
end
2227

28+
def quoted(value)
29+
Utils.quote_string_single(value) if value
30+
end
31+
2332
end
2433
end
2534
end

test/cases/specific_schema_test_sqlserver.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,10 @@ def quoted_id
117117
assert_sql(/@0 = 'T'/) { SSTestDatatypeMigration.where(char_col: value.new).first }
118118
assert_sql(/@0 = 'T'/) { SSTestDatatypeMigration.where(varchar_col: value.new).first }
119119
# Using our custom char type data.
120-
data = ActiveRecord::Type::SQLServer::Char::Data
121-
assert_sql(/@0 = 'T'/) { SSTestDatatypeMigration.where(char_col: data.new('T')).first }
122-
assert_sql(/@0 = 'T'/) { SSTestDatatypeMigration.where(varchar_col: data.new('T')).first }
120+
type = ActiveRecord::Type::SQLServer::Char
121+
data = ActiveRecord::Type::SQLServer::Data
122+
assert_sql(/@0 = 'T'/) { SSTestDatatypeMigration.where(char_col: data.new('T', type.new)).first }
123+
assert_sql(/@0 = 'T'/) { SSTestDatatypeMigration.where(varchar_col: data.new('T', type.new)).first }
123124
# Taking care of everything.
124125
assert_sql(/@0 = 'T'/) { SSTestDatatypeMigration.where(char_col: 'T').first }
125126
assert_sql(/@0 = 'T'/) { SSTestDatatypeMigration.where(varchar_col: 'T').first }

0 commit comments

Comments
 (0)