activerecord-oracle_enhanced-adapter 1.7.7 → 1.8.0

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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +225 -0
  3. data/README.md +14 -0
  4. data/VERSION +1 -1
  5. data/lib/active_record/connection_adapters/emulation/oracle_adapter.rb +1 -1
  6. data/lib/active_record/connection_adapters/oracle_enhanced/column.rb +7 -63
  7. data/lib/active_record/connection_adapters/oracle_enhanced/column_dumper.rb +6 -52
  8. data/lib/active_record/connection_adapters/oracle_enhanced/connection.rb +13 -16
  9. data/lib/active_record/connection_adapters/oracle_enhanced/context_index.rb +117 -119
  10. data/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +33 -27
  11. data/lib/active_record/connection_adapters/oracle_enhanced/database_tasks.rb +10 -10
  12. data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_connection.rb +58 -77
  13. data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_quoting.rb +0 -4
  14. data/lib/active_record/connection_adapters/oracle_enhanced/oci_connection.rb +51 -79
  15. data/lib/active_record/connection_adapters/oracle_enhanced/oci_quoting.rb +4 -4
  16. data/lib/active_record/connection_adapters/oracle_enhanced/procedures.rb +77 -77
  17. data/lib/active_record/connection_adapters/oracle_enhanced/quoting.rb +16 -45
  18. data/lib/active_record/connection_adapters/oracle_enhanced/schema_creation.rb +60 -65
  19. data/lib/active_record/connection_adapters/oracle_enhanced/schema_definitions.rb +33 -51
  20. data/lib/active_record/connection_adapters/oracle_enhanced/schema_dumper.rb +149 -162
  21. data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb +112 -132
  22. data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements_ext.rb +3 -4
  23. data/lib/active_record/connection_adapters/oracle_enhanced/structure_dump.rb +69 -107
  24. data/lib/active_record/connection_adapters/oracle_enhanced/version.rb +1 -1
  25. data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +292 -539
  26. data/lib/active_record/oracle_enhanced/type/boolean.rb +7 -11
  27. data/lib/active_record/oracle_enhanced/type/integer.rb +4 -5
  28. data/lib/active_record/oracle_enhanced/type/json.rb +8 -0
  29. data/lib/active_record/oracle_enhanced/type/national_character_string.rb +1 -2
  30. data/lib/active_record/oracle_enhanced/type/raw.rb +2 -4
  31. data/lib/active_record/oracle_enhanced/type/string.rb +2 -3
  32. data/lib/active_record/oracle_enhanced/type/text.rb +2 -4
  33. data/lib/active_record/oracle_enhanced/type/timestamptz.rb +23 -0
  34. data/lib/activerecord-oracle_enhanced-adapter.rb +2 -3
  35. data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +82 -162
  36. data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +35 -35
  37. data/spec/active_record/connection_adapters/oracle_enhanced_context_index_spec.rb +44 -42
  38. data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +270 -365
  39. data/spec/active_record/connection_adapters/oracle_enhanced_database_tasks_spec.rb +14 -7
  40. data/spec/active_record/connection_adapters/oracle_enhanced_dbms_output_spec.rb +5 -7
  41. data/spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb +118 -127
  42. data/spec/active_record/connection_adapters/oracle_enhanced_emulate_oracle_adapter_spec.rb +2 -3
  43. data/spec/active_record/connection_adapters/oracle_enhanced_procedures_spec.rb +73 -77
  44. data/spec/active_record/connection_adapters/oracle_enhanced_schema_dump_spec.rb +68 -83
  45. data/spec/active_record/connection_adapters/oracle_enhanced_schema_statements_spec.rb +263 -329
  46. data/spec/active_record/connection_adapters/oracle_enhanced_structure_dump_spec.rb +103 -48
  47. data/spec/spec_config.yaml.template +11 -0
  48. data/spec/spec_helper.rb +59 -60
  49. data/spec/support/alter_system_user_password.sql +2 -0
  50. data/spec/support/create_oracle_enhanced_users.sql +31 -0
  51. metadata +25 -25
  52. data/.rspec +0 -2
  53. data/Gemfile +0 -22
  54. data/RUNNING_TESTS.md +0 -83
  55. data/Rakefile +0 -45
  56. data/activerecord-oracle_enhanced-adapter.gemspec +0 -95
  57. data/lib/active_record/connection_adapters/oracle_enhanced/cpk.rb +0 -21
  58. data/spec/active_record/connection_adapters/oracle_enhanced_cpk_spec.rb +0 -113
