activerecord-oracle_enhanced-adapter 5.2.0 → 5.2.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f5c56a2903f50e1f4d29ebce73f1d3ecfb8ccc20fdff51530358068c99e74182
4
- data.tar.gz: 1230afe509076a53d1f797ccbdba4d74b29647fdc263f60849d1ae34145e6116
3
+ metadata.gz: aa24e2267bec0862bb898b8f03c11af04a34543d38f75e8b39a5b46000009437
4
+ data.tar.gz: '0485525d25c1f4307c1e9b958cd2f1b286bc5d10542e2fd8615e499a00c989c2'
5
5
  SHA512:
6
- metadata.gz: ba4c22c74b3da5cd8768681df7c57aa0b07d1037d13efeecd3588a3487543f79b2d0eea2e7c0fe7fd947aa66d0f339c39ff263bf680831b603c74052fa38e990
7
- data.tar.gz: cc928edfef4189c8ce3ed0e1d1643b2b13369ef052467b21fa7223c03d4a31925b45572e3d60e2ec3b108d12365d601f3e17884eda599586cd869789841c4895
6
+ metadata.gz: e70d58d735fec37fd8e19122f37b284397f152c911e3baf8127d8828cefd7b9f139d1acf2f3e147def7c82be26decd7e4f4eb10e85e63489ef6933ab089f83b7
7
+ data.tar.gz: 5651ab5ab00219a433b7281959d51068ea47dcd33648761cd4dc4f22c69f285dd79a8c73e262fdabe81042e9751dcb02021392c472649f7662b593daf1187d60
data/History.md CHANGED
@@ -1,3 +1,63 @@
1
+ ## 5.2.8 / 2019-12-25
2
+
3
+ * Changes and bug fixes
4
+ * Uninstall SimpleCov [#1968 #1970]
5
+
6
+ ## 5.2.7 / 2019-12-20
7
+
8
+ * Changes and bug fixes
9
+ * Address undefined local variable or method sql' [#1932 #1962 #1964]
10
+ * CI against Ruby 2.6.4 and Ruby 2.5.6 [#1922]
11
+ * Lock simplecov version for Ruby 2.2 and 2.3 [#1902]
12
+
13
+ ## 5.2.6 / 2019-05-17
14
+
15
+ * Changes and bug fixes
16
+ * Add TCP keepalive and TCP keepalive time configurations [#1874 #1878]
17
+ * CI against Ruby 2.6.2 and 2.5.5 #1849
18
+ * CI against Ruby 2.4.6 #1858
19
+
20
+ ## 5.2.5 / 2019-03-05
21
+
22
+ * Changes and bug fixes
23
+ * `references` column type should be :integer, not :bigint [#1831 #1832 #1835]
24
+ * CI against Ruby 2.6.1 [#1821 #1822]
25
+ * CI against JRuby 9.2.6.0 [#1824 #1828]
26
+ * CI against Ruby 2.6 and bump other Ruby versions [#1806 #1807]
27
+ * Install bundler and fallback to 1.7.3 if Bundler 2 is not available [#1811]
28
+ * Use i18n 1.2 for JRuby now [#1804 #1805]
29
+ * Add `allow_railures` for jruby-head until #1833 resolved [#1834 #1836]
30
+
31
+ ## 5.2.4 / 2018-11-29
32
+
33
+ * Changes and bug fixes
34
+ * Stop using NativeException [#1666 #1761 #1762]
35
+
36
+ ## 5.2.3 / 2018-08-08
37
+
38
+ * Changes and bug fixes
39
+ * Introduce column cache per connection [#1744 #1750]
40
+ * Use `cursor_sharing` = force by default again [#1745 #1748]
41
+ * Add `table_name` search condition to `indexes(table_name)` method [#1747 #1749]
42
+ * Suppress warning `BigDecimal.new` is deprecated [#1742 #1743]
43
+ * Do not install bundler explicitly [#1725 #1726]
44
+ * Add `allow_railures` for jruby-head until #1737 resolved [#1739 #1740]
45
+ * CI against JRuby 9.2.0.0 [#1728 #1741]
46
+ * Do not run CI against older version of JRuby [#1741]
47
+
48
+ ## 5.2.2 / 2018-04-28
49
+
50
+ * Changes and bug fixes
51
+ * Use SQL literals for `column_definitions` and `pk_and_sequence_for` [#1678 #1713 #1714]
52
+ * Memoize if the table needs to prefetch primary key[#1673 #1699 #1700]
53
+ * CI with JRuby 9.1.17.0 [#1710]
54
+ * Remove `rails/arel` from Gemfile [#1711 #1712]
55
+
56
+ ## 5.2.1 / 2018-04-15
57
+
58
+ * Changes and bug fixes
59
+ * Memoize if the table needs to prefetch primary key[#1673 #1699 #1700]
60
+
1
61
  ## 5.2.0 / 2018-04-10
2
62
 
3
63
  * Major changes and fixes
data/VERSION CHANGED
@@ -1 +1 @@
1
- 5.2.0
1
+ 5.2.8
@@ -263,7 +263,7 @@ module ActiveRecord
263
263
  value = klass.attribute_types[col.name].serialize(value)
264
264
  end
265
265
  uncached do
266
- unless lob_record = select_one(<<-SQL.strip.gsub(/\s+/, " "), "Writable Large Object")
266
+ unless lob_record = select_one(sql = <<-SQL.strip.gsub(/\s+/, " "), "Writable Large Object")
267
267
  SELECT #{quote_column_name(col.name)} FROM #{quote_table_name(table_name)}
268
268
  WHERE #{quote_column_name(klass.primary_key)} = #{id} FOR UPDATE
269
269
  SQL
@@ -150,7 +150,7 @@ module ActiveRecord
150
150
  # @raw_connection.setDefaultRowPrefetch(prefetch_rows) if prefetch_rows
151
151
  end
152
152
 
153
- cursor_sharing = config[:cursor_sharing]
153
+ cursor_sharing = config[:cursor_sharing] || "force"
154
154
  exec "alter session set cursor_sharing = #{cursor_sharing}" if cursor_sharing
155
155
 
156
156
  # Initialize NLS parameters
@@ -209,13 +209,9 @@ module ActiveRecord
209
209
  def ping
210
210
  exec_no_retry("select 1 from dual")
211
211
  @active = true
212
- rescue NativeException => e
212
+ rescue Java::JavaSql::SQLException => e
213
213
  @active = false
214
- if e.message =~ /^java\.sql\.SQL(Recoverable)?Exception/
215
- raise OracleEnhanced::ConnectionException, e.message
216
- else
217
- raise
218
- end
214
+ raise OracleEnhanced::ConnectionException, e.message
219
215
  end
220
216
 
221
217
  # Resets connection, by logging off and creating a new connection.
@@ -224,13 +220,9 @@ module ActiveRecord
224
220
  begin
225
221
  new_connection(@config)
226
222
  @active = true
227
- rescue NativeException => e
223
+ rescue Java::JavaSql::SQLException => e
228
224
  @active = false
229
- if e.message =~ /^java\.sql\.SQL(Recoverable)?Exception/
230
- raise OracleEnhanced::ConnectionException, e.message
231
- else
232
- raise
233
- end
225
+ raise OracleEnhanced::ConnectionException, e.message
234
226
  end
235
227
  end
236
228
 
@@ -239,8 +231,8 @@ module ActiveRecord
239
231
  should_retry = auto_retry? && autocommit?
240
232
  begin
241
233
  yield if block_given?
242
- rescue NativeException => e
243
- raise unless e.message =~ /^java\.sql\.SQL(Recoverable)?Exception: (Closed Connection|Io exception:|No more data to read from socket|IO Error:)/
234
+ rescue Java::JavaSql::SQLException => e
235
+ raise unless e.message =~ /^(Closed Connection|Io exception:|No more data to read from socket|IO Error:)/
244
236
  @active = false
245
237
  raise unless should_retry
246
238
  should_retry = false
@@ -455,11 +447,9 @@ module ActiveRecord
455
447
  super
456
448
  end
457
449
 
458
- # Return NativeException / java.sql.SQLException error code
450
+ # Return java.sql.SQLException error code
459
451
  def error_code(exception)
460
452
  case exception
461
- when NativeException
462
- exception.cause.getErrorCode
463
453
  when Java::JavaSql::SQLException
464
454
  exception.getErrorCode
465
455
  else
@@ -476,7 +466,7 @@ module ActiveRecord
476
466
  elsif d.isInt
477
467
  Integer(d.stringValue)
478
468
  else
479
- BigDecimal.new(d.stringValue)
469
+ BigDecimal(d.stringValue)
480
470
  end
481
471
  when :BINARY_FLOAT
482
472
  rset.getFloat(i)
@@ -124,7 +124,7 @@ module ActiveRecord
124
124
  when Type::OracleEnhanced::Raw
125
125
  @raw_cursor.bind_param(position, OracleEnhanced::Quoting.encode_raw(value))
126
126
  when ActiveModel::Type::Decimal
127
- @raw_cursor.bind_param(position, BigDecimal.new(value.to_s))
127
+ @raw_cursor.bind_param(position, BigDecimal(value.to_s))
128
128
  when NilClass
129
129
  @raw_cursor.bind_param(position, nil, String)
130
130
  else
@@ -285,6 +285,8 @@ module ActiveRecord
285
285
  # The OracleEnhancedOCIFactory factors out the code necessary to connect and
286
286
  # configure an Oracle/OCI connection.
287
287
  class OracleEnhancedOCIFactory #:nodoc:
288
+ DEFAULT_TCP_KEEPALIVE_TIME = 600
289
+
288
290
  def self.new_connection(config)
289
291
  # to_s needed if username, password or database is specified as number in database.yml file
290
292
  username = config[:username] && config[:username].to_s
@@ -295,7 +297,7 @@ module ActiveRecord
295
297
  privilege = config[:privilege] && config[:privilege].to_sym
296
298
  async = config[:allow_concurrency]
297
299
  prefetch_rows = config[:prefetch_rows] || 100
298
- cursor_sharing = config[:cursor_sharing]
300
+ cursor_sharing = config[:cursor_sharing] || "force"
299
301
  # get session time_zone from configuration or from TZ environment variable
300
302
  time_zone = config[:time_zone] || ENV["TZ"]
301
303
 
@@ -314,11 +316,13 @@ module ActiveRecord
314
316
  else
315
317
  database
316
318
  end
317
- OCI8.properties[:tcp_keepalive] = true
319
+
320
+ OCI8.properties[:tcp_keepalive] = config[:tcp_keepalive] == false ? false : true
318
321
  begin
319
- OCI8.properties[:tcp_keepalive_time] = 600
322
+ OCI8.properties[:tcp_keepalive_time] = config[:tcp_keepalive_time] || DEFAULT_TCP_KEEPALIVE_TIME
320
323
  rescue NotImplementedError
321
324
  end
325
+
322
326
  conn = OCI8.new username, password, connection_string, privilege
323
327
  conn.autocommit = true
324
328
  conn.non_blocking = true if async
@@ -66,6 +66,11 @@ module ActiveRecord
66
66
  end
67
67
  super
68
68
  end
69
+
70
+ def references(*args, **options)
71
+ super(*args, type: :integer, **options)
72
+ end
73
+ alias :belongs_to :references
69
74
  end
70
75
 
71
76
  class AlterTable < ActiveRecord::ConnectionAdapters::AlterTable
@@ -83,7 +83,7 @@ module ActiveRecord
83
83
  (owner, table_name, db_link) = @connection.describe(table_name)
84
84
  default_tablespace_name = default_tablespace
85
85
 
86
- result = select_all(<<-SQL.strip.gsub(/\s+/, " "), "indexes", [bind_string("owner", owner), bind_string("owner", owner)])
86
+ result = select_all(<<-SQL.strip.gsub(/\s+/, " "), "indexes", [bind_string("owner", owner), bind_string("owner", owner), bind_string("table_name", table_name)])
87
87
  SELECT LOWER(i.table_name) AS table_name, LOWER(i.index_name) AS index_name, i.uniqueness,
88
88
  i.index_type, i.ityp_owner, i.ityp_name, i.parameters,
89
89
  LOWER(i.tablespace_name) AS tablespace_name,
@@ -97,6 +97,7 @@ module ActiveRecord
97
97
  c.column_name = atc.column_name AND i.owner = atc.owner AND atc.hidden_column = 'NO'
98
98
  WHERE i.owner = :owner
99
99
  AND i.table_owner = :owner
100
+ AND i.table_name = :table_name
100
101
  AND NOT EXISTS (SELECT uc.index_name FROM all_constraints uc
101
102
  WHERE uc.index_name = i.index_name AND uc.owner = i.owner AND uc.constraint_type = 'P')
102
103
  ORDER BY i.index_name, c.column_position
@@ -152,6 +153,14 @@ module ActiveRecord
152
153
  all_schema_indexes.select { |i| i.table == table_name }
153
154
  end
154
155
 
156
+ def columns(table_name)
157
+ table_name = table_name.to_s
158
+ if @columns_cache[table_name]
159
+ @columns_cache[table_name]
160
+ else
161
+ @columns_cache[table_name] = super(table_name)
162
+ end
163
+ end
155
164
  # Additional options for +create_table+ method in migration files.
156
165
  #
157
166
  # You can specify individual starting value in table creation migration file, e.g.:
@@ -248,6 +257,8 @@ module ActiveRecord
248
257
  execute "DROP SEQUENCE #{quote_table_name(seq_name)}" rescue nil
249
258
  rescue ActiveRecord::StatementInvalid => e
250
259
  raise e unless options[:if_exists]
260
+ ensure
261
+ clear_table_columns_cache(table_name)
251
262
  end
252
263
 
253
264
  def insert_versions_sql(versions) # :nodoc:
@@ -398,6 +409,8 @@ module ActiveRecord
398
409
  execute add_column_sql
399
410
  create_sequence_and_trigger(table_name, options) if type && type.to_sym == :primary_key
400
411
  change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
412
+ ensure
413
+ clear_table_columns_cache(table_name)
401
414
  end
402
415
 
403
416
  def aliased_types(name, fallback)
@@ -407,6 +420,8 @@ module ActiveRecord
407
420
  def change_column_default(table_name, column_name, default_or_changes) #:nodoc:
408
421
  default = extract_new_default_value(default_or_changes)
409
422
  execute "ALTER TABLE #{quote_table_name(table_name)} MODIFY #{quote_column_name(column_name)} DEFAULT #{quote(default)}"
423
+ ensure
424
+ clear_table_columns_cache(table_name)
410
425
  end
411
426
 
412
427
  def change_column_null(table_name, column_name, null, default = nil) #:nodoc:
@@ -439,15 +454,21 @@ module ActiveRecord
439
454
  execute(change_column_sql)
440
455
 
441
456
  change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
457
+ ensure
458
+ clear_table_columns_cache(table_name)
442
459
  end
443
460
 
444
461
  def rename_column(table_name, column_name, new_column_name) #:nodoc:
445
462
  execute "ALTER TABLE #{quote_table_name(table_name)} RENAME COLUMN #{quote_column_name(column_name)} to #{quote_column_name(new_column_name)}"
446
463
  rename_column_indexes(table_name, column_name, new_column_name)
464
+ ensure
465
+ clear_table_columns_cache(table_name)
447
466
  end
448
467
 
449
468
  def remove_column(table_name, column_name, type = nil, options = {}) #:nodoc:
450
469
  execute "ALTER TABLE #{quote_table_name(table_name)} DROP COLUMN #{quote_column_name(column_name)} CASCADE CONSTRAINTS"
470
+ ensure
471
+ clear_table_columns_cache(table_name)
451
472
  end
452
473
 
453
474
  def change_table_comment(table_name, comment)
@@ -115,6 +115,8 @@ module ActiveRecord
115
115
  # * <tt>:time_zone</tt> - database session time zone
116
116
  # (it is recommended to set it using ENV['TZ'] which will be then also used for database session time zone)
117
117
  # * <tt>:schema</tt> - database schema which holds schema objects.
118
+ # * <tt>:tcp_keepalive</tt> - TCP keepalive is enabled for OCI client, defaults to true
119
+ # * <tt>:tcp_keepalive_time</tt> - TCP keepalive time for OCI client, defaults to 600
118
120
  #
119
121
  # Optionals NLS parameters:
120
122
  #
@@ -212,6 +214,8 @@ module ActiveRecord
212
214
  super(connection, logger, config)
213
215
  @statements = StatementPool.new(self.class.type_cast_config_to_integer(config[:statement_limit]))
214
216
  @enable_dbms_output = false
217
+ @do_not_prefetch_primary_key = {}
218
+ @columns_cache = {}
215
219
  end
216
220
 
217
221
  ADAPTER_NAME = "OracleEnhanced".freeze
@@ -427,8 +431,11 @@ module ActiveRecord
427
431
  def prefetch_primary_key?(table_name = nil)
428
432
  return true if table_name.nil?
429
433
  table_name = table_name.to_s
430
- owner, desc_table_name, db_link = @connection.describe(table_name)
431
- do_not_prefetch = !has_primary_key?(table_name, owner, desc_table_name, db_link) || has_primary_key_trigger?(table_name, owner, desc_table_name, db_link)
434
+ do_not_prefetch = @do_not_prefetch_primary_key[table_name]
435
+ if do_not_prefetch.nil?
436
+ owner, desc_table_name, db_link = @connection.describe(table_name)
437
+ @do_not_prefetch_primary_key [table_name] = do_not_prefetch = !has_primary_key?(table_name, owner, desc_table_name, db_link) || has_primary_key_trigger?(table_name, owner, desc_table_name, db_link)
438
+ end
432
439
  !do_not_prefetch
433
440
  end
434
441
 
@@ -514,7 +521,7 @@ module ActiveRecord
514
521
  def column_definitions(table_name)
515
522
  (owner, desc_table_name, db_link) = @connection.describe(table_name)
516
523
 
517
- select_all(<<-SQL.strip.gsub(/\s+/, " "), "Column definitions", [bind_string("owner", owner), bind_string("table_name", desc_table_name)])
524
+ select_all(<<-SQL.strip.gsub(/\s+/, " "), "Column definitions")
518
525
  SELECT cols.column_name AS name, cols.data_type AS sql_type,
519
526
  cols.data_default, cols.nullable, cols.virtual_column, cols.hidden_column,
520
527
  cols.data_type_owner AS sql_type_owner,
@@ -527,8 +534,8 @@ module ActiveRecord
527
534
  DECODE(data_type, 'NUMBER', data_scale, NULL) AS scale,
528
535
  comments.comments as column_comment
529
536
  FROM all_tab_cols#{db_link} cols, all_col_comments#{db_link} comments
530
- WHERE cols.owner = :owner
531
- AND cols.table_name = :table_name
537
+ WHERE cols.owner = '#{owner}'
538
+ AND cols.table_name = #{quote(desc_table_name)}
532
539
  AND cols.hidden_column = 'NO'
533
540
  AND cols.owner = comments.owner
534
541
  AND cols.table_name = comments.table_name
@@ -537,24 +544,28 @@ module ActiveRecord
537
544
  SQL
538
545
  end
539
546
 
547
+ def clear_table_columns_cache(table_name)
548
+ @columns_cache[table_name.to_s] = nil
549
+ end
550
+
540
551
  # Find a table's primary key and sequence.
541
552
  # *Note*: Only primary key is implemented - sequence will be nil.
542
553
  def pk_and_sequence_for(table_name, owner = nil, desc_table_name = nil, db_link = nil) #:nodoc:
543
554
  (owner, desc_table_name, db_link) = @connection.describe(table_name) unless owner
544
555
 
545
- seqs = select_values(<<-SQL.strip.gsub(/\s+/, " "), "Sequence", [bind_string("owner", owner), bind_string("sequence_name", default_sequence_name(desc_table_name).upcase)])
556
+ seqs = select_values(<<-SQL.strip.gsub(/\s+/, " "), "Sequence")
546
557
  select us.sequence_name
547
558
  from all_sequences#{db_link} us
548
- where us.sequence_owner = :owner
549
- and us.sequence_name = :sequence_name
559
+ where us.sequence_owner = '#{owner}'
560
+ and us.sequence_name = upper(#{quote(default_sequence_name(desc_table_name))})
550
561
  SQL
551
562
 
552
563
  # changed back from user_constraints to all_constraints for consistency
553
- pks = select_values(<<-SQL.strip.gsub(/\s+/, " "), "Primary Key", [bind_string("owner", owner), bind_string("table_name", desc_table_name)])
564
+ pks = select_values(<<-SQL.strip.gsub(/\s+/, " "), "Primary Key")
554
565
  SELECT cc.column_name
555
566
  FROM all_constraints#{db_link} c, all_cons_columns#{db_link} cc
556
- WHERE c.owner = :owner
557
- AND c.table_name = :table_name
567
+ WHERE c.owner = '#{owner}'
568
+ AND c.table_name = #{quote(desc_table_name)}
558
569
  AND c.constraint_type = 'P'
559
570
  AND cc.owner = c.owner
560
571
  AND cc.constraint_name = c.constraint_name
@@ -31,15 +31,15 @@ describe "OracleEnhancedAdapter establish connection" do
31
31
  expect(ActiveRecord::Base.connection).to be_active
32
32
  end
33
33
 
34
- it "should use database default cursor_sharing parameter value exact by default" do
34
+ it "should use database default cursor_sharing parameter value force by default" do
35
35
  # Use `SYSTEM_CONNECTION_PARAMS` to query v$parameter
36
36
  ActiveRecord::Base.establish_connection(SYSTEM_CONNECTION_PARAMS)
37
- expect(ActiveRecord::Base.connection.select_value("select value from v$parameter where name = 'cursor_sharing'")).to eq("EXACT")
37
+ expect(ActiveRecord::Base.connection.select_value("select value from v$parameter where name = 'cursor_sharing'")).to eq("FORCE")
38
38
  end
39
39
 
40
- it "should use modified cursor_sharing value force" do
41
- ActiveRecord::Base.establish_connection(SYSTEM_CONNECTION_PARAMS.merge(cursor_sharing: :force))
42
- expect(ActiveRecord::Base.connection.select_value("select value from v$parameter where name = 'cursor_sharing'")).to eq("FORCE")
40
+ it "should use modified cursor_sharing value exact" do
41
+ ActiveRecord::Base.establish_connection(SYSTEM_CONNECTION_PARAMS.merge(cursor_sharing: :exact))
42
+ expect(ActiveRecord::Base.connection.select_value("select value from v$parameter where name = 'cursor_sharing'")).to eq("EXACT")
43
43
  end
44
44
  end
45
45
 
@@ -122,6 +122,34 @@ describe "OracleEnhancedConnection" do
122
122
  end
123
123
  end
124
124
 
125
+ if defined?(OCI8)
126
+ describe "with TCP keepalive parameters" do
127
+ it "should use database default `tcp_keepalive` value true by default" do
128
+ ActiveRecord::ConnectionAdapters::OracleEnhanced::Connection.create(CONNECTION_PARAMS)
129
+
130
+ expect(OCI8.properties[:tcp_keepalive]).to be true
131
+ end
132
+
133
+ it "should use modified `tcp_keepalive` value false" do
134
+ ActiveRecord::ConnectionAdapters::OracleEnhanced::Connection.create(CONNECTION_PARAMS.dup.merge(tcp_keepalive: false))
135
+
136
+ expect(OCI8.properties[:tcp_keepalive]).to be false
137
+ end
138
+
139
+ it "should use database default `tcp_keepalive_time` value 600 by default" do
140
+ ActiveRecord::ConnectionAdapters::OracleEnhanced::Connection.create(CONNECTION_PARAMS)
141
+
142
+ expect(OCI8.properties[:tcp_keepalive_time]).to eq(600)
143
+ end
144
+
145
+ it "should use modified `tcp_keepalive_time` value 3000" do
146
+ ActiveRecord::ConnectionAdapters::OracleEnhanced::Connection.create(CONNECTION_PARAMS.dup.merge(tcp_keepalive_time: 3000))
147
+
148
+ expect(OCI8.properties[:tcp_keepalive_time]).to eq(3000)
149
+ end
150
+ end
151
+ end
152
+
125
153
  describe "with non-string parameters" do
126
154
  before(:all) do
127
155
  params = CONNECTION_PARAMS.dup
@@ -381,7 +409,7 @@ describe "OracleEnhancedConnection" do
381
409
  ActiveRecord::Base.connection.auto_retry = false
382
410
  kill_current_session
383
411
  if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
384
- expect { @conn.exec("SELECT * FROM dual") }.to raise_error(NativeException)
412
+ expect { @conn.exec("SELECT * FROM dual") }.to raise_error(Java::JavaSql::SQLRecoverableException)
385
413
  else
386
414
  expect { @conn.exec("SELECT * FROM dual") }.to raise_error(OCIError)
387
415
  end
@@ -399,7 +427,7 @@ describe "OracleEnhancedConnection" do
399
427
  ActiveRecord::Base.connection.auto_retry = false
400
428
  kill_current_session
401
429
  if defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
402
- expect { @conn.select("SELECT * FROM dual") }.to raise_error(NativeException)
430
+ expect { @conn.select("SELECT * FROM dual") }.to raise_error(Java::JavaSql::SQLRecoverableException)
403
431
  else
404
432
  expect { @conn.select("SELECT * FROM dual") }.to raise_error(OCIError)
405
433
  end
@@ -67,15 +67,16 @@ describe "OracleEnhancedAdapter" do
67
67
  end
68
68
 
69
69
  it "should get columns from database at first time" do
70
+ @conn.clear_table_columns_cache(:test_employees)
70
71
  expect(TestEmployee.connection.columns("test_employees").map(&:name)).to eq(@column_names)
71
72
  expect(@logger.logged(:debug).last).to match(/select .* from all_tab_cols/im)
72
73
  end
73
74
 
74
- it "should get columns from database at second time" do
75
+ it "should not get columns from database at second time" do
75
76
  TestEmployee.connection.columns("test_employees")
76
77
  @logger.clear(:debug)
77
78
  expect(TestEmployee.connection.columns("test_employees").map(&:name)).to eq(@column_names)
78
- expect(@logger.logged(:debug).last).to match(/select .* from all_tab_cols/im)
79
+ expect(@logger.logged(:debug).last).not_to match(/select .* from all_tab_cols/im)
79
80
  end
80
81
 
81
82
  it "should get primary key from database at first time" do
@@ -96,6 +97,14 @@ describe "OracleEnhancedAdapter" do
96
97
  expect(TestEmployee2.columns.map(&:sql_type)).to eq(@column_sql_types)
97
98
  end
98
99
  end
100
+
101
+ it "should get sequence value at next time" do
102
+ TestEmployee.create!
103
+ expect(@logger.logged(:debug).first).not_to match(/SELECT \"TEST_EMPLOYEES_SEQ\".NEXTVAL FROM dual/im)
104
+ @logger.clear(:debug)
105
+ TestEmployee.create!
106
+ expect(@logger.logged(:debug).first).to match(/SELECT \"TEST_EMPLOYEES_SEQ\".NEXTVAL FROM dual/im)
107
+ end
99
108
  end
100
109
  end
101
110
 
@@ -129,6 +138,7 @@ describe "OracleEnhancedAdapter" do
129
138
  @conn.execute "DROP DATABASE LINK #{@db_link}" rescue nil
130
139
  @sys_conn.drop_table :test_posts, if_exists: true
131
140
  Object.send(:remove_const, "TestPost") rescue nil
141
+ @conn.clear_table_columns_cache(:test_posts)
132
142
  ActiveRecord::Base.clear_cache!
133
143
  end
134
144
 
@@ -524,7 +534,7 @@ describe "OracleEnhancedAdapter" do
524
534
  it "should return array from indexes with bind usage" do
525
535
  expect(@conn.indexes("TEST_POSTS").class).to eq Array
526
536
  expect(@logger.logged(:debug).last).to match(/:owner/)
527
- expect(@logger.logged(:debug).last).to match(/\[\["owner", "#{DATABASE_USER.upcase}"\], \["owner", "#{DATABASE_USER.upcase}"\]\]/)
537
+ expect(@logger.logged(:debug).last).to match(/\[\["owner", "#{DATABASE_USER.upcase}"\], \["owner", "#{DATABASE_USER.upcase}"\], \["table_name", "TEST_POSTS"\]\]/)
528
538
  end
529
539
 
530
540
  it "should not have primary key trigger with bind usage" do
@@ -534,17 +544,17 @@ describe "OracleEnhancedAdapter" do
534
544
  expect(@logger.logged(:debug).last).to match(/\[\["owner", "#{DATABASE_USER.upcase}"\], \["trigger_name", "TEST_POSTS_PKT"\], \["owner", "#{DATABASE_USER.upcase}"\], \["table_name", "TEST_POSTS"\]\]/)
535
545
  end
536
546
 
537
- it "should return content from columns with bind usage" do
547
+ it "should return content from columns without bind usage" do
538
548
  expect(@conn.columns("TEST_POSTS").length).to be > 0
539
- expect(@logger.logged(:debug).last).to match(/:owner/)
540
- expect(@logger.logged(:debug).last).to match(/:table_name/)
541
- expect(@logger.logged(:debug).last).to match(/\[\["owner", "#{DATABASE_USER.upcase}"\], \["table_name", "TEST_POSTS"\]\]/)
549
+ expect(@logger.logged(:debug).last).not_to match(/:owner/)
550
+ expect(@logger.logged(:debug).last).not_to match(/:table_name/)
551
+ expect(@logger.logged(:debug).last).not_to match(/\[\["owner", "#{DATABASE_USER.upcase}"\], \["table_name", "TEST_POSTS"\]\]/)
542
552
  end
543
553
 
544
- it "should return pk and sequence from pk_and_sequence_for with bind usage" do
554
+ it "should return pk and sequence from pk_and_sequence_for without bind usage" do
545
555
  expect(@conn.pk_and_sequence_for("TEST_POSTS").length).to eq 2
546
- expect(@logger.logged(:debug).last).to match(/:owner/)
547
- expect(@logger.logged(:debug).last).to match(/\[\["owner", "#{DATABASE_USER.upcase}"\], \["table_name", "TEST_POSTS"\]\]/)
556
+ expect(@logger.logged(:debug).last).not_to match(/:owner/)
557
+ expect(@logger.logged(:debug).last).not_to match(/\[\["owner", "#{DATABASE_USER.upcase}"\], \["table_name", "TEST_POSTS"\]\]/)
548
558
  end
549
559
 
550
560
  it "should return pk from primary_keys with bind usage" do
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "simplecov"
4
- SimpleCov.start
5
3
  require "rubygems"
6
4
  require "bundler"
7
5
  require "yaml"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-oracle_enhanced-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.0
4
+ version: 5.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Raimonds Simanovskis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-09 00:00:00.000000000 Z
11
+ date: 2019-12-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -133,37 +133,36 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
133
  - !ruby/object:Gem::Version
134
134
  version: 1.8.11
135
135
  requirements: []
136
- rubyforge_project:
137
- rubygems_version: 2.7.6
136
+ rubygems_version: 3.1.2
138
137
  signing_key:
139
138
  specification_version: 4
140
139
  summary: Oracle enhanced adapter for ActiveRecord
141
140
  test_files:
142
- - spec/active_record/connection_adapters/emulation/oracle_adapter_spec.rb
143
- - spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb
144
- - spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb
145
- - spec/active_record/connection_adapters/oracle_enhanced/database_tasks_spec.rb
146
- - spec/active_record/connection_adapters/oracle_enhanced/schema_dumper_spec.rb
147
- - spec/active_record/connection_adapters/oracle_enhanced/structure_dump_spec.rb
148
- - spec/active_record/connection_adapters/oracle_enhanced/quoting_spec.rb
149
- - spec/active_record/connection_adapters/oracle_enhanced/context_index_spec.rb
150
- - spec/active_record/connection_adapters/oracle_enhanced/procedures_spec.rb
151
- - spec/active_record/connection_adapters/oracle_enhanced/schema_statements_spec.rb
152
- - spec/active_record/connection_adapters/oracle_enhanced/connection_spec.rb
153
- - spec/active_record/connection_adapters/oracle_enhanced/dbms_output_spec.rb
141
+ - spec/spec_helper.rb
154
142
  - spec/active_record/oracle_enhanced/type/integer_spec.rb
155
- - spec/active_record/oracle_enhanced/type/national_character_text_spec.rb
156
- - spec/active_record/oracle_enhanced/type/timestamp_spec.rb
157
- - spec/active_record/oracle_enhanced/type/binary_spec.rb
158
- - spec/active_record/oracle_enhanced/type/national_character_string_spec.rb
159
143
  - spec/active_record/oracle_enhanced/type/raw_spec.rb
160
144
  - spec/active_record/oracle_enhanced/type/float_spec.rb
145
+ - spec/active_record/oracle_enhanced/type/boolean_spec.rb
161
146
  - spec/active_record/oracle_enhanced/type/dirty_spec.rb
147
+ - spec/active_record/oracle_enhanced/type/binary_spec.rb
148
+ - spec/active_record/oracle_enhanced/type/timestamp_spec.rb
149
+ - spec/active_record/oracle_enhanced/type/national_character_text_spec.rb
162
150
  - spec/active_record/oracle_enhanced/type/json_spec.rb
163
151
  - spec/active_record/oracle_enhanced/type/text_spec.rb
164
- - spec/active_record/oracle_enhanced/type/boolean_spec.rb
165
- - spec/spec_config.yaml.template
166
- - spec/spec_helper.rb
167
- - spec/support/create_oracle_enhanced_users.sql
152
+ - spec/active_record/oracle_enhanced/type/national_character_string_spec.rb
153
+ - spec/active_record/connection_adapters/oracle_enhanced/context_index_spec.rb
154
+ - spec/active_record/connection_adapters/oracle_enhanced/quoting_spec.rb
155
+ - spec/active_record/connection_adapters/oracle_enhanced/dbms_output_spec.rb
156
+ - spec/active_record/connection_adapters/oracle_enhanced/schema_dumper_spec.rb
157
+ - spec/active_record/connection_adapters/oracle_enhanced/procedures_spec.rb
158
+ - spec/active_record/connection_adapters/oracle_enhanced/structure_dump_spec.rb
159
+ - spec/active_record/connection_adapters/oracle_enhanced/database_tasks_spec.rb
160
+ - spec/active_record/connection_adapters/oracle_enhanced/connection_spec.rb
161
+ - spec/active_record/connection_adapters/oracle_enhanced/schema_statements_spec.rb
162
+ - spec/active_record/connection_adapters/emulation/oracle_adapter_spec.rb
163
+ - spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb
164
+ - spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb
168
165
  - spec/support/alter_system_user_password.sql
166
+ - spec/support/create_oracle_enhanced_users.sql
169
167
  - spec/support/alter_system_set_open_cursors.sql
168
+ - spec/spec_config.yaml.template