activerecord-oracle_enhanced-adapter 1.7.3 → 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 +288 -0
  3. data/README.md +44 -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 +59 -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 +56 -82
  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 +119 -122
  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 +315 -538
  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 +14 -13
  35. data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +129 -166
  36. data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +50 -33
  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 +283 -378
  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 +74 -78
  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 +308 -321
  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 -50
  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,11 +80,12 @@ 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
+ rebuild_primary_key_index_to_default_tablespace(table_name, options)
88
89
  end
89
90
 
90
91
  def create_table_definition(*args)
@@ -112,22 +113,30 @@ module ActiveRecord
112
113
  self.all_schema_indexes = nil
113
114
  end
114
115
 
115
- def dump_schema_information #:nodoc:
116
- super
117
- end
118
-
119
- def initialize_schema_migrations_table
120
- super
121
- end
116
+ def insert_versions_sql(versions) # :nodoc:
117
+ sm_table = quote_table_name(ActiveRecord::SchemaMigration.table_name)
122
118
 
123
- def update_table_definition(table_name, base) #:nodoc:
124
- 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
125
134
  end
126
135
 
127
136
  def add_index(table_name, column_name, options = {}) #:nodoc:
128
137
  index_name, index_type, quoted_column_names, tablespace, index_options = add_index_options(table_name, column_name, options)
129
138
  execute "CREATE #{index_type} INDEX #{quote_column_name(index_name)} ON #{quote_table_name(table_name)} (#{quoted_column_names})#{tablespace} #{index_options}"
130
- if index_type == 'UNIQUE'
139
+ if index_type == "UNIQUE"
131
140
  unless quoted_column_names =~ /\(.*\)/
132
141
  execute "ALTER TABLE #{quote_table_name(table_name)} ADD CONSTRAINT #{quote_column_name(index_name)} #{index_type} (#{quoted_column_names})"
133
142
  end
@@ -152,29 +161,18 @@ module ActiveRecord
152
161
  if index_name.to_s.length > max_index_length
153
162
  raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' is too long; the limit is #{max_index_length} characters"
154
163
  end
155
- if index_name_exists?(table_name, index_name, false)
164
+ if table_exists?(table_name) && index_name_exists?(table_name, index_name)
156
165
  raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' already exists"
157
166
  end
158
167
 
159
168
  quoted_column_names = column_names.map { |e| quote_column_name_or_expression(e) }.join(", ")
160
- [index_name, index_type, quoted_column_names, tablespace, index_options]
169
+ [index_name, index_type, quoted_column_names, tablespace, index_options]
161
170
  end
162
171
 
163
172
  # Remove the given index from the table.
164
173
  # Gives warning if index does not exist
165
174
  def remove_index(table_name, options = {}) #:nodoc:
166
175
  index_name = index_name_for_remove(table_name, options)
167
- unless index_name_exists?(table_name, index_name, true)
168
- # sometimes options can be String or Array with column names
169
- options = {} unless options.is_a?(Hash)
170
- if options.has_key? :name
171
- options_without_column = options.dup
172
- options_without_column.delete :column
173
- index_name_without_column = index_name(table_name, options_without_column)
174
- return index_name_without_column if index_name_exists?(table_name, index_name_without_column, false)
175
- end
176
- raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' does not exist"
177
- end
178
176
  #TODO: It should execute only when index_type == "UNIQUE"
179
177
  execute "ALTER TABLE #{quote_table_name(table_name)} DROP CONSTRAINT #{quote_column_name(index_name)}" rescue nil
180
178
  execute "DROP INDEX #{quote_column_name(index_name)}"
@@ -195,11 +193,11 @@ module ActiveRecord
195
193
 
196
194
  # leave just first three letters from each word
197
195
  if shortened_name.length > identifier_max_length
198
- shortened_name = shortened_name.split('_').map{|w| w[0,3]}.join('_')
196
+ shortened_name = shortened_name.split("_").map { |w| w[0, 3] }.join("_")
199
197
  end
200
198
  # generate unique name using hash function
201
199
  if shortened_name.length > identifier_max_length
202
- 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]
203
201
  end
204
202
  @logger.warn "#{adapter_name} shortened default index name #{default_name} to #{shortened_name}" if @logger
205
203
  shortened_name
@@ -211,7 +209,12 @@ module ActiveRecord
211
209
  # as there's no way to determine the correct answer in that case.
212
210
  #
213
211
  # Will always query database and not index cache.
214
- 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
215
218
  (owner, table_name, db_link) = @connection.describe(table_name)
216
219
  result = select_value(<<-SQL)
217
220
  SELECT 1 FROM all_indexes#{db_link} i
@@ -224,31 +227,23 @@ module ActiveRecord
224
227
  end
225
228
 
226
229
  def rename_index(table_name, old_name, new_name) #:nodoc:
