activerecord-oracle_enhanced-adapter-monky_patch_755 0.3.0 → 1.0.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.
- 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.'
|