activerecord-oracle_enhanced-adapter 1.5.6 → 1.6.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.travis/oracle/download.sh +14 -0
  3. data/.travis/oracle/install.sh +31 -0
  4. data/.travis/setup_accounts.sh +9 -0
  5. data/.travis.yml +39 -0
  6. data/Gemfile +8 -8
  7. data/History.md +189 -0
  8. data/README.md +388 -178
  9. data/RUNNING_TESTS.md +11 -6
  10. data/VERSION +1 -1
  11. data/activerecord-oracle_enhanced-adapter.gemspec +29 -26
  12. data/lib/active_record/connection_adapters/{oracle_enhanced_column.rb → oracle_enhanced/column.rb} +14 -63
  13. data/lib/active_record/connection_adapters/oracle_enhanced/column_dumper.rb +66 -0
  14. data/lib/active_record/connection_adapters/{oracle_enhanced_connection.rb → oracle_enhanced/connection.rb} +2 -2
  15. data/lib/active_record/connection_adapters/oracle_enhanced/context_index.rb +347 -0
  16. data/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +260 -0
  17. data/lib/active_record/connection_adapters/oracle_enhanced/dirty.rb +40 -0
  18. data/lib/active_record/connection_adapters/{oracle_enhanced_jdbc_connection.rb → oracle_enhanced/jdbc_connection.rb} +13 -4
  19. data/lib/active_record/connection_adapters/{oracle_enhanced_oci_connection.rb → oracle_enhanced/oci_connection.rb} +11 -5
  20. data/lib/active_record/connection_adapters/{oracle_enhanced_procedures.rb → oracle_enhanced/procedures.rb} +1 -1
  21. data/lib/active_record/connection_adapters/{oracle_enhanced_schema_creation.rb → oracle_enhanced/schema_creation.rb} +34 -35
  22. data/lib/active_record/connection_adapters/oracle_enhanced/schema_definitions.rb +95 -0
  23. data/lib/active_record/connection_adapters/{oracle_enhanced_schema_dumper.rb → oracle_enhanced/schema_dumper.rb} +14 -37
  24. data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb +562 -0
  25. data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements_ext.rb +65 -0
  26. data/lib/active_record/connection_adapters/{oracle_enhanced_structure_dump.rb → oracle_enhanced/structure_dump.rb} +63 -14
  27. data/lib/active_record/connection_adapters/oracle_enhanced/version.rb +1 -0
  28. data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +171 -73
  29. data/lib/active_record/oracle_enhanced/type/integer.rb +13 -0
  30. data/lib/active_record/oracle_enhanced/type/raw.rb +13 -0
  31. data/lib/active_record/oracle_enhanced/type/timestamp.rb +11 -0
  32. data/lib/activerecord-oracle_enhanced-adapter.rb +1 -1
  33. data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +127 -49
  34. data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +46 -5
  35. data/spec/active_record/connection_adapters/oracle_enhanced_context_index_spec.rb +11 -3
  36. data/spec/active_record/connection_adapters/oracle_enhanced_cpk_spec.rb +3 -3
  37. data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +151 -78
  38. data/spec/active_record/connection_adapters/oracle_enhanced_database_tasks_spec.rb +4 -4
  39. data/spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb +10 -16
  40. data/spec/active_record/connection_adapters/oracle_enhanced_emulate_oracle_adapter_spec.rb +1 -1
  41. data/spec/active_record/connection_adapters/oracle_enhanced_procedures_spec.rb +5 -5
  42. data/spec/active_record/connection_adapters/oracle_enhanced_schema_dump_spec.rb +65 -181
  43. data/spec/active_record/connection_adapters/oracle_enhanced_schema_statements_spec.rb +114 -11
  44. data/spec/active_record/connection_adapters/oracle_enhanced_structure_dump_spec.rb +17 -1
  45. data/spec/spec_config.yaml.template +11 -0
  46. data/spec/spec_helper.rb +31 -12
  47. data/spec/support/alter_system_user_password.sql +2 -0
  48. data/spec/support/create_oracle_enhanced_users.sql +31 -0
  49. metadata +37 -27
  50. data/lib/active_record/connection_adapters/oracle_enhanced_column_dumper.rb +0 -77
  51. data/lib/active_record/connection_adapters/oracle_enhanced_context_index.rb +0 -350
  52. data/lib/active_record/connection_adapters/oracle_enhanced_database_statements.rb +0 -262
  53. data/lib/active_record/connection_adapters/oracle_enhanced_dirty.rb +0 -45
  54. data/lib/active_record/connection_adapters/oracle_enhanced_schema_definitions.rb +0 -197
  55. data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements.rb +0 -450
  56. data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements_ext.rb +0 -258
  57. data/lib/active_record/connection_adapters/oracle_enhanced_version.rb +0 -1
  58. /data/lib/active_record/connection_adapters/{oracle_enhanced_cpk.rb → oracle_enhanced/cpk.rb} +0 -0
  59. /data/lib/active_record/connection_adapters/{oracle_enhanced_database_tasks.rb → oracle_enhanced/database_tasks.rb} +0 -0