@@ -1,4 +1,4 @@
1
- require 'digest/sha1'
1
+ require "digest/sha1"
2
2
 
3
3
  module ActiveRecord
4
4
  module ConnectionAdapters
@@ -80,10 +80,10 @@ module ActiveRecord
80
80
  if supports_comments? && !supports_comments_in_create?
81
81
  change_table_comment(table_name, comment) if comment
82
82
  td.columns.each do |column|
83
- change_column_comment(table_name, column.name, column.comment) if column.comment
83
+ change_column_comment(table_name, column.name, column.comment) if column.comment.present?
84
84
  end
85
85
  end
86
- td.indexes.each { |c,o| add_index table_name, c, o }
86
+ td.indexes.each { |c, o| add_index table_name, c, o }
87
87
 
88
88
  rebuild_primary_key_index_to_default_tablespace(table_name, options)
89
89
  end
@@ -113,22 +113,30 @@ module ActiveRecord
113
113
  self.all_schema_indexes = nil
114
114
  end
115
115
 
116
- def dump_schema_information #:nodoc:
117
- super
118
- end
119
-
120
- def initialize_schema_migrations_table
121
- super
122
- end
116
+ def insert_versions_sql(versions) # :nodoc:
117
+ sm_table = quote_table_name(ActiveRecord::SchemaMigration.table_name)
123
118
 
124
- def update_table_definition(table_name, base) #:nodoc:
125
- OracleEnhanced::Table.new(table_name, base)
119
+ if supports_multi_insert?
120
+ versions.inject("INSERT ALL\n") { |sql, version|
121
+ sql << "INTO #{sm_table} (version) VALUES (#{quote(version)})\n"
122
+ } << "SELECT * FROM DUAL\n"
123
+ else
124
+ if versions.is_a?(Array)
125
+ # called from ActiveRecord::Base.connection#dump_schema_information
126
+ versions.map { |version|
127
+ "INSERT INTO #{sm_table} (version) VALUES (#{quote(version)})"
128
+ }.join("\n\n/\n\n")
129
+ else
130
+ # called from ActiveRecord::Base.connection#assume_migrated_upto_version
131
+ "INSERT INTO #{sm_table} (version) VALUES (#{quote(versions)})"
132
+ end
133
+ end
126
134
  end
127
135
 
128
136
  def add_index(table_name, column_name, options = {}) #:nodoc:
129
137
  index_name, index_type, quoted_column_names, tablespace, index_options = add_index_options(table_name, column_name, options)
130
138
  execute "CREATE #{index_type} INDEX #{quote_column_name(index_name)} ON #{quote_table_name(table_name)} (#{quoted_column_names})#{tablespace} #{index_options}"
131
- if index_type == 'UNIQUE'
139
+ if index_type == "UNIQUE"
132
140
  unless quoted_column_names =~ /\(.*\)/
133
141
  execute "ALTER TABLE #{quote_table_name(table_name)} ADD CONSTRAINT #{quote_column_name(index_name)} #{index_type} (#{quoted_column_names})"
134
142
  end
@@ -153,29 +161,18 @@ module ActiveRecord
153
161
  if index_name.to_s.length > max_index_length
154
162
  raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' is too long; the limit is #{max_index_length} characters"
155
163
  end
156
- if index_name_exists?(table_name, index_name, false)
164
+ if table_exists?(table_name) && index_name_exists?(table_name, index_name)
157
165
  raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' already exists"
158
166
  end
159
167
 
160
168
  quoted_column_names = column_names.map { |e| quote_column_name_or_expression(e) }.join(", ")
161
- [index_name, index_type, quoted_column_names, tablespace, index_options]
169
+ [index_name, index_type, quoted_column_names, tablespace, index_options]
162
170
  end
163
171
 
164
172
  # Remove the given index from the table.
165
173
  # Gives warning if index does not exist
166
174
  def remove_index(table_name, options = {}) #:nodoc:
167
175
  index_name = index_name_for_remove(table_name, options)
