activerecord-oracle_enhanced-adapter 1.5.6 → 1.6.9
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.
- checksums.yaml +4 -4
- data/.travis/oracle/download.sh +14 -0
- data/.travis/oracle/install.sh +31 -0
- data/.travis/setup_accounts.sh +9 -0
- data/.travis.yml +39 -0
- data/Gemfile +8 -8
- data/History.md +189 -0
- data/README.md +388 -178
- data/RUNNING_TESTS.md +11 -6
- data/VERSION +1 -1
- data/activerecord-oracle_enhanced-adapter.gemspec +29 -26
- data/lib/active_record/connection_adapters/{oracle_enhanced_column.rb → oracle_enhanced/column.rb} +14 -63
- data/lib/active_record/connection_adapters/oracle_enhanced/column_dumper.rb +66 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_connection.rb → oracle_enhanced/connection.rb} +2 -2
- data/lib/active_record/connection_adapters/oracle_enhanced/context_index.rb +347 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +260 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/dirty.rb +40 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_jdbc_connection.rb → oracle_enhanced/jdbc_connection.rb} +13 -4
- data/lib/active_record/connection_adapters/{oracle_enhanced_oci_connection.rb → oracle_enhanced/oci_connection.rb} +11 -5
- data/lib/active_record/connection_adapters/{oracle_enhanced_procedures.rb → oracle_enhanced/procedures.rb} +1 -1
- data/lib/active_record/connection_adapters/{oracle_enhanced_schema_creation.rb → oracle_enhanced/schema_creation.rb} +34 -35
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_definitions.rb +95 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_schema_dumper.rb → oracle_enhanced/schema_dumper.rb} +14 -37
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb +562 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements_ext.rb +65 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_structure_dump.rb → oracle_enhanced/structure_dump.rb} +63 -14
- data/lib/active_record/connection_adapters/oracle_enhanced/version.rb +1 -0
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +171 -73
- data/lib/active_record/oracle_enhanced/type/integer.rb +13 -0
- data/lib/active_record/oracle_enhanced/type/raw.rb +13 -0
- data/lib/active_record/oracle_enhanced/type/timestamp.rb +11 -0
- data/lib/activerecord-oracle_enhanced-adapter.rb +1 -1
- data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +127 -49
- data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +46 -5
- data/spec/active_record/connection_adapters/oracle_enhanced_context_index_spec.rb +11 -3
- data/spec/active_record/connection_adapters/oracle_enhanced_cpk_spec.rb +3 -3
- data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +151 -78
- data/spec/active_record/connection_adapters/oracle_enhanced_database_tasks_spec.rb +4 -4
- data/spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb +10 -16
- data/spec/active_record/connection_adapters/oracle_enhanced_emulate_oracle_adapter_spec.rb +1 -1
- data/spec/active_record/connection_adapters/oracle_enhanced_procedures_spec.rb +5 -5
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_dump_spec.rb +65 -181
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_statements_spec.rb +114 -11
- data/spec/active_record/connection_adapters/oracle_enhanced_structure_dump_spec.rb +17 -1
- data/spec/spec_config.yaml.template +11 -0
- data/spec/spec_helper.rb +31 -12
- data/spec/support/alter_system_user_password.sql +2 -0
- data/spec/support/create_oracle_enhanced_users.sql +31 -0
- metadata +37 -27
- data/lib/active_record/connection_adapters/oracle_enhanced_column_dumper.rb +0 -77
- data/lib/active_record/connection_adapters/oracle_enhanced_context_index.rb +0 -350
- data/lib/active_record/connection_adapters/oracle_enhanced_database_statements.rb +0 -262
- data/lib/active_record/connection_adapters/oracle_enhanced_dirty.rb +0 -45
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_definitions.rb +0 -197
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements.rb +0 -450
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements_ext.rb +0 -258
- data/lib/active_record/connection_adapters/oracle_enhanced_version.rb +0 -1
- /data/lib/active_record/connection_adapters/{oracle_enhanced_cpk.rb → oracle_enhanced/cpk.rb} +0 -0
- /data/lib/active_record/connection_adapters/{oracle_enhanced_database_tasks.rb → oracle_enhanced/database_tasks.rb} +0 -0
@@ -67,21 +67,21 @@ describe "OracleEnhancedAdapter date type detection based on column names" do
|
|
67
67
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = false
|
68
68
|
columns = @conn.columns('test_employees')
|
69
69
|
column = columns.detect{|c| c.name == "hire_date"}
|
70
|
-
column.
|
70
|
+
column.type_cast_from_database(Time.now).class.should == Time
|
71
71
|
end
|
72
72
|
|
73
73
|
it "should return Date value from DATE column if column name contains 'date' and emulate_dates_by_column_name is true" do
|
74
74
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = true
|
75
75
|
columns = @conn.columns('test_employees')
|
76
76
|
column = columns.detect{|c| c.name == "hire_date"}
|
77
|
-
column.
|
77
|
+
column.type_cast_from_database(Time.now).class.should == Date
|
78
78
|
end
|
79
79
|
|
80
80
|
it "should typecast DateTime value to Date value from DATE column if column name contains 'date' and emulate_dates_by_column_name is true" do
|
81
81
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = true
|
82
82
|
columns = @conn.columns('test_employees')
|
83
83
|
column = columns.detect{|c| c.name == "hire_date"}
|
84
|
-
column.
|
84
|
+
column.type_cast_from_database(DateTime.new(1900,1,1)).class.should == Date
|
85
85
|
end
|
86
86
|
|
87
87
|
describe "/ DATE values from ActiveRecord model" do
|
@@ -206,7 +206,6 @@ describe "OracleEnhancedAdapter integer type detection based on column names" do
|
|
206
206
|
job_id NUMBER,
|
207
207
|
salary NUMBER,
|
208
208
|
commission_pct NUMBER(2,2),
|
209
|
-
unwise_name_id NUMBER(2,2),
|
210
209
|
manager_id NUMBER(6),
|
211
210
|
is_manager NUMBER(1),
|
212
211
|
department_id NUMBER(4,0),
|
@@ -219,46 +218,17 @@ describe "OracleEnhancedAdapter integer type detection based on column names" do
|
|
219
218
|
INCREMENT BY 1 START WITH 10040 CACHE 20 NOORDER NOCYCLE
|
220
219
|
SQL
|
221
220
|
end
|
222
|
-
|
221
|
+
|
223
222
|
after(:all) do
|
224
223
|
@conn.execute "DROP TABLE test2_employees"
|
225
224
|
@conn.execute "DROP SEQUENCE test2_employees_seq"
|
226
225
|
end
|
227
226
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
columns = @conn.columns('test2_employees')
|
234
|
-
column = columns.detect{|c| c.name == "job_id"}
|
235
|
-
column.type.should == :decimal
|
236
|
-
end
|
237
|
-
|
238
|
-
it "should set NUMBER column type as decimal if column name is not 'id' and does not ends with '_id' and emulate_integers_by_column_name is true" do
|
239
|
-
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_integers_by_column_name = true
|
240
|
-
columns = @conn.columns('test2_employees')
|
241
|
-
column = columns.detect{|c| c.name == "salary"}
|
242
|
-
column.type.should == :decimal
|
243
|
-
end
|
244
|
-
end
|
245
|
-
|
246
|
-
context "when number_datatype_coercion is :float" do
|
247
|
-
before { ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.stub(:number_datatype_coercion).and_return(:float) }
|
248
|
-
|
249
|
-
it "should set NUMBER column type as float if emulate_integers_by_column_name is false" do
|
250
|
-
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_integers_by_column_name = false
|
251
|
-
columns = @conn.columns('test2_employees')
|
252
|
-
column = columns.detect{|c| c.name == "job_id"}
|
253
|
-
column.type.should == :float
|
254
|
-
end
|
255
|
-
|
256
|
-
it "should set NUMBER column type as float if column name is not 'id' and does not ends with '_id' and emulate_integers_by_column_name is true" do
|
257
|
-
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_integers_by_column_name = true
|
258
|
-
columns = @conn.columns('test2_employees')
|
259
|
-
column = columns.detect{|c| c.name == "salary"}
|
260
|
-
column.type.should == :float
|
261
|
-
end
|
227
|
+
it "should set NUMBER column type as decimal if emulate_integers_by_column_name is false" do
|
228
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_integers_by_column_name = false
|
229
|
+
columns = @conn.columns('test2_employees')
|
230
|
+
column = columns.detect{|c| c.name == "job_id"}
|
231
|
+
column.type.should == :decimal
|
262
232
|
end
|
263
233
|
|
264
234
|
it "should set NUMBER column type as integer if emulate_integers_by_column_name is true" do
|
@@ -270,24 +240,10 @@ describe "OracleEnhancedAdapter integer type detection based on column names" do
|
|
270
240
|
column.type.should == :integer
|
271
241
|
end
|
272
242
|
|
273
|
-
it "should set NUMBER
|
274
|
-
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_integers_by_column_name = true
|
275
|
-
columns = @conn.columns('test2_employees')
|
276
|
-
column = columns.detect{|c| c.name == "department_id"}
|
277
|
-
column.type.should == :integer
|
278
|
-
end
|
279
|
-
|
280
|
-
it "should set NUMBER(p,s) column type as integer if column name ends with '_id' and emulate_integers_by_column_name is true" do
|
243
|
+
it "should set NUMBER column type as decimal if column name does not contain 'id' and emulate_integers_by_column_name is true" do
|
281
244
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_integers_by_column_name = true
|
282
245
|
columns = @conn.columns('test2_employees')
|
283
|
-
column = columns.detect{|c| c.name == "
|
284
|
-
column.type.should == :integer
|
285
|
-
end
|
286
|
-
|
287
|
-
it "should set NUMBER(p,s) column type as decimal if column name ends with '_id' and emulate_integers_by_column_name is false" do
|
288
|
-
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_integers_by_column_name = false
|
289
|
-
columns = @conn.columns('test2_employees')
|
290
|
-
column = columns.detect{|c| c.name == "unwise_name_id"}
|
246
|
+
column = columns.detect{|c| c.name == "salary"}
|
291
247
|
column.type.should == :decimal
|
292
248
|
end
|
293
249
|
|
@@ -295,14 +251,14 @@ describe "OracleEnhancedAdapter integer type detection based on column names" do
|
|
295
251
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_integers_by_column_name = false
|
296
252
|
columns = @conn.columns('test2_employees')
|
297
253
|
column = columns.detect{|c| c.name == "job_id"}
|
298
|
-
column.
|
254
|
+
column.type_cast_from_database(1.0).class.should == BigDecimal
|
299
255
|
end
|
300
256
|
|
301
|
-
it "should return
|
257
|
+
it "should return Integer value from NUMBER column if column name contains 'id' and emulate_integers_by_column_name is true" do
|
302
258
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_integers_by_column_name = true
|
303
259
|
columns = @conn.columns('test2_employees')
|
304
260
|
column = columns.detect{|c| c.name == "job_id"}
|
305
|
-
column.
|
261
|
+
expect(column.type_cast_from_database(1.0)).to be_a(Integer)
|
306
262
|
end
|
307
263
|
|
308
264
|
describe "/ NUMBER values from ActiveRecord model" do
|
@@ -310,7 +266,7 @@ describe "OracleEnhancedAdapter integer type detection based on column names" do
|
|
310
266
|
class ::Test2Employee < ActiveRecord::Base
|
311
267
|
end
|
312
268
|
end
|
313
|
-
|
269
|
+
|
314
270
|
after(:each) do
|
315
271
|
Object.send(:remove_const, "Test2Employee")
|
316
272
|
@conn.clear_types_for_columns
|
@@ -335,16 +291,16 @@ describe "OracleEnhancedAdapter integer type detection based on column names" do
|
|
335
291
|
@employee2.job_id.class.should == BigDecimal
|
336
292
|
end
|
337
293
|
|
338
|
-
it "should return
|
294
|
+
it "should return Integer value from NUMBER column if column name contains 'id' and emulate_integers_by_column_name is true" do
|
339
295
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_integers_by_column_name = true
|
340
296
|
create_employee2
|
341
|
-
@employee2.job_id.
|
297
|
+
expect(@employee2.job_id).to be_a(Integer)
|
342
298
|
end
|
343
299
|
|
344
|
-
it "should return
|
300
|
+
it "should return Integer value from NUMBER column with integer value using _before_type_cast method" do
|
345
301
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_integers_by_column_name = true
|
346
302
|
create_employee2
|
347
|
-
@employee2.job_id_before_type_cast.
|
303
|
+
expect(@employee2.job_id_before_type_cast).to be_a(Integer)
|
348
304
|
end
|
349
305
|
|
350
306
|
it "should return BigDecimal value from NUMBER column if column name does not contain 'id' and emulate_integers_by_column_name is true" do
|
@@ -353,11 +309,11 @@ describe "OracleEnhancedAdapter integer type detection based on column names" do
|
|
353
309
|
@employee2.salary.class.should == BigDecimal
|
354
310
|
end
|
355
311
|
|
356
|
-
it "should return
|
312
|
+
it "should return Integer value from NUMBER column if column specified in set_integer_columns" do
|
357
313
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_integers_by_column_name = false
|
358
314
|
Test2Employee.set_integer_columns :job_id
|
359
315
|
create_employee2
|
360
|
-
@employee2.job_id.
|
316
|
+
expect(@employee2.job_id).to be_a(Integer)
|
361
317
|
end
|
362
318
|
|
363
319
|
it "should return Boolean value from NUMBER(1) column if emulate booleans is used" do
|
@@ -366,17 +322,17 @@ describe "OracleEnhancedAdapter integer type detection based on column names" do
|
|
366
322
|
@employee2.is_manager.class.should == TrueClass
|
367
323
|
end
|
368
324
|
|
369
|
-
it "should return
|
325
|
+
it "should return Integer value from NUMBER(1) column if emulate booleans is not used" do
|
370
326
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_booleans = false
|
371
327
|
create_employee2
|
372
|
-
@employee2.is_manager.
|
328
|
+
expect(@employee2.is_manager).to be_a(Integer)
|
373
329
|
end
|
374
330
|
|
375
|
-
it "should return
|
331
|
+
it "should return Integer value from NUMBER(1) column if column specified in set_integer_columns" do
|
376
332
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_booleans = true
|
377
333
|
Test2Employee.set_integer_columns :is_manager
|
378
334
|
create_employee2
|
379
|
-
@employee2.is_manager.
|
335
|
+
expect(@employee2.is_manager).to be_a(Integer)
|
380
336
|
end
|
381
337
|
|
382
338
|
end
|
@@ -420,6 +376,43 @@ describe "OracleEnhancedAdapter boolean type detection based on string column ty
|
|
420
376
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_booleans_from_strings = false
|
421
377
|
end
|
422
378
|
|
379
|
+
before(:each) do
|
380
|
+
class ::Test3Employee < ActiveRecord::Base
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
after(:each) do
|
385
|
+
Object.send(:remove_const, "Test3Employee")
|
386
|
+
@conn.clear_types_for_columns
|
387
|
+
ActiveRecord::Base.clear_cache! if ActiveRecord::Base.respond_to?(:"clear_cache!")
|
388
|
+
end
|
389
|
+
|
390
|
+
describe "default values in new records" do
|
391
|
+
context "when emulate_booleans_from_strings is false" do
|
392
|
+
before do
|
393
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_booleans_from_strings = false
|
394
|
+
end
|
395
|
+
|
396
|
+
it "are Y or N" do
|
397
|
+
subject = Test3Employee.new
|
398
|
+
expect(subject.has_phone).to eq('Y')
|
399
|
+
expect(subject.manager_yn).to eq('N')
|
400
|
+
end
|
401
|
+
end
|
402
|
+
|
403
|
+
context "when emulate_booleans_from_strings is true" do
|
404
|
+
before do
|
405
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_booleans_from_strings = true
|
406
|
+
end
|
407
|
+
|
408
|
+
it "are True or False" do
|
409
|
+
subject = Test3Employee.new
|
410
|
+
expect(subject.has_phone).to be_a(TrueClass)
|
411
|
+
expect(subject.manager_yn).to be_a(FalseClass)
|
412
|
+
end
|
413
|
+
end
|
414
|
+
end
|
415
|
+
|
423
416
|
it "should set CHAR/VARCHAR2 column type as string if emulate_booleans_from_strings is false" do
|
424
417
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_booleans_from_strings = false
|
425
418
|
columns = @conn.columns('test3_employees')
|
@@ -452,7 +445,7 @@ describe "OracleEnhancedAdapter boolean type detection based on string column ty
|
|
452
445
|
columns = @conn.columns('test3_employees')
|
453
446
|
%w(has_email has_phone active_flag manager_yn).each do |col|
|
454
447
|
column = columns.detect{|c| c.name == col}
|
455
|
-
column.
|
448
|
+
column.type_cast_from_database("Y").class.should == String
|
456
449
|
end
|
457
450
|
end
|
458
451
|
|
@@ -461,8 +454,8 @@ describe "OracleEnhancedAdapter boolean type detection based on string column ty
|
|
461
454
|
columns = @conn.columns('test3_employees')
|
462
455
|
%w(has_email has_phone active_flag manager_yn).each do |col|
|
463
456
|
column = columns.detect{|c| c.name == col}
|
464
|
-
column.
|
465
|
-
column.
|
457
|
+
column.type_cast_from_database("Y").class.should == TrueClass
|
458
|
+
column.type_cast_from_database("N").class.should == FalseClass
|
466
459
|
end
|
467
460
|
end
|
468
461
|
|
@@ -481,19 +474,16 @@ describe "OracleEnhancedAdapter boolean type detection based on string column ty
|
|
481
474
|
it "should get default value from VARCHAR2 boolean column if emulate_booleans_from_strings is true" do
|
482
475
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_booleans_from_strings = true
|
483
476
|
columns = @conn.columns('test3_employees')
|
484
|
-
columns.detect{|c| c.name == 'has_phone'}.default.should
|
485
|
-
columns.detect{|c| c.name == 'manager_yn'}.default.should
|
477
|
+
columns.detect{|c| c.name == 'has_phone'}.default.should eq 'Y'
|
478
|
+
columns.detect{|c| c.name == 'manager_yn'}.default.should be false
|
486
479
|
end
|
487
480
|
|
488
481
|
describe "/ VARCHAR2 boolean values from ActiveRecord model" do
|
489
482
|
before(:each) do
|
490
483
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_booleans_from_strings = false
|
491
|
-
class ::Test3Employee < ActiveRecord::Base
|
492
|
-
end
|
493
484
|
end
|
494
485
|
|
495
486
|
after(:each) do
|
496
|
-
Object.send(:remove_const, "Test3Employee")
|
497
487
|
@conn.clear_types_for_columns
|
498
488
|
ActiveRecord::Base.clear_cache! if ActiveRecord::Base.respond_to?(:"clear_cache!")
|
499
489
|
end
|
@@ -650,6 +640,7 @@ describe "OracleEnhancedAdapter timestamp with timezone support" do
|
|
650
640
|
|
651
641
|
end
|
652
642
|
|
643
|
+
|
653
644
|
describe "OracleEnhancedAdapter date and timestamp with different NLS date formats" do
|
654
645
|
before(:all) do
|
655
646
|
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
@@ -906,7 +897,7 @@ describe "OracleEnhancedAdapter assign string to :date and :datetime columns" do
|
|
906
897
|
@employee.reload
|
907
898
|
@employee.last_login_at.should == @today.to_time
|
908
899
|
end
|
909
|
-
|
900
|
+
|
910
901
|
end
|
911
902
|
|
912
903
|
describe "OracleEnhancedAdapter handling of CLOB columns" do
|
@@ -1119,6 +1110,20 @@ describe "OracleEnhancedAdapter handling of CLOB columns" do
|
|
1119
1110
|
@employee.comments.should == @char_data
|
1120
1111
|
end
|
1121
1112
|
|
1113
|
+
it "should store serializable ruby data structures" do
|
1114
|
+
ruby_data1 = {"arbitrary1" => ["ruby", :data, 123]}
|
1115
|
+
ruby_data2 = {"arbitrary2" => ["ruby", :data, 123]}
|
1116
|
+
@employee = Test2Employee.create!(
|
1117
|
+
:comments => ruby_data1
|
1118
|
+
)
|
1119
|
+
@employee.reload
|
1120
|
+
@employee.comments.should == ruby_data1
|
1121
|
+
@employee.comments = ruby_data2
|
1122
|
+
@employee.save
|
1123
|
+
@employee.reload
|
1124
|
+
@employee.comments.should == ruby_data2
|
1125
|
+
end
|
1126
|
+
|
1122
1127
|
it "should keep unchanged serialized data when other columns changed" do
|
1123
1128
|
@employee = Test2Employee.create!(
|
1124
1129
|
:first_name => "First",
|
@@ -1130,6 +1135,18 @@ describe "OracleEnhancedAdapter handling of CLOB columns" do
|
|
1130
1135
|
@employee.reload
|
1131
1136
|
@employee.comments.should == "initial serialized data"
|
1132
1137
|
end
|
1138
|
+
|
1139
|
+
it "should keep serialized data after save" do
|
1140
|
+
@employee = Test2Employee.new
|
1141
|
+
@employee.comments = {:length=>{:is=>1}}
|
1142
|
+
@employee.save
|
1143
|
+
@employee.reload
|
1144
|
+
@employee.comments.should == {:length=>{:is=>1}}
|
1145
|
+
@employee.comments = {:length=>{:is=>2}}
|
1146
|
+
@employee.save
|
1147
|
+
@employee.reload
|
1148
|
+
@employee.comments.should == {:length=>{:is=>2}}
|
1149
|
+
end
|
1133
1150
|
end
|
1134
1151
|
|
1135
1152
|
describe "OracleEnhancedAdapter handling of BLOB columns" do
|
@@ -1383,6 +1400,7 @@ describe "OracleEnhancedAdapter handling of RAW columns" do
|
|
1383
1400
|
end
|
1384
1401
|
end
|
1385
1402
|
|
1403
|
+
|
1386
1404
|
describe "OracleEnhancedAdapter quoting of NCHAR and NVARCHAR2 columns" do
|
1387
1405
|
before(:all) do
|
1388
1406
|
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
@@ -1443,3 +1461,58 @@ describe "OracleEnhancedAdapter quoting of NCHAR and NVARCHAR2 columns" do
|
|
1443
1461
|
end
|
1444
1462
|
|
1445
1463
|
end
|
1464
|
+
|
1465
|
+
describe "OracleEnhancedAdapter handling of BINARY_FLOAT columns" do
|
1466
|
+
before(:all) do
|
1467
|
+
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
1468
|
+
@conn = ActiveRecord::Base.connection
|
1469
|
+
@conn.execute "DROP TABLE test2_employees" rescue nil
|
1470
|
+
@conn.execute <<-SQL
|
1471
|
+
CREATE TABLE test2_employees (
|
1472
|
+
id NUMBER PRIMARY KEY,
|
1473
|
+
first_name VARCHAR2(20),
|
1474
|
+
last_name VARCHAR2(25),
|
1475
|
+
email VARCHAR2(25),
|
1476
|
+
phone_number VARCHAR2(20),
|
1477
|
+
hire_date DATE,
|
1478
|
+
job_id NUMBER,
|
1479
|
+
salary NUMBER,
|
1480
|
+
commission_pct NUMBER(2,2),
|
1481
|
+
hourly_rate BINARY_FLOAT,
|
1482
|
+
manager_id NUMBER(6),
|
1483
|
+
is_manager NUMBER(1),
|
1484
|
+
department_id NUMBER(4,0),
|
1485
|
+
created_at DATE
|
1486
|
+
)
|
1487
|
+
SQL
|
1488
|
+
@conn.execute "DROP SEQUENCE test2_employees_seq" rescue nil
|
1489
|
+
@conn.execute <<-SQL
|
1490
|
+
CREATE SEQUENCE test2_employees_seq MINVALUE 1
|
1491
|
+
INCREMENT BY 1 START WITH 10040 CACHE 20 NOORDER NOCYCLE
|
1492
|
+
SQL
|
1493
|
+
|
1494
|
+
class ::Test2Employee < ActiveRecord::Base
|
1495
|
+
end
|
1496
|
+
end
|
1497
|
+
|
1498
|
+
after(:all) do
|
1499
|
+
Object.send(:remove_const, "Test2Employee")
|
1500
|
+
|
1501
|
+
@conn.execute "DROP TABLE test2_employees"
|
1502
|
+
@conn.execute "DROP SEQUENCE test2_employees_seq"
|
1503
|
+
end
|
1504
|
+
|
1505
|
+
it "should set BINARY_FLOAT column type as float" do
|
1506
|
+
columns = @conn.columns('test2_employees')
|
1507
|
+
column = columns.detect{|c| c.name == "hourly_rate"}
|
1508
|
+
column.type.should == :float
|
1509
|
+
end
|
1510
|
+
|
1511
|
+
it "should BINARY_FLOAT column type returns an approximate value" do
|
1512
|
+
employee = Test2Employee.create(hourly_rate: 4.4)
|
1513
|
+
|
1514
|
+
employee.reload
|
1515
|
+
|
1516
|
+
expect(employee.hourly_rate).to eq(4.400000095367432)
|
1517
|
+
end
|
1518
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'active_record/connection_adapters/
|
2
|
+
require 'active_record/connection_adapters/oracle_enhanced/database_tasks'
|
3
3
|
require 'stringio'
|
4
4
|
require 'tempfile'
|
5
5
|
|
@@ -42,14 +42,14 @@ describe "Oracle Enhanced adapter database tasks" do
|
|
42
42
|
describe "drop" do
|
43
43
|
before { ActiveRecord::Tasks::DatabaseTasks.drop(config) }
|
44
44
|
it "drops all tables" do
|
45
|
-
ActiveRecord::Base.connection.table_exists?(:test_posts).should
|
45
|
+
ActiveRecord::Base.connection.table_exists?(:test_posts).should be false
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
49
|
describe "purge" do
|
50
50
|
before { ActiveRecord::Tasks::DatabaseTasks.purge(config) }
|
51
51
|
it "drops all tables" do
|
52
|
-
ActiveRecord::Base.connection.table_exists?(:test_posts).should
|
52
|
+
ActiveRecord::Base.connection.table_exists?(:test_posts).should be false
|
53
53
|
ActiveRecord::Base.connection.select_value("SELECT COUNT(*) FROM RECYCLEBIN").should == 0
|
54
54
|
end
|
55
55
|
end
|
@@ -77,7 +77,7 @@ describe "Oracle Enhanced adapter database tasks" do
|
|
77
77
|
ActiveRecord::Tasks::DatabaseTasks.structure_load(config, temp_file)
|
78
78
|
end
|
79
79
|
it "loads the database structure from a file" do
|
80
|
-
ActiveRecord::Base.connection.table_exists?(:test_posts).should
|
80
|
+
ActiveRecord::Base.connection.table_exists?(:test_posts).should be true
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
@@ -16,7 +16,6 @@ if ActiveRecord::Base.method_defined?(:changed?)
|
|
16
16
|
last_name VARCHAR2(25),
|
17
17
|
job_id NUMBER(6,0) NULL,
|
18
18
|
salary NUMBER(8,2),
|
19
|
-
pto_per_hour NUMBER,
|
20
19
|
comments CLOB,
|
21
20
|
hire_date DATE
|
22
21
|
)
|
@@ -28,7 +27,7 @@ if ActiveRecord::Base.method_defined?(:changed?)
|
|
28
27
|
class TestEmployee < ActiveRecord::Base
|
29
28
|
end
|
30
29
|
end
|
31
|
-
|
30
|
+
|
32
31
|
after(:all) do
|
33
32
|
Object.send(:remove_const, "TestEmployee")
|
34
33
|
@conn.execute "DROP TABLE test_employees"
|
@@ -63,16 +62,6 @@ if ActiveRecord::Base.method_defined?(:changed?)
|
|
63
62
|
@employee.should_not be_changed
|
64
63
|
end
|
65
64
|
|
66
|
-
it "should not mark empty float (stored as NULL) as changed when reassigning it" do
|
67
|
-
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.stub(:number_datatype_coercion) { :float }
|
68
|
-
@employee = TestEmployee.create!(:pto_per_hour => '')
|
69
|
-
@employee.pto_per_hour = ''
|
70
|
-
@employee.should_not be_changed
|
71
|
-
@employee.reload
|
72
|
-
@employee.pto_per_hour = ''
|
73
|
-
@employee.should_not be_changed
|
74
|
-
end
|
75
|
-
|
76
65
|
it "should not mark empty text (stored as NULL) as changed when reassigning it" do
|
77
66
|
@employee = TestEmployee.create!(:comments => nil)
|
78
67
|
@employee.comments = nil
|
@@ -121,8 +110,8 @@ if ActiveRecord::Base.method_defined?(:changed?)
|
|
121
110
|
it "should not mark integer as changed when reassigning it" do
|
122
111
|
@employee = TestEmployee.new
|
123
112
|
@employee.job_id = 0
|
124
|
-
@employee.save
|
125
|
-
|
113
|
+
@employee.save.should be true
|
114
|
+
|
126
115
|
@employee.should_not be_changed
|
127
116
|
|
128
117
|
@employee.job_id = '0'
|
@@ -133,7 +122,7 @@ if ActiveRecord::Base.method_defined?(:changed?)
|
|
133
122
|
@employee = TestEmployee.create!(
|
134
123
|
:comments => "initial"
|
135
124
|
)
|
136
|
-
@employee.save
|
125
|
+
@employee.save.should be true
|
137
126
|
@employee.reload
|
138
127
|
@employee.comments.should == 'initial'
|
139
128
|
|
@@ -141,12 +130,17 @@ if ActiveRecord::Base.method_defined?(:changed?)
|
|
141
130
|
class << oci_conn
|
142
131
|
def write_lob(lob, value, is_binary = false); raise "don't do this'"; end
|
143
132
|
end
|
144
|
-
@employee.save
|
133
|
+
expect { @employee.save! }.to_not raise_error
|
145
134
|
class << oci_conn
|
146
135
|
remove_method :write_lob
|
147
136
|
end
|
148
137
|
end
|
149
138
|
|
139
|
+
it "should be able to handle attributes which are not backed by a column" do
|
140
|
+
TestEmployee.create!(:comments => "initial")
|
141
|
+
@employee = TestEmployee.select("#{TestEmployee.quoted_table_name}.*, 24 ranking").first
|
142
|
+
expect { @employee.ranking = 25 }.to_not raise_error
|
143
|
+
end
|
150
144
|
end
|
151
145
|
|
152
146
|
end
|
@@ -12,7 +12,7 @@ describe "OracleEnhancedAdapter emulate OracleAdapter" do
|
|
12
12
|
it "should be an OracleAdapter" do
|
13
13
|
@conn = ActiveRecord::Base.establish_connection(CONNECTION_PARAMS.merge(:emulate_oracle_adapter => true))
|
14
14
|
ActiveRecord::Base.connection.should_not be_nil
|
15
|
-
ActiveRecord::Base.connection.is_a?(ActiveRecord::ConnectionAdapters::OracleAdapter).should
|
15
|
+
ActiveRecord::Base.connection.is_a?(ActiveRecord::ConnectionAdapters::OracleAdapter).should be true
|
16
16
|
end
|
17
17
|
|
18
18
|
after(:all) do
|
@@ -186,7 +186,7 @@ describe "OracleEnhancedAdapter custom methods for create, update and destroy" d
|
|
186
186
|
lambda {
|
187
187
|
@employee.save
|
188
188
|
}.should raise_error("Make the transaction rollback")
|
189
|
-
@employee.
|
189
|
+
@employee.new_record?.should be true
|
190
190
|
TestEmployee.count.should == employees_count
|
191
191
|
end
|
192
192
|
|
@@ -263,7 +263,6 @@ describe "OracleEnhancedAdapter custom methods for create, update and destroy" d
|
|
263
263
|
end
|
264
264
|
|
265
265
|
it "should delete record and set destroyed flag" do
|
266
|
-
return pending("Not in this ActiveRecord version (requires >= 2.3.5)") unless TestEmployee.method_defined?(:destroyed?)
|
267
266
|
@employee = TestEmployee.create(
|
268
267
|
:first_name => "First",
|
269
268
|
:last_name => "Last",
|
@@ -325,7 +324,8 @@ describe "OracleEnhancedAdapter custom methods for create, update and destroy" d
|
|
325
324
|
:last_name => "Last",
|
326
325
|
:hire_date => @today
|
327
326
|
)
|
328
|
-
|
327
|
+
#TODO: dirty workaround to remove sql statement for `table` method
|
328
|
+
@logger.logged(:debug)[-2].should match(/^TestEmployee Create \(\d+\.\d+(ms)?\) custom create method$/)
|
329
329
|
clear_logger
|
330
330
|
end
|
331
331
|
|
@@ -359,7 +359,7 @@ describe "OracleEnhancedAdapter custom methods for create, update and destroy" d
|
|
359
359
|
:last_name => "Last",
|
360
360
|
:hire_date => @today
|
361
361
|
)
|
362
|
-
@employee.save.should
|
362
|
+
@employee.save.should be false
|
363
363
|
@employee.errors[:first_name].should_not be_blank
|
364
364
|
end
|
365
365
|
|
@@ -370,7 +370,7 @@ describe "OracleEnhancedAdapter custom methods for create, update and destroy" d
|
|
370
370
|
:hire_date => @today
|
371
371
|
)
|
372
372
|
@employee.first_name = nil
|
373
|
-
@employee.save.should
|
373
|
+
@employee.save.should be false
|
374
374
|
@employee.errors[:first_name].should_not be_blank
|
375
375
|
end
|
376
376
|
|