activerecord-oracle_enhanced-adapter 1.5.6 → 1.6.0.beta1
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 +4 -4
- data/Gemfile +2 -2
- data/History.md +87 -0
- data/README.md +271 -174
- data/VERSION +1 -1
- data/activerecord-oracle_enhanced-adapter.gemspec +26 -22
- data/lib/active_record/connection_adapters/{oracle_enhanced_column.rb → oracle_enhanced/column.rb} +14 -63
- data/lib/active_record/connection_adapters/oracle_enhanced/column_dumper.rb +65 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_connection.rb → oracle_enhanced/connection.rb} +2 -2
- data/lib/active_record/connection_adapters/oracle_enhanced/context_index.rb +347 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_cpk.rb → oracle_enhanced/cpk.rb} +0 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +257 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_database_tasks.rb → oracle_enhanced/database_tasks.rb} +0 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/dirty.rb +40 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_jdbc_connection.rb → oracle_enhanced/jdbc_connection.rb} +0 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_oci_connection.rb → oracle_enhanced/oci_connection.rb} +0 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_procedures.rb → oracle_enhanced/procedures.rb} +0 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_schema_creation.rb → oracle_enhanced/schema_creation.rb} +17 -16
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_definitions.rb +92 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_schema_dumper.rb → oracle_enhanced/schema_dumper.rb} +4 -32
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb +543 -0
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements_ext.rb +65 -0
- data/lib/active_record/connection_adapters/{oracle_enhanced_structure_dump.rb → oracle_enhanced/structure_dump.rb} +26 -4
- data/lib/active_record/connection_adapters/oracle_enhanced/version.rb +1 -0
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +159 -66
- data/lib/active_record/oracle_enhanced/type/integer.rb +13 -0
- data/lib/active_record/oracle_enhanced/type/raw.rb +13 -0
- data/lib/active_record/oracle_enhanced/type/timestamp.rb +11 -0
- data/lib/activerecord-oracle_enhanced-adapter.rb +1 -1
- data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +6 -31
- data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +1 -1
- data/spec/active_record/connection_adapters/oracle_enhanced_context_index_spec.rb +2 -2
- data/spec/active_record/connection_adapters/oracle_enhanced_cpk_spec.rb +2 -2
- data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +63 -63
- data/spec/active_record/connection_adapters/oracle_enhanced_database_tasks_spec.rb +1 -1
- data/spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb +7 -13
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_dump_spec.rb +21 -175
- data/spec/spec_config.yaml.template +10 -0
- data/spec/spec_helper.rb +21 -10
- metadata +29 -25
- data/lib/active_record/connection_adapters/oracle_enhanced_column_dumper.rb +0 -77
- data/lib/active_record/connection_adapters/oracle_enhanced_context_index.rb +0 -350
- data/lib/active_record/connection_adapters/oracle_enhanced_database_statements.rb +0 -262
- data/lib/active_record/connection_adapters/oracle_enhanced_dirty.rb +0 -45
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_definitions.rb +0 -197
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements.rb +0 -450
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements_ext.rb +0 -258
- data/lib/active_record/connection_adapters/oracle_enhanced_version.rb +0 -1
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'digest/sha1'
|
2
|
+
|
3
|
+
module ActiveRecord
|
4
|
+
module ConnectionAdapters
|
5
|
+
module OracleEnhancedSchemaStatementsExt
|
6
|
+
# Create primary key trigger (so that you can skip primary key value in INSERT statement).
|
7
|
+
# By default trigger name will be "table_name_pkt", you can override the name with
|
8
|
+
# :trigger_name option (but it is not recommended to override it as then this trigger will
|
9
|
+
# not be detected by ActiveRecord model and it will still do prefetching of sequence value).
|
10
|
+
#
|
11
|
+
# add_primary_key_trigger :users
|
12
|
+
#
|
13
|
+
# You can also create primary key trigger using +create_table+ with :primary_key_trigger
|
14
|
+
# option:
|
15
|
+
#
|
16
|
+
# create_table :users, :primary_key_trigger => true do |t|
|
17
|
+
# # ...
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
def add_primary_key_trigger(table_name, options={})
|
21
|
+
# call the same private method that is used for create_table :primary_key_trigger => true
|
22
|
+
create_primary_key_trigger(table_name, options)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Add synonym to existing table or view or sequence. Can be used to create local synonym to
|
26
|
+
# remote table in other schema or in other database
|
27
|
+
# Examples:
|
28
|
+
#
|
29
|
+
# add_synonym :posts, "blog.posts"
|
30
|
+
# add_synonym :posts_seq, "blog.posts_seq"
|
31
|
+
# add_synonym :employees, "hr.employees@dblink", :force => true
|
32
|
+
#
|
33
|
+
def add_synonym(name, table_name, options = {})
|
34
|
+
sql = "CREATE"
|
35
|
+
if options[:force] == true
|
36
|
+
sql << " OR REPLACE"
|
37
|
+
end
|
38
|
+
sql << " SYNONYM #{quote_table_name(name)} FOR #{quote_table_name(table_name)}"
|
39
|
+
execute sql
|
40
|
+
end
|
41
|
+
|
42
|
+
# Remove existing synonym to table or view or sequence
|
43
|
+
# Example:
|
44
|
+
#
|
45
|
+
# remove_synonym :posts, "blog.posts"
|
46
|
+
#
|
47
|
+
def remove_synonym(name)
|
48
|
+
execute "DROP SYNONYM #{quote_table_name(name)}"
|
49
|
+
end
|
50
|
+
|
51
|
+
# get synonyms for schema dump
|
52
|
+
def synonyms #:nodoc:
|
53
|
+
select_all("SELECT synonym_name, table_owner, table_name, db_link FROM user_synonyms").collect do |row|
|
54
|
+
OracleEnhanced::SynonymDefinition.new(oracle_downcase(row['synonym_name']),
|
55
|
+
oracle_downcase(row['table_owner']), oracle_downcase(row['table_name']), oracle_downcase(row['db_link']))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.class_eval do
|
64
|
+
include ActiveRecord::ConnectionAdapters::OracleEnhancedSchemaStatementsExt
|
65
|
+
end
|
@@ -134,12 +134,34 @@ module ActiveRecord #:nodoc:
|
|
134
134
|
join_with_statement_token(fks)
|
135
135
|
end
|
136
136
|
|
137
|
-
def
|
138
|
-
|
139
|
-
|
140
|
-
|
137
|
+
def foreign_key_definition(to_table, options = {}) #:nodoc:
|
138
|
+
columns = Array(options[:column] || options[:columns])
|
139
|
+
|
140
|
+
if columns.size > 1
|
141
|
+
# composite foreign key
|
142
|
+
columns_sql = columns.map {|c| quote_column_name(c)}.join(',')
|
143
|
+
references = options[:references] || columns
|
144
|
+
references_sql = references.map {|c| quote_column_name(c)}.join(',')
|
145
|
+
else
|
146
|
+
columns_sql = quote_column_name(columns.first || "#{to_table.to_s.singularize}_id")
|
147
|
+
references = options[:references] ? options[:references].first : nil
|
148
|
+
references_sql = quote_column_name(options[:primary_key] || references || "id")
|
149
|
+
end
|
150
|
+
|
151
|
+
table_name = to_table
|
152
|
+
|
153
|
+
sql = "FOREIGN KEY (#{columns_sql}) REFERENCES #{quote_table_name(table_name)}(#{references_sql})"
|
154
|
+
|
155
|
+
case options[:dependent]
|
156
|
+
when :nullify
|
157
|
+
sql << " ON DELETE SET NULL"
|
158
|
+
when :delete
|
159
|
+
sql << " ON DELETE CASCADE"
|
160
|
+
end
|
161
|
+
sql
|
141
162
|
end
|
142
163
|
|
164
|
+
|
143
165
|
# Extract all stored procedures, packages, synonyms and views.
|
144
166
|
def structure_dump_db_stored_code #:nodoc:
|
145
167
|
structure = []
|
@@ -0,0 +1 @@
|
|
1
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter::VERSION = File.read(File.expand_path('../../../../../VERSION', __FILE__)).chomp
|
@@ -30,9 +30,13 @@
|
|
30
30
|
# portions Copyright 2005 Graham Jenkins
|
31
31
|
|
32
32
|
require 'active_record/connection_adapters/abstract_adapter'
|
33
|
-
require 'active_record/connection_adapters/
|
33
|
+
require 'active_record/connection_adapters/oracle_enhanced/connection'
|
34
|
+
require 'active_record/connection_adapters/oracle_enhanced/database_statements'
|
35
|
+
require 'active_record/connection_adapters/oracle_enhanced/schema_statements'
|
36
|
+
require 'active_record/connection_adapters/oracle_enhanced/column_dumper'
|
37
|
+
require 'active_record/connection_adapters/oracle_enhanced/context_index'
|
34
38
|
|
35
|
-
require 'active_record/connection_adapters/
|
39
|
+
require 'active_record/connection_adapters/oracle_enhanced/column'
|
36
40
|
|
37
41
|
require 'digest/sha1'
|
38
42
|
|
@@ -131,7 +135,7 @@ module ActiveRecord
|
|
131
135
|
|
132
136
|
def record_changed_lobs
|
133
137
|
@changed_lob_columns = self.class.lob_columns.select do |col|
|
134
|
-
|
138
|
+
self.attribute_changed?(col.name) && !self.class.readonly_attributes.to_a.include?(col.name)
|
135
139
|
end
|
136
140
|
end
|
137
141
|
end
|
@@ -218,6 +222,15 @@ module ActiveRecord
|
|
218
222
|
# * <tt>:nls_time_tz_format</tt>
|
219
223
|
#
|
220
224
|
class OracleEnhancedAdapter < AbstractAdapter
|
225
|
+
# TODO: Use relative
|
226
|
+
include ActiveRecord::ConnectionAdapters::OracleEnhanced::DatabaseStatements
|
227
|
+
include ActiveRecord::ConnectionAdapters::OracleEnhanced::SchemaStatements
|
228
|
+
include ActiveRecord::ConnectionAdapters::OracleEnhanced::ColumnDumper
|
229
|
+
include ActiveRecord::ConnectionAdapters::OracleEnhanced::ContextIndex
|
230
|
+
|
231
|
+
def schema_creation
|
232
|
+
OracleEnhanced::SchemaCreation.new self
|
233
|
+
end
|
221
234
|
|
222
235
|
##
|
223
236
|
# :singleton-method:
|
@@ -270,13 +283,6 @@ module ActiveRecord
|
|
270
283
|
cattr_accessor :emulate_dates_by_column_name
|
271
284
|
self.emulate_dates_by_column_name = false
|
272
285
|
|
273
|
-
##
|
274
|
-
# :singleton-method:
|
275
|
-
# Specify how `NUMBER` datatype columns, without precision and scale, are handled in Rails world.
|
276
|
-
# Default is :decimal and other valid option is :float. Be wary of setting it to other values.
|
277
|
-
cattr_accessor :number_datatype_coercion
|
278
|
-
self.number_datatype_coercion = :decimal
|
279
|
-
|
280
286
|
# Check column name to identify if it is Date (and not Time) column.
|
281
287
|
# Is used if +emulate_dates_by_column_name+ option is set to +true+.
|
282
288
|
# Override this method definition in initializer file if different Date column recognition is needed.
|
@@ -311,7 +317,7 @@ module ActiveRecord
|
|
311
317
|
# Is used if +emulate_integers_by_column_name+ option is set to +true+.
|
312
318
|
# Override this method definition in initializer file if different Integer column recognition is needed.
|
313
319
|
def self.is_integer_column?(name, table_name = nil)
|
314
|
-
|
320
|
+
name =~ /(^|_)id$/i
|
315
321
|
end
|
316
322
|
|
317
323
|
##
|
@@ -326,9 +332,9 @@ module ActiveRecord
|
|
326
332
|
# Check column name to identify if it is boolean (and not String) column.
|
327
333
|
# Is used if +emulate_booleans_from_strings+ option is set to +true+.
|
328
334
|
# Override this method definition in initializer file if different boolean column recognition is needed.
|
329
|
-
def self.is_boolean_column?(name,
|
330
|
-
return true if ["CHAR(1)","VARCHAR2(1)"].include?(
|
331
|
-
|
335
|
+
def self.is_boolean_column?(name, sql_type, table_name = nil)
|
336
|
+
return true if ["CHAR(1)","VARCHAR2(1)"].include?(sql_type)
|
337
|
+
sql_type =~ /^VARCHAR2/ && (name =~ /_flag$/i || name =~ /_yn$/i)
|
332
338
|
end
|
333
339
|
|
334
340
|
# How boolean value should be quoted to String.
|
@@ -383,21 +389,18 @@ module ActiveRecord
|
|
383
389
|
end
|
384
390
|
end
|
385
391
|
|
386
|
-
class BindSubstitution < Arel::Visitors::Oracle #:nodoc:
|
387
|
-
include Arel::Visitors::BindVisitor
|
388
|
-
end
|
389
|
-
|
390
392
|
def initialize(connection, logger, config) #:nodoc:
|
391
393
|
super(connection, logger)
|
392
394
|
@quoted_column_names, @quoted_table_names = {}, {}
|
393
395
|
@config = config
|
394
396
|
@statements = StatementPool.new(connection, config.fetch(:statement_limit) { 250 })
|
395
397
|
@enable_dbms_output = false
|
396
|
-
|
397
|
-
|
398
|
+
@visitor = Arel::Visitors::Oracle.new self
|
399
|
+
|
400
|
+
if self.class.type_cast_config_to_boolean(config.fetch(:prepared_statements) { true })
|
398
401
|
@prepared_statements = true
|
399
402
|
else
|
400
|
-
@
|
403
|
+
@prepared_statements = false
|
401
404
|
end
|
402
405
|
end
|
403
406
|
|
@@ -423,7 +426,13 @@ module ActiveRecord
|
|
423
426
|
true
|
424
427
|
end
|
425
428
|
|
426
|
-
|
429
|
+
def supports_foreign_keys?
|
430
|
+
true
|
431
|
+
end
|
432
|
+
|
433
|
+
def supports_views?
|
434
|
+
true
|
435
|
+
end
|
427
436
|
|
428
437
|
#:stopdoc:
|
429
438
|
DEFAULT_NLS_PARAMETERS = {
|
@@ -448,11 +457,11 @@ module ActiveRecord
|
|
448
457
|
|
449
458
|
#:stopdoc:
|
450
459
|
NATIVE_DATABASE_TYPES = {
|
451
|
-
:primary_key => "NUMBER(
|
460
|
+
:primary_key => "NUMBER(38) NOT NULL PRIMARY KEY",
|
452
461
|
:string => { :name => "VARCHAR2", :limit => 255 },
|
453
462
|
:text => { :name => "CLOB" },
|
454
|
-
:integer => { :name => "NUMBER", :limit =>
|
455
|
-
:float => { :name => "
|
463
|
+
:integer => { :name => "NUMBER", :limit => 38 },
|
464
|
+
:float => { :name => "BINARY_FLOAT" },
|
456
465
|
:decimal => { :name => "DECIMAL" },
|
457
466
|
:datetime => { :name => "DATE" },
|
458
467
|
# changed to native TIMESTAMP type
|
@@ -462,7 +471,8 @@ module ActiveRecord
|
|
462
471
|
:date => { :name => "DATE" },
|
463
472
|
:binary => { :name => "BLOB" },
|
464
473
|
:boolean => { :name => "NUMBER", :limit => 1 },
|
465
|
-
:raw => { :name => "RAW", :limit => 2000 }
|
474
|
+
:raw => { :name => "RAW", :limit => 2000 },
|
475
|
+
:bigint => { :name => "NUMBER", :limit => 19 }
|
466
476
|
}
|
467
477
|
# if emulate_booleans_from_strings then store booleans in VARCHAR2
|
468
478
|
NATIVE_DATABASE_TYPES_BOOLEAN_STRINGS = NATIVE_DATABASE_TYPES.dup.merge(
|
@@ -667,22 +677,26 @@ module ActiveRecord
|
|
667
677
|
|
668
678
|
# Cast a +value+ to a type that the database understands.
|
669
679
|
def type_cast(value, column)
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
680
|
+
if column && column.cast_type.is_a?(Type::Serialized)
|
681
|
+
super
|
682
|
+
else
|
683
|
+
case value
|
684
|
+
when true, false
|
685
|
+
if emulate_booleans_from_strings || column && column.type == :string
|
686
|
+
self.class.boolean_to_string(value)
|
687
|
+
else
|
688
|
+
value ? 1 : 0
|
689
|
+
end
|
690
|
+
when Date, Time
|
691
|
+
if value.acts_like?(:time)
|
692
|
+
zone_conversion_method = ActiveRecord::Base.default_timezone == :utc ? :getutc : :getlocal
|
693
|
+
value.respond_to?(zone_conversion_method) ? value.send(zone_conversion_method) : value
|
694
|
+
else
|
695
|
+
value
|
696
|
+
end
|
681
697
|
else
|
682
|
-
|
698
|
+
super
|
683
699
|
end
|
684
|
-
else
|
685
|
-
super
|
686
700
|
end
|
687
701
|
end
|
688
702
|
|
@@ -812,7 +826,7 @@ module ActiveRecord
|
|
812
826
|
value = attributes[col.name]
|
813
827
|
# changed sequence of next two lines - should check if value is nil before converting to yaml
|
814
828
|
next if value.nil? || (value == '')
|
815
|
-
value = value.to_yaml if
|
829
|
+
value = value.to_yaml if value.is_a?(String) && klass.serialized_attributes[col.name]
|
816
830
|
uncached do
|
817
831
|
sql = is_with_cpk ? "SELECT #{quote_column_name(col.name)} FROM #{quote_table_name(table_name)} WHERE #{klass.composite_where_clause(id)} FOR UPDATE" :
|
818
832
|
"SELECT #{quote_column_name(col.name)} FROM #{quote_table_name(table_name)} WHERE #{quote_column_name(klass.primary_key)} = #{id} FOR UPDATE"
|
@@ -906,7 +920,7 @@ module ActiveRecord
|
|
906
920
|
statement_parameters = $1
|
907
921
|
end
|
908
922
|
end
|
909
|
-
all_schema_indexes <<
|
923
|
+
all_schema_indexes << OracleEnhanced::IndexDefinition.new(row['table_name'], row['index_name'],
|
910
924
|
row['uniqueness'] == "UNIQUE", row['index_type'] == 'DOMAIN' ? "#{row['ityp_owner']}.#{row['ityp_name']}" : nil,
|
911
925
|
row['parameters'], statement_parameters,
|
912
926
|
row['tablespace_name'] == default_tablespace_name ? nil : row['tablespace_name'], [])
|
@@ -1038,7 +1052,7 @@ module ActiveRecord
|
|
1038
1052
|
end.map do |row|
|
1039
1053
|
limit, scale = row['limit'], row['scale']
|
1040
1054
|
if limit || scale
|
1041
|
-
row['sql_type'] += "(#{(limit ||
|
1055
|
+
row['sql_type'] += "(#{(limit || 38).to_i}" + ((scale = scale.to_i) > 0 ? ",#{scale})" : ")")
|
1042
1056
|
end
|
1043
1057
|
|
1044
1058
|
if row['sql_type_owner']
|
@@ -1055,19 +1069,61 @@ module ActiveRecord
|
|
1055
1069
|
# match newlines.
|
1056
1070
|
row['data_default'].sub!(/^'(.*)'$/m, '\1')
|
1057
1071
|
row['data_default'] = nil if row['data_default'] =~ /^(null|empty_[bc]lob\(\))$/i
|
1072
|
+
# TODO: Needs better fix to fallback "N" to false
|
1073
|
+
row['data_default'] = false if row['data_default'] == "N"
|
1074
|
+
end
|
1075
|
+
|
1076
|
+
# TODO: Consider to extract another method such as `get_cast_type`
|
1077
|
+
case row['sql_type']
|
1078
|
+
when /decimal|numeric|number/i
|
1079
|
+
if get_type_for_column(table_name, oracle_downcase(row['name'])) == :integer
|
1080
|
+
cast_type = ActiveRecord::OracleEnhanced::Type::Integer.new
|
1081
|
+
elsif OracleEnhancedAdapter.emulate_booleans && row['sql_type'].upcase == "NUMBER(1)"
|
1082
|
+
cast_type = Type::Boolean.new
|
1083
|
+
elsif OracleEnhancedAdapter.emulate_integers_by_column_name && OracleEnhancedAdapter.is_integer_column?(row['name'], table_name)
|
1084
|
+
cast_type = ActiveRecord::OracleEnhanced::Type::Integer.new
|
1085
|
+
else
|
1086
|
+
cast_type = lookup_cast_type(row['sql_type'])
|
1087
|
+
end
|
1088
|
+
when /char/i
|
1089
|
+
if get_type_for_column(table_name, oracle_downcase(row['name'])) == :string
|
1090
|
+
cast_type = Type::String.new
|
1091
|
+
elsif get_type_for_column(table_name, oracle_downcase(row['name'])) == :boolean
|
1092
|
+
cast_type = Type::Boolean.new
|
1093
|
+
elsif OracleEnhancedAdapter.emulate_booleans_from_strings && OracleEnhancedAdapter.is_boolean_column?(row['name'], row['sql_type'], table_name)
|
1094
|
+
cast_type = Type::Boolean.new
|
1095
|
+
else
|
1096
|
+
cast_type = lookup_cast_type(row['sql_type'])
|
1097
|
+
end
|
1098
|
+
when /date/i
|
1099
|
+
if get_type_for_column(table_name, oracle_downcase(row['name'])) == :date
|
1100
|
+
cast_type = Type::Date.new
|
1101
|
+
elsif get_type_for_column(table_name, oracle_downcase(row['name'])) == :datetime
|
1102
|
+
cast_type = Type::DateTime.new
|
1103
|
+
elsif OracleEnhancedAdapter.emulate_dates_by_column_name && OracleEnhancedAdapter.is_date_column?(row['name'], table_name)
|
1104
|
+
cast_type = Type::Date.new
|
1105
|
+
else
|
1106
|
+
cast_type = lookup_cast_type(row['sql_type'])
|
1107
|
+
end
|
1108
|
+
else
|
1109
|
+
cast_type = lookup_cast_type(row['sql_type'])
|
1058
1110
|
end
|
1059
1111
|
|
1060
|
-
|
1112
|
+
new_column(oracle_downcase(row['name']),
|
1061
1113
|
row['data_default'],
|
1114
|
+
cast_type,
|
1062
1115
|
row['sql_type'],
|
1063
1116
|
row['nullable'] == 'Y',
|
1064
|
-
# pass table name for table specific column definitions
|
1065
1117
|
table_name,
|
1066
|
-
|
1067
|
-
|
1118
|
+
is_virtual,
|
1119
|
+
false )
|
1068
1120
|
end
|
1069
1121
|
end
|
1070
1122
|
|
1123
|
+
def new_column(name, default, cast_type, sql_type = nil, null = true, table_name = nil, virtual=false, returning_id=false)
|
1124
|
+
OracleEnhancedColumn.new(name, default, cast_type, sql_type, null, table_name, virtual, returning_id)
|
1125
|
+
end
|
1126
|
+
|
1071
1127
|
# used just in tests to clear column cache
|
1072
1128
|
def clear_columns_cache #:nodoc:
|
1073
1129
|
@@columns_cache = nil
|
@@ -1207,6 +1263,34 @@ module ActiveRecord
|
|
1207
1263
|
|
1208
1264
|
protected
|
1209
1265
|
|
1266
|
+
def initialize_type_map(m)
|
1267
|
+
super
|
1268
|
+
# oracle
|
1269
|
+
register_class_with_limit m, %r(date)i, Type::DateTime
|
1270
|
+
register_class_with_limit m, %r(raw)i, ActiveRecord::OracleEnhanced::Type::Raw
|
1271
|
+
register_class_with_limit m, %r(timestamp)i, ActiveRecord::OracleEnhanced::Type::Timestamp
|
1272
|
+
|
1273
|
+
m.register_type(%r(NUMBER)i) do |sql_type|
|
1274
|
+
scale = extract_scale(sql_type)
|
1275
|
+
precision = extract_precision(sql_type)
|
1276
|
+
limit = extract_limit(sql_type)
|
1277
|
+
if scale == 0
|
1278
|
+
ActiveRecord::OracleEnhanced::Type::Integer.new(precision: precision, limit: limit)
|
1279
|
+
else
|
1280
|
+
Type::Decimal.new(precision: precision, scale: scale)
|
1281
|
+
end
|
1282
|
+
end
|
1283
|
+
end
|
1284
|
+
|
1285
|
+
def extract_limit(sql_type) #:nodoc:
|
1286
|
+
case sql_type
|
1287
|
+
when /^bigint/i
|
1288
|
+
19
|
1289
|
+
when /\((.*)\)/
|
1290
|
+
$1.to_i
|
1291
|
+
end
|
1292
|
+
end
|
1293
|
+
|
1210
1294
|
def translate_exception(exception, message) #:nodoc:
|
1211
1295
|
case @connection.error_code(exception)
|
1212
1296
|
when 1
|
@@ -1220,6 +1304,10 @@ module ActiveRecord
|
|
1220
1304
|
|
1221
1305
|
private
|
1222
1306
|
|
1307
|
+
def select(sql, name = nil, binds = [])
|
1308
|
+
exec_query(sql, name, binds)
|
1309
|
+
end
|
1310
|
+
|
1223
1311
|
def oracle_downcase(column_name)
|
1224
1312
|
@connection.oracle_downcase(column_name)
|
1225
1313
|
end
|
@@ -1256,12 +1344,8 @@ module ActiveRecord
|
|
1256
1344
|
end
|
1257
1345
|
|
1258
1346
|
protected
|
1259
|
-
def log(sql, name, binds = nil) #:nodoc:
|
1260
|
-
|
1261
|
-
super sql, name, binds
|
1262
|
-
else
|
1263
|
-
super sql, name
|
1264
|
-
end
|
1347
|
+
def log(sql, name = "SQL", binds = [], statement_name = nil) #:nodoc:
|
1348
|
+
super
|
1265
1349
|
ensure
|
1266
1350
|
log_dbms_output if dbms_output_enabled?
|
1267
1351
|
end
|
@@ -1289,38 +1373,47 @@ module ActiveRecord
|
|
1289
1373
|
end
|
1290
1374
|
|
1291
1375
|
# Implementation of standard schema definition statements and extensions for schema definition
|
1292
|
-
require 'active_record/connection_adapters/
|
1293
|
-
require 'active_record/connection_adapters/
|
1376
|
+
require 'active_record/connection_adapters/oracle_enhanced/schema_statements'
|
1377
|
+
require 'active_record/connection_adapters/oracle_enhanced/schema_statements_ext'
|
1294
1378
|
|
1295
1379
|
# Extensions for schema definition
|
1296
|
-
require 'active_record/connection_adapters/
|
1380
|
+
require 'active_record/connection_adapters/oracle_enhanced/schema_definitions'
|
1297
1381
|
|
1298
1382
|
# Extensions for context index definition
|
1299
|
-
require 'active_record/connection_adapters/
|
1383
|
+
require 'active_record/connection_adapters/oracle_enhanced/context_index'
|
1300
1384
|
|
1301
1385
|
# Load additional methods for composite_primary_keys support
|
1302
|
-
require 'active_record/connection_adapters/
|
1386
|
+
require 'active_record/connection_adapters/oracle_enhanced/cpk'
|
1303
1387
|
|
1304
1388
|
# Load patch for dirty tracking methods
|
1305
|
-
require 'active_record/connection_adapters/
|
1389
|
+
require 'active_record/connection_adapters/oracle_enhanced/dirty'
|
1306
1390
|
|
1307
1391
|
# Patches and enhancements for schema dumper
|
1308
|
-
require 'active_record/connection_adapters/
|
1392
|
+
require 'active_record/connection_adapters/oracle_enhanced/schema_dumper'
|
1309
1393
|
|
1310
1394
|
# Implementation of structure dump
|
1311
|
-
require 'active_record/connection_adapters/
|
1395
|
+
require 'active_record/connection_adapters/oracle_enhanced/structure_dump'
|
1312
1396
|
|
1313
|
-
require 'active_record/connection_adapters/
|
1397
|
+
require 'active_record/connection_adapters/oracle_enhanced/version'
|
1314
1398
|
|
1315
1399
|
module ActiveRecord
|
1316
|
-
autoload :OracleEnhancedProcedures, 'active_record/connection_adapters/
|
1400
|
+
autoload :OracleEnhancedProcedures, 'active_record/connection_adapters/oracle_enhanced/procedures'
|
1317
1401
|
end
|
1318
1402
|
|
1319
1403
|
# Patches and enhancements for column dumper
|
1320
|
-
require 'active_record/connection_adapters/
|
1404
|
+
require 'active_record/connection_adapters/oracle_enhanced/column_dumper'
|
1321
1405
|
|
1322
1406
|
# Moved SchemaCreation class
|
1323
|
-
require 'active_record/connection_adapters/
|
1407
|
+
require 'active_record/connection_adapters/oracle_enhanced/schema_creation'
|
1324
1408
|
|
1325
1409
|
# Moved DatabaseStetements
|
1326
|
-
require 'active_record/connection_adapters/
|
1410
|
+
require 'active_record/connection_adapters/oracle_enhanced/database_statements'
|
1411
|
+
|
1412
|
+
# Add Type:Raw
|
1413
|
+
require 'active_record/oracle_enhanced/type/raw'
|
1414
|
+
|
1415
|
+
# Add Type:Timestamp
|
1416
|
+
require 'active_record/oracle_enhanced/type/timestamp'
|
1417
|
+
|
1418
|
+
# Add OracleEnhanced::Type::Integer
|
1419
|
+
require 'active_record/oracle_enhanced/type/integer'
|