tiny_tds 2.1.5 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +590 -0
  3. data/.gitignore +2 -0
  4. data/CHANGELOG.md +32 -1
  5. data/Gemfile +1 -8
  6. data/ISSUE_TEMPLATE.md +1 -1
  7. data/README.md +75 -88
  8. data/Rakefile +44 -30
  9. data/VERSION +1 -1
  10. data/docker-compose.yml +20 -8
  11. data/ext/tiny_tds/client.c +10 -15
  12. data/ext/tiny_tds/extconf.rb +183 -66
  13. data/ext/tiny_tds/extconsts.rb +4 -11
  14. data/ext/tiny_tds/result.c +28 -35
  15. data/ext/tiny_tds/tiny_tds_ext.c +4 -1
  16. data/lib/tiny_tds/bin.rb +12 -26
  17. data/lib/tiny_tds/client.rb +38 -42
  18. data/lib/tiny_tds/error.rb +0 -2
  19. data/lib/tiny_tds/gem.rb +5 -14
  20. data/lib/tiny_tds/result.rb +0 -2
  21. data/lib/tiny_tds/version.rb +1 -1
  22. data/lib/tiny_tds.rb +28 -47
  23. data/setup_cimgruby_dev.sh +25 -0
  24. data/start_dev.sh +21 -0
  25. data/tasks/native_gem.rake +12 -10
  26. data/tasks/package.rake +1 -3
  27. data/tasks/ports.rake +14 -75
  28. data/tasks/test.rake +3 -5
  29. data/test/bin/install-freetds.sh +2 -4
  30. data/test/bin/install-mssql.ps1 +42 -0
  31. data/test/bin/install-mssqltools.sh +9 -0
  32. data/test/bin/restore-from-native-gem.ps1 +10 -0
  33. data/test/bin/setup_tinytds_db.sh +7 -0
  34. data/test/bin/setup_volume_permissions.sh +10 -0
  35. data/test/client_test.rb +111 -120
  36. data/test/gem_test.rb +32 -111
  37. data/test/result_test.rb +259 -365
  38. data/test/schema_test.rb +369 -395
  39. data/test/sql/db-create.sql +18 -0
  40. data/test/sql/db-login.sql +38 -0
  41. data/test/test_helper.rb +75 -102
  42. data/test/thread_test.rb +22 -31
  43. data/tiny_tds.gemspec +28 -27
  44. metadata +70 -57
  45. data/.travis.yml +0 -25
  46. data/appveyor.yml +0 -72
  47. data/tasks/ports/freetds.rb +0 -37
  48. data/tasks/ports/libiconv.rb +0 -43
  49. data/tasks/ports/openssl.rb +0 -62
  50. data/tasks/ports/recipe.rb +0 -52
  51. data/test/appveyor/dbsetup.ps1 +0 -27
  52. data/test/appveyor/dbsetup.sql +0 -9
  53. data/test/benchmark/query.rb +0 -77
  54. data/test/benchmark/query_odbc.rb +0 -106
  55. data/test/benchmark/query_tinytds.rb +0 -126
  56. data/test/bin/setup.sh +0 -19
  57. data/test/schema/sqlserver_2000.sql +0 -140
  58. data/test/schema/sqlserver_2005.sql +0 -140
  59. data/test/schema/sqlserver_2014.sql +0 -140
  60. data/test/schema/sqlserver_2016.sql +0 -140
  61. data/test/schema/sybase_ase.sql +0 -138
  62. /data/test/schema/{sqlserver_2008.sql → sqlserver_2017.sql} +0 -0
data/test/schema_test.rb CHANGED
@@ -1,443 +1,417 @@
1
- # encoding: utf-8
2
- require 'test_helper'
1
+ require "test_helper"
3
2
 
4
3
  class SchemaTest < TinyTds::TestCase
5
-
6
- describe 'Casting SQL Server schema' do
7
-
4
+ describe "Casting SQL Server schema" do
8
5
  before do
9
6
  @@current_schema_loaded ||= load_current_schema
10
7
  @client = new_connection
11
- @gif1px = File.read('test/schema/1px.gif',:mode=>"rb:BINARY")
8
+ @gif1px = File.read("test/schema/1px.gif", mode: "rb:BINARY")
12
9
  end
13
10
 
14
- describe 'for shared types' do
11
+ it "casts bigint" do
12
+ assert_equal(-9223372036854775807, find_value(11, :bigint))
13
+ assert_equal 9223372036854775806, find_value(12, :bigint)
14
+ end
15
15
 
16
- it 'casts bigint' do
17
- assert_equal (-9223372036854775807), find_value(11, :bigint)
18
- assert_equal 9223372036854775806, find_value(12, :bigint)
19
- end
16
+ it "casts binary" do
17
+ value = find_value(21, :binary_50)
18
+ assert_equal @gif1px + "\000", value
19
+ assert_binary_encoding(value)
20
+ end
20
21
 
21
- it 'casts binary' do
22
- value = find_value(21, :binary_50)
23
- assert_equal @gif1px + "\000", value
24
- assert_binary_encoding(value)
25
- end
22
+ it "casts bit" do
23
+ assert_equal true, find_value(31, :bit)
24
+ assert_equal false, find_value(32, :bit)
25
+ assert_nil find_value(21, :bit)
26
+ end
26
27
 