168
- unless index_name_exists?(table_name, index_name, true)
169
- # sometimes options can be String or Array with column names
170
- options = {} unless options.is_a?(Hash)
171
- if options.has_key? :name
172
- options_without_column = options.dup
173
- options_without_column.delete :column
174
- index_name_without_column = index_name(table_name, options_without_column)
175
- return index_name_without_column if index_name_exists?(table_name, index_name_without_column, false)
176
- end
177
- raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' does not exist"
178
- end
179
176
  #TODO: It should execute only when index_type == "UNIQUE"
180
177
  execute "ALTER TABLE #{quote_table_name(table_name)} DROP CONSTRAINT #{quote_column_name(index_name)}" rescue nil
181
178
  execute "DROP INDEX #{quote_column_name(index_name)}"
@@ -196,11 +193,11 @@ module ActiveRecord
196
193
 
197
194
  # leave just first three letters from each word
198
195
  if shortened_name.length > identifier_max_length
199
- shortened_name = shortened_name.split('_').map{|w| w[0,3]}.join('_')
196
+ shortened_name = shortened_name.split("_").map { |w| w[0, 3] }.join("_")
200
197
  end
201
198
  # generate unique name using hash function
202
199
  if shortened_name.length > identifier_max_length
203
- shortened_name = 'i'+Digest::SHA1.hexdigest(default_name)[0,identifier_max_length-1]
200
+ shortened_name = "i" + Digest::SHA1.hexdigest(default_name)[0, identifier_max_length - 1]
204
201
  end
205
202
  @logger.warn "#{adapter_name} shortened default index name #{default_name} to #{shortened_name}" if @logger
206
203
  shortened_name
@@ -212,7 +209,12 @@ module ActiveRecord
212
209
  # as there's no way to determine the correct answer in that case.
213
210
  #
214
211
  # Will always query database and not index cache.
215
- def index_name_exists?(table_name, index_name, default)
212
+ def index_name_exists?(table_name, index_name, default = nil)
213
+ unless default.nil?
214
+ ActiveSupport::Deprecation.warn(<<-MSG.squish)
215
+ Passing default to #index_name_exists? is deprecated without replacement.
216
+ MSG
217
+ end
216
218
  (owner, table_name, db_link) = @connection.describe(table_name)
217
219
  result = select_value(<<-SQL)
218
220
  SELECT 1 FROM all_indexes#{db_link} i
@@ -225,31 +227,23 @@ module ActiveRecord
225
227
  end
226
228
 
227
229
  def rename_index(table_name, old_name, new_name) #:nodoc:
228
- unless index_name_exists?(table_name, old_name, true)
229
- raise ArgumentError, "Index name '#{old_name}' on table '#{table_name}' does not exist"
230
- end
231
- if new_name.length > allowed_index_name_length
232
- raise ArgumentError, "Index name '#{new_name}' on table '#{table_name}' is too long; the limit is #{allowed_index_name_length} characters"
233
- end
230
+ validate_index_length!(table_name, new_name)
234
231
  execute "ALTER INDEX #{quote_column_name(old_name)} rename to #{quote_column_name(new_name)}"
235
232
  ensure
236
233
  self.all_schema_indexes = nil
237
234
  end
238
235
 
236
+ def add_reference(table_name, *args)
237
+ ActiveRecord::ConnectionAdapters::OracleEnhanced::ReferenceDefinition.new(*args).add_to(update_table_definition(table_name, self))
238
+ end
239
+
239
240
  def add_column(table_name, column_name, type, options = {}) #:nodoc:
240
- if type.to_sym == :virtual
241
- type = options[:type]
242
- end
243
241
  type = aliased_types(type.to_s, type)
244
- add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD #{quote_column_name(column_name)} "
245
- add_column_sql << type_to_sql(type, options[:limit], options[:precision], options[:scale]) if type
246
-
247
- add_column_options!(add_column_sql, options.merge(:type=>type, :column_name=>column_name, :table_name=>table_name))
248
-
249
- add_column_sql << tablespace_for((type_to_sql(type).downcase.to_sym), nil, table_name, column_name) if type
250
-
251
- execute(add_column_sql)
252
-
242
+ at = create_alter_table table_name
243
+ at.add_column(column_name, type, options)
244
+ add_column_sql = schema_creation.accept at
245
+ add_column_sql << tablespace_for((type_to_sql(type).downcase.to_sym), nil, table_name, column_name)
246
+ execute add_column_sql
253
247
  create_sequence_and_trigger(table_name, options) if type && type.to_sym == :primary_key
254
248
  change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
255
249
  ensure
