tiny_tds 2.1.6-x64-mingw-ucrt

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 (104) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +407 -0
  3. data/.codeclimate.yml +20 -0
  4. data/.gitattributes +1 -0
  5. data/.gitignore +22 -0
  6. data/.rubocop.yml +31 -0
  7. data/CHANGELOG.md +280 -0
  8. data/CODE_OF_CONDUCT.md +31 -0
  9. data/Gemfile +2 -0
  10. data/ISSUE_TEMPLATE.md +38 -0
  11. data/MIT-LICENSE +23 -0
  12. data/README.md +504 -0
  13. data/Rakefile +62 -0
  14. data/VERSION +1 -0
  15. data/bin/defncopy-ttds +3 -0
  16. data/bin/tsql-ttds +3 -0
  17. data/docker-compose.yml +34 -0
  18. data/exe/.keep +0 -0
  19. data/ext/tiny_tds/client.c +499 -0
  20. data/ext/tiny_tds/client.h +53 -0
  21. data/ext/tiny_tds/extconf.rb +92 -0
  22. data/ext/tiny_tds/extconsts.rb +15 -0
  23. data/ext/tiny_tds/result.c +634 -0
  24. data/ext/tiny_tds/result.h +32 -0
  25. data/ext/tiny_tds/tiny_tds_ext.c +12 -0
  26. data/ext/tiny_tds/tiny_tds_ext.h +17 -0
  27. data/lib/tiny_tds/3.1/tiny_tds.so +0 -0
  28. data/lib/tiny_tds/3.2/tiny_tds.so +0 -0
  29. data/lib/tiny_tds/bin.rb +104 -0
  30. data/lib/tiny_tds/client.rb +136 -0
  31. data/lib/tiny_tds/error.rb +14 -0
  32. data/lib/tiny_tds/gem.rb +27 -0
  33. data/lib/tiny_tds/result.rb +7 -0
  34. data/lib/tiny_tds/version.rb +3 -0
  35. data/lib/tiny_tds.rb +61 -0
  36. data/patches/freetds/1.00.27/0001-mingw_missing_inet_pton.diff +34 -0
  37. data/patches/freetds/1.00.27/0002-Don-t-use-MSYS2-file-libws2_32.diff +28 -0
  38. data/patches/libiconv/1.14/1-avoid-gets-error.patch +17 -0
  39. data/ports/x64-mingw-ucrt/freetds/1.1.24/bin/bsqldb.exe +0 -0
  40. data/ports/x64-mingw-ucrt/freetds/1.1.24/bin/datacopy.exe +0 -0
  41. data/ports/x64-mingw-ucrt/freetds/1.1.24/bin/defncopy.exe +0 -0
  42. data/ports/x64-mingw-ucrt/freetds/1.1.24/bin/freebcp.exe +0 -0
  43. data/ports/x64-mingw-ucrt/freetds/1.1.24/bin/libct-4.dll +0 -0
  44. data/ports/x64-mingw-ucrt/freetds/1.1.24/bin/libsybdb-5.dll +0 -0
  45. data/ports/x64-mingw-ucrt/freetds/1.1.24/bin/osql +388 -0
  46. data/ports/x64-mingw-ucrt/freetds/1.1.24/bin/tdspool.exe +0 -0
  47. data/ports/x64-mingw-ucrt/freetds/1.1.24/bin/tsql.exe +0 -0
  48. data/ports/x64-mingw-ucrt/freetds/1.1.24/lib/libct.dll.a +0 -0
  49. data/ports/x64-mingw-ucrt/freetds/1.1.24/lib/libct.la +41 -0
  50. data/ports/x64-mingw-ucrt/freetds/1.1.24/lib/libsybdb.dll.a +0 -0
  51. data/ports/x64-mingw-ucrt/freetds/1.1.24/lib/libsybdb.la +41 -0
  52. data/ports/x64-mingw-ucrt/libiconv/1.15/bin/iconv.exe +0 -0
  53. data/ports/x64-mingw-ucrt/libiconv/1.15/bin/libcharset-1.dll +0 -0
  54. data/ports/x64-mingw-ucrt/libiconv/1.15/bin/libiconv-2.dll +0 -0
  55. data/ports/x64-mingw-ucrt/libiconv/1.15/lib/charset.alias +4 -0
  56. data/ports/x64-mingw-ucrt/libiconv/1.15/lib/libcharset.dll.a +0 -0
  57. data/ports/x64-mingw-ucrt/libiconv/1.15/lib/libcharset.la +41 -0
  58. data/ports/x64-mingw-ucrt/libiconv/1.15/lib/libiconv.dll.a +0 -0
  59. data/ports/x64-mingw-ucrt/libiconv/1.15/lib/libiconv.la +41 -0
  60. data/ports/x64-mingw-ucrt/openssl/1.1.1s/bin/c_rehash +251 -0
  61. data/ports/x64-mingw-ucrt/openssl/1.1.1s/bin/libcrypto-1_1-x64.dll +0 -0
  62. data/ports/x64-mingw-ucrt/openssl/1.1.1s/bin/libssl-1_1-x64.dll +0 -0
  63. data/ports/x64-mingw-ucrt/openssl/1.1.1s/bin/openssl.exe +0 -0
  64. data/ports/x64-mingw-ucrt/openssl/1.1.1s/lib/libcrypto.a +0 -0
  65. data/ports/x64-mingw-ucrt/openssl/1.1.1s/lib/libcrypto.dll.a +0 -0
  66. data/ports/x64-mingw-ucrt/openssl/1.1.1s/lib/libssl.a +0 -0
  67. data/ports/x64-mingw-ucrt/openssl/1.1.1s/lib/libssl.dll.a +0 -0
  68. data/setup_cimgruby_dev.sh +25 -0
  69. data/start_dev.sh +21 -0
  70. data/tasks/native_gem.rake +23 -0
  71. data/tasks/package.rake +8 -0
  72. data/tasks/ports/freetds.rb +37 -0
  73. data/tasks/ports/libiconv.rb +26 -0
  74. data/tasks/ports/openssl.rb +62 -0
  75. data/tasks/ports/recipe.rb +64 -0
  76. data/tasks/ports.rake +108 -0
  77. data/tasks/test.rake +9 -0
  78. data/test/benchmark/query.rb +77 -0
  79. data/test/benchmark/query_odbc.rb +106 -0
  80. data/test/benchmark/query_tinytds.rb +126 -0
  81. data/test/bin/install-freetds.sh +20 -0
  82. data/test/bin/install-mssql.ps1 +31 -0
  83. data/test/bin/install-mssqltools.sh +9 -0
  84. data/test/bin/install-openssl.sh +18 -0
  85. data/test/bin/setup_tinytds_db.sh +7 -0
  86. data/test/bin/setup_volume_permissions.sh +10 -0
  87. data/test/client_test.rb +275 -0
  88. data/test/gem_test.rb +177 -0
  89. data/test/result_test.rb +814 -0
  90. data/test/schema/1px.gif +0 -0
  91. data/test/schema/sqlserver_2000.sql +140 -0
  92. data/test/schema/sqlserver_2005.sql +140 -0
  93. data/test/schema/sqlserver_2008.sql +140 -0
  94. data/test/schema/sqlserver_2014.sql +140 -0
  95. data/test/schema/sqlserver_2016.sql +140 -0
  96. data/test/schema/sqlserver_azure.sql +140 -0
  97. data/test/schema/sybase_ase.sql +138 -0
  98. data/test/schema_test.rb +443 -0
  99. data/test/sql/db-create.sql +18 -0
  100. data/test/sql/db-login.sql +38 -0
  101. data/test/test_helper.rb +280 -0
  102. data/test/thread_test.rb +98 -0
  103. data/tiny_tds.gemspec +31 -0
  104. metadata +267 -0