27
- it 'casts bit' do
28
- assert_equal true, find_value(31, :bit)
29
- assert_equal false, find_value(32, :bit)
30
- assert_nil find_value(21, :bit)
31
- end
28
+ it "casts char" do
29
+ partial_char = "12345678 "
30
+ assert_equal "1234567890", find_value(41, :char_10)
31
+ assert_equal partial_char, find_value(42, :char_10)
32
+ assert_utf8_encoding find_value(42, :char_10)
33
+ end
32
34
 
33
- it 'casts char' do
34
- partial_char = '12345678 '
35
- assert_equal '1234567890', find_value(41, :char_10)
36
- assert_equal partial_char, find_value(42, :char_10)
37
- assert_utf8_encoding find_value(42, :char_10)
38
- end
35
+ it "casts datetime" do
36
+ # 1753-01-01T00:00:00.000
37
+ v = find_value 61, :datetime
38
+ assert_instance_of Time, v, "not in range of Time class"
39
+ assert_equal 1753, v.year
40
+ assert_equal 0o1, v.month
41
+ assert_equal 0o1, v.day
42
+ assert_equal 0, v.hour
43
+ assert_equal 0, v.min
44
+ assert_equal 0, v.sec
45
+ assert_equal 0, v.usec
46
+ # 9999-12-31T23:59:59.997
47
+ v = find_value 62, :datetime
48
+ assert_instance_of Time, v, "not in range of Time class"
49
+ assert_equal 9999, v.year
50
+ assert_equal 12, v.month
51
+ assert_equal 31, v.day
52
+ assert_equal 23, v.hour
53
+ assert_equal 59, v.min
54
+ assert_equal 59, v.sec
55
+ assert_equal 997000, v.usec
56
+ assert_equal utc_offset, find_value(62, :datetime, timezone: :local).utc_offset
57
+ assert_equal 0, find_value(62, :datetime, timezone: :utc).utc_offset
58
+ # 2010-01-01T12:34:56.123
59
+ v = find_value 63, :datetime
60
+ assert_instance_of Time, v, "in range of Time class"
61
+ assert_equal 2010, v.year
62
+ assert_equal 0o1, v.month
63
+ assert_equal 0o1, v.day
64
+ assert_equal 12, v.hour
65
+ assert_equal 34, v.min
66
+ assert_equal 56, v.sec
67
+ assert_equal 123000, v.usec
68
+ assert_equal utc_offset, find_value(63, :datetime, timezone: :local).utc_offset
69
+ assert_equal 0, find_value(63, :datetime, timezone: :utc).utc_offset
70
+ end
39
71
 
40
- it 'casts datetime' do
41
- # 1753-01-01T00:00:00.000
42
- v = find_value 61, :datetime
43
- assert_instance_of Time, v, 'not in range of Time class'
44
- assert_equal 1753, v.year
45
- assert_equal 01, v.month
46
- assert_equal 01, v.day
47
- assert_equal 0, v.hour
48
- assert_equal 0, v.min
49
- assert_equal 0, v.sec
50
- assert_equal 0, v.usec
51
- # 9999-12-31T23:59:59.997
52
- v = find_value 62, :datetime
53
- assert_instance_of Time, v, 'not in range of Time class'
54
- assert_equal 9999, v.year
55
- assert_equal 12, v.month
56
- assert_equal 31, v.day
57
- assert_equal 23, v.hour
58
- assert_equal 59, v.min
59
- assert_equal 59, v.sec
60
- assert_equal 997000, v.usec
61
- assert_equal utc_offset, find_value(62, :datetime, :timezone => :local).utc_offset
62
- assert_equal 0, find_value(62, :datetime, :timezone => :utc).utc_offset
63
- # 2010-01-01T12:34:56.123
64
- v = find_value 63, :datetime
65
- assert_instance_of Time, v, 'in range of Time class'
66
- assert_equal 2010, v.year
67
- assert_equal 01, v.month
68
- assert_equal 01, v.day
69
- assert_equal 12, v.hour
70
- assert_equal 34, v.min
71
- assert_equal 56, v.sec
72
- assert_equal 123000, v.usec
73
- assert_equal utc_offset, find_value(63, :datetime, :timezone => :local).utc_offset
74
- assert_equal 0, find_value(63, :datetime, :timezone => :utc).utc_offset
75
- end
72
+ it "casts decimal" do
73
+ assert_instance_of BigDecimal, find_value(91, :decimal_9_2)
74
+ assert_equal BigDecimal("12345.01"), find_value(91, :decimal_9_2)
75
+ assert_equal BigDecimal("1234567.89"), find_value(92, :decimal_9_2)
76
+ assert_equal BigDecimal("0.0"), find_value(93, :decimal_16_4)
77
+ assert_equal BigDecimal("123456789012.3456"), find_value(94, :decimal_16_4)
78
+ end
76
79
 
