activerecord-oracle_enhanced-adapter 1.5.6 → 1.6.9
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|