activerecord-oracle_enhanced-adapter-monky_patch_755 0.3.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +3 -1
- data/lib/activerecord/monkey_patch/rails5_1.rb +15 -0
- data/lib/activerecord/monkey_patch/rails5_2.rb +219 -0
- data/lib/oracle_enhanced/monkey_patch_755/version.rb +1 -1
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 06fe1c2f06a608758e071627802d4ddfdfb6b650d0a41c0f6359adda79e31af4
|
4
|
+
data.tar.gz: 80f000c4cb4114014d0a1c4b1f7d2586ff449aa1d7ca63f063ab3d6c3d86e40d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1387e40b2fa4d8c0a916e1b9170511c90b93b0c60618f3891ab0a3d3e2fb04318f70d48b5dc33c2961cb32f0886c4180e3a74de7b2c31fff18fcceb9cf36d0e2
|
7
|
+
data.tar.gz: 51aa051b7dde9d41082f9ebb8cb42ffb262d5626f79b4af110db40d00c2460b52cc9b465dc31af4c34aca4a3fe5512576c0f2f9a97ce831f940fbbbd2d2aaf23
|
data/README.md
CHANGED
@@ -2,7 +2,9 @@
|
|
2
2
|
|
3
3
|
A monkey patch for oracle-enhanced ISSUE [#755](https://github.com/rsim/oracle-enhanced/issues/755).
|
4
4
|
|
5
|
-
**ISSUE #755 has been resolved
|
5
|
+
**ISSUE #755 has been resolved on activerecord-oracle_enhanced-adapter 1.7.3 or higher.**
|
6
|
+
|
7
|
+
The development of this gem has ended. Rails 5.2 or higher are not supported.
|
6
8
|
|
7
9
|
## Installation
|
8
10
|
|
@@ -184,6 +184,21 @@ module ActiveRecord
|
|
184
184
|
end
|
185
185
|
end
|
186
186
|
end
|
187
|
+
|
188
|
+
module SchemaStatements
|
189
|
+
# https://github.com/rsim/oracle-enhanced/blob/v1.7.9/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb#L290
|
190
|
+
def change_column_null(table_name, column_name, null, default = nil) #:nodoc:
|
191
|
+
column = column_for(table_name, column_name)
|
192
|
+
|
193
|
+
unless null || default.nil?
|
194
|
+
execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL")
|
195
|
+
end
|
196
|
+
|
197
|
+
sql_type = column.sql_type.to_s == 'DATETIME' ? 'DATE' : column.sql_type # monkey_patched
|
198
|
+
|
199
|
+
change_column table_name, column_name, sql_type, :null => null
|
200
|
+
end
|
201
|
+
end
|
187
202
|
end
|
188
203
|
end
|
189
204
|
|
@@ -0,0 +1,219 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module MonkeyPatch
|
3
|
+
SUPPORTED_MAJOR_VERSION = 5
|
4
|
+
MINIMUM_SUPPORTED_VERSION = '5.2.0'.freeze
|
5
|
+
end
|
6
|
+
|
7
|
+
module ConnectionAdapters
|
8
|
+
#
|
9
|
+
# This is a monkey patch to the problem below.
|
10
|
+
# As a result of `bin/rails db:schema:dump`, the `DATE` type column expects to return `t.datetime :created_at`.
|
11
|
+
# But actually `t.date :created_at` is returned.
|
12
|
+
#
|
13
|
+
# Perhaps, converting the `DATE` type created in Rails 4 to `TIMESTAMP(6)` type that is used in Rails 5 makes
|
14
|
+
# this monkey patch unnecessary.
|
15
|
+
#
|
16
|
+
# Original code is the following URL.
|
17
|
+
#
|
18
|
+
# https://github.com/rails/rails/blob/v5.2.1/activerecord/lib/active_record/connection_adapters/abstract/schema_dumper.rb#L13-L15
|
19
|
+
#
|
20
|
+
module ColumnDumper
|
21
|
+
def column_spec(column)
|
22
|
+
# The following 2 lines are a main monkey patch in this method.
|
23
|
+
spec = Hash[prepare_column_options(column).map { |k, v| [k, "#{k}: #{v}"] }]
|
24
|
+
|
25
|
+
schema_type = (column.type == :date) ? :datetime : schema_type_with_virtual(column)
|
26
|
+
|
27
|
+
[schema_type, prepare_column_options(column)]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module OracleEnhanced
|
32
|
+
module SchemaStatements
|
33
|
+
|
34
|
+
#
|
35
|
+
# Original code is the following URL.
|
36
|
+
# https://github.com/rsim/oracle-enhanced/blob/v5.2.3/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb#L618-L652
|
37
|
+
#
|
38
|
+
def new_column_from_field(table_name, field)
|
39
|
+
limit, scale = field["limit"], field["scale"]
|
40
|
+
if limit || scale
|
41
|
+
field["sql_type"] += "(#{(limit || 38).to_i}" + ((scale = scale.to_i) > 0 ? ",#{scale})" : ")")
|
42
|
+
end
|
43
|
+
|
44
|
+
if field["sql_type_owner"]
|
45
|
+
field["sql_type"] = field["sql_type_owner"] + "." + field["sql_type"]
|
46
|
+
end
|
47
|
+
|
48
|
+
is_virtual = field["virtual_column"] == "YES"
|
49
|
+
|
50
|
+
# clean up odd default spacing from Oracle
|
51
|
+
if field["data_default"] && !is_virtual
|
52
|
+
field["data_default"].sub!(/^(.*?)\s*$/, '\1')
|
53
|
+
|
54
|
+
# If a default contains a newline these cleanup regexes need to
|
55
|
+
# match newlines.
|
56
|
+
field["data_default"].sub!(/^'(.*)'$/m, '\1')
|
57
|
+
field["data_default"] = nil if field["data_default"] =~ /^(null|empty_[bc]lob\(\))$/i
|
58
|
+
# TODO: Needs better fix to fallback "N" to false
|
59
|
+
field["data_default"] = false if (field["data_default"] == "N" && OracleEnhancedAdapter.emulate_booleans_from_strings)
|
60
|
+
end
|
61
|
+
|
62
|
+
type_metadata = fetch_type_metadata(field["sql_type"], is_virtual)
|
63
|
+
|
64
|
+
# *** Its a monkey patch paragraph. ***
|
65
|
+
p "sql_type: #{type_metadata.sql_type}"
|
66
|
+
if /date/i === type_metadata.sql_type
|
67
|
+
if type_metadata.type == :date
|
68
|
+
type_metadata.instance_eval('@sql_type = "DATETIME"')
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
default_value = extract_value_from_default(field["data_default"])
|
73
|
+
default_value = nil if is_virtual
|
74
|
+
OracleEnhanced::Column.new(oracle_downcase(field["name"]),
|
75
|
+
default_value,
|
76
|
+
type_metadata,
|
77
|
+
field["nullable"] == "Y",
|
78
|
+
table_name,
|
79
|
+
field["column_comment"]
|
80
|
+
)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
class OracleEnhancedAdapter
|
86
|
+
#
|
87
|
+
# `supports_datetime_with_precision?` method and `native_database_types` method are overwriting
|
88
|
+
# the mapping between Rails and Oracle type to match Rails 4.2 behavior.
|
89
|
+
#
|
90
|
+
# The following is the SQL type when generating datetime column.
|
91
|
+
#
|
92
|
+
# - Rails 5 ... `TIMESTAMP(6)' SQL type.
|
93
|
+
# - Rails 4 ... `DATE' SQL type. ***This is the behavior of the monkey patch***.
|
94
|
+
#
|
95
|
+
# Original code is the following URL.
|
96
|
+
#
|
97
|
+
# https://github.com/rsim/oracle-enhanced/blob/v5.2.3/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb
|
98
|
+
#
|
99
|
+
def supports_datetime_with_precision?
|
100
|
+
false
|
101
|
+
end
|
102
|
+
|
103
|
+
def native_database_types
|
104
|
+
native_database_types_patch = {
|
105
|
+
datetime: { name: "DATE" },
|
106
|
+
time: { name: "DATE" }
|
107
|
+
}
|
108
|
+
|
109
|
+
if emulate_booleans_from_strings
|
110
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter::NATIVE_DATABASE_TYPES_BOOLEAN_STRINGS.dup.merge(native_database_types_patch)
|
111
|
+
else
|
112
|
+
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter::NATIVE_DATABASE_TYPES.dup.merge(native_database_types_patch)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
module OracleEnhanced
|
118
|
+
module Quoting
|
119
|
+
#
|
120
|
+
# Original code has been removed.
|
121
|
+
#
|
122
|
+
# https://github.com/rsim/oracle-enhanced/commit/28dd91ccbbbf8e1e313ba816257ad281860f100b
|
123
|
+
#
|
124
|
+
def quote(value)
|
125
|
+
# p caller.each {|c| p c }
|
126
|
+
p "*** quote: #{value}"
|
127
|
+
p "*** quote: #{value.class}"
|
128
|
+
case value
|
129
|
+
when ::Date, ::Time, ::DateTime # *** Its a monky patch condition. ***
|
130
|
+
p "xxx quote: #{value.class}"
|
131
|
+
p "xxx quote acts_like?: #{value.acts_like?(:time)}"
|
132
|
+
if value.acts_like?(:time)
|
133
|
+
zone_conversion_method = ActiveRecord::Base.default_timezone == :utc ? :getutc : :getlocal
|
134
|
+
|
135
|
+
# p "*** quote respond_to?: #{value.respond_to?(zone_conversion_method)}"
|
136
|
+
if value.respond_to?(zone_conversion_method)
|
137
|
+
value = value.send(zone_conversion_method)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# p "*** quote to_s(:db): #{value.to_s(:db)}"
|
142
|
+
"'#{value.to_s(:db)}'"
|
143
|
+
else
|
144
|
+
super
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
#
|
149
|
+
# Follow up to https://github.com/rsim/oracle-enhanced/pull/1267/commits/f26432f679fb836f4f4d72f6a7e9999da175ac91
|
150
|
+
#
|
151
|
+
def _type_cast(value)
|
152
|
+
# p "*** _type_cast: #{value}"
|
153
|
+
# p "*** _type_cast: #{value.class}"
|
154
|
+
case value
|
155
|
+
when Date, Time # *** Its a monky patch condition. ***
|
156
|
+
if value.acts_like?(:time)
|
157
|
+
zone_conversion_method = ActiveRecord::Base.default_timezone == :utc ? :getutc : :getlocal
|
158
|
+
value.respond_to?(zone_conversion_method) ? value.send(zone_conversion_method) : value
|
159
|
+
else
|
160
|
+
value
|
161
|
+
end
|
162
|
+
when ActiveRecord::Type::OracleEnhanced::NationalCharacterString::Data
|
163
|
+
value.to_s
|
164
|
+
else
|
165
|
+
super
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
#
|
173
|
+
# Original code is the following URL.
|
174
|
+
#
|
175
|
+
# https://github.com/rails/rails/blob/v5.2.0.beta2/activerecord/lib/active_record/relation/where_clause_factory.rb
|
176
|
+
#
|
177
|
+
class Relation
|
178
|
+
class WhereClauseFactory
|
179
|
+
def build(opts, other)
|
180
|
+
# p "*** WhereClauseFactory #{opts}"
|
181
|
+
# p "*** WhereClauseFactory #{opts.class}"
|
182
|
+
case opts
|
183
|
+
when String, Array
|
184
|
+
parts = [klass.send(:sanitize_sql, other.empty? ? opts : ([opts] + other))]
|
185
|
+
when Hash
|
186
|
+
opts = ActiveRecord::MonkeyPatch.adjust_timezone_offset(opts)
|
187
|
+
|
188
|
+
attributes = predicate_builder.resolve_column_aliases(opts)
|
189
|
+
attributes = klass.send(:expand_hash_conditions_for_aggregates, attributes)
|
190
|
+
attributes.stringify_keys!
|
191
|
+
|
192
|
+
parts = predicate_builder.build_from_hash(attributes)
|
193
|
+
when Arel::Nodes::Node
|
194
|
+
parts = [opts]
|
195
|
+
else
|
196
|
+
raise ArgumentError, "Unsupported argument type: #{opts} (#{opts.class})"
|
197
|
+
end
|
198
|
+
|
199
|
+
WhereClause.new(parts)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
#
|
205
|
+
# Original code is the following URL.
|
206
|
+
# https://github.com/rails/rails/blob/v5.2.0.beta2/activerecord/lib/active_record/statement_cache.rb#L83-L87
|
207
|
+
#
|
208
|
+
class StatementCache # :nodoc:
|
209
|
+
class BindMap # :nodoc:
|
210
|
+
def bind(values)
|
211
|
+
values = ActiveRecord::MonkeyPatch.adjust_timezone_offset(values)
|
212
|
+
|
213
|
+
bas = @bound_attributes.dup
|
214
|
+
@indexes.each_with_index { |offset, i| bas[offset] = bas[offset].with_cast_value(values[i]) }
|
215
|
+
bas
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-oracle_enhanced-adapter-monky_patch_755
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Koichi ITO
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -17,6 +17,9 @@ dependencies:
|
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 4.2.1
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '5.2'
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -24,6 +27,9 @@ dependencies:
|
|
24
27
|
- - ">="
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: 4.2.1
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '5.2'
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: activerecord-oracle_enhanced-adapter
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,6 +65,9 @@ dependencies:
|
|
59
65
|
- - ">="
|
60
66
|
- !ruby/object:Gem::Version
|
61
67
|
version: 4.2.1
|
68
|
+
- - "<"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '5.2'
|
62
71
|
type: :development
|
63
72
|
prerelease: false
|
64
73
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -66,6 +75,9 @@ dependencies:
|
|
66
75
|
- - ">="
|
67
76
|
- !ruby/object:Gem::Version
|
68
77
|
version: 4.2.1
|
78
|
+
- - "<"
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '5.2'
|
69
81
|
- !ruby/object:Gem::Dependency
|
70
82
|
name: rspec
|
71
83
|
requirement: !ruby/object:Gem::Requirement
|
@@ -93,6 +105,7 @@ files:
|
|
93
105
|
- lib/activerecord/monkey_patch/rails4_2.rb
|
94
106
|
- lib/activerecord/monkey_patch/rails5_0.rb
|
95
107
|
- lib/activerecord/monkey_patch/rails5_1.rb
|
108
|
+
- lib/activerecord/monkey_patch/rails5_2.rb
|
96
109
|
- lib/oracle_enhanced/monkey_patch_755/hooks.rb
|
97
110
|
- lib/oracle_enhanced/monkey_patch_755/railtie.rb
|
98
111
|
- lib/oracle_enhanced/monkey_patch_755/version.rb
|
@@ -108,6 +121,8 @@ post_install_message: |
|
|
108
121
|
Upgrade Rails 4.2 or older version to Rails 5.
|
109
122
|
See https://github.com/rsim/oracle-enhanced#upgrade-rails-42-or-older-version-to-rails-5
|
110
123
|
|
124
|
+
Also this gem doesn't support Rails 5.2 or higher.
|
125
|
+
|
111
126
|
Thank you.
|
112
127
|
rdoc_options: []
|
113
128
|
require_paths:
|
@@ -123,8 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
138
|
- !ruby/object:Gem::Version
|
124
139
|
version: '0'
|
125
140
|
requirements: []
|
126
|
-
|
127
|
-
rubygems_version: 2.6.12
|
141
|
+
rubygems_version: 3.0.2
|
128
142
|
signing_key:
|
129
143
|
specification_version: 4
|
130
144
|
summary: 'A monkey patch for oracle-enhanced ISSUE #755.'
|