77
- it 'casts decimal' do
78
- assert_instance_of BigDecimal, find_value(91, :decimal_9_2)
79
- assert_equal BigDecimal('12345.01'), find_value(91, :decimal_9_2)
80
- assert_equal BigDecimal('1234567.89'), find_value(92, :decimal_9_2)
81
- assert_equal BigDecimal('0.0'), find_value(93, :decimal_16_4)
82
- assert_equal BigDecimal('123456789012.3456'), find_value(94, :decimal_16_4)
83
- end
80
+ it "casts float" do
81
+ assert_equal 123.00000001, find_value(101, :float)
82
+ assert_equal 0.0, find_value(102, :float)
83
+ assert_equal find_value(102, :float).object_id, find_value(102, :float).object_id, "use global zero float"
84
+ assert_equal 123.45, find_value(103, :float)
85
+ end
84
86
 
85
- it 'casts float' do
86
- assert_equal 123.00000001, find_value(101,:float)
87
- assert_equal 0.0, find_value(102,:float)
88
- assert_equal find_value(102,:float).object_id, find_value(102,:float).object_id, 'use global zero float'
89
- assert_equal 123.45, find_value(103,:float)
90
- end
87
+ it "casts image" do
88
+ value = find_value(141, :image)
89
+ assert_equal @gif1px, value
90
+ assert_binary_encoding(value)
91
+ end
91
92
 
92
- it 'casts image' do
93
- value = find_value(141,:image)
94
- assert_equal @gif1px, value
95
- assert_binary_encoding(value)
96
- end
93
+ it "casts int" do
94
+ assert_equal(-2147483647, find_value(151, :int))
95
+ assert_equal 2147483646, find_value(152, :int)
96
+ end
97
97
 
98
- it 'casts int' do
99
- assert_equal (-2147483647), find_value(151, :int)
100
- assert_equal 2147483646, find_value(152, :int)
101
- end
98
+ it "casts money" do
99
+ assert_instance_of BigDecimal, find_value(161, :money)
100
+ assert_equal BigDecimal("4.20"), find_value(161, :money)
101
+ assert_equal BigDecimal("922337203685477.5806"), find_value(163, :money)
102
+ assert_equal BigDecimal("-922337203685477.5807"), find_value(162, :money)
103
+ end
102
104
 
103
- it 'casts money' do
104
- assert_instance_of BigDecimal, find_value(161, :money)
105
- assert_equal BigDecimal('4.20'), find_value(161, :money)
106
- assert_equal BigDecimal('922337203685477.5806'), find_value(163 ,:money)
107
- assert_equal BigDecimal('-922337203685477.5807'), find_value(162 ,:money)
108
- end
105
+ it "casts nchar" do
106
+ assert_equal "1234567890", find_value(171, :nchar_10)
107
+ assert_equal "123456åå ", find_value(172, :nchar_10)
108
+ assert_equal "abc123 ", find_value(173, :nchar_10)
109
+ end
109
110
 
110
- it 'casts nchar' do
111
- assert_equal '1234567890', find_value(171, :nchar_10)
112
- assert_equal '123456åå ', find_value(172, :nchar_10)
113
- assert_equal 'abc123 ', find_value(173, :nchar_10)
114
- end
111
+ it "casts ntext" do
112
+ assert_equal "test ntext", find_value(181, :ntext)
113
+ assert_equal "test ntext åå", find_value(182, :ntext)
114
+ assert_utf8_encoding find_value(182, :ntext)
115
+ # If this test fails, try setting the "text size" in your freetds.conf. See: http://www.freetds.org/faq.html#textdata
116
+ large_value = "x" * 5000
117
+ large_value_id = @client.execute("INSERT INTO [datatypes] ([ntext]) VALUES (N'#{large_value}')").insert
118
+ assert_equal large_value, find_value(large_value_id, :ntext)
119
+ end
115
120
 
116
- it 'casts ntext' do
117
- assert_equal 'test ntext', find_value(181, :ntext)
118
- assert_equal 'test ntext åå', find_value(182, :ntext)
119
- assert_utf8_encoding find_value(182, :ntext)
120
- # If this test fails, try setting the "text size" in your freetds.conf. See: http://www.freetds.org/faq.html#textdata
121
- large_value = "x" * 5000
122
- large_value_id = @client.execute("INSERT INTO [datatypes] ([ntext]) VALUES (N'#{large_value}')").insert
123
- assert_equal large_value, find_value(large_value_id, :ntext)
124
- end unless sybase_ase?
125
-
126
- it 'casts numeric' do
127
- assert_instance_of BigDecimal, find_value(191, :numeric_18_0)
128
- assert_equal BigDecimal('191'), find_value(191, :numeric_18_0)
129
- assert_equal BigDecimal('123456789012345678'), find_value(192, :numeric_18_0)
130
- assert_equal BigDecimal('12345678901234567890.01'), find_value(193, :numeric_36_2)
131
- assert_equal BigDecimal('123.46'), find_value(194, :numeric_36_2)
132
- end
121
+ it "casts numeric" do
122
+ assert_instance_of BigDecimal, find_value(191, :numeric_18_0)
123
+ assert_equal BigDecimal("191"), find_value(191, :numeric_18_0)
124
+ assert_equal BigDecimal("123456789012345678"), find_value(192, :numeric_18_0)
125
+ assert_equal BigDecimal("12345678901234567890.01"), find_value(193, :numeric_36_2)
126
+ assert_equal BigDecimal("123.46"), find_value(194, :numeric_36_2)
127
+ end
133
128
 