@@ -274,7 +268,7 @@ module ActiveRecord
274
268
  execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL")
275
269
  end
276
270
 
277
- change_column table_name, column_name, column.sql_type, :null => null
271
+ change_column table_name, column_name, column.sql_type, null: null
278
272
  end
279
273
 
280
274
  def change_column(table_name, column_name, type, options = {}) #:nodoc:
@@ -288,14 +282,15 @@ module ActiveRecord
288
282
  if type.to_sym == :virtual
289
283
  type = options[:type]
290
284
  end
291
- change_column_sql = "ALTER TABLE #{quote_table_name(table_name)} MODIFY #{quote_column_name(column_name)} "
292
- change_column_sql << "#{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" if type
293
-
294
- add_column_options!(change_column_sql, options.merge(:type=>type, :column_name=>column_name, :table_name=>table_name))
295
-
296
- change_column_sql << tablespace_for((type_to_sql(type).downcase.to_sym), nil, options[:table_name], options[:column_name]) if type
297
285
 
286
+ td = create_table_definition(table_name)
287
+ cd = td.new_column_definition(column.name, type, options)
288
+ change_column_stmt = schema_creation.accept cd
289
+ change_column_stmt << tablespace_for((type_to_sql(type).downcase.to_sym), nil, options[:table_name], options[:column_name]) if type
290
+ change_column_sql = "ALTER TABLE #{quote_table_name(table_name)} MODIFY #{change_column_stmt}"
298
291
  execute(change_column_sql)
292
+
293
+ change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
299
294
  ensure
300
295
  clear_table_columns_cache(table_name)
301
296
  end
@@ -346,9 +341,9 @@ module ActiveRecord
346
341
  end
347
342
 
348
343
  # Maps logical Rails types to Oracle-specific data types.
349
- def type_to_sql(type, limit = nil, precision = nil, scale = nil) #:nodoc:
344
+ def type_to_sql(type, limit: nil, precision: nil, scale: nil, **) #:nodoc:
350
345
  # Ignore options for :text and :binary columns
351
- return super(type, nil, nil, nil) if ['text', 'binary'].include?(type.to_s)
346
+ return super(type) if ["text", "binary"].include?(type.to_s)
352
347
 
353
348
  super
354
349
  end
@@ -362,28 +357,11 @@ module ActiveRecord
362
357
  SQL
363
358
  end
364
359
 
365
- def add_foreign_key(from_table, to_table, options = {})
366
- if options[:dependent]
367
- ActiveSupport::Deprecation.warn "`:dependent` option will be deprecated. Please use `:on_delete` option"
368
- end
369
- case options[:dependent]
370
- when :delete then options[:on_delete] = :cascade
371
- when :nullify then options[:on_delete] = :nullify
372
- else
373
- end
374
-
375
- super
376
- end
377
-
378
- def remove_foreign_key(from_table, options_or_to_table = {})
379
- super
380
- end
381
-
382
360
  # get table foreign keys for schema dump
383
361
  def foreign_keys(table_name) #:nodoc:
384
362
  (owner, desc_table_name, db_link) = @connection.describe(table_name)
385
363
 
386
- fk_info = select_all(<<-SQL, 'Foreign Keys')
364
+ fk_info = select_all(<<-SQL, "Foreign Keys")
387
365
  SELECT r.table_name to_table
388
366
  ,rc.column_name references_column
389
367
  ,cc.column_name
@@ -392,7 +370,7 @@ module ActiveRecord
392
370
  FROM all_constraints#{db_link} c, all_cons_columns#{db_link} cc,
393
371
  all_constraints#{db_link} r, all_cons_columns#{db_link} rc
394
372
  WHERE c.owner = '#{owner}'
395
- AND c.table_name = '#{desc_table_name}'
373
+ AND c.table_name = q'[#{desc_table_name}]'
396
374
  AND c.constraint_type = 'R'
397
375
  AND cc.owner = c.owner
398
376
  AND cc.constraint_name = c.constraint_name
@@ -406,19 +384,19 @@ module ActiveRecord
406
384
 
407
385
  fk_info.map do |row|
408
386
  options = {
409
- column: oracle_downcase(row['column_name']),
410
- name: oracle_downcase(row['name']),
411
- primary_key: oracle_downcase(row['references_column'])
387
+ column: oracle_downcase(row["column_name"]),
388
+ name: oracle_downcase(row["name"]),
389
+ primary_key: oracle_downcase(row["references_column"])
412
390
  }
