@api semipublic
# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 73 73: def create_model_storage(model) 74: name = self.name 75: properties = model.properties_with_subclasses(name) 76: table_name = model.storage_name(name) 77: truncate_or_delete = self.class.auto_migrate_with 78: table_is_truncated = truncate_or_delete && @truncated_tables && @truncated_tables[table_name] 79: 80: return false if storage_exists?(table_name) && !table_is_truncated 81: return false if properties.empty? 82: 83: with_connection do |connection| 84: # if table was truncated then check if all columns for properties are present 85: # TODO: check all other column definition options 86: if table_is_truncated && storage_has_all_fields?(table_name, properties) 87: @truncated_tables[table_name] = nil 88: else 89: # forced drop of table if properties are different 90: if truncate_or_delete 91: destroy_model_storage(model, true) 92: end 93: 94: statements = [ create_table_statement(connection, model, properties) ] 95: statements.concat(create_index_statements(model)) 96: statements.concat(create_unique_index_statements(model)) 97: statements.concat(create_sequence_statements(model)) 98: 99: statements.each do |statement| 100: command = connection.create_command(statement) 101: command.execute_non_query 102: end 103: end 104: 105: end 106: 107: true 108: end
@api semipublic
# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 111 111: def destroy_model_storage(model, forced = false) 112: table_name = model.storage_name(name) 113: klass = self.class 114: truncate_or_delete = klass.auto_migrate_with 115: if storage_exists?(table_name) 116: if truncate_or_delete && !forced 117: case truncate_or_delete 118: when :truncate 119: execute(truncate_table_statement(model)) 120: when :delete 121: execute(delete_table_statement(model)) 122: else 123: raise ArgumentError, "Unsupported auto_migrate_with option" 124: end 125: @truncated_tables ||= {} 126: @truncated_tables[table_name] = true 127: else 128: execute(drop_table_statement(model)) 129: @truncated_tables[table_name] = nil if @truncated_tables 130: end 131: end 132: # added destroy of sequences 133: reset_sequences = klass.auto_migrate_reset_sequences 134: table_is_truncated = @truncated_tables && @truncated_tables[table_name] 135: unless truncate_or_delete && !reset_sequences && !forced 136: if sequence_exists?(model_sequence_name(model)) 137: statement = if table_is_truncated && !forced 138: reset_sequence_statement(model) 139: else 140: drop_sequence_statement(model) 141: end 142: execute(statement) if statement 143: end 144: end 145: true 146: end
# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 66 66: def drop_table_statement(model) 67: table_name = quote_name(model.storage_name(name)) 68: "DROP TABLE #{table_name} CASCADE CONSTRAINTS" 69: end
@api semipublic
# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 42 42: def field_exists?(storage_name, field_name) 43: statement = DataMapper::Ext::String.compress_lines( SELECT COUNT(*) FROM all_tab_columns WHERE owner = ? AND table_name = ? AND column_name = ?) 44: 45: select(statement, schema_name, oracle_upcase(storage_name), oracle_upcase(field_name)).first > 0 46: end
@api semipublic
# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 29 29: def sequence_exists?(sequence_name) 30: return false unless sequence_name 31: statement = DataMapper::Ext::String.compress_lines( SELECT COUNT(*) FROM all_sequences WHERE sequence_owner = ? AND sequence_name = ?) 32: 33: select(statement, schema_name, oracle_upcase(sequence_name)).first > 0 34: end
@api semipublic
# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 17 17: def storage_exists?(storage_name) 18: statement = DataMapper::Ext::String.compress_lines( SELECT COUNT(*) FROM all_tables WHERE owner = ? AND table_name = ?) 19: 20: select(statement, schema_name, oracle_upcase(storage_name)).first > 0 21: end
@api semipublic
# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 55 55: def storage_fields(storage_name) 56: statement = DataMapper::Ext::String.compress_lines( SELECT column_name FROM all_tab_columns WHERE owner = ? AND table_name = ?) 57: 58: select(statement, schema_name, oracle_upcase(storage_name)) 59: end
If table or column name contains just lowercase characters then do uppercase as uppercase version will be used in Oracle data dictionary tables
# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 156 156: def oracle_upcase(name) 157: name =~ /[A-Z]/ ? name : name.upcase 158: end
# File lib/dm-migrations/adapters/dm-oracle-adapter.rb, line 150 150: def storage_has_all_fields?(table_name, properties) 151: properties.map { |property| oracle_upcase(property.field) }.sort == storage_fields(table_name).sort 152: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.