ruby-oci8 2.1.5.1-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +17 -0
  3. data/COPYING +30 -0
  4. data/COPYING_old +64 -0
  5. data/ChangeLog +2779 -0
  6. data/Makefile +92 -0
  7. data/NEWS +660 -0
  8. data/README.md +43 -0
  9. data/VERSION +1 -0
  10. data/dist-files +91 -0
  11. data/docs/install-binary-package.md +40 -0
  12. data/docs/install-full-client.md +116 -0
  13. data/docs/install-instant-client.md +167 -0
  14. data/docs/platform-specific-issues.md +197 -0
  15. data/docs/report-installation-issue.md +50 -0
  16. data/lib/.document +1 -0
  17. data/lib/dbd/OCI8.rb +591 -0
  18. data/lib/oci8.rb +147 -0
  19. data/lib/oci8.rb.in +147 -0
  20. data/lib/oci8/.document +8 -0
  21. data/lib/oci8/bindtype.rb +350 -0
  22. data/lib/oci8/compat.rb +113 -0
  23. data/lib/oci8/connection_pool.rb +108 -0
  24. data/lib/oci8/cursor.rb +564 -0
  25. data/lib/oci8/datetime.rb +605 -0
  26. data/lib/oci8/encoding-init.rb +79 -0
  27. data/lib/oci8/encoding.yml +537 -0
  28. data/lib/oci8/metadata.rb +2092 -0
  29. data/lib/oci8/object.rb +605 -0
  30. data/lib/oci8/oci8.rb +560 -0
  31. data/lib/oci8/ocihandle.rb +607 -0
  32. data/lib/oci8/oracle_version.rb +143 -0
  33. data/lib/oci8/properties.rb +134 -0
  34. data/lib/oci8lib_200.so +0 -0
  35. data/metaconfig +142 -0
  36. data/pre-distclean.rb +7 -0
  37. data/ruby-oci8.gemspec +80 -0
  38. data/setup.rb +1333 -0
  39. data/test/README +42 -0
  40. data/test/config.rb +184 -0
  41. data/test/setup_test_object.sql +171 -0
  42. data/test/test_all.rb +54 -0
  43. data/test/test_appinfo.rb +63 -0
  44. data/test/test_array_dml.rb +333 -0
  45. data/test/test_bind_raw.rb +46 -0
  46. data/test/test_bind_string.rb +106 -0
  47. data/test/test_bind_time.rb +178 -0
  48. data/test/test_break.rb +124 -0
  49. data/test/test_clob.rb +98 -0
  50. data/test/test_connection_pool.rb +125 -0
  51. data/test/test_connstr.rb +81 -0
  52. data/test/test_datetime.rb +581 -0
  53. data/test/test_dbi.rb +366 -0
  54. data/test/test_dbi_clob.rb +53 -0
  55. data/test/test_encoding.rb +104 -0
  56. data/test/test_error.rb +88 -0
  57. data/test/test_metadata.rb +1485 -0
  58. data/test/test_object.rb +462 -0
  59. data/test/test_oci8.rb +489 -0
  60. data/test/test_oracle_version.rb +70 -0
  61. data/test/test_oradate.rb +256 -0
  62. data/test/test_oranumber.rb +787 -0
  63. data/test/test_rowid.rb +33 -0
  64. metadata +109 -0