413
- options[:on_delete] = extract_foreign_key_action(row['delete_rule'])
414
- OracleEnhanced::ForeignKeyDefinition.new(oracle_downcase(table_name), oracle_downcase(row['to_table']), options)
391
+ options[:on_delete] = extract_foreign_key_action(row["delete_rule"])
392
+ ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(oracle_downcase(table_name), oracle_downcase(row["to_table"]), options)
415
393
  end
416
394
  end
417
395
 
418
396
  def extract_foreign_key_action(specifier) # :nodoc:
419
397
  case specifier
420
- when 'CASCADE'; :cascade
421
- when 'SET NULL'; :nullify
398
+ when "CASCADE"; :cascade
399
+ when "SET NULL"; :nullify
422
400
  end
423
401
  end
424
402
 
@@ -445,49 +423,52 @@ module ActiveRecord
445
423
  end
446
424
  end
447
425
 
448
- private
449
-
450
426
  def create_alter_table(name)
451
- OracleEnhanced::AlterTable.new create_table_definition(name, false, {})
452
- end
453
-
454
- def tablespace_for(obj_type, tablespace_option, table_name=nil, column_name=nil)
455
- tablespace_sql = ''
456
- if tablespace = (tablespace_option || default_tablespace_for(obj_type))
457
- tablespace_sql << if [:blob, :clob].include?(obj_type.to_sym)
458
- " LOB (#{quote_column_name(column_name)}) STORE AS #{column_name.to_s[0..10]}_#{table_name.to_s[0..14]}_ls (TABLESPACE #{tablespace})"
459
- else
460
- " TABLESPACE #{tablespace}"
461
- end
462
- end
463
- tablespace_sql
427
+ ActiveRecord::ConnectionAdapters::OracleEnhanced::AlterTable.new create_table_definition(name, false, {})
464
428
  end
465
429
 
466
- def default_tablespace_for(type)
467
- (default_tablespaces[type] || default_tablespaces[native_database_types[type][:name]]) rescue nil
430
+ def update_table_definition(table_name, base)
431
+ ActiveRecord::ConnectionAdapters::OracleEnhanced::Table.new(table_name, base)
468
432
  end
469
433
 
434
+ private
470
435
 
471
- def column_for(table_name, column_name)
472
- unless column = columns(table_name).find { |c| c.name == column_name.to_s }
473
- raise "No such column: #{table_name}.#{column_name}"
436
+ def tablespace_for(obj_type, tablespace_option, table_name = nil, column_name = nil)
437
+ tablespace_sql = ""
438
+ if tablespace = (tablespace_option || default_tablespace_for(obj_type))
439
+ if [:blob, :clob].include?(obj_type.to_sym)
440
+ tablespace_sql << " LOB (#{quote_column_name(column_name)}) STORE AS #{column_name.to_s[0..10]}_#{table_name.to_s[0..14]}_ls (TABLESPACE #{tablespace})"
441
+ else
442
+ tablespace_sql << " TABLESPACE #{tablespace}"
443
+ end
444
+ end
445
+ tablespace_sql
474
446
  end
475
- column
476
- end
477
447
 
478
- def create_sequence_and_trigger(table_name, options)
479
- seq_name = options[:sequence_name] || default_sequence_name(table_name)
480
- seq_start_value = options[:sequence_start_value] || default_sequence_start_value
481
- execute "CREATE SEQUENCE #{quote_table_name(seq_name)} START WITH #{seq_start_value}"
448
+ def default_tablespace_for(type)
449
+ (default_tablespaces[type] || default_tablespaces[native_database_types[type][:name]]) rescue nil
450
+ end
482
451
 
483
- create_primary_key_trigger(table_name, options) if options[:primary_key_trigger]
484
- end
452
+ def column_for(table_name, column_name)
453
+ unless column = columns(table_name).find { |c| c.name == column_name.to_s }
454
+ raise "No such column: #{table_name}.#{column_name}"
455
+ end
456
+ column
457
+ end
485
458
 
