ruby-oci8 2.0.4-x86-mingw32

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 (52) hide show
  1. data/ChangeLog +1912 -0
  2. data/Makefile +96 -0
  3. data/NEWS +223 -0
  4. data/README +86 -0
  5. data/VERSION +1 -0
  6. data/dist-files +77 -0
  7. data/doc/api.en.html +527 -0
  8. data/doc/api.en.rd +554 -0
  9. data/doc/api.ja.html +525 -0
  10. data/doc/api.ja.rd +557 -0
  11. data/doc/manual.css +35 -0
  12. data/lib/.document +1 -0
  13. data/lib/dbd/OCI8.rb +591 -0
  14. data/lib/oci8.rb +82 -0
  15. data/lib/oci8.rb.in +82 -0
  16. data/lib/oci8/.document +5 -0
  17. data/lib/oci8/bindtype.rb +319 -0
  18. data/lib/oci8/compat.rb +113 -0
  19. data/lib/oci8/datetime.rb +619 -0
  20. data/lib/oci8/encoding-init.rb +40 -0
  21. data/lib/oci8/encoding.yml +537 -0
  22. data/lib/oci8/metadata.rb +2077 -0
  23. data/lib/oci8/object.rb +562 -0
  24. data/lib/oci8/oci8.rb +571 -0
  25. data/lib/oci8/oracle_version.rb +144 -0
  26. data/lib/oci8lib_18.so +0 -0
  27. data/lib/oci8lib_191.so +0 -0
  28. data/metaconfig +142 -0
  29. data/pre-distclean.rb +7 -0
  30. data/ruby-oci8.gemspec +63 -0
  31. data/setup.rb +1331 -0
  32. data/test/README +4 -0
  33. data/test/config.rb +109 -0
  34. data/test/test_all.rb +50 -0
  35. data/test/test_appinfo.rb +63 -0
  36. data/test/test_array_dml.rb +333 -0
  37. data/test/test_bind_raw.rb +46 -0
  38. data/test/test_bind_time.rb +178 -0
  39. data/test/test_break.rb +83 -0
  40. data/test/test_clob.rb +79 -0
  41. data/test/test_connstr.rb +81 -0
  42. data/test/test_datetime.rb +622 -0
  43. data/test/test_dbi.rb +366 -0
  44. data/test/test_dbi_clob.rb +53 -0
  45. data/test/test_encoding.rb +100 -0
  46. data/test/test_metadata.rb +257 -0
  47. data/test/test_oci8.rb +434 -0
  48. data/test/test_oracle_version.rb +70 -0
  49. data/test/test_oradate.rb +256 -0
  50. data/test/test_oranumber.rb +655 -0
  51. data/test/test_rowid.rb +33 -0
  52. metadata +108 -0