227
- unless index_name_exists?(table_name, old_name, true)
228
- raise ArgumentError, "Index name '#{old_name}' on table '#{table_name}' does not exist"
229
- end
230
- if new_name.length > allowed_index_name_length
231
- raise ArgumentError, "Index name '#{new_name}' on table '#{table_name}' is too long; the limit is #{allowed_index_name_length} characters"
232
- end
230
+ validate_index_length!(table_name, new_name)
233
231
  execute "ALTER INDEX #{quote_column_name(old_name)} rename to #{quote_column_name(new_name)}"
234
232
  ensure
235
233
  self.all_schema_indexes = nil
236
234
  end
237
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
+
238
240
  def add_column(table_name, column_name, type, options = {}) #:nodoc:
239
- if type.to_sym == :virtual
240
- type = options[:type]
241
- end
242
241
  type = aliased_types(type.to_s, type)
243
- add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD #{quote_column_name(column_name)} "
244
- add_column_sql << type_to_sql(type, options[:limit], options[:precision], options[:scale]) if type
245
-
246
- add_column_options!(add_column_sql, options.merge(:type=>type, :column_name=>column_name, :table_name=>table_name))
247
-
248
- add_column_sql << tablespace_for((type_to_sql(type).downcase.to_sym), nil, table_name, column_name) if type
249
-
250
- execute(add_column_sql)
251
-
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
252
247
  create_sequence_and_trigger(table_name, options) if type && type.to_sym == :primary_key
253
248
  change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
254
249
  ensure
@@ -273,7 +268,7 @@ module ActiveRecord
273
268
  execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL")
274
269
  end
275
270
 
276
- change_column table_name, column_name, column.sql_type, :null => null
271
+ change_column table_name, column_name, column.sql_type, null: null
277
272
  end
278
273
 
279
274
  def change_column(table_name, column_name, type, options = {}) #:nodoc:
@@ -287,14 +282,15 @@ module ActiveRecord
287
282
  if type.to_sym == :virtual
288
283
  type = options[:type]
289
284
  end
290
- change_column_sql = "ALTER TABLE #{quote_table_name(table_name)} MODIFY #{quote_column_name(column_name)} "
291
- change_column_sql << "#{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" if type
292
-
293
- add_column_options!(change_column_sql, options.merge(:type=>type, :column_name=>column_name, :table_name=>table_name))
294
-
295
- change_column_sql << tablespace_for((type_to_sql(type).downcase.to_sym), nil, options[:table_name], options[:column_name]) if type
296
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}"
297
291
  execute(change_column_sql)
292
+
293
+ change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
298
294
  ensure
299
295
  clear_table_columns_cache(table_name)
300
296
  end
@@ -345,9 +341,9 @@ module ActiveRecord
345
341
  end
346
342
 
347
343
  # Maps logical Rails types to Oracle-specific data types.
348
- 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:
349
345
  # Ignore options for :text and :binary columns
350
- return super(type, nil, nil, nil) if ['text', 'binary'].include?(type.to_s)
346
+ return super(type) if ["text", "binary"].include?(type.to_s)
351
347
 
352
348
  super
353
349
  end
@@ -361,28 +357,11 @@ module ActiveRecord
361
357
  SQL
362
358
  end
363
359
 
364
- def add_foreign_key(from_table, to_table, options = {})
365
- if options[:dependent]
366
- ActiveSupport::Deprecation.warn "`:dependent` option will be deprecated. Please use `:on_delete` option"
367
- end
368
- case options[:dependent]
369
- when :delete then options[:on_delete] = :cascade
370
- when :nullify then options[:on_delete] = :nullify
371
- else
372
- end
373
-
374
- super
375
- end
376
-
377
- def remove_foreign_key(from_table, options_or_to_table = {})
378
- super
379
- end
380
-
381
360
  # get table foreign keys for schema dump
382
361
  def foreign_keys(table_name) #:nodoc:
383
362
  (owner, desc_table_name, db_link) = @connection.describe(table_name)
384
363
 
385
- fk_info = select_all(<<-SQL, 'Foreign Keys')
364
+ fk_info = select_all(<<-SQL, "Foreign Keys")
386
365
  SELECT r.table_name to_table
387
366
  ,rc.column_name references_column
388
367
  ,cc.column_name
@@ -391,7 +370,7 @@ module ActiveRecord
391
370
  FROM all_constraints#{db_link} c, all_cons_columns#{db_link} cc,
392
371
  all_constraints#{db_link} r, all_cons_columns#{db_link} rc
393
372
  WHERE c.owner = '#{owner}'
394
- AND c.table_name = '#{desc_table_name}'
373
+ AND c.table_name = q'[#{desc_table_name}]'
395
374
  AND c.constraint_type = 'R'
396
375
  AND cc.owner = c.owner
