activerecord-oracle_enhanced-adapter 1.1.9 → 1.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 (22) hide show
  1. data/History.txt +11 -0
  2. data/README.txt +6 -2
  3. data/lib/active_record/connection_adapters/emulation/oracle_adapter.rb +5 -0
  4. data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +771 -907
  5. data/lib/active_record/connection_adapters/oracle_enhanced_connection.rb +71 -0
  6. data/lib/active_record/connection_adapters/oracle_enhanced_core_ext.rb +64 -0
  7. data/lib/active_record/connection_adapters/oracle_enhanced_dirty.rb +2 -2
  8. data/lib/active_record/connection_adapters/oracle_enhanced_jdbc_connection.rb +352 -0
  9. data/lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb +346 -0
  10. data/lib/active_record/connection_adapters/oracle_enhanced_procedures.rb +2 -1
  11. data/lib/active_record/connection_adapters/oracle_enhanced_reserved_words.rb +126 -0
  12. data/lib/active_record/connection_adapters/oracle_enhanced_version.rb +2 -2
  13. data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +200 -97
  14. data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +170 -0
  15. data/spec/active_record/connection_adapters/oracle_enhanced_core_ext_spec.rb +40 -0
  16. data/spec/active_record/connection_adapters/oracle_enhanced_cpk_spec.rb +11 -6
  17. data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +148 -53
  18. data/spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb +13 -5
  19. data/spec/active_record/connection_adapters/oracle_enhanced_emulate_oracle_adapter_spec.rb +27 -0
  20. data/spec/active_record/connection_adapters/oracle_enhanced_procedures_spec.rb +10 -6
  21. data/spec/spec_helper.rb +51 -6
  22. metadata +11 -2
