activerecord-oracle_enhanced-adapter 5.2.0 → 5.2.8

Sign up to get free protection for your applications and to get access to all the features.
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