397
376
  AND cc.constraint_name = c.constraint_name
@@ -405,19 +384,19 @@ module ActiveRecord
405
384
 
406
385
  fk_info.map do |row|
407
386
  options = {
408
- column: oracle_downcase(row['column_name']),
409
- name: oracle_downcase(row['name']),
410
- 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"])
411
390
  }
412
- options[:on_delete] = extract_foreign_key_action(row['delete_rule'])
413
- 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)
414
393
  end
415
394
  end
416
395
 
417
396
  def extract_foreign_key_action(specifier) # :nodoc:
418
397
  case specifier
419
- when 'CASCADE'; :cascade
420
- when 'SET NULL'; :nullify
398
+ when "CASCADE"; :cascade
399
+ when "SET NULL"; :nullify
421
400
  end
422
401
  end
423
402
 
@@ -434,59 +413,62 @@ module ActiveRecord
434
413
  old_constraints = select_all(sql_constraints)
435
414
  begin
436
415
  old_constraints.each do |constraint|
437
- execute "ALTER TABLE #{constraint["table_name"]} DISABLE CONSTRAINT #{constraint["constraint_name"]}"
416
+ execute "ALTER TABLE #{quote_table_name(constraint["table_name"])} DISABLE CONSTRAINT #{quote_table_name(constraint["constraint_name"])}"
438
417
  end
439
418
  yield
440
419
  ensure
441
420
  old_constraints.each do |constraint|
442
- execute "ALTER TABLE #{constraint["table_name"]} ENABLE CONSTRAINT #{constraint["constraint_name"]}"
421
+ execute "ALTER TABLE #{quote_table_name(constraint["table_name"])} ENABLE CONSTRAINT #{quote_table_name(constraint["constraint_name"])}"
443
422
  end
444
423
  end
445
424
  end
446
425
 
447
- private
448
-
449
426
  def create_alter_table(name)
450
- OracleEnhanced::AlterTable.new create_table_definition(name, false, {})
451
- end
452
-
453
- def tablespace_for(obj_type, tablespace_option, table_name=nil, column_name=nil)
454
- tablespace_sql = ''
455
- if tablespace = (tablespace_option || default_tablespace_for(obj_type))
456
- tablespace_sql << if [:blob, :clob].include?(obj_type.to_sym)
457
- " LOB (#{quote_column_name(column_name)}) STORE AS #{column_name.to_s[0..10]}_#{table_name.to_s[0..14]}_ls (TABLESPACE #{tablespace})"
458
- else
459
- " TABLESPACE #{tablespace}"
460
- end
461
- end
462
- tablespace_sql
427
+ ActiveRecord::ConnectionAdapters::OracleEnhanced::AlterTable.new create_table_definition(name, false, {})
463
428
  end
464
429
 
465
- def default_tablespace_for(type)
466
- (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)
467
432
  end
468
433
 
434
+ private
469
435
 
470
- def column_for(table_name, column_name)
471
- unless column = columns(table_name).find { |c| c.name == column_name.to_s }
472
- 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
473
446
  end
474
- column
475
- end
476
447
 
477
- def create_sequence_and_trigger(table_name, options)
478
- seq_name = options[:sequence_name] || default_sequence_name(table_name)
479
- seq_start_value = options[:sequence_start_value] || default_sequence_start_value
480
- 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
481
451
 
482
- create_primary_key_trigger(table_name, options) if options[:primary_key_trigger]
483
- 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
484
458
 
485
- def create_primary_key_trigger(table_name, options)
486
- seq_name = options[:sequence_name] || default_sequence_name(table_name)
487
- trigger_name = options[:trigger_name] || default_trigger_name(table_name)
488
- primary_key = options[:primary_key] || Base.get_primary_key(table_name.to_s.singularize)
489
- 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)
490
472
  CREATE OR REPLACE TRIGGER #{quote_table_name(trigger_name)}
491
473
  BEFORE INSERT ON #{quote_table_name(table_name)} FOR EACH ROW
492
474
  BEGIN
@@ -497,13 +479,28 @@ module ActiveRecord
497
479
  END IF;
498
480
  END;
499
481
  SQL
500
- end
482
+ end
501
483
 
502
- def default_trigger_name(table_name)
503
- # truncate table name if necessary to fit in max length of identifier
504
- "#{table_name.to_s[0,table_name_length-4]}_pkt"
505
- end
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
488
+
489
+ def rebuild_primary_key_index_to_default_tablespace(table_name, options)
490
+ tablespace = default_tablespace_for(:index)
506
491
 
492
+ return unless tablespace
493
+
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')")
499
+
500
+ return unless index_name
501
+
502
+ execute("ALTER INDEX #{quote_column_name(index_name)} REBUILD TABLESPACE #{tablespace}")
503
+ end
507
504
  end
508
505
  end
509
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