134
- it 'casts nvarchar' do
135
- assert_equal 'test nvarchar_50', find_value(201, :nvarchar_50)
136
- assert_equal 'test nvarchar_50 åå', find_value(202, :nvarchar_50)
137
- assert_utf8_encoding find_value(202, :nvarchar_50)
138
- end
129
+ it "casts nvarchar" do
130
+ assert_equal "test nvarchar_50", find_value(201, :nvarchar_50)
131
+ assert_equal "test nvarchar_50 åå", find_value(202, :nvarchar_50)
132
+ assert_utf8_encoding find_value(202, :nvarchar_50)
133
+ end
139
134
 
140
- it 'casts real' do
141
- assert_in_delta 123.45, find_value(221, :real), 0.01
142
- assert_equal 0.0, find_value(222, :real)
143
- assert_equal find_value(222, :real).object_id, find_value(222, :real).object_id, 'use global zero float'
144
- assert_in_delta 0.00001, find_value(223, :real), 0.000001
145
- end
135
+ it "casts real" do
136
+ assert_in_delta 123.45, find_value(221, :real), 0.01
137
+ assert_equal 0.0, find_value(222, :real)
138
+ assert_equal find_value(222, :real).object_id, find_value(222, :real).object_id, "use global zero float"
139
+ assert_in_delta 0.00001, find_value(223, :real), 0.000001
140
+ end
146
141
 
147
- it 'casts smalldatetime' do
148
- # 1901-01-01 15:45:00
149
- v = find_value 231, :smalldatetime
150
- assert_instance_of Time, v
151
- assert_equal 1901, v.year
152
- assert_equal 01, v.month
153
- assert_equal 01, v.day
154
- assert_equal 15, v.hour
155
- assert_equal 45, v.min
156
- assert_equal 00, v.sec
157
- assert_equal Time.local(1901).utc_offset, find_value(231, :smalldatetime, :timezone => :local).utc_offset
158
- assert_equal 0, find_value(231, :smalldatetime, :timezone => :utc).utc_offset
159
- # 2078-06-05 04:20:00
160
- v = find_value 232, :smalldatetime
161
- assert_instance_of Time, v
162
- assert_equal 2078, v.year
163
- assert_equal 06, v.month
164
- assert_equal 05, v.day
165
- assert_equal 04, v.hour
166
- assert_equal 20, v.min
167
- assert_equal 00, v.sec
168
- assert_equal Time.local(2078,6).utc_offset, find_value(232, :smalldatetime, :timezone => :local).utc_offset
169
- assert_equal 0, find_value(232, :smalldatetime, :timezone => :utc).utc_offset
170
- end
142
+ it "casts smalldatetime" do
143
+ # 1901-01-01 15:45:00
144
+ v = find_value 231, :smalldatetime
145
+ assert_instance_of Time, v
146
+ assert_equal 1901, v.year
147
+ assert_equal 0o1, v.month
148
+ assert_equal 0o1, v.day
149
+ assert_equal 15, v.hour
150
+ assert_equal 45, v.min
151
+ assert_equal 0o0, v.sec
152
+ assert_equal Time.local(1901).utc_offset, find_value(231, :smalldatetime, timezone: :local).utc_offset
153
+ assert_equal 0, find_value(231, :smalldatetime, timezone: :utc).utc_offset
154
+ # 2078-06-05 04:20:00
155
+ v = find_value 232, :smalldatetime
156
+ assert_instance_of Time, v
157
+ assert_equal 2078, v.year
158
+ assert_equal 0o6, v.month
159
+ assert_equal 0o5, v.day
160
+ assert_equal 0o4, v.hour
161
+ assert_equal 20, v.min
162
+ assert_equal 0o0, v.sec
163
+ assert_equal Time.local(2078, 6).utc_offset, find_value(232, :smalldatetime, timezone: :local).utc_offset
164
+ assert_equal 0, find_value(232, :smalldatetime, timezone: :utc).utc_offset
165
+ end
171
166
 
172
- it 'casts smallint' do
173
- assert_equal (-32767), find_value(241, :smallint)
174
- assert_equal 32766, find_value(242, :smallint)
175
- end
167
+ it "casts smallint" do
168
+ assert_equal(-32767, find_value(241, :smallint))
169
+ assert_equal 32766, find_value(242, :smallint)
170
+ end
176
171
 
177
- it 'casts smallmoney' do
178
- assert_instance_of BigDecimal, find_value(251, :smallmoney)
179
- assert_equal BigDecimal("4.20"), find_value(251, :smallmoney)
180
- assert_equal BigDecimal("-214748.3647"), find_value(252, :smallmoney)
181
- assert_equal BigDecimal("214748.3646"), find_value(253, :smallmoney)
182
- end
172
+ it "casts smallmoney" do
173
+ assert_instance_of BigDecimal, find_value(251, :smallmoney)
174
+ assert_equal BigDecimal("4.20"), find_value(251, :smallmoney)
175
+ assert_equal BigDecimal("-214748.3647"), find_value(252, :smallmoney)
176
+ assert_equal BigDecimal("214748.3646"), find_value(253, :smallmoney)
177
+ end
183
178
 