data/test/test_dbi.rb ADDED
@@ -0,0 +1,366 @@
1
+ require 'dbi'
2
+ require 'oci8'
3
+ require 'test/unit'
4
+ require File.dirname(__FILE__) + '/config'
5
+
6
+ class TestDBI < Test::Unit::TestCase
7
+
8
+ def setup
9
+ @dbh = get_dbi_connection()
10
+ end
11
+
12
+ def teardown
13
+ @dbh.disconnect
14
+ end
15
+
16
+ def test_select
17
+ drop_table('test_table')
18
+ sql = <<-EOS
19
+ CREATE TABLE test_table
20
+ (C CHAR(10) NOT NULL,
21
+ V VARCHAR2(20),
22
+ N NUMBER(10, 2),
23
+ D DATE)
24
+ STORAGE (
25
+ INITIAL 4k
26
+ NEXT 4k
27
+ MINEXTENTS 1
28
+ MAXEXTENTS UNLIMITED
29
+ PCTINCREASE 0)
30
+ EOS
31
+ @dbh.do(sql)
32
+ sth = @dbh.prepare("INSERT INTO test_table VALUES (?, ?, ?, ?)")
33
+ 1.upto(10) do |i|
34
+ sth.execute(format("%10d", i * 10), i.to_s, i, nil)
35
+ end
36
+ sth = @dbh.execute("SELECT * FROM test_table ORDER BY c")
37
+ assert_equal(["C", "V", "N", "D"], sth.column_names)
38
+ 1.upto(10) do |i|
39
+ rv = sth.fetch
40
+ assert_equal(format("%10d", i * 10), rv[0])
41
+ assert_equal(i.to_s, rv[1])
42
+ assert_equal(i, rv[2])
43
+ end
44
+ assert_nil(sth.fetch)
45
+ assert_equal(10, @dbh.select_one("SELECT COUNT(*) FROM test_table")[0])
46
+ @dbh.rollback()
47
+ assert_equal(0, @dbh.select_one("SELECT COUNT(*) FROM test_table")[0])
48
+ drop_table('test_table')
49
+ end
50
+
51
+ def test_ref_cursor
52
+ drop_table('test_table')
53
+ sql = <<-EOS
54
+ CREATE TABLE test_table
55
+ (C CHAR(10) NOT NULL,
56
+ V VARCHAR2(20),
57
+ N NUMBER(10, 2),
58
+ D DATE)
59
+ STORAGE (
60
+ INITIAL 4k
61
+ NEXT 4k
62
+ MINEXTENTS 1
63
+ MAXEXTENTS UNLIMITED
64
+ PCTINCREASE 0)
65
+ EOS
66
+ @dbh.do(sql)
67
+ sth = @dbh.prepare("INSERT INTO test_table VALUES (?, ?, ?, ?)")
68
+ 1.upto(10) do |i|
69
+ sth.execute(format("%10d", i * 10), i.to_s, i, nil)
70
+ end
71
+ # get a ref cursor
72
+ plsql = @dbh.execute("BEGIN OPEN ? FOR SELECT * FROM test_table ORDER BY c; END;", DBI::StatementHandle)
73
+ sth = plsql.func(:bind_value, 1)
74
+ assert_equal(["C", "V", "N", "D"], sth.column_names)
75
+ 1.upto(10) do |i|
76
+ rv = sth.fetch
77
+ assert_equal(format("%10d", i * 10), rv[0])
78
+ assert_equal(i.to_s, rv[1])
79
+ assert_equal(i, rv[2])
80
+ end
81
+ @dbh.rollback()
82
+ drop_table('test_table')
83
+ end
84
+
85
+ def test_define
86
+ drop_table('test_table')
87
+ sql = <<-EOS
88
+ CREATE TABLE test_table
89
+ (C CHAR(10) NOT NULL,
90
+ V VARCHAR2(20),
91
+ N NUMBER(10, 2),
92
+ D1 DATE, D2 DATE, D3 DATE, D4 DATE,
93
+ INT NUMBER(30), BIGNUM NUMBER(30))
94
+ STORAGE (
95
+ INITIAL 4k
96
+ NEXT 4k
97
+ MINEXTENTS 1
98
+ MAXEXTENTS UNLIMITED
99
+ PCTINCREASE 0)
100
+ EOS
101
+ @dbh.do(sql)
102
+ sth = @dbh.prepare("INSERT INTO test_table VALUES (:C, :V, :N, :D1, :D2, :D3, :D4, :INT, :BIGNUM)")
103
+ 1.upto(10) do |i|
104
+ if i == 1
105
+ if OCI8::oracle_client_version >= OCI8::ORAVER_9_0
106
+ dt = nil
107
+ v = ''
108
+ sth.execute(format("%10d", i * 10), v, i, dt, dt, dt, dt, i, i)
109
+ else
110
+ # explicitly bind nil with datatype to avoid ORA-01475 when using Oracle 8i.
111
+ sth.bind_param(1, format("%10d", i * 10))
112
+ sth.bind_param(2, '')
113
+ sth.bind_param(3, i)
114
+ sth.bind_param(4, nil, {'type' => OraDate})
115
+ sth.bind_param(5, nil, {'type' => OraDate})
116
+ sth.bind_param(6, nil, {'type' => OraDate})
117
+ sth.bind_param(7, nil, {'type' => OraDate})
118
+ sth.bind_param(8, i)
119
+ sth.bind_param(9, i)
120
+ sth.execute
121
+ end
122
+ else
123
+ dt = OraDate.new(2000 + i, 8, 3, 23, 59, 59)
124
+ v = i.to_s
125
+ sth.execute(format("%10d", i * 10), v, i, dt, dt, dt, dt, i, i)
126
+ end
127
+ end
128
+ sth.finish
129
+ sth = @dbh.prepare("SELECT * FROM test_table ORDER BY c")
130
+ sth.func(:define, 5, Time) # define 5th column as Time
131
+ sth.func(:define, 6, Date) # define 6th column as Date
132
+ sth.func(:define, 7, DateTime) # define 7th column as DateTime
133
+ sth.func(:define, 8, Integer) # define 8th column as Integer
134
+ sth.func(:define, 9, Bignum) # define 9th column as Bignum
135
+ sth.execute
136
+ assert_equal(["C", "V", "N", "D1", "D2", "D3", "D4", "INT", "BIGNUM"], sth.column_info.collect {|cl| cl.name})
137
+ 1.upto(10) do |i|
138
+ rv = sth.fetch
139
+ assert_equal(format("%10d", i * 10), rv[0])
140
+ assert_equal(i, rv[2])
141
+ if i == 1
142
+ assert_nil(rv[1])
143
+ assert_nil(rv[3])
144
+ assert_nil(rv[4])
145
+ assert_nil(rv[5])
146
+ assert_nil(rv[6])
147
+ else
148
+ assert_equal(i.to_s, rv[1])
149
+ tm = Time.local(2000 + i, 8, 3, 23, 59, 59)
150
+ dt = Date.civil(2000 + i, 8, 3)
151
+ dttm = DateTime.civil(2000 + i, 8, 3, 23, 59, 59, Time.now.utc_offset.to_r/86400)
152
+ assert_equal(tm, rv[3])
153
+ assert_equal(tm, rv[4])
154
+ assert_equal(dt, rv[5])
155
+ assert_equal(dttm, rv[6])
156
+ assert_instance_of(Time, rv[4])
157
+ assert_instance_of(Date, rv[5])
158
+ assert_instance_of(DateTime, rv[6])
159
+ end
160
+ assert_equal(i, rv[7])
161
+ assert_equal(i, rv[8])
162
+ end
163
+ assert_nil(sth.fetch)
164
+ sth.finish
165
+ drop_table('test_table')
166
+ end
167
+
168
+ def test_bind_dbi_data_type
169
+ begin
170
+ if DBI::VERSION >= '0.4.0'
171
+ # suppress deprecated warnings while running this test.
172
+ saved_action = Deprecated.action
173
+ Deprecated.set_action(Proc.new {})
174
+ end
175
+
176
+ inval = DBI::Date.new(2004, 3, 20)
177
+ sth = @dbh.execute("BEGIN ? := ?; END;", DBI::Date, inval)
178
+ outval = sth.func(:bind_value, 1)
179
+ assert_instance_of(DBI::Date, outval)
180
+ assert_equal(inval.to_time, outval.to_time)
181
+
182
+ inval = DBI::Timestamp.new(2004, 3, 20, 18, 26, 33)
183
+ sth = @dbh.execute("BEGIN ? := ?; END;", DBI::Timestamp, inval)
184
+ outval = sth.func(:bind_value, 1)
185
+ assert_instance_of(DBI::Timestamp, outval)
186
+ assert_equal(inval.to_time, outval.to_time)
187
+ ensure
188
+ Deprecated.set_action(saved_action) if saved_action
189
+ end
190
+ end
191
+
192
+ def test_column_info
193
+ if $oracle_version < OCI8::ORAVER_8_1
194
+ begin
195
+ @dbh.columns('tab')
196
+ rescue RuntimeError
197
+ assert_equal("This feature is unavailable on Oracle 8.0", $!.to_s)
198
+ end
199
+ return
200
+ end
201
+
202
+ # data_size factor for nchar charset_form.
203
+ sth = @dbh.execute("select N'1' from dual")
204
+ cfrm = sth.column_info[0]['precision']
205
+ if $oracle_version >= OCI8::ORAVER_9_0
206
+ # data_size factor for char semantics.
207
+ sth = @dbh.execute("select CAST('1' AS CHAR(1 char)) from dual")
208
+ csem = sth.column_info[0]['precision']
209
+ else
210
+ csem = 1
211
+ end
212
+
213
+ ora80 = OCI8::ORAVER_8_0
214
+ ora81 = OCI8::ORAVER_8_1
215
+ ora90 = OCI8::ORAVER_9_0
216
+ ora101 = OCI8::ORAVER_10_1
217
+ coldef =
218
+ [
219
+ # oracle_version, definition, sql_type, type_name, nullable, precision,scale,indexed,primary,unique,default
220
+ [ora80, "CHAR(10) NOT NULL", DBI::SQL_CHAR, 'CHAR', false, 10, nil, true, true, true, nil],
221
+ [ora90, "CHAR(10 CHAR)", DBI::SQL_CHAR, 'CHAR', true, 10 * csem, nil, false,false,false,nil],
222
+ [ora80, "NCHAR(10)", DBI::SQL_CHAR, 'NCHAR', true, 10 * cfrm, nil, true, false,true, nil],
223
+ [ora80, "VARCHAR2(10) DEFAULT 'a''b'", DBI::SQL_VARCHAR, 'VARCHAR2', true, 10, nil, true, false,false, "a'b"],
224
+ [ora90, "VARCHAR2(10 CHAR)", DBI::SQL_VARCHAR, 'VARCHAR2', true, 10 * csem, nil, false,false,false,nil],
225
+ [ora80, "NVARCHAR2(10)", DBI::SQL_VARCHAR, 'NVARCHAR2',true, 10 * cfrm, nil, false,false,false,nil],
226
+ [ora80, "RAW(10)", DBI::SQL_VARBINARY, 'RAW', true, 10, nil, false,false,false,nil],
227
+ [ora81, "CLOB", DBI::SQL_CLOB, 'CLOB', true, 4000, nil, false,false,false,nil],
228
+ [ora81, "NCLOB", DBI::SQL_CLOB, 'NCLOB', true, 4000, nil, false,false,false,nil],
229
+ [ora80, "BLOB", DBI::SQL_BLOB, 'BLOB', true, 4000, nil, false,false,false,nil],
230
+ [ora80, "BFILE", DBI::SQL_BLOB, 'BFILE', true, 4000, nil, false,false,false,nil],
231
+ [ora80, "NUMBER", DBI::SQL_NUMERIC, 'NUMBER', true, 38, nil, false,false,false,nil],
232
+ [ora80, "NUMBER(10)", DBI::SQL_NUMERIC, 'NUMBER', true, 10, 0, false,false,false,nil],
233
+ [ora80, "NUMBER(10,2)", DBI::SQL_NUMERIC, 'NUMBER', true, 10, 2, false,false,false,nil],
234
+ [ora80, "FLOAT", DBI::SQL_FLOAT, 'FLOAT', true, (126 * 0.30103).ceil, nil, false,false,false,nil],
235
+ [ora80, "FLOAT(10)", DBI::SQL_FLOAT, 'FLOAT', true, (10 * 0.30103).ceil, nil, false,false,false,nil],
236
+ [ora101,"BINARY_FLOAT", DBI::SQL_FLOAT, 'BINARY_FLOAT', true, 7, nil, false,false,false,nil],
237
+ [ora101,"BINARY_DOUBLE", DBI::SQL_DOUBLE, 'BINARY_DOUBLE', true, 16, nil, false,false,false,nil],
238
+ [ora80, "DATE", DBI::SQL_DATE, 'DATE', true, 19, nil, false,false,false,nil],
239
+ [ora90, "TIMESTAMP", DBI::SQL_TIMESTAMP, 'TIMESTAMP', true, 20 + 6, nil, false,false,false,nil],
240
+ [ora90, "TIMESTAMP(9)", DBI::SQL_TIMESTAMP, 'TIMESTAMP', true, 20 + 9, nil, false,false,false,nil],
241
+ [ora90, "TIMESTAMP WITH TIME ZONE", DBI::SQL_TIMESTAMP, 'TIMESTAMP WITH TIME ZONE', true, 27 + 6, nil, false,false,false,nil],
242
+ [ora90, "TIMESTAMP(9) WITH TIME ZONE", DBI::SQL_TIMESTAMP, 'TIMESTAMP WITH TIME ZONE', true, 27 + 9, nil, false,false,false,nil],
243
+ [ora90, "TIMESTAMP WITH LOCAL TIME ZONE", DBI::SQL_TIMESTAMP, 'TIMESTAMP WITH LOCAL TIME ZONE', true, 20 + 6, nil, false,false,false,nil],
244
+ [ora90, "TIMESTAMP(9) WITH LOCAL TIME ZONE", DBI::SQL_TIMESTAMP, 'TIMESTAMP WITH LOCAL TIME ZONE', true, 20 + 9, nil, false,false,false,nil],
245
+ [ora90, "INTERVAL YEAR TO MONTH", DBI::SQL_OTHER, 'INTERVAL YEAR TO MONTH', true, 2 + 3, nil, false,false,false,nil],
246
+ [ora90, "INTERVAL YEAR(4) TO MONTH", DBI::SQL_OTHER, 'INTERVAL YEAR TO MONTH', true, 4 + 3, nil, false,false,false,nil],
247
+ [ora90, "INTERVAL DAY TO SECOND", DBI::SQL_OTHER, 'INTERVAL DAY TO SECOND', true, 2 + 10 + 6, nil, false,false,false,nil],
248
+ [ora90, "INTERVAL DAY(4) TO SECOND(9)",DBI::SQL_OTHER, 'INTERVAL DAY TO SECOND', true, 4 + 10 + 9, nil, false,false,false,nil],
249
+ ]
250
+
251
+ coldef.reject! do |c| c[0] > $oracle_version end
252
+
253
+ drop_table('test_table')
254
+ @dbh.execute(<<-EOS)
255
+ CREATE TABLE test_table (#{n = 0; coldef.collect do |c| n += 1; "C#{n} " + c[1] + (c[8] ? ' PRIMARY KEY' : ''); end.join(',')})
256
+ STORAGE (
257
+ INITIAL 100k
258
+ NEXT 100k
259
+ MINEXTENTS 1
260
+ MAXEXTENTS UNLIMITED
261
+ PCTINCREASE 0)
262
+ EOS
263
+ coldef.each_with_index do |col, idx|
264
+ next if col[8] # primary
265
+ if col[7] # indexed
266
+ @dbh.execute(<<-EOS)
267
+ CREATE #{col[9] ? 'UNIQUE' : ''} INDEX test_table_idx#{idx + 1} ON test_table(C#{idx + 1})
268
+ STORAGE (
269
+ INITIAL 100k
270
+ NEXT 100k
271
+ MINEXTENTS 1
272
+ MAXEXTENTS UNLIMITED
273
+ PCTINCREASE 0)
274
+ EOS
275
+ end
276
+ end
277
+
278
+ @dbh.columns('test_table').each_with_index do |ci, i|
279
+ assert_equal("C#{i + 1}", ci['name'], "'#{coldef[i][1]}': name")
280
+ assert_equal(coldef[i][2], ci['sql_type'], "'#{coldef[i][1]}': sql_type")
281
+ assert_equal(coldef[i][3], ci['type_name'], "'#{coldef[i][1]}': type_name")
282
+ assert_equal(coldef[i][4], ci['nullable'], "'#{coldef[i][1]}': nullable")
283
+ assert_equal(coldef[i][5], ci['precision'], "'#{coldef[i][1]}': precision")
284
+ assert_equal(coldef[i][6], ci['scale'], "'#{coldef[i][1]}': scale")
285
+ assert_equal(coldef[i][7], ci['indexed'], "'#{coldef[i][1]}': indexed")
286
+ assert_equal(coldef[i][8], ci['primary'], "'#{coldef[i][1]}': primary")
287
+ assert_equal(coldef[i][9], ci['unique'], "'#{coldef[i][1]}': unique")
288
+ assert_equal(coldef[i][10],ci['default'], "'#{coldef[i][1]}': default")
289
+ end
290
+
291
+ # temporarily change OCI8::BindType::Mapping.
292
+ saved_mapping = {}
293
+ [OCI8::SQLT_TIMESTAMP_TZ,
294
+ OCI8::SQLT_TIMESTAMP_LTZ,
295
+ OCI8::SQLT_INTERVAL_YM,
296
+ OCI8::SQLT_INTERVAL_DS].each do |sqlt_type|
297
+ saved_mapping[sqlt_type] = OCI8::BindType::Mapping[sqlt_type]
298
+ OCI8::BindType::Mapping[sqlt_type] = OCI8::BindType::String
299
+ end
300
+ begin
301
+ sth = @dbh.execute("SELECT * FROM test_table")
302
+ ensure
303
+ saved_mapping.each do |key, val|
304
+ OCI8::BindType::Mapping[key] = val
305
+ end
306
+ end
307
+ sth.column_info.each_with_index do |ci, i|
308
+ assert_equal("C#{i + 1}", ci['name'], "'#{coldef[i][1]}': name")
309
+ assert_equal(coldef[i][2], ci['sql_type'], "'#{coldef[i][1]}': sql_type")
310
+ assert_equal(coldef[i][3], ci['type_name'], "'#{coldef[i][1]}': type_name")
311
+ assert_equal(coldef[i][4], ci['nullable'], "'#{coldef[i][1]}': nullable")
312
+ assert_equal(coldef[i][5], ci['precision'], "'#{coldef[i][1]}': precision")
313
+ assert_equal(coldef[i][6], ci['scale'], "'#{coldef[i][1]}': scale")
314
+ assert_equal(nil, ci['indexed'], "'#{coldef[i][1]}': indexed")
315
+ assert_equal(nil, ci['primary'], "'#{coldef[i][1]}': primary")
316
+ assert_equal(nil, ci['unique'], "'#{coldef[i][1]}': unique")
317
+ assert_equal(nil, ci['default'], "'#{coldef[i][1]}': default")
318
+ end
319
+
320
+ drop_table('test_table')
321
+ end
322
+
323
+ def test_column_info_of_tab
324
+ coldef =
325
+ [
326
+ # name, sql_type, type_name, nullable,precision,scale,indexed,primary,unique,default
327
+ ["TNAME", DBI::SQL_VARCHAR,'VARCHAR2',false, 30, nil, false, false, false, nil],
328
+ ["TABTYPE", DBI::SQL_VARCHAR,'VARCHAR2',true, 7, nil, false, false, false, nil],
329
+ ["CLUSTERID",DBI::SQL_NUMERIC,'NUMBER', true, 38, nil, false, false, false, nil],
330
+ ]
331
+ begin
332
+ @dbh.columns('tab').each_with_index do |ci, i|
333
+ assert_equal(coldef[i][0], ci['name'], "'#{coldef[i][0]}': name")
334
+ assert_equal(coldef[i][1], ci['sql_type'], "'#{coldef[i][0]}': sql_type")
335
+ assert_equal(coldef[i][2], ci['type_name'], "'#{coldef[i][0]}': type_name")
336
+ assert_equal(coldef[i][3], ci['nullable'], "'#{coldef[i][0]}': nullable")
337
+ assert_equal(coldef[i][4], ci['precision'], "'#{coldef[i][0]}': precision")
338
+ assert_equal(coldef[i][5], ci['scale'], "'#{coldef[i][0]}': scale")
339
+ assert_equal(coldef[i][6], ci['indexed'], "'#{coldef[i][0]}': indexed")
340
+ assert_equal(coldef[i][7], ci['primary'], "'#{coldef[i][0]}': primary")
341
+ assert_equal(coldef[i][8], ci['unique'], "'#{coldef[i][0]}': unique")
342
+ assert_equal(coldef[i][9], ci['default'], "'#{coldef[i][0]}': default")
343
+ end
344
+ rescue RuntimeError
345
+ if $oracle_version < OCI8::ORAVER_8_1
346
+ assert_equal("This feature is unavailable on Oracle 8.0", $!.to_s)
347
+ else
348
+ raise
349
+ end
350
+ end
351
+
352
+ @dbh.execute("SELECT * FROM tab").column_info.each_with_index do |ci, i|
353
+ assert_equal(coldef[i][0], ci['name'], "'#{coldef[i][0]}': name")
354
+ assert_equal(coldef[i][1], ci['sql_type'], "'#{coldef[i][0]}': sql_type")
355
+ assert_equal(coldef[i][2], ci['type_name'], "'#{coldef[i][0]}': type_name")
356
+ assert_equal(coldef[i][3], ci['nullable'], "'#{coldef[i][0]}': nullable")
357
+ assert_equal(coldef[i][4], ci['precision'], "'#{coldef[i][0]}': precision")
358
+ assert_equal(coldef[i][5], ci['scale'], "'#{coldef[i][0]}': scale")
359
+ assert_equal(nil, ci['indexed'], "'#{coldef[i][0]}': indexed")
360
+ assert_equal(nil, ci['primary'], "'#{coldef[i][0]}': primary")
361
+ assert_equal(nil, ci['unique'], "'#{coldef[i][0]}': unique")
362
+ assert_equal(nil, ci['default'], "'#{coldef[i][0]}': default")
363
+ end
364
+ end
365
+
366
+ end # TestDBI
@@ -0,0 +1,53 @@
1
+ require 'dbi'
2
+ require 'oci8'
3
+ require 'test/unit'
4
+ require File.dirname(__FILE__) + '/config'
5
+
6
+ class TestDbiCLob < Test::Unit::TestCase
7
+
8
+ def setup
9
+ @dbh = get_dbi_connection()
10
+ end
11
+
12
+ def test_insert
13
+ filename = File.basename($lobfile)
14
+ @dbh.do("DELETE FROM test_clob WHERE filename = :1", filename)
15
+
16
+ # insert an empty clob and get the rowid.
17
+ rowid = @dbh.execute("INSERT INTO test_clob(filename, content) VALUES (:1, EMPTY_CLOB())", filename) do |sth|
18
+ sth.func(:rowid)
19
+ end
20
+ lob = @dbh.select_one("SELECT content FROM test_clob WHERE filename = :1 FOR UPDATE", filename)[0]
21
+ begin
22
+ open($lobfile) do |f|
23
+ while f.gets()
24
+ lob.write($_)
25
+ end
26
+ end
27
+ ensure
28
+ lob.close()
29
+ end
30
+ end
31
+
32
+ def test_read
33
+ filename = File.basename($lobfile)
34
+ test_insert() # first insert data.
35
+ lob = @dbh.select_one("SELECT content FROM test_clob WHERE filename = :1 FOR UPDATE", filename)[0]
36
+ begin
37
+ open($lobfile) do |f|
38
+ while buf = lob.read($lobreadnum)
39
+ fbuf = f.read(buf.size)
40
+ assert_equal(fbuf, buf)
41
+ end
42
+ assert_equal(nil, buf)
43
+ assert_equal(true, f.eof?)
44
+ end
45
+ ensure
46
+ lob.close()
47
+ end
48
+ end
49
+
50
+ def teardown
51
+ @dbh.disconnect
52
+ end
53
+ end
@@ -0,0 +1,104 @@
1
+ require 'oci8'
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/config'
4
+
5
+ class TestEncoding < Test::Unit::TestCase
6
+ def setup
7
+ @conn = get_oci8_connection
8
+ end
9
+
10
+ def test_select
11
+ drop_table('test_table')
12
+ @conn.exec(<<EOS)
13
+ CREATE TABLE test_table
14
+ (C CHAR(10),
15
+ V VARCHAR2(10),
16
+ R RAW(10),
17
+ LR LONG RAW,
18
+ CL CLOB,
19
+ NCL NCLOB,
20
+ BL BLOB)
21
+ STORAGE (
22
+ INITIAL 4k
23
+ NEXT 4k
24
+ MINEXTENTS 1
25
+ MAXEXTENTS UNLIMITED
26
+ PCTINCREASE 0)
27
+ EOS
28
+ ascii_8bit = "\xab\xcd".force_encoding('ASCII-8BIT')
29
+ @conn.exec(<<EOS)
30
+ INSERT INTO test_table VALUES ('abcd', 'abcd', 'abcd', 'abcd', 'abcd', 'abcd', 'abcd')
31
+ EOS
32
+ @conn.exec("SELECT * FROM test_table") do |row|
33
+ assert_equal('abcd ', row[0], 'CHAR(10)')
34
+ assert_equal(OCI8.encoding, row[0].encoding);
35
+ assert_equal('abcd', row[1], 'VARCHAR2(10)')
36
+ assert_equal(OCI8.encoding, row[1].encoding);
37
+ assert_equal(ascii_8bit, row[2], 'RAW(10)')
38
+ assert_equal(ascii_8bit.encoding, row[2].encoding);
39
+ assert_equal(ascii_8bit, row[3], 'LONG RAW')
40
+ assert_equal(ascii_8bit.encoding, row[3].encoding);
41
+ assert_equal('abcd', (data = row[4].read), 'CLOB')
42
+ assert_equal(OCI8.encoding, data.encoding);
43
+ assert_equal('abcd', (data = row[5].read), 'NCLOB')
44
+ assert_equal(OCI8.encoding, data.encoding);
45
+ assert_equal(ascii_8bit, (data = row[6].read), 'BLOB')
46
+ assert_equal(ascii_8bit.encoding, data.encoding);
47
+
48
+ if OCI8.encoding.name == "UTF-8" and ['WE8ISO8859P1', 'WE8ISO8859P15', 'AL32UTF8', 'UTF8'].include? @conn.database_charset_name
49
+ utf_8 = "\u00A1\u00A2\u00A3\u00A5\u00A7\u00A9"
50
+ iso_8859_1 = utf_8.encode("ISO-8859-15")
51
+ # CLOB
52
+ lob = row[4]
53
+ lob.rewind
54
+ lob.write(iso_8859_1) # converted to OCI8.encoding(UTF-8)
55
+ lob.rewind
56
+ assert_equal(utf_8, lob.read)
57
+ # NCLOB
58
+ lob = row[5]
59
+ lob.rewind
60
+ lob.write(iso_8859_1) # converted to OCI8.encoding(UTF-8)
61
+ lob.rewind
62
+ assert_equal(utf_8, lob.read)
63
+ # BLOB
64
+ lob = row[6]
65
+ lob.rewind
66
+ lob.write(iso_8859_1) # written without encoding conversion
67
+ lob.rewind
68
+ assert_equal(iso_8859_1.force_encoding('ASCII-8BIT'), lob.read)
69
+ else
70
+ warn "Skip some asserts because the database character set is neither WE8ISO8859P1, WE8ISO8859P15, AL32UTF8 nor UTF8." if OCI8.encoding.name == "UTF-8"
71
+ end
72
+ end
73
+ drop_table('test_table')
74
+ end
75
+
76
+ warn "Skip some tests which runs only when NLS_CHARACTERSETS is unicode." if OCI8.encoding.name != "UTF-8"
77
+
78
+ if OCI8.encoding.name == "UTF-8"
79
+ def test_bind_string_with_code_conversion
80
+ drop_table('test_table')
81
+ @conn.exec(<<EOS)
82
+ CREATE TABLE test_table
83
+ (V VARCHAR2(3000))
84
+ STORAGE (
85
+ INITIAL 4k
86
+ NEXT 4k
87
+ MINEXTENTS 1
88
+ MAXEXTENTS UNLIMITED
89
+ PCTINCREASE 0)
90
+ EOS
91
+ utf_8 = "\u00A1" * 1500 # 3000 byte
92
+ iso_8859_1 = utf_8.encode("ISO-8859-1") # 1500 byte
93
+ @conn.exec("INSERT INTO test_table VALUES (:1)", iso_8859_1)
94
+ @conn.exec("SELECT * FROM test_table") do |row|
95
+ assert_equal(utf_8, row[0])
96
+ end
97
+ drop_table('test_table')
98
+ end
99
+ end
100
+
101
+ def teardown
102
+ @conn.logoff
103
+ end
104
+ end