@@ -0,0 +1,170 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ describe "OracleEnhancedConnection create connection" do
4
+
5
+ before(:all) do
6
+ @conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(CONNECTION_PARAMS)
7
+ end
8
+
9
+ before(:each) do
10
+ @conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(CONNECTION_PARAMS) unless @conn.active?
11
+ end
12
+
13
+ after(:all) do
14
+ @conn.logoff if @conn.active?
15
+ end
16
+
17
+ it "should create new connection" do
18
+ @conn.should be_active
19
+ end
20
+
21
+ it "should ping active connection" do
22
+ @conn.ping.should be_true
23
+ end
24
+
25
+ it "should not ping inactive connection" do
26
+ @conn.logoff
27
+ lambda { @conn.ping }.should raise_error(ActiveRecord::ConnectionAdapters::OracleEnhancedConnectionException)
28
+ end
29
+
30
+ it "should reset active connection" do
31
+ @conn.reset!
32
+ @conn.should be_active
33
+ end
34
+
35
+ it "should be in autocommit mode after connection" do
36
+ @conn.should be_autocommit
37
+ end
38
+
39
+ end
40
+
41
+ describe "OracleEnhancedConnection SQL execution" do
42
+
43
+ before(:all) do
44
+ @conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(CONNECTION_PARAMS)
45
+ end
46
+
47
+ before(:each) do
48
+ @conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(CONNECTION_PARAMS) unless @conn.active?
49
+ end
50
+
51
+ after(:all) do
52
+ @conn.logoff if @conn.active?
53
+ end
54
+
55
+ it "should execute SQL statement" do
56
+ @conn.exec("SELECT * FROM dual").should_not be_nil
57
+ end
58
+
59
+ it "should execute SQL select" do
60
+ @conn.select("SELECT * FROM dual").should == [{'dummy' => 'X'}]
61
+ end
62
+
63
+ it "should execute SQL select and return also columns" do
64
+ @conn.select("SELECT * FROM dual", nil, true).should == [ [{'dummy' => 'X'}], ['dummy'] ]
65
+ end
66
+
67
+ end
68
+
69
+ describe "OracleEnhancedConnection auto reconnection" do
70
+
71
+ before(:all) do
72
+ ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
73
+ @conn = ActiveRecord::Base.connection.instance_variable_get("@connection")
74
+ @sys_conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(SYS_CONNECTION_PARAMS)
75
+ end
76
+
77
+ before(:each) do
78
+ ActiveRecord::Base.connection.reconnect! unless @conn.active?
79
+ end
80
+
81
+ after(:all) do
82
+ ActiveRecord::Base.connection.disconnect! if @conn.active?
83
+ end
84
+
85
+ def kill_current_session
86
+ audsid = @conn.select("SELECT userenv('sessionid') audsid FROM dual").first['audsid']
87
+ sid_serial = @sys_conn.select("SELECT s.sid||','||s.serial# sid_serial
88
+ FROM v$session s
89
+ WHERE audsid = '#{audsid}'").first['sid_serial']
90
+ @sys_conn.exec "ALTER SYSTEM KILL SESSION '#{sid_serial}' IMMEDIATE"
91
+ end
92
+
93
+ it "should reconnect and execute SQL statement if connection is lost and auto retry is enabled" do
94
+ # @conn.auto_retry = true
95
+ ActiveRecord::Base.connection.auto_retry = true
96
+ kill_current_session
97
+ @conn.exec("SELECT * FROM dual").should_not be_nil
98
+ end
99
+
100
+ it "should not reconnect and execute SQL statement if connection is lost and auto retry is disabled" do
101
+ # @conn.auto_retry = false
102
+ ActiveRecord::Base.connection.auto_retry = false
103
+ kill_current_session
104
+ lambda { @conn.exec("SELECT * FROM dual") }.should raise_error
105
+ end
106
+
107
+ it "should reconnect and execute SQL select if connection is lost and auto retry is enabled" do
108
+ # @conn.auto_retry = true
109
+ ActiveRecord::Base.connection.auto_retry = true
110
+ kill_current_session
111
+ @conn.select("SELECT * FROM dual").should == [{'dummy' => 'X'}]
112
+ end
113
+
114
+ it "should not reconnect and execute SQL select if connection is lost and auto retry is disabled" do
115
+ # @conn.auto_retry = false
116
+ ActiveRecord::Base.connection.auto_retry = false
117
+ kill_current_session
118
+ lambda { @conn.select("SELECT * FROM dual") }.should raise_error
119
+ end
120
+
121
+ end
122
+
123
+ describe "OracleEnhancedConnection describe table" do
124
+
125
+ before(:all) do
126
+ @conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(CONNECTION_PARAMS)
127
+ @owner = CONNECTION_PARAMS[:username].upcase
128
+ end
129
+
130
+ after(:all) do
131
+ @conn.logoff if @conn.active?
132
+ end
133
+
134
+ it "should describe existing table" do
135
+ @conn.exec "CREATE TABLE test_employees (first_name VARCHAR2(20))" rescue nil
136
+ @conn.describe("test_employees").should == [@owner, "TEST_EMPLOYEES"]
137
+ @conn.exec "DROP TABLE test_employees" rescue nil
138
+ end
139
+
140
+ it "should not describe non-existing table" do
141
+ lambda { @conn.describe("test_xxx") }.should raise_error(ActiveRecord::ConnectionAdapters::OracleEnhancedConnectionException)
142
+ end
143
+
144
+ it "should describe table in other schema" do
145
+ @conn.describe("sys.dual").should == ["SYS", "DUAL"]
146
+ end
147
+
148
+ it "should describe existing view" do
149
+ @conn.exec "CREATE TABLE test_employees (first_name VARCHAR2(20))" rescue nil
150
+ @conn.exec "CREATE VIEW test_employees_v AS SELECT * FROM test_employees" rescue nil
151
+ @conn.describe("test_employees_v").should == [@owner, "TEST_EMPLOYEES_V"]
152
+ @conn.exec "DROP VIEW test_employees_v" rescue nil
153
+ @conn.exec "DROP TABLE test_employees" rescue nil
154
+ end
155
+
156
+ it "should describe view in other schema" do
157
+ @conn.describe("sys.v_$version").should == ["SYS", "V_$VERSION"]
158
+ end
159
+
160
+ it "should describe existing private synonym" do
161
+ @conn.exec "CREATE SYNONYM test_dual FOR sys.dual" rescue nil
162
+ @conn.describe("test_dual").should == ["SYS", "DUAL"]
163
+ @conn.exec "DROP SYNONYM test_dual" rescue nil
164
+ end
165
+
166
+ it "should describe existing public synonym" do
167
+ @conn.describe("all_tables").should == ["SYS", "ALL_TABLES"]
168
+ end
169
+
170
+ end
@@ -0,0 +1,40 @@
1
+ # encoding: utf-8
2
+
3
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
4
+
5
+ describe "OracleEnhancedAdapter to_d method" do
6
+ it "BigDecimal#to_d returns the same decimal number" do
7
+ d = BigDecimal.new("12345678901234567890.0123456789")
8
+ d.to_d.should == d
9
+ end
10
+
11
+ it "Bignum#to_d translates large integer to decimal" do
12
+ n = 12345678901234567890
13
+ n.to_d.should == BigDecimal.new(n.to_s)
14
+ end
15
+
16
+ it "Fixnum#to_d translates small integer to decimal" do
17
+ n = 123456
18
+ n.to_d.should == BigDecimal.new(n.to_s)
19
+ end
20
+ end
21
+
22
+ if ENV['RAILS_GEM_VERSION'] >= '2.3'
23
+
24
+ describe "OracleEnhancedAdapter Unicode aware upcase and downcase" do
25
+ before(:all) do
26
+ @down = "āčēģīķļņšūž"
27
+ @up = "ĀČĒĢĪĶĻŅŠŪŽ"
28
+ end
29
+
30
+ it "should translate Unicode string to upcase" do
31
+ @down.mb_chars.upcase.to_s.should == @up
32
+ end
33
+
34
+ it "should translate Unicode string to downcase" do
35
+ @up.mb_chars.downcase.to_s.should == @down
36
+ end
37
+
38
+ end
39
+
40
+ end
@@ -3,12 +3,13 @@ require File.dirname(__FILE__) + '/../../spec_helper.rb'
3
3
  describe "OracleEnhancedAdapter composite_primary_keys support" do
4
4
 
5
5
  before(:all) do
6
- require "composite_primary_keys"
7
- ActiveRecord::Base.establish_connection(:adapter => "oracle_enhanced",
8
- :database => "xe",
9
- :username => "hr",
10
- :password => "hr")
11
- class JobHistory < ActiveRecord::Base
6
+ if defined?(ActiveRecord::ConnectionAdapters::OracleAdapter)
7
+ @old_oracle_adapter = ActiveRecord::ConnectionAdapters::OracleAdapter
8
+ ActiveRecord::ConnectionAdapters.send(:remove_const, :OracleAdapter)
9
+ end
10
+ ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
11
+ require 'composite_primary_keys'
12
+ class ::JobHistory < ActiveRecord::Base
12
13
  set_table_name "job_history"
13
14
  set_primary_keys :employee_id, :start_date
14
15
  end
@@ -17,6 +18,10 @@ describe "OracleEnhancedAdapter composite_primary_keys support" do
17
18
  after(:all) do
18
19
  Object.send(:remove_const, 'CompositePrimaryKeys') if defined?(CompositePrimaryKeys)
19
20
  Object.send(:remove_const, 'JobHistory') if defined?(JobHistory)
21
+ if @old_oracle_adapter
22
+ ActiveRecord::ConnectionAdapters.send(:remove_const, :OracleAdapter)
23
+ ActiveRecord::ConnectionAdapters::OracleAdapter = @old_oracle_adapter
24
+ end
20
25
  end
21
26
 
22
27
  it "should tell ActiveRecord that count distinct is not supported" do
@@ -2,10 +2,7 @@ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
2
 
3
3
  describe "OracleEnhancedAdapter date type detection based on column names" do
4
4
  before(:all) do
5
- ActiveRecord::Base.establish_connection(:adapter => "oracle_enhanced",
6
- :database => "xe",
7
- :username => "hr",
8
- :password => "hr")
5
+ ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
9
6
  @conn = ActiveRecord::Base.connection
10
7
  @conn.execute <<-SQL
11
8
  CREATE TABLE test_employees (
@@ -82,7 +79,7 @@ describe "OracleEnhancedAdapter date type detection based on column names" do
82
79
  ActiveRecord::Base.connection.clear_types_for_columns
83
80
  ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = false
84
81
  ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates = false
85
- class TestEmployee < ActiveRecord::Base
82
+ class ::TestEmployee < ActiveRecord::Base
86
83
  set_table_name "hr.test_employees"
87
84
  set_primary_key :employee_id
88
85
  end
@@ -124,7 +121,7 @@ describe "OracleEnhancedAdapter date type detection based on column names" do
124
121
  end
125
122
 
126
123
  it "should return Date value from DATE column if emulate_dates_by_column_name is false but column is defined as date" do
127
- class TestEmployee < ActiveRecord::Base
124
+ class ::TestEmployee < ActiveRecord::Base
128
125
  set_date_columns :hire_date
129
126
  end
130
127
  ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = false
@@ -133,7 +130,7 @@ describe "OracleEnhancedAdapter date type detection based on column names" do
133
130
  end
134
131
 
135
132
  it "should return Time value from DATE column if emulate_dates_by_column_name is true but column is defined as datetime" do
136
- class TestEmployee < ActiveRecord::Base
133
+ class ::TestEmployee < ActiveRecord::Base
137
134
  set_datetime_columns :hire_date
138
135
  end
139
136
  ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = true
@@ -160,10 +157,7 @@ end
160
157
 
161
158
  describe "OracleEnhancedAdapter integer type detection based on column names" do
162
159
  before(:all) do
163
- ActiveRecord::Base.establish_connection(:adapter => "oracle_enhanced",
164
- :database => "xe",
165
- :username => "hr",
166
- :password => "hr")
160
+ ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
167
161
  @conn = ActiveRecord::Base.connection
168
162
  @conn.execute <<-SQL
169
163
  CREATE TABLE test2_employees (
@@ -231,7 +225,7 @@ describe "OracleEnhancedAdapter integer type detection based on column names" do
231
225
 
232
226
  describe "/ NUMBER values from ActiveRecord model" do
233
227
  before(:each) do
234
- class Test2Employee < ActiveRecord::Base
228
+ class ::Test2Employee < ActiveRecord::Base
235
229
  end
236
230
  end
237
231
 
@@ -273,10 +267,7 @@ end
273
267
 
274
268
  describe "OracleEnhancedAdapter boolean type detection based on string column types and names" do
275
269
  before(:all) do
276
- ActiveRecord::Base.establish_connection(:adapter => "oracle_enhanced",
277
- :database => "xe",
278
- :username => "hr",
279
- :password => "hr")
270
+ ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
280
271
  @conn = ActiveRecord::Base.connection
281
272
  @conn.execute <<-SQL
282
273
  CREATE TABLE test3_employees (
@@ -293,9 +284,9 @@ describe "OracleEnhancedAdapter boolean type detection based on string column ty
293
284
  department_id NUMBER(4,0),
294
285
  created_at DATE,
295
286
  has_email CHAR(1),
296
- has_phone VARCHAR2(1),
287
+ has_phone VARCHAR2(1) DEFAULT 'Y',
297
288
  active_flag VARCHAR2(2),
298
- manager_yn VARCHAR2(3),
289
+ manager_yn VARCHAR2(3) DEFAULT 'N',
299
290
  test_boolean VARCHAR2(3)
300
291
  )
301
292
  SQL
@@ -367,11 +358,18 @@ describe "OracleEnhancedAdapter boolean type detection based on string column ty
367
358
  ActiveRecord::Base.connection.type_to_sql(
368
359
  :boolean, nil, nil, nil).should == "NUMBER(1)"
369
360
  end
361
+
362
+ it "should get default value from VARCHAR2 boolean column if emulate_booleans_from_strings is true" do
363
+ ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_booleans_from_strings = true
364
+ columns = @conn.columns('test3_employees')
365
+ columns.detect{|c| c.name == 'has_phone'}.default.should be_true
366
+ columns.detect{|c| c.name == 'manager_yn'}.default.should be_false
367
+ end
370
368
 
371
369
  describe "/ VARCHAR2 boolean values from ActiveRecord model" do
372
370
  before(:each) do
373
371
  ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_booleans_from_strings = false
374
- class Test3Employee < ActiveRecord::Base
372
+ class ::Test3Employee < ActiveRecord::Base
375
373
  end
376
374
  end
377
375
 
@@ -422,7 +420,7 @@ describe "OracleEnhancedAdapter boolean type detection based on string column ty
422
420
 
423
421
  it "should return boolean value from VARCHAR2 boolean column if column specified in set_boolean_columns" do
424
422
  ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_booleans_from_strings = true
425
- class Test3Employee < ActiveRecord::Base
423
+ class ::Test3Employee < ActiveRecord::Base
426
424
  set_boolean_columns :test_boolean
427
425
  end
428
426
  create_employee3(:test_boolean => true)
@@ -431,6 +429,12 @@ describe "OracleEnhancedAdapter boolean type detection based on string column ty
431
429
  create_employee3(:test_boolean => false)
432
430
  @employee3.test_boolean.class.should == FalseClass
433
431
  @employee3.test_boolean_before_type_cast.should == "N"
432
+ create_employee3(:test_boolean => nil)
433
+ @employee3.test_boolean.class.should == NilClass
434
+ @employee3.test_boolean_before_type_cast.should == nil
435
+ create_employee3(:test_boolean => "")
436
+ @employee3.test_boolean.class.should == NilClass
437
+ @employee3.test_boolean_before_type_cast.should == nil
434
438
  end
435
439
 
436
440
  end
@@ -439,10 +443,7 @@ end
439
443
 
440
444
  describe "OracleEnhancedAdapter timestamp with timezone support" do
441
445
  before(:all) do
442
- ActiveRecord::Base.establish_connection(:adapter => "oracle_enhanced",
443
- :database => "xe",
444
- :username => "hr",
445
- :password => "hr")
446
+ ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
446
447
  @conn = ActiveRecord::Base.connection
447
448
  @conn.execute <<-SQL
448
449
  CREATE TABLE test_employees (
@@ -481,7 +482,7 @@ describe "OracleEnhancedAdapter timestamp with timezone support" do
481
482
 
482
483
  describe "/ TIMESTAMP WITH TIME ZONE values from ActiveRecord model" do
483
484
  before(:all) do
484
- class TestEmployee < ActiveRecord::Base
485
+ class ::TestEmployee < ActiveRecord::Base
485
486
  set_primary_key :employee_id
486
487
  end
487
488
  end
@@ -505,18 +506,35 @@ describe "OracleEnhancedAdapter timestamp with timezone support" do
505
506
  end
506
507
  end
507
508
 
508
- it "should return Time value without fractional seconds from TIMESTAMP columns" do
509
- # currently fractional seconds are not retrieved from database
510
- @now = Time.local(2008,5,26,23,11,11,10)
511
- @employee = TestEmployee.create(
512
- :created_at => @now,
513
- :created_at_tz => @now,
514
- :created_at_ltz => @now
515
- )
516
- @employee.reload
517
- [:created_at, :created_at_tz, :created_at_ltz].each do |c|
518
- @employee.send(c).class.should == Time
519
- @employee.send(c).to_f.should == @now.to_f.to_i.to_f # remove fractional seconds
509
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
510
+ it "should return Time value with fractional seconds from TIMESTAMP columns" do
511
+ # currently fractional seconds are not retrieved from database
512
+ @now = Time.local(2008,5,26,23,11,11,10)
513
+ @employee = TestEmployee.create(
514
+ :created_at => @now,
515
+ :created_at_tz => @now,
516
+ :created_at_ltz => @now
517
+ )
518
+ @employee.reload
519
+ [:created_at, :created_at_tz, :created_at_ltz].each do |c|
520
+ @employee.send(c).class.should == Time
521
+ @employee.send(c).to_f.should == @now.to_f
522
+ end
523
+ end
524
+ else
525
+ it "should return Time value without fractional seconds from TIMESTAMP columns" do
526
+ # currently fractional seconds are not retrieved from database
527
+ @now = Time.local(2008,5,26,23,11,11,10)
528
+ @employee = TestEmployee.create(
529
+ :created_at => @now,
530
+ :created_at_tz => @now,
531
+ :created_at_ltz => @now
532
+ )
533
+ @employee.reload
534
+ [:created_at, :created_at_tz, :created_at_ltz].each do |c|
535
+ @employee.send(c).class.should == Time
536
+ @employee.send(c).to_f.should == @now.to_f.to_i.to_f # remove fractional seconds
537
+ end
520
538
  end
521
539
  end
522
540
 
@@ -527,10 +545,7 @@ end
527
545
 
528
546
  describe "OracleEnhancedAdapter date and timestamp with different NLS date formats" do
529
547
  before(:all) do
530
- ActiveRecord::Base.establish_connection(:adapter => "oracle_enhanced",
531
- :database => "xe",
532
- :username => "hr",
533
- :password => "hr")
548
+ ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
534
549
  @conn = ActiveRecord::Base.connection
535
550
  @conn.execute <<-SQL
536
551
  CREATE TABLE test_employees (
@@ -567,7 +582,7 @@ describe "OracleEnhancedAdapter date and timestamp with different NLS date forma
567
582
  before(:each) do
568
583
  ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates = false
569
584
  ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = false
570
- class TestEmployee < ActiveRecord::Base
585
+ class ::TestEmployee < ActiveRecord::Base
571
586
  set_primary_key :employee_id
572
587
  end
573
588
  @today = Date.new(2008,6,28)
@@ -626,7 +641,7 @@ describe "OracleEnhancedAdapter date and timestamp with different NLS date forma
626
641
  end
627
642
 
628
643
  it "should quote Time values with TO_TIMESTAMP" do
629
- @ts = Time.at(@now.to_f + 0.1)
644
+ @ts = @now + 0.1
630
645
  @conn.quote(@ts).should == "TO_TIMESTAMP('#{@ts.year}-#{"%02d" % @ts.month}-#{"%02d" % @ts.day} "+
631
646
  "#{"%02d" % @ts.hour}:#{"%02d" % @ts.min}:#{"%02d" % @ts.sec}.100000','YYYY-MM-DD HH24:MI:SS.FF6')"
632
647
  end
@@ -635,10 +650,7 @@ end
635
650
 
636
651
  describe "OracleEnhancedAdapter assign string to :date and :datetime columns" do
637
652
  before(:all) do
638
- ActiveRecord::Base.establish_connection(:adapter => "oracle_enhanced",
639
- :database => "xe",
640
- :username => "hr",
641
- :password => "hr")
653
+ ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
642
654
  @conn = ActiveRecord::Base.connection
643
655
  @conn.execute <<-SQL
644
656
  CREATE TABLE test_employees (
@@ -654,7 +666,7 @@ describe "OracleEnhancedAdapter assign string to :date and :datetime columns" do
654
666
  CREATE SEQUENCE test_employees_seq MINVALUE 1
655
667
  INCREMENT BY 1 CACHE 20 NOORDER NOCYCLE
656
668
  SQL
657
- class TestEmployee < ActiveRecord::Base
669
+ class ::TestEmployee < ActiveRecord::Base
658
670
  set_primary_key :employee_id
659
671
  end
660
672
  end
@@ -768,10 +780,7 @@ end
768
780
 
769
781
  describe "OracleEnhancedAdapter handling of CLOB columns" do
770
782
  before(:all) do
771
- ActiveRecord::Base.establish_connection(:adapter => "oracle_enhanced",
772
- :database => "xe",
773
- :username => "hr",
774
- :password => "hr")
783
+ ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
775
784
  @conn = ActiveRecord::Base.connection
776
785
  @conn.execute <<-SQL
777
786
  CREATE TABLE test_employees (
@@ -785,7 +794,7 @@ describe "OracleEnhancedAdapter handling of CLOB columns" do
785
794
  CREATE SEQUENCE test_employees_seq MINVALUE 1
786
795
  INCREMENT BY 1 CACHE 20 NOORDER NOCYCLE
787
796
  SQL
788
- class TestEmployee < ActiveRecord::Base
797
+ class ::TestEmployee < ActiveRecord::Base
789
798
  set_primary_key :employee_id
790
799
  end
791
800
  end
@@ -824,3 +833,89 @@ describe "OracleEnhancedAdapter handling of CLOB columns" do
824
833
 
825
834
  end
826
835
 
836
+ describe "OracleEnhancedAdapter handling of BLOB columns" do
837
+ before(:all) do
838
+ ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
839
+ @conn = ActiveRecord::Base.connection
840
+ @conn.execute <<-SQL
841
+ CREATE TABLE test_employees (
842
+ employee_id NUMBER(6,0),
843
+ first_name VARCHAR2(20),
844
+ last_name VARCHAR2(25),
845
+ binary_data BLOB
846
+ )
847
+ SQL
848
+ @conn.execute <<-SQL
849
+ CREATE SEQUENCE test_employees_seq MINVALUE 1
850
+ INCREMENT BY 1 CACHE 20 NOORDER NOCYCLE
851
+ SQL
852
+ @binary_data = "\0\1\2\3\4\5\6\7\8\9"*10000
853
+ @binary_data2 = "\1\2\3\4\5\6\7\8\9\0"*10000
854
+ end
855
+
856
+ after(:all) do
857
+ @conn.execute "DROP TABLE test_employees"
858
+ @conn.execute "DROP SEQUENCE test_employees_seq"
859
+ end
860
+
861
+ before(:each) do
862
+ class ::TestEmployee < ActiveRecord::Base
863
+ set_primary_key :employee_id
864
+ end
865
+ end
866
+
867
+ after(:each) do
868
+ Object.send(:remove_const, "TestEmployee")
869
+ end
870
+
871
+ it "should create record with BLOB data" do
872
+ @employee = TestEmployee.create!(
873
+ :first_name => "First",
874
+ :last_name => "Last",
875
+ :binary_data => @binary_data
876
+ )
877
+ @employee.reload
878
+ @employee.binary_data.should == @binary_data
879
+ end
880
+
881
+ it "should update record with BLOB data" do
882
+ @employee = TestEmployee.create!(
883
+ :first_name => "First",
884
+ :last_name => "Last"
885
+ )
886
+ @employee.reload
887
+ @employee.binary_data.should be_nil
888
+ @employee.binary_data = @binary_data
889
+ @employee.save!
890
+ @employee.reload
891
+ @employee.binary_data.should == @binary_data
892
+ end
893
+
894
+ it "should update record that has existing BLOB data with different BLOB data" do
895
+ @employee = TestEmployee.create!(
896
+ :first_name => "First",
897
+ :last_name => "Last",
898
+ :binary_data => @binary_data
899
+ )
900
+ @employee.reload
901
+ @employee.binary_data = @binary_data2
902
+ @employee.save!
903
+ @employee.reload
904
+ @employee.binary_data.should == @binary_data2
905
+ end
906
+
907
+ it "should update record that has existing BLOB data with nil" do
908
+ @employee = TestEmployee.create!(
909
+ :first_name => "First",
910
+ :last_name => "Last",
911
+ :binary_data => @binary_data
912
+ )
913
+ @employee.reload
914
+ @employee.binary_data = nil
915
+ @employee.save!
916
+ @employee.reload
917
+ @employee.binary_data.should be_nil
918
+ end
919
+
920
+ end
921
+