184
- it 'casts text' do
185
- assert_equal 'test text', find_value(271, :text)
186
- assert_utf8_encoding find_value(271, :text)
187
- end
179
+ it "casts text" do
180
+ assert_equal "test text", find_value(271, :text)
181
+ assert_utf8_encoding find_value(271, :text)
182
+ end
188
183
 
189
- it 'casts tinyint' do
190
- assert_equal 0, find_value(301, :tinyint)
191
- assert_equal 255, find_value(302, :tinyint)
192
- end
184
+ it "casts tinyint" do
185
+ assert_equal 0, find_value(301, :tinyint)
186
+ assert_equal 255, find_value(302, :tinyint)
187
+ end
193
188
 
194
- it 'casts uniqueidentifier' do
195
- assert_match %r|\w{8}-\w{4}-\w{4}-\w{4}-\w{12}|, find_value(311, :uniqueidentifier)
196
- assert_utf8_encoding find_value(311, :uniqueidentifier)
197
- end unless sybase_ase?
189
+ it "casts uniqueidentifier" do
190
+ assert_match %r|\w{8}-\w{4}-\w{4}-\w{4}-\w{12}|, find_value(311, :uniqueidentifier)
191
+ assert_utf8_encoding find_value(311, :uniqueidentifier)
192
+ end
198
193
 
199
- it 'casts varbinary' do
200
- value = find_value(321, :varbinary_50)
201
- assert_equal @gif1px, value
202
- assert_binary_encoding(value)
203
- end
194
+ it "casts varbinary" do
195
+ value = find_value(321, :varbinary_50)
196
+ assert_equal @gif1px, value
197
+ assert_binary_encoding(value)
198
+ end
204
199
 
205
- it 'casts varchar' do
206
- assert_equal 'test varchar_50', find_value(341, :varchar_50)
207
- assert_utf8_encoding find_value(341, :varchar_50)
208
- end
200
+ it "casts varchar" do
201
+ assert_equal "test varchar_50", find_value(341, :varchar_50)
202
+ assert_utf8_encoding find_value(341, :varchar_50)
203
+ end
209
204
 
205
+ it "casts nvarchar(max)" do
206
+ assert_equal "test nvarchar_max", find_value(211, :nvarchar_max)
207
+ assert_equal "test nvarchar_max åå", find_value(212, :nvarchar_max)
208
+ assert_utf8_encoding find_value(212, :nvarchar_max)
210
209
  end
211
210
 
211
+ it "casts varbinary(max)" do
212
+ value = find_value(331, :varbinary_max)
213
+ assert_equal @gif1px, value
214
+ assert_binary_encoding(value)
215
+ end
212
216
 
213
- describe 'for 2005 and up' do
217
+ it "casts varchar(max)" do
218
+ value = find_value(351, :varchar_max)
219
+ assert_equal "test varchar_max", value
220
+ assert_utf8_encoding(value)
221
+ end
214
222
 
215
- it 'casts nvarchar(max)' do
216
- assert_equal 'test nvarchar_max', find_value(211, :nvarchar_max)
217
- assert_equal 'test nvarchar_max åå', find_value(212, :nvarchar_max)
218
- assert_utf8_encoding find_value(212, :nvarchar_max)
219
- end
223
+ it "casts xml" do
224
+ value = find_value(361, :xml)
225
+ assert_equal "<foo><bar>batz</bar></foo>", value
226
+ assert_utf8_encoding(value)
227
+ end
220
228
 
221
- it 'casts varbinary(max)' do
222
- value = find_value(331, :varbinary_max)
223
- assert_equal @gif1px, value
224
- assert_binary_encoding(value)
229
+ it "casts date" do
230
+ # 0001-01-01
231
+ v = find_value 51, :date
232
+ if @client.tds_73?
233
+ assert_instance_of Date, v
234
+ assert_equal 1, v.year, "Year"
235
+ assert_equal 1, v.month, "Month"
236
+ assert_equal 1, v.day, "Day"
237
+ else
238
+ assert_equal "0001-01-01", v
225
239
  end
226
-
227
- it 'casts varchar(max)' do
228
- value = find_value(351, :varchar_max)
229
- assert_equal 'test varchar_max', value
230
- assert_utf8_encoding(value)
240
+ # 9999-12-31
241
+ v = find_value 52, :date
242
+ if @client.tds_73?
243
+ assert_instance_of Date, v
244
+ assert_equal 9999, v.year, "Year"
245
+ assert_equal 12, v.month, "Month"
246
+ assert_equal 31, v.day, "Day"
247
+ else
248
+ assert_equal "9999-12-31", v
231
249
  end
250
+ end
232
251
 
233
- it 'casts xml' do
234
- value = find_value(361, :xml)
235
- assert_equal '<foo><bar>batz</bar></foo>', value
236
- assert_utf8_encoding(value)
252
+ it "casts time" do
253
+ # 15:45:00.709714966
254
+ v = find_value 281, :time_2
255
+ if @client.tds_73?
256
+ assert_instance_of Time, v
257
+ assert_equal 1900, v.year, "Year"
258
+ assert_equal 1, v.month, "Month"
259
+ assert_equal 1, v.day, "Day"
260
+ assert_equal 15, v.hour, "Hour"
261
+ assert_equal 45, v.min, "Minute"
262
+ assert_equal 0, v.sec, "Second"
263
+ assert_equal 710000, v.usec, "Microseconds"
264
+ assert_equal 710000000, v.nsec, "Nanoseconds"
265
+ else
266
+ assert_equal "15:45:00.71", v
237
267
  end