data/RUNNING_TESTS.md CHANGED
@@ -16,7 +16,9 @@ to increase process limit and then restart the database (this will be necessary
16
16
  Ruby versions
17
17
  -------------
18
18
 
19
- It is recommended to use [RVM](http://rvm.beginrescueend.com) to run tests with different Ruby implementations. oracle_enhanced is mainly tested with MRI 1.8.7 (all Rails versions) and 1.9.2 (Rails 3) and JRuby 1.6.
19
+ oracle_enhanced is tested with MRI 2.1.x and 2.2.x, and JRuby 1.7.x and 9.0.x.x.
20
+
21
+ It is recommended to use [RVM](http://rvm.beginrescueend.com) to run tests with different Ruby implementations.
20
22
 
21
23
  Running tests
22
24
  -------------
@@ -26,19 +28,22 @@ Running tests
26
28
  SQL> CREATE USER oracle_enhanced IDENTIFIED BY oracle_enhanced;
27
29
  SQL> GRANT unlimited tablespace, create session, create table, create sequence, create procedure, create trigger, create view, create materialized view, create database link, create synonym, create type, ctxapp TO oracle_enhanced;
28
30
 
29
- * If you use RVM then switch to corresponding Ruby (1.8.7, 1.9.2 or JRuby) and it is recommended to create isolated gemset for test purposes (e.g. rvm create gemset oracle_enhanced)
31
+ SQL> CREATE USER oracle_enhanced_schema IDENTIFIED BY oracle_enhanced_schema;
32
+ SQL> GRANT unlimited tablespace, create session, create table, create sequence, create procedure, create trigger, create view, create materialized view, create database link, create synonym, create type, ctxapp TO oracle_enhanced_schema;
33
+
34
+ * If you use RVM then switch to corresponding Ruby. It is recommended to create isolated gemsets for test purposes (e.g. rvm create gemset oracle_enhanced)
30
35
 
31
36
  * Install bundler with
32
37
 
33
38
  gem install bundler
34
39
 
35
- * Set RAILS_GEM_VERSION to Rails version that you would like to use in oracle_enhanced tests, e.g.
36
-
37
- export RAILS_GEM_VERSION=3.0.3
38
-
39
40
  * Install necessary gems with
40
41
 
41
42
  bundle install
43
+
44
+ * Configure database credentials in one of two ways:
45
+ * copy spec/spec_config.yaml.template to spec/spec_config.yaml and modify as needed
46
+ * set required environment variables (see DATABASE_NAME in spec_helper.rb)
42
47
 
43
48
  * Run tests with
44
49
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.5.6
1
+ 1.6.9
@@ -5,12 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{activerecord-oracle_enhanced-adapter}
8
- s.version = "1.5.6"
8
+ s.version = "1.6.9"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.license = 'MIT'
12
12
  s.authors = [%q{Raimonds Simanovskis}]
13
- s.date = %q{2015-03-30}
13
+ s.date = %q{2017-03-29}
14
14
  s.description = %q{Oracle "enhanced" ActiveRecord adapter contains useful additional methods for working with new and legacy Oracle databases.
15
15
  This adapter is superset of original ActiveRecord Oracle adapter.
16
16
  }
@@ -30,23 +30,27 @@ This adapter is superset of original ActiveRecord Oracle adapter.
30
30
  "activerecord-oracle_enhanced-adapter.gemspec",
31
31
  "lib/active_record/connection_adapters/emulation/oracle_adapter.rb",
32
32
  "lib/active_record/connection_adapters/oracle_enhanced_adapter.rb",
33
- "lib/active_record/connection_adapters/oracle_enhanced_column.rb",
34
- "lib/active_record/connection_adapters/oracle_enhanced_column_dumper.rb",
35
- "lib/active_record/connection_adapters/oracle_enhanced_connection.rb",
36
- "lib/active_record/connection_adapters/oracle_enhanced_context_index.rb",
37
- "lib/active_record/connection_adapters/oracle_enhanced_cpk.rb",
38
- "lib/active_record/connection_adapters/oracle_enhanced_database_statements.rb",
39
- "lib/active_record/connection_adapters/oracle_enhanced_dirty.rb",
40
- "lib/active_record/connection_adapters/oracle_enhanced_jdbc_connection.rb",
41
- "lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb",
42
- "lib/active_record/connection_adapters/oracle_enhanced_procedures.rb",
43
- "lib/active_record/connection_adapters/oracle_enhanced_schema_creation.rb",
44
- "lib/active_record/connection_adapters/oracle_enhanced_schema_definitions.rb",
45
- "lib/active_record/connection_adapters/oracle_enhanced_schema_dumper.rb",
46
- "lib/active_record/connection_adapters/oracle_enhanced_schema_statements.rb",
47
- "lib/active_record/connection_adapters/oracle_enhanced_schema_statements_ext.rb",
48
- "lib/active_record/connection_adapters/oracle_enhanced_structure_dump.rb",
49
- "lib/active_record/connection_adapters/oracle_enhanced_version.rb",
33
+ "lib/active_record/connection_adapters/oracle_enhanced/column.rb",
34
+ "lib/active_record/connection_adapters/oracle_enhanced/column_dumper.rb",
35
+ "lib/active_record/connection_adapters/oracle_enhanced/connection.rb",
36
+ "lib/active_record/connection_adapters/oracle_enhanced/context_index.rb",
37
+ "lib/active_record/connection_adapters/oracle_enhanced/cpk.rb",
38
+ "lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb",
39
+ "lib/active_record/connection_adapters/oracle_enhanced/dirty.rb",
40
+ "lib/active_record/connection_adapters/oracle_enhanced/database_tasks.rb",
41
+ "lib/active_record/connection_adapters/oracle_enhanced/jdbc_connection.rb",
42
+ "lib/active_record/connection_adapters/oracle_enhanced/oci_connection.rb",
43
+ "lib/active_record/connection_adapters/oracle_enhanced/procedures.rb",
44
+ "lib/active_record/connection_adapters/oracle_enhanced/schema_creation.rb",
45
+ "lib/active_record/connection_adapters/oracle_enhanced/schema_definitions.rb",
46
+ "lib/active_record/connection_adapters/oracle_enhanced/schema_dumper.rb",
47
+ "lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb",
48
+ "lib/active_record/connection_adapters/oracle_enhanced/schema_statements_ext.rb",
49
+ "lib/active_record/connection_adapters/oracle_enhanced/structure_dump.rb",
50
+ "lib/active_record/connection_adapters/oracle_enhanced/version.rb",
51
+ "lib/active_record/oracle_enhanced/type/integer.rb",
52
+ "lib/active_record/oracle_enhanced/type/timestamp.rb",
53
+ "lib/active_record/oracle_enhanced/type/raw.rb",
50
54
  "lib/activerecord-oracle_enhanced-adapter.rb",
51
55
  "spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb",
52
56
  "spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb",
@@ -88,9 +92,9 @@ This adapter is superset of original ActiveRecord Oracle adapter.
88
92
  s.specification_version = 3
89
93
 
90
94
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
91
- s.add_development_dependency(%q<jeweler>, ["~> 1.8"])
95
+ s.add_development_dependency(%q<jeweler>, ["~> 2.0"])
92
96
  s.add_development_dependency(%q<rspec>, ["~> 2.4"])
93
- s.add_development_dependency(%q<activerecord>, [">= 0"])
97
+ s.add_development_dependency(%q<activerecord>, ["~> 4.2.1"])
94
98
  s.add_development_dependency(%q<activemodel>, [">= 0"])
95
99
  s.add_development_dependency(%q<activesupport>, [">= 0"])
96
100
  s.add_development_dependency(%q<actionpack>, [">= 0"])
@@ -100,9 +104,9 @@ This adapter is superset of original ActiveRecord Oracle adapter.
100
104
  s.add_development_dependency(%q<ruby-plsql>, [">= 0.4.4"])
101
105
  s.add_development_dependency(%q<ruby-oci8>, [">= 2.0.4"])
102
106
  else
103
- s.add_dependency(%q<jeweler>, ["~> 1.8"])
107
+ s.add_dependency(%q<jeweler>, ["~> 2.0"])
104
108
  s.add_dependency(%q<rspec>, ["~> 2.4"])
105
- s.add_dependency(%q<activerecord>, [">= 0"])
109
+ s.add_dependency(%q<activerecord>, ["~> 4.2.1"])
106
110
  s.add_dependency(%q<activemodel>, [">= 0"])
107
111
  s.add_dependency(%q<activesupport>, [">= 0"])
108
112
  s.add_dependency(%q<actionpack>, [">= 0"])
@@ -113,9 +117,9 @@ This adapter is superset of original ActiveRecord Oracle adapter.
113
117
  s.add_dependency(%q<ruby-oci8>, [">= 2.0.4"])
114
118
  end
115
119
  else
116
- s.add_dependency(%q<jeweler>, ["~> 1.8"])
120
+ s.add_dependency(%q<jeweler>, ["~> 2.0"])
117
121
  s.add_dependency(%q<rspec>, ["~> 2.4"])
118
- s.add_dependency(%q<activerecord>, [">= 0"])
122
+ s.add_dependency(%q<activerecord>, ["~> 4.2.1"])
119
123
  s.add_dependency(%q<activemodel>, [">= 0"])
120
124
  s.add_dependency(%q<activesupport>, [">= 0"])
121
125
  s.add_dependency(%q<actionpack>, [">= 0"])
@@ -126,4 +130,3 @@ This adapter is superset of original ActiveRecord Oracle adapter.
126
130
  s.add_dependency(%q<ruby-oci8>, [">= 2.0.4"])
127
131
  end
128
132
  end
129
-
@@ -2,11 +2,13 @@ module ActiveRecord
2
2
  module ConnectionAdapters #:nodoc:
3
3
  class OracleEnhancedColumn < Column
4
4
 
5
- attr_reader :table_name, :forced_column_type, :nchar, :virtual_column_data_default, :returning_id #:nodoc:
5
+ attr_reader :table_name, :nchar, :virtual_column_data_default, :returning_id #:nodoc:
6
6
 
7
- def initialize(name, default, sql_type = nil, null = true, table_name = nil, forced_column_type = nil, virtual=false, returning_id=false) #:nodoc:
7
+ FALSE_VALUES << 'N'
8
+ TRUE_VALUES << 'Y'
9
+
10
+ def initialize(name, default, cast_type, sql_type = nil, null = true, table_name = nil, virtual=false, returning_id=false) #:nodoc:
8
11
  @table_name = table_name
9
- @forced_column_type = forced_column_type
10
12
  @virtual = virtual
11
13
  @virtual_column_data_default = default.inspect if virtual
12
14
  @returning_id = returning_id
@@ -15,32 +17,20 @@ module ActiveRecord
15
17
  else
16
18
  default_value = self.class.extract_value_from_default(default)
17
19
  end
18
- super(name, default_value, sql_type, null)
20
+ super(name, default_value, cast_type, sql_type, null)
19
21
  # Is column NCHAR or NVARCHAR2 (will need to use N'...' value quoting for these data types)?
20
22
  # Define only when needed as adapter "quote" method will check at first if instance variable is defined.
21
- @nchar = true if @type == :string && sql_type[0,1] == 'N'
22
- @object_type = sql_type.include? '.'
23
- end
24
-
25
- def type_cast(value) #:nodoc:
26
- case type
27
- when :raw
28
- OracleEnhancedColumn.string_to_raw(value)
29
- when :datetime
30
- OracleEnhancedAdapter.emulate_dates ? guess_date_or_time(value) : super
31
- when :float
32
- !value.nil? ? self.class.value_to_decimal(value) : super
33
- else
34
- super
23
+ if sql_type
24
+ @nchar = true if cast_type.class == ActiveRecord::Type::String && sql_type[0,1] == 'N'
25
+ @object_type = sql_type.include? '.'
35
26
  end
27
+ # TODO: Need to investigate when `sql_type` becomes nil
36
28
  end
37
29
 
38
- def type_cast_code(var_name)
39
- type == :float ? "#{self.class.name}.value_to_decimal(#{var_name})" : super
40
- end
41
-
42
- def klass
43
- type == :float ? BigDecimal : super
30
+ def type_cast(value) #:nodoc:
31
+ return OracleEnhancedColumn::string_to_raw(value) if type == :raw
32
+ return guess_date_or_time(value) if type == :datetime && OracleEnhancedAdapter.emulate_dates
33
+ super
44
34
  end
45
35
 
46
36
  def virtual?
@@ -96,45 +86,6 @@ module ActiveRecord
96
86
 
97
87
  private
98
88
 
99
- def simplified_type(field_type)
100
- forced_column_type ||
101
- case field_type
102
- when /decimal|numeric|number/i
103
- if OracleEnhancedAdapter.emulate_booleans && field_type.upcase == "NUMBER(1)"
104
- :boolean
105
- elsif extract_scale(field_type) == 0 ||
106
- # if column name is ID or ends with _ID
107
- OracleEnhancedAdapter.emulate_integers_by_column_name && OracleEnhancedAdapter.is_integer_column?(name, table_name)
108
- :integer
109
- elsif field_type.upcase == "NUMBER"
110
- OracleEnhancedAdapter.number_datatype_coercion
111
- else
112
- :decimal
113
- end
114
- when /raw/i
115
- :raw
116
- when /char/i
117
- if OracleEnhancedAdapter.emulate_booleans_from_strings &&
118
- OracleEnhancedAdapter.is_boolean_column?(name, field_type, table_name)
119
- :boolean
120
- else
121
- :string
122
- end
123
- when /date/i
124
- if OracleEnhancedAdapter.emulate_dates_by_column_name && OracleEnhancedAdapter.is_date_column?(name, table_name)
125
- :date
126
- else
127
- :datetime
128
- end
129
- when /timestamp/i
130
- :timestamp
131
- when /time/i
132
- :datetime
133
- else
134
- super
135
- end
136
- end
137
-
138
89
  def self.extract_value_from_default(default)
139
90
  case default
140
91
  when String
@@ -0,0 +1,66 @@
1
+ module ActiveRecord #:nodoc:
2
+ module ConnectionAdapters #:nodoc:
3
+ module OracleEnhanced #:nodoc:
4
+ module ColumnDumper #:nodoc:
5
+ def self.included(base) #:nodoc:
6
+ base.class_eval do
7
+ private
8
+ alias_method_chain :column_spec, :oracle_enhanced
9
+ alias_method_chain :prepare_column_options, :oracle_enhanced
10
+ alias_method_chain :migration_keys, :oracle_enhanced
11
+
12
+ def oracle_enhanced_adapter?
13
+ # return original method if not using 'OracleEnhanced'
14
+ if (rails_env = defined?(Rails.env) ? Rails.env : (defined?(RAILS_ENV) ? RAILS_ENV : nil)) &&
15
+ ActiveRecord::Base.configurations[rails_env] &&
16
+ ActiveRecord::Base.configurations[rails_env]['adapter'] != 'oracle_enhanced'
17
+ return false
18
+ else
19
+ return true
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ def column_spec_with_oracle_enhanced(column, types)
26
+ # return original method if not using 'OracleEnhanced'
27
+ return column_spec_without_oracle_enhanced(column, types) unless oracle_enhanced_adapter?
28
+
29
+ spec = prepare_column_options(column, types)
30
+ (spec.keys - [:name, :type]).each do |k|
31
+ key_s = (k == :virtual_type ? "type: " : "#{k.to_s}: ")
32
+ spec[k] = key_s + spec[k]
33
+ end
34
+ spec
35
+ end
36
+
37
+ def prepare_column_options_with_oracle_enhanced(column, types)
38
+ # return original method if not using 'OracleEnhanced'
39
+ return prepare_column_options_without_oracle_enhanced(column, types) unless oracle_enhanced_adapter?
40
+
41
+ spec = {}
42
+ spec[:name] = column.name.inspect
43
+ spec[:type] = column.virtual? ? 'virtual' : column.type.to_s
44
+ spec[:virtual_type] = column.type.inspect if column.virtual? && column.sql_type != 'NUMBER'
45
+ spec[:limit] = column.limit.inspect if column.limit != types[column.type][:limit] && column.type != :decimal
46
+ spec[:precision] = column.precision.inspect if !column.precision.nil?
47
+ spec[:scale] = column.scale.inspect if !column.scale.nil?
48
+ spec[:null] = 'false' if !column.null
49
+ spec[:as] = column.virtual_column_data_default if column.virtual?
50
+ spec[:default] = schema_default(column) if column.has_default? && !column.virtual?
51
+ spec[:comment] = column.comment.inspect unless column.comment.nil?
52
+ spec.delete(:default) if spec[:default].nil?
53
+ spec
54
+ end
55
+
56
+ def migration_keys_with_oracle_enhanced
57
+ # TODO `& column_specs.map(&:keys).flatten` should be exetuted here
58
+ # return original method if not using 'OracleEnhanced'
59
+ return migration_keys_without_oracle_enhanced unless oracle_enhanced_adapter?
60
+
61
+ [:name, :limit, :precision, :scale, :default, :null, :as, :virtual_type, :comment]
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -109,11 +109,11 @@ end
109
109
  # if MRI or YARV
110
110
  if !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby'
111
111
  ORACLE_ENHANCED_CONNECTION = :oci
112
- require 'active_record/connection_adapters/oracle_enhanced_oci_connection'
112
+ require 'active_record/connection_adapters/oracle_enhanced/oci_connection'
113
113
  # if JRuby
114
114
  elsif RUBY_ENGINE == 'jruby'
115
115
  ORACLE_ENHANCED_CONNECTION = :jdbc
116
- require 'active_record/connection_adapters/oracle_enhanced_jdbc_connection'
116
+ require 'active_record/connection_adapters/oracle_enhanced/jdbc_connection'
117
117
  else
118
118
  raise "Unsupported Ruby engine #{RUBY_ENGINE}"
119
119
  end