@@ -0,0 +1,46 @@
1
+ # Low-level API
2
+ require 'oci8'
3
+ require 'test/unit'
4
+ require File.dirname(__FILE__) + '/config'
5
+
6
+ class TestBindRaw < Test::Unit::TestCase
7
+ CHECK_TARGET = [
8
+ ["0123456789:;<=>?", "303132333435363738393A3B3C3D3E3F"],
9
+ ["@ABCDEFGHIJKLMNO", "404142434445464748494A4B4C4D4E4F"],
10
+ ["PQRSTUVWXYZ[\\]^_", "505152535455565758595A5B5C5D5E5F"],
11
+ ["`abcdefghijklmno", "606162636465666768696A6B6C6D6E6F"],
12
+ ["pqrstuvwxyz{|}~", "707172737475767778797A7B7C7D7E"],
13
+ ]
14
+
15
+ def setup
16
+ @conn = get_oci8_connection()
17
+ end
18
+
19
+ def test_set_raw
20
+ cursor = @conn.parse("BEGIN :hex := RAWTOHEX(:raw); END;")
21
+ cursor.bind_param(:raw, nil, OCI8::RAW, 16)
22
+ cursor.bind_param(:hex, nil, String, 32)
23
+
24
+ CHECK_TARGET.each do |raw, hex|
25
+ cursor[:raw] = raw
26
+ cursor.exec
27
+ assert_equal(hex, cursor[:hex])
28
+ end
29
+ end
30
+
31
+ def test_get_raw
32
+ cursor = @conn.parse("BEGIN :raw := HEXTORAW(:hex); END;")
33
+ cursor.bind_param(:hex, nil, String, 32)
34
+ cursor.bind_param(:raw, nil, OCI8::RAW, 16)
35
+
36
+ CHECK_TARGET.each do |raw, hex|
37
+ cursor[:hex] = hex
38
+ cursor.exec
39
+ assert_equal(raw, cursor[:raw])
40
+ end
41
+ end
42
+
43
+ def teardown
44
+ @conn.logoff
45
+ end
46
+ end
@@ -0,0 +1,178 @@
1
+ require 'oci8'
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/config'
4
+
5
+ class TestBindTime < Test::Unit::TestCase
6
+
7
+ YEAR_CHECK_TARGET = [1971, 1989, 2002, 2037]
8
+ MON_CHECK_TARGET = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
9
+ DAY_CHECK_TARGET = [1, 10, 20, 31] # days of January.
10
+ HOUR_CHECK_TARGET = [0, 6, 12, 18, 23]
11
+ MIN_CHECK_TARGET = [0, 15, 30, 45, 59]
12
+ SEC_CHECK_TARGET = [0, 15, 30, 45, 59]
13
+
14
+ def setup
15
+ @conn = get_oci8_connection
16
+ end
17
+
18
+ def test_set_year
19
+ cursor = @conn.parse("BEGIN :year := TO_NUMBER(TO_CHAR(:time, 'SYYYY'), '9999'); END;")
20
+ cursor.bind_param(:time, Time)
21
+ cursor.bind_param(:year, Fixnum)
22
+
23
+ YEAR_CHECK_TARGET.each do |i|
24
+ # set year
25
+ cursor[:time] = Time.local(i, 1)
26
+ # check result
27
+ cursor.exec
28
+ assert_equal(i, cursor[:year])
29
+ end
30
+ end
31
+
32
+ def test_get_year
33
+ cursor = @conn.parse("BEGIN :time := TO_DATE(TO_CHAR(:year, '0999'), 'SYYYY'); END;")
34
+ cursor.bind_param(:year, Fixnum)
35
+ cursor.bind_param(:time, Time)
36
+ YEAR_CHECK_TARGET.each do |i|
37
+ # set time via oracle.
38
+ cursor[:year] = i
39
+ cursor.exec
40
+ # check Time#year
41
+ assert_equal(i, cursor[:time].year)
42
+ end
43
+ end
44
+
45
+ def test_set_mon
46
+ cursor = @conn.parse("BEGIN :mon := TO_NUMBER(TO_CHAR(:time, 'MM'), '99'); END;")
47
+ cursor.bind_param(:time, Time)
48
+ cursor.bind_param(:mon, Fixnum)
49
+ MON_CHECK_TARGET.each do |i|
50
+ # set mon
51
+ cursor[:time] = Time.local(2001, i)
52
+ # check result via oracle.
53
+ cursor.exec
54
+ assert_equal(i, cursor[:mon])
55
+ end
56
+ end
57
+
58
+ def test_get_mon
59
+ cursor = @conn.parse("BEGIN :time := TO_DATE(TO_CHAR(:mon, '99'), 'MM'); END;")
60
+ cursor.bind_param(:mon, Fixnum)
61
+ cursor.bind_param(:time, Time)
62
+ MON_CHECK_TARGET.each do |i|
63
+ # set time via oracle.
64
+ cursor[:mon] = i;
65
+ cursor.exec
66
+ # check Time#mon
67
+ assert_equal(i, cursor[:time].mon)
68
+ end
69
+ end
70
+
71
+ def test_set_day
72
+ cursor = @conn.parse("BEGIN :day := TO_NUMBER(TO_CHAR(:time, 'DD'), '99'); END;")
73
+ cursor.bind_param(:time, Time)
74
+ cursor.bind_param(:day, Fixnum)
75
+ DAY_CHECK_TARGET.each do |i|
76
+ # set day
77
+ cursor[:time] = Time.local(2001, 1, i)
78
+ # check result via oracle.
79
+ cursor.exec
80
+ assert_equal(i, cursor[:day])
81
+ end
82
+ end
83
+
84
+ def test_get_day
85
+ cursor = @conn.parse("BEGIN :time := TO_DATE('200101' || TO_CHAR(:day, 'FM00'), 'YYYYMMDD'); END;")
86
+ day_in = cursor.bind_param(:day, Fixnum)
87
+ time_out = cursor.bind_param(:time, Time)
88
+ DAY_CHECK_TARGET.each do |i|
89
+ # set time via oracle.
90
+ cursor[:day] = i;
91
+ cursor.exec
92
+ # check Time#day
93
+ assert_equal(i, cursor[:time].day)
94
+ end
95
+ end
96
+
97
+ def test_set_hour
98
+ cursor = @conn.parse("BEGIN :hour := TO_NUMBER(TO_CHAR(:time, 'HH24'), '99'); END;")
99
+ cursor.bind_param(:time, Time)
100
+ cursor.bind_param(:hour, Fixnum)
101
+ HOUR_CHECK_TARGET.each do |i|
102
+ # set hour
103
+ cursor[:time] = Time.local(2001, 1, 1, i)
104
+ # check result via oracle.
105
+ cursor.exec
106
+ assert_equal(i, cursor[:hour])
107
+ end
108
+ end
109
+
110
+ def test_get_hour
111
+ cursor = @conn.parse("BEGIN :time := TO_DATE(TO_CHAR(:hour, '99'), 'HH24'); END;")
112
+ cursor.bind_param(:hour, Fixnum)
113
+ cursor.bind_param(:time, Time)
114
+ HOUR_CHECK_TARGET.each do |i|
115
+ # set time via oracle.
116
+ cursor[:hour] = i
117
+ cursor.exec
118
+ # check Time#hour
119
+ assert_equal(i, cursor[:time].hour)
120
+ end
121
+ end
122
+
123
+ def test_set_min
124
+ cursor = @conn.parse("BEGIN :min := TO_NUMBER(TO_CHAR(:time, 'MI'), '99'); END;")
125
+ cursor.bind_param(:time, Time)
126
+ cursor.bind_param(:min, Fixnum)
127
+ MIN_CHECK_TARGET.each do |i|
128
+ # set min
129
+ cursor[:time] = Time.local(2001, 1, 1, 0, i)
130
+ # check result via oracle.
131
+ cursor.exec
132
+ assert_equal(i, cursor[:min])
133
+ end
134
+ end
135
+
136
+ def test_get_min
137
+ cursor = @conn.parse("BEGIN :time := TO_DATE(TO_CHAR(:min, '99'), 'MI'); END;")
138
+ cursor.bind_param(:min, Fixnum)
139
+ cursor.bind_param(:time, Time)
140
+ MIN_CHECK_TARGET.each do |i|
141
+ # set time via oracle.
142
+ cursor[:min] = i;
143
+ cursor.exec
144
+ # check Time#min
145
+ assert_equal(i, cursor[:time].min)
146
+ end
147
+ end
148
+
149
+ def test_set_sec
150
+ cursor = @conn.parse("BEGIN :sec := TO_NUMBER(TO_CHAR(:time, 'SS'), '99'); END;")
151
+ cursor.bind_param(:time, Time)
152
+ cursor.bind_param(:sec, Fixnum)
153
+ SEC_CHECK_TARGET.each do |i|
154
+ # set sec
155
+ cursor[:time] = Time.local(2001, 1, 1, 0, 0, i)
156
+ # check result via oracle.
157
+ cursor.exec
158
+ assert_equal(i, cursor[:sec])
159
+ end
160
+ end
161
+
162
+ def test_get_sec
163
+ cursor = @conn.parse("BEGIN :time := TO_DATE(TO_CHAR(:sec, '99'), 'SS'); END;")
164
+ cursor.bind_param(:sec, Fixnum)
165
+ cursor.bind_param(:time, Time)
166
+ SEC_CHECK_TARGET.each do |i|
167
+ # set time via oracle.
168
+ cursor[:sec] = i
169
+ cursor.exec
170
+ # check Time#sec
171
+ assert_equal(i, cursor[:time].sec)
172
+ end
173
+ end
174
+
175
+ def teardown
176
+ @conn.logoff
177
+ end
178
+ end
@@ -0,0 +1,83 @@
1
+ # High-level API
2
+ require 'oci8'
3
+ require 'test/unit'
4
+ require File.dirname(__FILE__) + '/config'
5
+
6
+ class TestBreak < Test::Unit::TestCase
7
+
8
+ def setup
9
+ @conn = get_oci8_connection
10
+ end
11
+
12
+ def teardown
13
+ @conn.logoff
14
+ end
15
+
16
+ def report(str)
17
+ printf "%d: %s\n", (Time.now - $start_time), str
18
+ end
19
+
20
+ PLSQL_DONE = 1
21
+ OCIBREAK = 2
22
+ SEND_BREAK = 3
23
+
24
+ TIME_IN_PLSQL = 5
25
+ TIME_TO_BREAK = 2
26
+ MARGIN = 0.1
27
+
28
+ def do_test_ocibreak(conn, expect)
29
+ $start_time = Time.now
30
+
31
+ th = Thread.start do
32
+ begin
33
+ conn.exec("BEGIN DBMS_LOCK.SLEEP(#{TIME_IN_PLSQL}); END;")
34
+ assert_equal(expect[PLSQL_DONE], (Time.now - $start_time + MARGIN).to_i, 'PLSQL_DONE')
35
+ rescue OCIBreak
36
+ assert_equal(expect[OCIBREAK], (Time.now - $start_time + MARGIN).to_i, 'OCIBREAK')
37
+ end
38
+ end
39
+
40
+ sleep(0.01) # make a time to run DBMS_LOCK.SLEEP
41
+ sleep(TIME_TO_BREAK)
42
+ assert_equal(expect[SEND_BREAK], (Time.now - $start_time + MARGIN).to_i, 'SEND_BREAK')
43
+ conn.break()
44
+ th.join
45
+ end
46
+
47
+ def test_blocking_mode
48
+ @conn.non_blocking = false
49
+ assert_equal(false, @conn.non_blocking?)
50
+ expect = []
51
+ expect[PLSQL_DONE] = TIME_IN_PLSQL
52
+ expect[OCIBREAK] = "Invalid status"
53
+ expect[SEND_BREAK] = TIME_IN_PLSQL + TIME_TO_BREAK
54
+ do_test_ocibreak(@conn, expect)
55
+ end
56
+
57
+ def test_non_blocking_mode
58
+ is_windows_server = false
59
+ @conn.exec('select banner from v$version') do |row|
60
+ is_windows_server = true if row[0].include? 'Windows'
61
+ end
62
+
63
+ @conn.non_blocking = true
64
+ assert_equal(true, @conn.non_blocking?)
65
+ expect = []
66
+ if is_windows_server
67
+ if $oracle_server_version >= OCI8::ORAVER_9_0
68
+ # raise after sleeping #{TIME_IN_PLSQL} seconds.
69
+ expect[PLSQL_DONE] = "Invalid status"
70
+ expect[OCIBREAK] = TIME_IN_PLSQL
71
+ else
72
+ expect[PLSQL_DONE] = TIME_IN_PLSQL
73
+ expect[OCIBREAK] = "Invalid status"
74
+ end
75
+ else
76
+ # raise immediately by OCI8#break.
77
+ expect[PLSQL_DONE] = "Invalid status"
78
+ expect[OCIBREAK] = TIME_TO_BREAK
79
+ end
80
+ expect[SEND_BREAK] = TIME_TO_BREAK
81
+ do_test_ocibreak(@conn, expect)
82
+ end
83
+ end
@@ -0,0 +1,79 @@
1
+ # Low-level API
2
+ require 'oci8'
3
+ require 'test/unit'
4
+ require File.dirname(__FILE__) + '/config'
5
+
6
+ class TestCLob < Test::Unit::TestCase
7
+
8
+ def setup
9
+ @conn = get_oci8_connection
10
+ end
11
+
12
+ def test_insert
13
+ filename = File.basename($lobfile)
14
+ @conn.exec("DELETE FROM test_clob WHERE filename = :1", filename)
15
+ @conn.exec("INSERT INTO test_clob(filename, content) VALUES (:1, EMPTY_CLOB())", filename)
16
+ cursor = @conn.exec("SELECT content FROM test_clob WHERE filename = :1 FOR UPDATE", filename)
17
+ lob = cursor.fetch[0]
18
+ open($lobfile) do |f|
19
+ while f.gets()
20
+ lob.write($_)
21
+ end
22
+ end
23
+ lob.close
24
+ end
25
+
26
+ def test_insert_with_flush
27
+ filename = File.basename($lobfile)
28
+ @conn.exec("DELETE FROM test_clob WHERE filename = :1", filename)
29
+ @conn.exec("INSERT INTO test_clob(filename, content) VALUES (:1, EMPTY_CLOB())", filename)
30
+ cursor = @conn.exec("SELECT content FROM test_clob WHERE filename = :1 FOR UPDATE", filename)
31
+ lob = cursor.fetch[0]
32
+ lob.sync = false
33
+ open($lobfile) do |f|
34
+ while f.gets()
35
+ lob.write($_)
36
+ end
37
+ end
38
+ lob.flush
39
+ lob.close
40
+ end
41
+
42
+ def test_insert_symbol
43
+ filename = 'test_symbol'
44
+ value = :foo_bar
45
+ @conn.exec("DELETE FROM test_clob WHERE filename = :1", filename)
46
+ @conn.exec("INSERT INTO test_clob(filename, content) VALUES (:1, EMPTY_CLOB())", filename)
47
+ cursor = @conn.exec("SELECT content FROM test_clob WHERE filename = :1 FOR UPDATE", filename)
48
+ lob = cursor.fetch[0]
49
+ lob.write(value)
50
+ lob.rewind
51
+ assert_equal(value.to_s, lob.read);
52
+ lob.close
53
+ end
54
+
55
+ def test_read
56
+ test_insert() # first insert data.
57
+ filename = File.basename($lobfile)
58
+ cursor = @conn.exec("SELECT content FROM test_clob WHERE filename = :1 FOR UPDATE", filename)
59
+ lob = cursor.fetch[0]
60
+
61
+ open($lobfile) do |f|
62
+ while buf = lob.read($lobreadnum)
63
+ fbuf = f.read(buf.size)
64
+ assert_equal(fbuf, buf)
65
+ # offset += buf.size will not work fine,
66
+ # Though buf.size counts in byte,
67
+ # offset and $lobreadnum count in character.
68
+ end
69
+ assert_equal(nil, buf)
70
+ assert(f.eof?)
71
+ assert(lob.eof?)
72
+ end
73
+ lob.close
74
+ end
75
+
76
+ def teardown
77
+ @conn.logoff
78
+ end
79
+ end
@@ -0,0 +1,81 @@
1
+ require 'oci8'
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/config'
4
+
5
+ class TestConnStr < Test::Unit::TestCase
6
+ TEST_CASES =
7
+ [
8
+ # success cases:
9
+ # [ 'connect_string', expected result as an array]
10
+ # error cases:
11
+ # [ 'connect_string', ExceptionClass]
12
+ ["hr/hr@host/service_name", ["hr", "hr", "host/service_name", nil]],
13
+ ["sys/syspw@host/service_name AS SYSdba ", ["sys", "syspw", "host/service_name", :SYSDBA]],
14
+ ["sys/syspw@host:1521/service_name as sysdba", ["sys", "syspw", "host:1521/service_name", :SYSDBA]],
15
+ # error cases
16
+ ["service_name", ArgumentError],
17
+ ["", ArgumentError],
18
+ ["foo bar/baz", ArgumentError],
19
+ ["foo@bar/baz", ArgumentError],
20
+ # raise error in connecting but no error in parse_connect_string.
21
+ ["foo/bar as sysdbaaa", ["foo", "bar", nil, "sysdbaaa"]],
22
+
23
+ ##
24
+ ## following test cases are contributed by Shiwei Zhang.
25
+ ##
26
+ #"username/password"
27
+ ["username/password", ["username", "password", nil, nil]],
28
+ #"username/password@[//]host[:port][/service_name]"
29
+ ["username/password@host", ["username", "password", "host", nil]],
30
+ ["username/password@host/service_name", ["username", "password", "host/service_name", nil]],
31
+ ["username/password@host:1521", ["username", "password", "host:1521", nil]],
32
+ ["username/password@host:1521/service_name", ["username", "password", "host:1521/service_name", nil]],
33
+ ["username/password@//host", ["username", "password", "//host", nil]],
34
+ ["username/password@//host/service_name", ["username", "password", "//host/service_name", nil]],
35
+ ["username/password@//host:1521", ["username", "password", "//host:1521", nil]],
36
+ ["username/password@//host:1521/service_name", ["username", "password", "//host:1521/service_name", nil]],
37
+ #"username/password as{sysoper|sysdba}"
38
+ ["username/password as sysoper", ["username", "password", nil, :SYSOPER]],
39
+ ["username/password as sysdba", ["username", "password", nil, :SYSDBA]],
40
+ #"username/password@[//]host[:port][/service_name] as {sysoper|sysdba}"
41
+ ["username/password@host as sysoper", ["username", "password", "host", :SYSOPER]],
42
+ ["username/password@host as sysdba", ["username", "password", "host", :SYSDBA]],
43
+ ["username/password@host/service_name as sysoper", ["username", "password", "host/service_name", :SYSOPER]],
44
+ ["username/password@host/service_name as sysdba", ["username", "password", "host/service_name", :SYSDBA]],
45
+ ["username/password@host:1521 as sysoper", ["username", "password", "host:1521", :SYSOPER]],
46
+ ["username/password@host:1521 as sysdba", ["username", "password", "host:1521", :SYSDBA]],
47
+ ["username/password@host:1521/service_name as sysoper", ["username", "password", "host:1521/service_name", :SYSOPER]],
48
+ ["username/password@host:1521/service_name as sysdba", ["username", "password", "host:1521/service_name", :SYSDBA]],
49
+ ["username/password@//host as sysoper", ["username", "password", "//host", :SYSOPER]],
50
+ ["username/password@//host as sysdba", ["username", "password", "//host", :SYSDBA]],
51
+ ["username/password@//host/service_name as sysoper", ["username", "password", "//host/service_name", :SYSOPER]],
52
+ ["username/password@//host/service_name as sysdba", ["username", "password", "//host/service_name", :SYSDBA]],
53
+ ["username/password@//host:1521 as sysoper", ["username", "password", "//host:1521", :SYSOPER]],
54
+ ["username/password@//host:1521 as sysdba", ["username", "password", "//host:1521", :SYSDBA]],
55
+ ["username/password@//host:1521/service_name as sysoper", ["username", "password", "//host:1521/service_name", :SYSOPER]],
56
+ ["username/password@//host:1521/service_name as sysdba", ["username", "password", "//host:1521/service_name", :SYSDBA]],
57
+ ["/passwd@192.168.19.19:1521/orcl as sysdba", ["", "passwd", "192.168.19.19:1521/orcl", :SYSDBA]],
58
+ ["/", [nil, nil, nil, nil]],
59
+ ["/ as sysdba", [nil, nil, nil, :SYSDBA]],
60
+ ]
61
+
62
+ def test_connstr
63
+ obj = OCI8.allocate # create an uninitialized object.
64
+ TEST_CASES.each do |test_case|
65
+ case test_case[1]
66
+ when Array
67
+ # use instance_eval to call a private method parse_connect_string.
68
+ result = obj.instance_eval { parse_connect_string(test_case[0]) }
69
+ assert_equal(test_case[1], result, test_case[0])
70
+ when Class
71
+ assert_raises(test_case[1]) do
72
+ result = obj.instance_eval { parse_connect_string(test_case[0]) }
73
+ end
74
+ else
75
+ raise "unsupported testcase"
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ Test::Unit::AutoRunner.run() if $0 == __FILE__