@@ -0,0 +1,443 @@
1
+ # encoding: utf-8
2
+ require 'test_helper'
3
+
4
+ class SchemaTest < TinyTds::TestCase
5
+
6
+ describe 'Casting SQL Server schema' do
7
+
8
+ before do
9
+ @@current_schema_loaded ||= load_current_schema
10
+ @client = new_connection
11
+ @gif1px = File.read('test/schema/1px.gif',:mode=>"rb:BINARY")
12
+ end
13
+
14
+ describe 'for shared types' do
15
+
16
+ it 'casts bigint' do
17
+ assert_equal (-9223372036854775807), find_value(11, :bigint)
18
+ assert_equal 9223372036854775806, find_value(12, :bigint)
19
+ end
20
+
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
26
+
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
32
+
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
39
+
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
76
+
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
84
+
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
91
+
92
+ it 'casts image' do
93
+ value = find_value(141,:image)
94
+ assert_equal @gif1px, value
95
+ assert_binary_encoding(value)
96
+ end
97
+
98
+ it 'casts int' do
99
+ assert_equal (-2147483647), find_value(151, :int)
100
+ assert_equal 2147483646, find_value(152, :int)
101
+ end
102
+
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
109
+
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
115
+
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
133
+
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
139
+
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
146
+
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
171
+
172
+ it 'casts smallint' do
173
+ assert_equal (-32767), find_value(241, :smallint)
174
+ assert_equal 32766, find_value(242, :smallint)
175
+ end
176
+
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
183
+
184
+ it 'casts text' do
185
+ assert_equal 'test text', find_value(271, :text)
186
+ assert_utf8_encoding find_value(271, :text)
187
+ end
188
+
189
+ it 'casts tinyint' do
190
+ assert_equal 0, find_value(301, :tinyint)
191
+ assert_equal 255, find_value(302, :tinyint)
192
+ end
193
+
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?
198
+
199
+ it 'casts varbinary' do
200
+ value = find_value(321, :varbinary_50)
201
+ assert_equal @gif1px, value
202
+ assert_binary_encoding(value)
203
+ end
204
+
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
209
+
210
+ end
211
+
212
+
213
+ describe 'for 2005 and up' do
214
+
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
220
+
221
+ it 'casts varbinary(max)' do
222
+ value = find_value(331, :varbinary_max)
223
+ assert_equal @gif1px, value
224
+ assert_binary_encoding(value)
225
+ 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)
231
+ end
232
+
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)
237
+ 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
265
+ 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
328
+ 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
391
+ end
392
+
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
415
+ end
416
+
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?
433
+
434
+ end
435
+
436
+
437
+
438
+ end
439
+
440
+
441
+
442
+
443
+
@@ -0,0 +1,18 @@
1
+ :ON ERROR EXIT
2
+
3
+ PRINT 'RUNNING DB-CREATE.SQL, CREATING TINYTDS TEST DATABASE';
4
+ IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = 'tinytdstest')
5
+ BEGIN
6
+ CREATE DATABASE [tinytdstest];
7
+ END
8
+ GO
9
+
10
+ IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name LIKE 'tinytdstest')
11
+ BEGIN
12
+ PRINT 'TINY TDS TEST DB SUCCESSFULY CREATED';
13
+ END
14
+ ELSE
15
+ BEGIN
16
+ THROW 51000, 'TINY TDS TEST DB CREATION FAILED', 1;
17
+ END
18
+ GO
@@ -0,0 +1,38 @@
1
+ :ON ERROR EXIT
2
+
3
+ PRINT 'RUNNING DB-LOGIN.SQL';
4
+
5
+ PRINT 'CREATING TINYTDS TEST LOGIN';
6
+ IF NOT EXISTS (select name from sys.server_principals where name like 'tinytds')
7
+ BEGIN
8
+ CREATE LOGIN [tinytds] WITH PASSWORD = '', CHECK_POLICY = OFF, DEFAULT_DATABASE = [tinytdstest];
9
+ END
10
+ GO
11
+
12
+ IF EXISTS (select name from sys.server_principals where name like 'tinytds')
13
+ BEGIN
14
+ PRINT 'TINY TDS TEST LOGIN SUCCESSFULY CREATED';
15
+ END
16
+ ELSE
17
+ BEGIN
18
+ THROW 51000, 'TINY TDS TEST LOGIN CREATION FAILED', 1;
19
+ END
20
+ GO
21
+
22
+ USE [tinytdstest];
23
+ IF NOT EXISTS (select name from sys.database_principals where name LIKE 'tinytds')
24
+ BEGIN
25
+ CREATE USER [tinytds] FOR LOGIN [tinytds];
26
+ EXEC sp_addrolemember N'db_owner', N'tinytds';
27
+ END
28
+ GO
29
+
30
+ IF EXISTS (select name from sys.database_principals where name LIKE 'tinytds')
31
+ BEGIN
32
+ PRINT 'TINY TDS TEST USER SUCCESSFULY CREATED';
33
+ END
34
+ ELSE
35
+ BEGIN
36
+ THROW 51000, 'TINY TDS TEST USER CREATION FAILED', 1;
37
+ END
38
+ GO