238
-
239
- end if sqlserver_2005? || sqlserver_2008? || sqlserver_2014? || sqlserver_azure?
240
-
241
-
242
- describe 'for 2008 and up' do
243
-
244
- it 'casts date' do
245
- # 0001-01-01
246
- v = find_value 51, :date
247
- if @client.tds_73?
248
- assert_instance_of Date, v
249
- assert_equal 1, v.year, 'Year'
250
- assert_equal 1, v.month, 'Month'
251
- assert_equal 1, v.day, 'Day'
252
- else
253
- assert_equal '0001-01-01', v
254
- end
255
- # 9999-12-31
256
- v = find_value 52, :date
257
- if @client.tds_73?
258
- assert_instance_of Date, v
259
- assert_equal 9999, v.year, 'Year'
260
- assert_equal 12, v.month, 'Month'
261
- assert_equal 31, v.day, 'Day'
262
- else
263
- assert_equal '9999-12-31', v
264
- end
268
+ # 04:20:00.288321545
269
+ v = find_value 282, :time_2
270
+ if @client.tds_73?
271
+ assert_instance_of Time, v
272
+ assert_equal 1900, v.year, "Year"
273
+ assert_equal 1, v.month, "Month"
274
+ assert_equal 1, v.day, "Day"
275
+ assert_equal 4, v.hour, "Hour"
276
+ assert_equal 20, v.min, "Minute"
277
+ assert_equal 0, v.sec, "Second"
278
+ assert_equal 290000, v.usec, "Microseconds"
279
+ assert_equal 290000000, v.nsec, "Nanoseconds"
280
+ else
281
+ assert_equal "04:20:00.29", v
265
282
  end
266
-
267
- it 'casts time' do
268
- # 15:45:00.709714966
269
- v = find_value 281, :time_2
270
- if @client.tds_73?
271
- assert_instance_of Time, v
272
- assert_equal 1900, v.year, 'Year'
273
- assert_equal 1, v.month, 'Month'
274
- assert_equal 1, v.day, 'Day'
275
- assert_equal 15, v.hour, 'Hour'
276
- assert_equal 45, v.min, 'Minute'
277
- assert_equal 0, v.sec, 'Second'
278
- assert_equal 710000, v.usec, 'Microseconds'
279
- assert_equal 710000000, v.nsec, 'Nanoseconds'
280
- else
281
- assert_equal '15:45:00.71', v
282
- end
283
- # 04:20:00.288321545
284
- v = find_value 282, :time_2
285
- if @client.tds_73?
286
- assert_instance_of Time, v
287
- assert_equal 1900, v.year, 'Year'
288
- assert_equal 1, v.month, 'Month'
289
- assert_equal 1, v.day, 'Day'
290
- assert_equal 4, v.hour, 'Hour'
291
- assert_equal 20, v.min, 'Minute'
292
- assert_equal 0, v.sec, 'Second'
293
- assert_equal 290000, v.usec, 'Microseconds'
294
- assert_equal 290000000, v.nsec, 'Nanoseconds'
295
- else
296
- assert_equal '04:20:00.29', v
297
- end
298
- # 15:45:00.709714966
299
- v = find_value 283, :time_7
300
- if @client.tds_73?
301
- assert_instance_of Time, v
302
- assert_equal 1900, v.year, 'Year'
303
- assert_equal 1, v.month, 'Month'
304
- assert_equal 1, v.day, 'Day'
305
- assert_equal 15, v.hour, 'Hour'
306
- assert_equal 45, v.min, 'Minute'
307
- assert_equal 0, v.sec, 'Second'
308
- assert_equal 709715, v.usec, 'Microseconds'
309
- assert_equal 709715000, v.nsec, 'Nanoseconds'
310
- else
311
- assert_equal '15:45:00.7097150', v
312
- end
313
- # 04:20:00.288321545
314
- v = find_value 284, :time_7
315
- if @client.tds_73?
316
- assert_instance_of Time, v
317
- assert_equal 1900, v.year, 'Year'
318
- assert_equal 1, v.month, 'Month'
319
- assert_equal 1, v.day, 'Day'
320
- assert_equal 4, v.hour, 'Hour'
321
- assert_equal 20, v.min, 'Minute'
322
- assert_equal 0, v.sec, 'Second'
323
- assert_equal 288321, v.usec, 'Microseconds'
324
- assert_equal 288321500, v.nsec, 'Nanoseconds'
325
- else
326
- assert_equal '04:20:00.2883215', v
327
- end
283
+ # 15:45:00.709714966
284
+ v = find_value 283, :time_7
285
+ if @client.tds_73?
286
+ assert_instance_of Time, v
287
+ assert_equal 1900, v.year, "Year"
288
+ assert_equal 1, v.month, "Month"
289
+ assert_equal 1, v.day, "Day"
290
+ assert_equal 15, v.hour, "Hour"
291
+ assert_equal 45, v.min, "Minute"
292
+ assert_equal 0, v.sec, "Second"
293
+ assert_equal 709715, v.usec, "Microseconds"
294
+ assert_equal 709715000, v.nsec, "Nanoseconds"
295
+ else
296
+ assert_equal "15:45:00.7097150", v
328
297
  end
