activerecord-oracle_enhanced-adapter 1.6.9 → 1.7.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +10 -11
- data/History.md +126 -14
- data/README.md +9 -6
- data/RUNNING_TESTS.md +1 -1
- data/Rakefile +1 -16
- data/VERSION +1 -1
- data/activerecord-oracle_enhanced-adapter.gemspec +15 -52
- data/lib/active_record/connection_adapters/oracle_enhanced/column.rb +8 -22
- data/lib/active_record/connection_adapters/oracle_enhanced/column_dumper.rb +53 -45
- data/lib/active_record/connection_adapters/oracle_enhanced/connection.rb +6 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +23 -62
- data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_connection.rb +46 -56
- data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_quoting.rb +35 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/oci_connection.rb +34 -21
- data/lib/active_record/connection_adapters/oracle_enhanced/oci_quoting.rb +36 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/procedures.rb +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/quoting.rb +174 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_creation.rb +17 -8
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_definitions.rb +17 -11
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_dumper.rb +160 -178
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb +42 -94
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements_ext.rb +50 -54
- data/lib/active_record/connection_adapters/oracle_enhanced/structure_dump.rb +15 -11
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +197 -301
- data/lib/active_record/oracle_enhanced/type/integer.rb +3 -2
- data/lib/active_record/oracle_enhanced/type/national_character_string.rb +25 -0
- data/lib/active_record/oracle_enhanced/type/raw.rb +14 -2
- data/lib/active_record/oracle_enhanced/type/string.rb +28 -0
- data/lib/active_record/oracle_enhanced/type/text.rb +32 -0
- data/lib/activerecord-oracle_enhanced-adapter.rb +12 -17
- data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +113 -135
- data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +51 -59
- data/spec/active_record/connection_adapters/oracle_enhanced_context_index_spec.rb +40 -41
- data/spec/active_record/connection_adapters/oracle_enhanced_cpk_spec.rb +6 -6
- data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +281 -233
- data/spec/active_record/connection_adapters/oracle_enhanced_database_tasks_spec.rb +7 -7
- data/spec/active_record/connection_adapters/oracle_enhanced_dbms_output_spec.rb +10 -10
- data/spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb +22 -22
- data/spec/active_record/connection_adapters/oracle_enhanced_emulate_oracle_adapter_spec.rb +2 -2
- data/spec/active_record/connection_adapters/oracle_enhanced_procedures_spec.rb +36 -37
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_dump_spec.rb +86 -46
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_statements_spec.rb +194 -294
- data/spec/active_record/connection_adapters/oracle_enhanced_structure_dump_spec.rb +53 -39
- data/spec/spec_helper.rb +0 -6
- metadata +42 -143
- data/.travis.yml +0 -39
- data/.travis/oracle/download.sh +0 -14
- data/.travis/oracle/install.sh +0 -31
- data/.travis/setup_accounts.sh +0 -9
- data/lib/active_record/connection_adapters/oracle_enhanced/dirty.rb +0 -40
- data/lib/active_record/oracle_enhanced/type/timestamp.rb +0 -11
- data/spec/spec_config.yaml.template +0 -11
- data/spec/support/alter_system_user_password.sql +0 -2
- data/spec/support/create_oracle_enhanced_users.sql +0 -31
@@ -1,7 +1,8 @@
|
|
1
|
-
|
1
|
+
#TODO Need to consider namespace change since paremt class moved to ActiveModel
|
2
|
+
module ActiveRecord
|
2
3
|
module OracleEnhanced
|
3
4
|
module Type
|
4
|
-
class Integer <
|
5
|
+
class Integer < ActiveModel::Type::Integer # :nodoc:
|
5
6
|
private
|
6
7
|
|
7
8
|
def max_value
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'active_model/type/string'
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module OracleEnhanced
|
5
|
+
module Type
|
6
|
+
class NationalCharacterString < ActiveRecord::OracleEnhanced::Type::String # :nodoc:
|
7
|
+
|
8
|
+
def serialize(value)
|
9
|
+
return unless value
|
10
|
+
Data.new(super)
|
11
|
+
end
|
12
|
+
|
13
|
+
class Data # :nodoc:
|
14
|
+
def initialize(value)
|
15
|
+
@value = value
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
@value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -1,12 +1,24 @@
|
|
1
|
-
require '
|
1
|
+
require 'active_model/type/string'
|
2
2
|
|
3
|
+
#TODO Need to consider namespace change since paremt class moved to ActiveModel
|
3
4
|
module ActiveRecord
|
4
5
|
module OracleEnhanced
|
5
6
|
module Type
|
6
|
-
class Raw <
|
7
|
+
class Raw < ActiveModel::Type::String # :nodoc:
|
7
8
|
def type
|
8
9
|
:raw
|
9
10
|
end
|
11
|
+
|
12
|
+
def serialize(value)
|
13
|
+
# Encode a string or byte array as string of hex codes
|
14
|
+
if value.nil?
|
15
|
+
super
|
16
|
+
else
|
17
|
+
value = value.unpack('C*')
|
18
|
+
value.map { |x| "%02X" % x }.join
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
10
22
|
end
|
11
23
|
end
|
12
24
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'active_model/type/string'
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module OracleEnhanced
|
5
|
+
module Type
|
6
|
+
class String < ActiveModel::Type::String # :nodoc:
|
7
|
+
def changed?(old_value, new_value, _new_value_before_type_cast)
|
8
|
+
if old_value.nil?
|
9
|
+
new_value = nil if new_value == ""
|
10
|
+
old_value != new_value
|
11
|
+
else
|
12
|
+
super
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def changed_in_place?(raw_old_value, new_value)
|
17
|
+
if raw_old_value.nil?
|
18
|
+
new_value = nil if new_value == ''
|
19
|
+
raw_old_value != new_value
|
20
|
+
else
|
21
|
+
super
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'active_model/type/string'
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module OracleEnhanced
|
5
|
+
module Type
|
6
|
+
class Text < ActiveModel::Type::Text # :nodoc:
|
7
|
+
|
8
|
+
def changed_in_place?(raw_old_value, new_value)
|
9
|
+
#TODO: Needs to find a way not to cast here.
|
10
|
+
raw_old_value = cast(raw_old_value)
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def serialize(value)
|
15
|
+
return unless value
|
16
|
+
Data.new(super)
|
17
|
+
end
|
18
|
+
|
19
|
+
class Data # :nodoc:
|
20
|
+
def initialize(value)
|
21
|
+
@value = value
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
@value
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,25 +1,20 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
rake_tasks do
|
8
|
-
load 'active_record/connection_adapters/oracle_enhanced/database_tasks.rb'
|
9
|
-
end
|
10
|
-
|
11
|
-
ActiveSupport.on_load(:active_record) do
|
12
|
-
require 'active_record/connection_adapters/oracle_enhanced_adapter'
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
class OracleEnhancedRailtie < ::Rails::Railtie
|
4
|
+
rake_tasks do
|
5
|
+
load 'active_record/connection_adapters/oracle_enhanced/database_tasks.rb'
|
6
|
+
end
|
13
7
|
|
14
|
-
|
15
|
-
|
16
|
-
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.cache_columns = true
|
17
|
-
end
|
8
|
+
ActiveSupport.on_load(:active_record) do
|
9
|
+
require 'active_record/connection_adapters/oracle_enhanced_adapter'
|
18
10
|
|
11
|
+
# Cache column descriptions between requests in test and production environments
|
12
|
+
if Rails.env.test? || Rails.env.production?
|
13
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.cache_columns = true
|
19
14
|
end
|
20
15
|
|
21
16
|
end
|
17
|
+
|
22
18
|
end
|
23
19
|
end
|
24
|
-
|
25
20
|
end
|
@@ -4,33 +4,33 @@ describe "OracleEnhancedAdapter establish connection" do
|
|
4
4
|
|
5
5
|
it "should connect to database" do
|
6
6
|
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
7
|
-
ActiveRecord::Base.connection.
|
8
|
-
ActiveRecord::Base.connection.class.
|
7
|
+
expect(ActiveRecord::Base.connection).not_to be_nil
|
8
|
+
expect(ActiveRecord::Base.connection.class).to eq(ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter)
|
9
9
|
end
|
10
10
|
|
11
11
|
it "should connect to database as SYSDBA" do
|
12
12
|
ActiveRecord::Base.establish_connection(SYS_CONNECTION_PARAMS)
|
13
|
-
ActiveRecord::Base.connection.
|
14
|
-
ActiveRecord::Base.connection.class.
|
13
|
+
expect(ActiveRecord::Base.connection).not_to be_nil
|
14
|
+
expect(ActiveRecord::Base.connection.class).to eq(ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter)
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should be active after connection to database" do
|
18
18
|
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
19
|
-
ActiveRecord::Base.connection.
|
19
|
+
expect(ActiveRecord::Base.connection).to be_active
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should not be active after disconnection to database" do
|
23
23
|
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
24
24
|
ActiveRecord::Base.connection.disconnect!
|
25
|
-
ActiveRecord::Base.connection.
|
25
|
+
expect(ActiveRecord::Base.connection).not_to be_active
|
26
26
|
end
|
27
27
|
|
28
28
|
it "should be active after reconnection to database" do
|
29
29
|
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
30
30
|
ActiveRecord::Base.connection.reconnect!
|
31
|
-
ActiveRecord::Base.connection.
|
31
|
+
expect(ActiveRecord::Base.connection).to be_active
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
end
|
35
35
|
|
36
36
|
describe "OracleEnhancedAdapter" do
|
@@ -40,7 +40,7 @@ describe "OracleEnhancedAdapter" do
|
|
40
40
|
before(:all) do
|
41
41
|
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
describe "ignore specified table columns" do
|
45
45
|
before(:all) do
|
46
46
|
@conn = ActiveRecord::Base.connection
|
@@ -83,7 +83,7 @@ describe "OracleEnhancedAdapter" do
|
|
83
83
|
class ::TestEmployee < ActiveRecord::Base
|
84
84
|
ignore_table_columns :phone_number, :hire_date
|
85
85
|
end
|
86
|
-
TestEmployee.connection.columns('test_employees').select{|c| ['phone_number','hire_date'].include?(c.name) }.
|
86
|
+
expect(TestEmployee.connection.columns('test_employees').select{|c| ['phone_number','hire_date'].include?(c.name) }).to be_empty
|
87
87
|
end
|
88
88
|
|
89
89
|
it "should ignore specified table columns specified in several lines" do
|
@@ -91,14 +91,14 @@ describe "OracleEnhancedAdapter" do
|
|
91
91
|
ignore_table_columns :phone_number
|
92
92
|
ignore_table_columns :hire_date
|
93
93
|
end
|
94
|
-
TestEmployee.connection.columns('test_employees').select{|c| ['phone_number','hire_date'].include?(c.name) }.
|
94
|
+
expect(TestEmployee.connection.columns('test_employees').select{|c| ['phone_number','hire_date'].include?(c.name) }).to be_empty
|
95
95
|
end
|
96
96
|
|
97
97
|
it "should not ignore unspecified table columns" do
|
98
98
|
class ::TestEmployee < ActiveRecord::Base
|
99
99
|
ignore_table_columns :phone_number, :hire_date
|
100
100
|
end
|
101
|
-
TestEmployee.connection.columns('test_employees').select{|c| c.name == 'email' }.
|
101
|
+
expect(TestEmployee.connection.columns('test_employees').select{|c| c.name == 'email' }).not_to be_empty
|
102
102
|
end
|
103
103
|
|
104
104
|
it "should ignore specified table columns in other connection" do
|
@@ -107,7 +107,7 @@ describe "OracleEnhancedAdapter" do
|
|
107
107
|
end
|
108
108
|
# establish other connection
|
109
109
|
other_conn = ActiveRecord::Base.oracle_enhanced_connection(CONNECTION_PARAMS)
|
110
|
-
other_conn.columns('test_employees').select{|c| ['phone_number','hire_date'].include?(c.name) }.
|
110
|
+
expect(other_conn.columns('test_employees').select{|c| ['phone_number','hire_date'].include?(c.name) }).to be_empty
|
111
111
|
end
|
112
112
|
|
113
113
|
end
|
@@ -173,37 +173,37 @@ describe "OracleEnhancedAdapter" do
|
|
173
173
|
it 'should identify virtual columns as such' do
|
174
174
|
skip "Not supported in this database version" unless @oracle11g_or_higher
|
175
175
|
te = TestEmployee.connection.columns('test_employees').detect(&:virtual?)
|
176
|
-
te.name.
|
176
|
+
expect(te.name).to eq('full_name')
|
177
177
|
end
|
178
178
|
|
179
179
|
it "should get columns from database at first time" do
|
180
|
-
TestEmployee.connection.columns('test_employees').map(&:name).
|
181
|
-
@logger.logged(:debug).last.
|
180
|
+
expect(TestEmployee.connection.columns('test_employees').map(&:name)).to eq(@column_names)
|
181
|
+
expect(@logger.logged(:debug).last).to match(/select .* from all_tab_cols/im)
|
182
182
|
end
|
183
183
|
|
184
184
|
it "should get columns from database at second time" do
|
185
185
|
TestEmployee.connection.columns('test_employees')
|
186
186
|
@logger.clear(:debug)
|
187
|
-
TestEmployee.connection.columns('test_employees').map(&:name).
|
188
|
-
@logger.logged(:debug).last.
|
187
|
+
expect(TestEmployee.connection.columns('test_employees').map(&:name)).to eq(@column_names)
|
188
|
+
expect(@logger.logged(:debug).last).to match(/select .* from all_tab_cols/im)
|
189
189
|
end
|
190
190
|
|
191
191
|
it "should get primary key from database at first time" do
|
192
|
-
TestEmployee.connection.pk_and_sequence_for('test_employees').
|
193
|
-
@logger.logged(:debug).last.
|
192
|
+
expect(TestEmployee.connection.pk_and_sequence_for('test_employees')).to eq(['id', nil])
|
193
|
+
expect(@logger.logged(:debug).last).to match(/select .* from all_constraints/im)
|
194
194
|
end
|
195
195
|
|
196
196
|
it "should get primary key from database at first time" do
|
197
|
-
TestEmployee.connection.pk_and_sequence_for('test_employees').
|
197
|
+
expect(TestEmployee.connection.pk_and_sequence_for('test_employees')).to eq(['id', nil])
|
198
198
|
@logger.clear(:debug)
|
199
|
-
TestEmployee.connection.pk_and_sequence_for('test_employees').
|
200
|
-
@logger.logged(:debug).last.
|
199
|
+
expect(TestEmployee.connection.pk_and_sequence_for('test_employees')).to eq(['id', nil])
|
200
|
+
expect(@logger.logged(:debug).last).to match(/select .* from all_constraints/im)
|
201
201
|
end
|
202
202
|
|
203
203
|
it "should have correct sql types when 2 models are using the same table and AR query cache is enabled" do
|
204
204
|
@conn.cache do
|
205
|
-
TestEmployee.columns.map(&:sql_type).
|
206
|
-
TestEmployee2.columns.map(&:sql_type).
|
205
|
+
expect(TestEmployee.columns.map(&:sql_type)).to eq(@column_sql_types)
|
206
|
+
expect(TestEmployee2.columns.map(&:sql_type)).to eq(@column_sql_types)
|
207
207
|
end
|
208
208
|
end
|
209
209
|
|
@@ -216,34 +216,34 @@ describe "OracleEnhancedAdapter" do
|
|
216
216
|
end
|
217
217
|
|
218
218
|
it "should get columns from database at first time" do
|
219
|
-
TestEmployee.connection.columns('test_employees').map(&:name).
|
220
|
-
@logger.logged(:debug).last.
|
219
|
+
expect(TestEmployee.connection.columns('test_employees').map(&:name)).to eq(@column_names)
|
220
|
+
expect(@logger.logged(:debug).last).to match(/select .* from all_tab_cols/im)
|
221
221
|
end
|
222
222
|
|
223
223
|
it "should get columns from cache at second time" do
|
224
224
|
TestEmployee.connection.columns('test_employees')
|
225
225
|
@logger.clear(:debug)
|
226
|
-
TestEmployee.connection.columns('test_employees').map(&:name).
|
227
|
-
@logger.logged(:debug).last.
|
226
|
+
expect(TestEmployee.connection.columns('test_employees').map(&:name)).to eq(@column_names)
|
227
|
+
expect(@logger.logged(:debug).last).to be_blank
|
228
228
|
end
|
229
229
|
|
230
230
|
it "should get primary key from database at first time" do
|
231
|
-
TestEmployee.connection.pk_and_sequence_for('test_employees').
|
232
|
-
@logger.logged(:debug).last.
|
231
|
+
expect(TestEmployee.connection.pk_and_sequence_for('test_employees')).to eq(['id', nil])
|
232
|
+
expect(@logger.logged(:debug).last).to match(/select .* from all_constraints/im)
|
233
233
|
end
|
234
234
|
|
235
235
|
it "should get primary key from cache at first time" do
|
236
|
-
TestEmployee.connection.pk_and_sequence_for('test_employees').
|
236
|
+
expect(TestEmployee.connection.pk_and_sequence_for('test_employees')).to eq(['id', nil])
|
237
237
|
@logger.clear(:debug)
|
238
|
-
TestEmployee.connection.pk_and_sequence_for('test_employees').
|
239
|
-
@logger.logged(:debug).last.
|
238
|
+
expect(TestEmployee.connection.pk_and_sequence_for('test_employees')).to eq(['id', nil])
|
239
|
+
expect(@logger.logged(:debug).last).to be_blank
|
240
240
|
end
|
241
241
|
|
242
242
|
it "should store primary key as nil in cache at first time for table without primary key" do
|
243
|
-
TestEmployee.connection.pk_and_sequence_for('test_employees_without_pk').
|
243
|
+
expect(TestEmployee.connection.pk_and_sequence_for('test_employees_without_pk')).to eq(nil)
|
244
244
|
@logger.clear(:debug)
|
245
|
-
TestEmployee.connection.pk_and_sequence_for('test_employees_without_pk').
|
246
|
-
@logger.logged(:debug).last.
|
245
|
+
expect(TestEmployee.connection.pk_and_sequence_for('test_employees_without_pk')).to eq(nil)
|
246
|
+
expect(@logger.logged(:debug).last).to be_blank
|
247
247
|
end
|
248
248
|
|
249
249
|
end
|
@@ -274,11 +274,11 @@ describe "OracleEnhancedAdapter" do
|
|
274
274
|
end
|
275
275
|
|
276
276
|
it "should tell ActiveRecord that count distinct is supported" do
|
277
|
-
ActiveRecord::Base.connection.supports_count_distinct
|
277
|
+
expect(ActiveRecord::Base.connection.supports_count_distinct?).to be_truthy
|
278
278
|
end
|
279
279
|
|
280
280
|
it "should execute correct SQL COUNT DISTINCT statement" do
|
281
|
-
|
281
|
+
expect { TestEmployee.distinct.count(:employee_id) }.not_to raise_error
|
282
282
|
end
|
283
283
|
|
284
284
|
end
|
@@ -316,7 +316,7 @@ describe "OracleEnhancedAdapter" do
|
|
316
316
|
|
317
317
|
it "should create table" do
|
318
318
|
[:varchar2, :integer, :comment].each do |attr|
|
319
|
-
TestReservedWord.columns_hash[attr.to_s].name.
|
319
|
+
expect(TestReservedWord.columns_hash[attr.to_s].name).to eq(attr.to_s)
|
320
320
|
end
|
321
321
|
end
|
322
322
|
|
@@ -329,72 +329,72 @@ describe "OracleEnhancedAdapter" do
|
|
329
329
|
record = TestReservedWord.create!(attrs)
|
330
330
|
record.reload
|
331
331
|
attrs.each do |k, v|
|
332
|
-
record.send(k).
|
332
|
+
expect(record.send(k)).to eq(v)
|
333
333
|
end
|
334
334
|
end
|
335
335
|
|
336
336
|
it "should remove double quotes in column quoting" do
|
337
|
-
ActiveRecord::Base.connection.quote_column_name('aaa "bbb" ccc').
|
337
|
+
expect(ActiveRecord::Base.connection.quote_column_name('aaa "bbb" ccc')).to eq('"aaa bbb ccc"')
|
338
338
|
end
|
339
339
|
|
340
340
|
end
|
341
341
|
|
342
342
|
describe "valid table names" do
|
343
343
|
before(:all) do
|
344
|
-
@adapter = ActiveRecord::ConnectionAdapters::
|
344
|
+
@adapter = ActiveRecord::ConnectionAdapters::OracleEnhanced::Quoting
|
345
345
|
end
|
346
346
|
|
347
347
|
it "should be valid with letters and digits" do
|
348
|
-
@adapter.valid_table_name?("abc_123").
|
348
|
+
expect(@adapter.valid_table_name?("abc_123")).to be_truthy
|
349
349
|
end
|
350
350
|
|
351
351
|
it "should be valid with schema name" do
|
352
|
-
@adapter.valid_table_name?("abc_123.def_456").
|
352
|
+
expect(@adapter.valid_table_name?("abc_123.def_456")).to be_truthy
|
353
353
|
end
|
354
354
|
|
355
355
|
it "should be valid with $ in name" do
|
356
|
-
@adapter.valid_table_name?("sys.v$session").
|
356
|
+
expect(@adapter.valid_table_name?("sys.v$session")).to be_truthy
|
357
357
|
end
|
358
358
|
|
359
359
|
it "should be valid with upcase schema name" do
|
360
|
-
@adapter.valid_table_name?("ABC_123.DEF_456").
|
360
|
+
expect(@adapter.valid_table_name?("ABC_123.DEF_456")).to be_truthy
|
361
361
|
end
|
362
362
|
|
363
363
|
it "should be valid with irregular schema name and database links" do
|
364
|
-
@adapter.valid_table_name?('abc$#_123.abc$#_123@abc$#@._123').
|
364
|
+
expect(@adapter.valid_table_name?('abc$#_123.abc$#_123@abc$#@._123')).to be_truthy
|
365
365
|
end
|
366
366
|
|
367
367
|
it "should not be valid with two dots in name" do
|
368
|
-
@adapter.valid_table_name?("abc_123.def_456.ghi_789").
|
368
|
+
expect(@adapter.valid_table_name?("abc_123.def_456.ghi_789")).to be_falsey
|
369
369
|
end
|
370
370
|
|
371
371
|
it "should not be valid with invalid characters" do
|
372
|
-
@adapter.valid_table_name?("warehouse-things").
|
372
|
+
expect(@adapter.valid_table_name?("warehouse-things")).to be_falsey
|
373
373
|
end
|
374
374
|
|
375
375
|
it "should not be valid with for camel-case" do
|
376
|
-
@adapter.valid_table_name?("Abc").
|
377
|
-
@adapter.valid_table_name?("aBc").
|
378
|
-
@adapter.valid_table_name?("abC").
|
376
|
+
expect(@adapter.valid_table_name?("Abc")).to be_falsey
|
377
|
+
expect(@adapter.valid_table_name?("aBc")).to be_falsey
|
378
|
+
expect(@adapter.valid_table_name?("abC")).to be_falsey
|
379
379
|
end
|
380
|
-
|
380
|
+
|
381
381
|
it "should not be valid for names > 30 characters" do
|
382
|
-
@adapter.valid_table_name?("a" * 31).
|
382
|
+
expect(@adapter.valid_table_name?("a" * 31)).to be_falsey
|
383
383
|
end
|
384
|
-
|
384
|
+
|
385
385
|
it "should not be valid for schema names > 30 characters" do
|
386
|
-
@adapter.valid_table_name?(("a" * 31) + ".validname").
|
386
|
+
expect(@adapter.valid_table_name?(("a" * 31) + ".validname")).to be_falsey
|
387
387
|
end
|
388
|
-
|
388
|
+
|
389
389
|
it "should not be valid for database links > 128 characters" do
|
390
|
-
@adapter.valid_table_name?("name@" + "a" * 129).
|
390
|
+
expect(@adapter.valid_table_name?("name@" + "a" * 129)).to be_falsey
|
391
391
|
end
|
392
|
-
|
392
|
+
|
393
393
|
it "should not be valid for names that do not begin with alphabetic characters" do
|
394
|
-
@adapter.valid_table_name?("1abc").
|
395
|
-
@adapter.valid_table_name?("_abc").
|
396
|
-
@adapter.valid_table_name?("abc.1xyz").
|
397
|
-
@adapter.valid_table_name?("abc._xyz").
|
394
|
+
expect(@adapter.valid_table_name?("1abc")).to be_falsey
|
395
|
+
expect(@adapter.valid_table_name?("_abc")).to be_falsey
|
396
|
+
expect(@adapter.valid_table_name?("abc.1xyz")).to be_falsey
|
397
|
+
expect(@adapter.valid_table_name?("abc._xyz")).to be_falsey
|
398
398
|
end
|
399
399
|
end
|
400
400
|
|
@@ -444,9 +444,9 @@ describe "OracleEnhancedAdapter" do
|
|
444
444
|
end
|
445
445
|
|
446
446
|
wh = WarehouseThing.create!(:name => "Foo", :foo => 2)
|
447
|
-
wh.id.
|
447
|
+
expect(wh.id).not_to be_nil
|
448
448
|
|
449
|
-
@conn.tables.
|
449
|
+
expect(@conn.tables).to include("warehouse-things")
|
450
450
|
end
|
451
451
|
|
452
452
|
it "should allow creation of a table with CamelCase name" do
|
@@ -456,13 +456,13 @@ describe "OracleEnhancedAdapter" do
|
|
456
456
|
end
|
457
457
|
|
458
458
|
cc = CamelCase.create!(:name => "Foo", :foo => 2)
|
459
|
-
cc.id.
|
460
|
-
|
461
|
-
@conn.tables.
|
459
|
+
expect(cc.id).not_to be_nil
|
460
|
+
|
461
|
+
expect(@conn.tables).to include("CamelCase")
|
462
462
|
end
|
463
463
|
|
464
464
|
it "properly quotes database links" do
|
465
|
-
@conn.quote_table_name('asdf@some.link').
|
465
|
+
expect(@conn.quote_table_name('asdf@some.link')).to eq('"ASDF"@"SOME.LINK"')
|
466
466
|
end
|
467
467
|
end
|
468
468
|
|
@@ -504,13 +504,13 @@ describe "OracleEnhancedAdapter" do
|
|
504
504
|
end
|
505
505
|
|
506
506
|
it "should get column names" do
|
507
|
-
TestPost.column_names.
|
507
|
+
expect(TestPost.column_names).to eq(["id", "title", "body", "created_at", "updated_at"])
|
508
508
|
end
|
509
509
|
|
510
510
|
it "should create record" do
|
511
511
|
p = TestPost.create(:title => "Title", :body => "Body")
|
512
|
-
p.id.
|
513
|
-
TestPost.find(p.id).
|
512
|
+
expect(p.id).not_to be_nil
|
513
|
+
expect(TestPost.find(p.id)).not_to be_nil
|
514
514
|
end
|
515
515
|
|
516
516
|
end
|
@@ -523,11 +523,11 @@ describe "OracleEnhancedAdapter" do
|
|
523
523
|
it "should get current database name" do
|
524
524
|
# get database name if using //host:port/database connection string
|
525
525
|
database_name = CONNECTION_PARAMS[:database].split('/').last
|
526
|
-
@conn.current_database.upcase.
|
526
|
+
expect(@conn.current_database.upcase).to eq(database_name.upcase)
|
527
527
|
end
|
528
528
|
|
529
529
|
it "should get current database session user" do
|
530
|
-
@conn.current_user.upcase.
|
530
|
+
expect(@conn.current_user.upcase).to eq(CONNECTION_PARAMS[:username].upcase)
|
531
531
|
end
|
532
532
|
end
|
533
533
|
|
@@ -554,7 +554,7 @@ describe "OracleEnhancedAdapter" do
|
|
554
554
|
@conn.create_table :foos, :temporary => true, :id => false do |t|
|
555
555
|
t.integer :id
|
556
556
|
end
|
557
|
-
@conn.temporary_table?("foos").
|
557
|
+
expect(@conn.temporary_table?("foos")).to be_truthy
|
558
558
|
end
|
559
559
|
end
|
560
560
|
|
@@ -597,7 +597,7 @@ describe "OracleEnhancedAdapter" do
|
|
597
597
|
|
598
598
|
it "should load included association with more than 1000 records" do
|
599
599
|
posts = TestPost.includes(:test_comments).to_a
|
600
|
-
posts.size.
|
600
|
+
expect(posts.size).to eq(@ids.size)
|
601
601
|
end
|
602
602
|
|
603
603
|
end
|
@@ -629,30 +629,30 @@ describe "OracleEnhancedAdapter" do
|
|
629
629
|
|
630
630
|
it "should clear older cursors when statement limit is reached" do
|
631
631
|
pk = TestPost.columns_hash[TestPost.primary_key]
|
632
|
-
sub =
|
633
|
-
binds = [
|
632
|
+
sub = Arel::Nodes::BindParam.new.to_sql
|
633
|
+
binds = [ActiveRecord::Relation::QueryAttribute.new(pk, 1, ActiveRecord::Type::Integer.new)]
|
634
634
|
|
635
|
-
|
635
|
+
expect {
|
636
636
|
4.times do |i|
|
637
637
|
@conn.exec_query("SELECT * FROM test_posts WHERE #{i}=#{i} AND id = #{sub}", "SQL", binds)
|
638
638
|
end
|
639
|
-
}.
|
639
|
+
}.to change(@statements, :length).by(+3)
|
640
640
|
end
|
641
641
|
|
642
642
|
it "should cache UPDATE statements with bind variables" do
|
643
|
-
|
643
|
+
expect {
|
644
644
|
pk = TestPost.columns_hash[TestPost.primary_key]
|
645
|
-
sub =
|
646
|
-
binds = [
|
645
|
+
sub = Arel::Nodes::BindParam.new.to_sql
|
646
|
+
binds = [ActiveRecord::Relation::QueryAttribute.new(pk, 1, ActiveRecord::Type::Integer.new)]
|
647
647
|
@conn.exec_update("UPDATE test_posts SET id = #{sub}", "SQL", binds)
|
648
|
-
}.
|
648
|
+
}.to change(@statements, :length).by(+1)
|
649
649
|
end
|
650
650
|
|
651
651
|
it "should not cache UPDATE statements without bind variables" do
|
652
|
-
|
652
|
+
expect {
|
653
653
|
binds = []
|
654
654
|
@conn.exec_update("UPDATE test_posts SET id = 1", "SQL", binds)
|
655
|
-
}.
|
655
|
+
}.not_to change(@statements, :length)
|
656
656
|
end
|
657
657
|
end
|
658
658
|
|
@@ -677,16 +677,17 @@ describe "OracleEnhancedAdapter" do
|
|
677
677
|
|
678
678
|
it "should explain query" do
|
679
679
|
explain = TestPost.where(:id => 1).explain
|
680
|
-
explain.
|
681
|
-
explain.
|
680
|
+
expect(explain).to include("Cost")
|
681
|
+
expect(explain).to include("INDEX UNIQUE SCAN")
|
682
682
|
end
|
683
683
|
|
684
684
|
it "should explain query with binds" do
|
685
685
|
pk = TestPost.columns_hash[TestPost.primary_key]
|
686
|
-
sub =
|
687
|
-
|
688
|
-
explain.
|
689
|
-
explain.
|
686
|
+
sub = Arel::Nodes::BindParam.new.to_sql
|
687
|
+
binds = [ActiveRecord::Relation::QueryAttribute.new(pk, 1, ActiveRecord::Type::Integer.new)]
|
688
|
+
explain = @conn.explain(TestPost.where(TestPost.arel_table[pk.name].eq(sub)), binds)
|
689
|
+
expect(explain).to include("Cost")
|
690
|
+
expect(explain).to include("INDEX UNIQUE SCAN")
|
690
691
|
end
|
691
692
|
end
|
692
693
|
|
@@ -731,65 +732,42 @@ describe "OracleEnhancedAdapter" do
|
|
731
732
|
end
|
732
733
|
|
733
734
|
it "should return n records with limit(n)" do
|
734
|
-
@employee.limit(3).to_a.size.
|
735
|
+
expect(@employee.limit(3).to_a.size).to be(3)
|
735
736
|
end
|
736
737
|
|
737
738
|
it "should return less than n records with limit(n) if there exist less than n records" do
|
738
|
-
@employee.limit(10).to_a.size.
|
739
|
+
expect(@employee.limit(10).to_a.size).to be(5)
|
739
740
|
end
|
740
741
|
|
741
742
|
it "should return the records starting from offset n with offset(n)" do
|
742
|
-
expect(@employee.order(:sort_order).first.first_name
|
743
|
-
expect(@employee.order(:sort_order).offset(0).first.first_name
|
744
|
-
expect(@employee.order(:sort_order).offset(1).first.first_name
|
745
|
-
expect(@employee.order(:sort_order).offset(4).first.first_name
|
743
|
+
expect(@employee.order(:sort_order).first.first_name).to eq("Peter")
|
744
|
+
expect(@employee.order(:sort_order).offset(0).first.first_name).to eq("Peter")
|
745
|
+
expect(@employee.order(:sort_order).offset(1).first.first_name).to eq("Tony")
|
746
|
+
expect(@employee.order(:sort_order).offset(4).first.first_name).to eq("Natasha")
|
746
747
|
end
|
747
748
|
end
|
748
749
|
|
749
|
-
describe
|
750
|
-
|
750
|
+
describe "valid_type?" do
|
751
751
|
before(:all) do
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
serialize :serialized, Array
|
759
|
-
end
|
752
|
+
@conn = ActiveRecord::Base.connection
|
753
|
+
@conn.execute <<-SQL
|
754
|
+
CREATE TABLE test_employees (
|
755
|
+
first_name VARCHAR2(20)
|
756
|
+
)
|
757
|
+
SQL
|
760
758
|
end
|
761
759
|
|
762
760
|
after(:all) do
|
763
|
-
|
764
|
-
drop_table :test_serialized_columns
|
765
|
-
end
|
766
|
-
Object.send(:remove_const, 'TestSerializedColumn')
|
767
|
-
ActiveRecord::Base.table_name_prefix = nil
|
768
|
-
ActiveRecord::Base.clear_cache! if ActiveRecord::Base.respond_to?(:"clear_cache!")
|
769
|
-
end
|
770
|
-
|
771
|
-
before(:each) do
|
772
|
-
set_logger
|
761
|
+
@conn.execute "DROP TABLE test_employees"
|
773
762
|
end
|
774
763
|
|
775
|
-
|
776
|
-
|
764
|
+
it "returns true when passed a valid type" do
|
765
|
+
column = @conn.columns('test_employees').find { |col| col.name == 'first_name' }
|
766
|
+
expect(@conn.valid_type?(column.type)).to be true
|
777
767
|
end
|
778
768
|
|
779
|
-
it
|
780
|
-
|
781
|
-
serialized_column = TestSerializedColumn.new
|
782
|
-
|
783
|
-
expect(serialized_column.serialized.should).to eq([])
|
784
|
-
serialized_column.serialized << new_value
|
785
|
-
expect(serialized_column.serialized.should).to eq([new_value])
|
786
|
-
serialized_column.save
|
787
|
-
expect(serialized_column.save!.should).to eq(true)
|
788
|
-
|
789
|
-
serialized_column.reload
|
790
|
-
expect(serialized_column.serialized.should).to eq([new_value])
|
791
|
-
serialized_column.serialized = []
|
792
|
-
expect(serialized_column.save!.should).to eq(true)
|
769
|
+
it "returns false when passed an invalid type" do
|
770
|
+
expect(@conn.valid_type?(:foobar)).to be false
|
793
771
|
end
|
794
772
|
end
|
795
773
|
end
|