486
- def create_primary_key_trigger(table_name, options)
487
- seq_name = options[:sequence_name] || default_sequence_name(table_name)
488
- trigger_name = options[:trigger_name] || default_trigger_name(table_name)
489
- primary_key = options[:primary_key] || Base.get_primary_key(table_name.to_s.singularize)
490
- execute compress_lines(<<-SQL)
459
+ def create_sequence_and_trigger(table_name, options)
460
+ seq_name = options[:sequence_name] || default_sequence_name(table_name)
461
+ seq_start_value = options[:sequence_start_value] || default_sequence_start_value
462
+ execute "CREATE SEQUENCE #{quote_table_name(seq_name)} START WITH #{seq_start_value}"
463
+
464
+ create_primary_key_trigger(table_name, options) if options[:primary_key_trigger]
465
+ end
466
+
467
+ def create_primary_key_trigger(table_name, options)
468
+ seq_name = options[:sequence_name] || default_sequence_name(table_name)
469
+ trigger_name = options[:trigger_name] || default_trigger_name(table_name)
470
+ primary_key = options[:primary_key] || Base.get_primary_key(table_name.to_s.singularize)
471
+ execute compress_lines(<<-SQL)
491
472
  CREATE OR REPLACE TRIGGER #{quote_table_name(trigger_name)}
492
473
  BEFORE INSERT ON #{quote_table_name(table_name)} FOR EACH ROW
493
474
  BEGIN
@@ -498,29 +479,28 @@ module ActiveRecord
498
479
  END IF;
499
480
  END;
500
481
  SQL
501
- end
502
-
503
- def default_trigger_name(table_name)
504
- # truncate table name if necessary to fit in max length of identifier
505
- "#{table_name.to_s[0,table_name_length-4]}_pkt"
506
- end
482
+ end
507
483
 
508
- def rebuild_primary_key_index_to_default_tablespace(table_name, options)
509
- tablespace = default_tablespace_for(:index)
484
+ def default_trigger_name(table_name)
485
+ # truncate table name if necessary to fit in max length of identifier
486
+ "#{table_name.to_s[0, table_name_length - 4]}_pkt"
487
+ end
510
488
 
511
- return unless tablespace
489
+ def rebuild_primary_key_index_to_default_tablespace(table_name, options)
490
+ tablespace = default_tablespace_for(:index)
512
491
 
513
- index_name = Base.connection.select_value(
514
- "SELECT index_name FROM all_constraints
515
- WHERE table_name = #{quote(table_name.upcase)}
516
- AND constraint_type = 'P'
517
- AND owner = SYS_CONTEXT('userenv', 'current_schema')")
492
+ return unless tablespace
518
493
 
519
- return unless index_name
494
+ index_name = Base.connection.select_value(
495
+ "SELECT index_name FROM all_constraints
496
+ WHERE table_name = #{quote(table_name.upcase)}
497
+ AND constraint_type = 'P'
498
+ AND owner = SYS_CONTEXT('userenv', 'current_schema')")
520
499
 
521
- execute("ALTER INDEX #{quote_column_name(index_name)} REBUILD TABLESPACE #{tablespace}")
522
- end
500
+ return unless index_name
523
501
 
502
+ execute("ALTER INDEX #{quote_column_name(index_name)} REBUILD TABLESPACE #{tablespace}")
503
+ end
524
504
  end
525
505
  end
526
506
  end
@@ -16,7 +16,7 @@ module ActiveRecord
16
16
  # # ...
17
17
  # end
18
18
  #
19
- def add_primary_key_trigger(table_name, options={})
19
+ def add_primary_key_trigger(table_name, options = {})
20
20
  # call the same private method that is used for create_table :primary_key_trigger => true
21
21
  create_primary_key_trigger(table_name, options)
22
22
  end
@@ -50,11 +50,10 @@ module ActiveRecord
50
50
  # get synonyms for schema dump
51
51
  def synonyms #:nodoc:
52
52
  select_all("SELECT synonym_name, table_owner, table_name, db_link FROM all_synonyms where owner = SYS_CONTEXT('userenv', 'session_user')").collect do |row|
53
- OracleEnhanced::SynonymDefinition.new(oracle_downcase(row['synonym_name']),
54
- oracle_downcase(row['table_owner']), oracle_downcase(row['table_name']), oracle_downcase(row['db_link']))
53
+ OracleEnhanced::SynonymDefinition.new(oracle_downcase(row["synonym_name"]),
54
+ oracle_downcase(row["table_owner"]), oracle_downcase(row["table_name"]), oracle_downcase(row["db_link"]))
55
55
  end
56
56
  end
57
-
58
57
  end
59
58
  end
60
59
  end