329
-
330
- it 'casts datetime2' do
331
- # 0001-01-01 00:00:00.0000000
332
- v = find_value 71, :datetime2_7
333
- if @client.tds_73?
334
- assert_instance_of Time, v
335
- assert_equal 1, v.year, 'Year'
336
- assert_equal 1, v.month, 'Month'
337
- assert_equal 1, v.day, 'Day'
338
- assert_equal 0, v.hour, 'Hour'
339
- assert_equal 0, v.min, 'Minute'
340
- assert_equal 0, v.sec, 'Second'
341
- assert_equal 0, v.usec, 'Microseconds'
342
- assert_equal 0, v.nsec, 'Nanoseconds'
343
- else
344
- assert_equal '0001-01-01 00:00:00.0000000', v
345
- end
346
- # 1984-01-24 04:20:00.0000000
347
- v = find_value 72, :datetime2_7
348
- if @client.tds_73?
349
- assert_instance_of Time, v
350
- assert_equal 1984, v.year, 'Year'
351
- assert_equal 1, v.month, 'Month'
352
- assert_equal 24, v.day, 'Day'
353
- assert_equal 4, v.hour, 'Hour'
354
- assert_equal 20, v.min, 'Minute'
355
- assert_equal 0, v.sec, 'Second'
356
- assert_equal 0, v.usec, 'Microseconds'
357
- assert_equal 0, v.nsec, 'Nanoseconds'
358
- else
359
- assert_equal '1984-01-24 04:20:00.0000000', v
360
- end
361
- # 9999-12-31 23:59:59.9999999
362
- v = find_value 73, :datetime2_7
363
- if @client.tds_73?
364
- assert_instance_of Time, v
365
- assert_equal 9999, v.year, 'Year'
366
- assert_equal 12, v.month, 'Month'
367
- assert_equal 31, v.day, 'Day'
368
- assert_equal 23, v.hour, 'Hour'
369
- assert_equal 59, v.min, 'Minute'
370
- assert_equal 59, v.sec, 'Second'
371
- assert_equal 999999, v.usec, 'Microseconds'
372
- assert_equal 999999900, v.nsec, 'Nanoseconds'
373
- else
374
- assert_equal '9999-12-31 23:59:59.9999999', v
375
- end
376
- # 9999-12-31 23:59:59.123456789
377
- v = find_value 74, :datetime2_2
378
- if @client.tds_73?
379
- assert_instance_of Time, v
380
- assert_equal 9999, v.year, 'Year'
381
- assert_equal 12, v.month, 'Month'
382
- assert_equal 31, v.day, 'Day'
383
- assert_equal 23, v.hour, 'Hour'
384
- assert_equal 59, v.min, 'Minute'
385
- assert_equal 59, v.sec, 'Second'
386
- assert_equal 120000, v.usec, 'Microseconds'
387
- assert_equal 120000000, v.nsec, 'Nanoseconds'
388
- else
389
- assert_equal '9999-12-31 23:59:59.12', v
390
- end
298
+ # 04:20:00.288321545
299
+ v = find_value 284, :time_7
300
+ if @client.tds_73?
301
+ assert_instance_of Time, v
302
+ assert_equal 1900, v.year, "Year"
303
+ assert_equal 1, v.month, "Month"
304
+ assert_equal 1, v.day, "Day"
305
+ assert_equal 4, v.hour, "Hour"
306
+ assert_equal 20, v.min, "Minute"
307
+ assert_equal 0, v.sec, "Second"
308
+ assert_equal 288321, v.usec, "Microseconds"
309
+ assert_equal 288321500, v.nsec, "Nanoseconds"
310
+ else
311
+ assert_equal "04:20:00.2883215", v
391
312
  end
313
+ end
392
314
 
393
- it 'casts datetimeoffset' do
394
- # 1984-01-24T04:20:00.1234567-08:00
395
- v = find_value 84, :datetimeoffset_7
396
- if @client.tds_73?
397
- assertions = lambda {
398
- assert_instance_of Time, v
399
- assert_equal 1984, v.year, 'Year'
400
- assert_equal 1, v.month, 'Month'
401
- assert_equal 24, v.day, 'Day'
402
- assert_equal 4, v.hour, 'Hour'
403
- assert_equal 20, v.min, 'Minute'
404
- assert_equal 59, v.sec, 'Second'
405
- assert_equal 123456, v.usec, 'Microseconds'
406
- assert_equal 123456700, v.nsec, 'Nanoseconds'
407
- assert_equal (-28800), v.utc_offset, 'Offset'
408
- }
409
- assertions.call
410
- v = find_value 84, :datetimeoffset_7, timezone: :local
411
- assertions.call # Ignores timezone query option.
412
- else
413
- assert_equal '1984-01-24 04:20:59.1234567 -08:00', v
414
- end
315
+ it "casts datetime2" do
316
+ # 0001-01-01 00:00:00.0000000
317
+ v = find_value 71, :datetime2_7
318
+ if @client.tds_73?
319
+ assert_instance_of Time, v
320
+ assert_equal 1, v.year, "Year"
321
+ assert_equal 1, v.month, "Month"
322
+ assert_equal 1, v.day, "Day"
323
+ assert_equal 0, v.hour, "Hour"
324
+ assert_equal 0, v.min, "Minute"
325
+ assert_equal 0, v.sec, "Second"
326
+ assert_equal 0, v.usec, "Microseconds"
327
+ assert_equal 0, v.nsec, "Nanoseconds"
328
+ else
329
+ assert_equal "0001-01-01 00:00:00.0000000", v
330
+ end
331
+ # 1984-01-24 04:20:00.0000000
332
+ v = find_value 72, :datetime2_7
333
+ if @client.tds_73?
334
+ assert_instance_of Time, v
335
+ assert_equal 1984, v.year, "Year"
336
+ assert_equal 1, v.month, "Month"
337
+ assert_equal 24, v.day, "Day"
338
+ assert_equal 4, v.hour, "Hour"
339
+ assert_equal 20, v.min, "Minute"
340
+ assert_equal 0, v.sec, "Second"
341
+ assert_equal 0, v.usec, "Microseconds"
342
+ assert_equal 0, v.nsec, "Nanoseconds"
343
+ else
344
+ assert_equal "1984-01-24 04:20:00.0000000", v
415
345
  end
346
+ # 9999-12-31 23:59:59.9999999
347
+ v = find_value 73, :datetime2_7
348
+ if @client.tds_73?
349
+ assert_instance_of Time, v
350
+ assert_equal 9999, v.year, "Year"
351
+ assert_equal 12, v.month, "Month"
352
+ assert_equal 31, v.day, "Day"
353
+ assert_equal 23, v.hour, "Hour"
354
+ assert_equal 59, v.min, "Minute"
355
+ assert_equal 59, v.sec, "Second"
356
+ assert_equal 999999, v.usec, "Microseconds"
357
+ assert_equal 999999900, v.nsec, "Nanoseconds"
358
+ else
359
+ assert_equal "9999-12-31 23:59:59.9999999", v
360
+ end
361
+ # 9999-12-31 23:59:59.123456789
362
+ v = find_value 74, :datetime2_2
363
+ if @client.tds_73?
364
+ assert_instance_of Time, v
365
+ assert_equal 9999, v.year, "Year"
366
+ assert_equal 12, v.month, "Month"
367
+ assert_equal 31, v.day, "Day"
368
+ assert_equal 23, v.hour, "Hour"
369
+ assert_equal 59, v.min, "Minute"
370
+ assert_equal 59, v.sec, "Second"
371
+ assert_equal 120000, v.usec, "Microseconds"
372
+ assert_equal 120000000, v.nsec, "Nanoseconds"
373
+ else
374
+ assert_equal "9999-12-31 23:59:59.12", v
375
+ end
376
+ end
416
377
 
417
- # it 'casts geography' do
418
- # value = find_value 111, :geography
419
- # assert_equal '', value
420
- # end
421
- #
422
- # it 'casts geometry' do
423
- # value = find_value 121, :geometry
424
- # assert_equal '', value
425
- # end
426
- #
427
- # it 'casts hierarchyid' do
428
- # value = find_value 131, :hierarchyid
429
- # assert_equal '', value
430
- # end
431
-
432
- end if sqlserver_2008? || sqlserver_2014? || sqlserver_azure?
378
+ it "casts datetimeoffset" do
379
+ # 1984-01-24T04:20:00.1234567-08:00
380
+ v = find_value 84, :datetimeoffset_7
381
+ if @client.tds_73?
382
+ assertions = lambda {
383
+ assert_instance_of Time, v
384
+ assert_equal 1984, v.year, "Year"
385
+ assert_equal 1, v.month, "Month"
386
+ assert_equal 24, v.day, "Day"
387
+ assert_equal 4, v.hour, "Hour"
388
+ assert_equal 20, v.min, "Minute"
389
+ assert_equal 59, v.sec, "Second"
390
+ assert_equal 123456, v.usec, "Microseconds"
391
+ assert_equal 123456700, v.nsec, "Nanoseconds"
392
+ assert_equal(-28800, v.utc_offset, "Offset")
393
+ }
394
+ assertions.call
395
+ v = find_value 84, :datetimeoffset_7, timezone: :local
396
+ assertions.call # Ignores timezone query option.
397
+ else
398
+ assert_equal "1984-01-24 04:20:59.1234567 -08:00", v
399
+ end
400
+ end
433
401
 
402
+ # it 'casts geography' do
403
+ # value = find_value 111, :geography
404
+ # assert_equal '', value
405
+ # end
406
+ #
407
+ # it 'casts geometry' do
408
+ # value = find_value 121, :geometry
409
+ # assert_equal '', value
410
+ # end
411
+ #
412
+ # it 'casts hierarchyid' do
413
+ # value = find_value 131, :hierarchyid
414
+ # assert_equal '', value
415
+ # end
434
416
  end
435
-
436
-
437
-
438
417
  end
439
-
440
-
441
-
442
-
443
-