sunstone 7.1.0.1 → 8.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 +4 -4
- data/ext/active_record/associations/collection_association.rb +1 -2
- data/ext/active_record/associations.rb +7 -7
- data/ext/active_record/finder_methods.rb +5 -0
- data/ext/active_record/persistence.rb +16 -12
- data/ext/active_record/relation/calculations.rb +47 -9
- data/ext/active_record/relation/query_methods.rb +6 -4
- data/ext/active_record/transactions.rb +15 -13
- data/lib/active_record/connection_adapters/sunstone/database_statements.rb +82 -47
- data/lib/active_record/connection_adapters/sunstone/quoting.rb +19 -0
- data/lib/active_record/connection_adapters/sunstone_adapter.rb +27 -44
- data/lib/sunstone/connection.rb +1 -1
- data/lib/sunstone/version.rb +1 -1
- data/lib/sunstone.rb +2 -14
- metadata +10 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd0eae0dbdee21a95ca29317302b67b50647f7d6654af15553425f55d1d11aed
|
4
|
+
data.tar.gz: b0cdc960489411360b1ee4f2cb4cdcce93b7df2464dabdafa2bc26955be002b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce768f425153db1d5a2242f845bc3de221a4d0d0d8a30a1428c128d2bb1e4353ef986020283fdd1d17e7652937c38d03eb1f42478acbc694da32135f335cab22
|
7
|
+
data.tar.gz: ece020a27e0554bad07f0e831919e8969cebdd6970adc344fb4f018b3a45032588dcd7c4eb512d9fcb8ff4acfc09ef27d9fe6124fa2b9db0d5eeff659885d800
|
@@ -6,7 +6,7 @@ module ActiveRecord
|
|
6
6
|
|
7
7
|
def replace(other_array)
|
8
8
|
other_array.each { |val| raise_on_type_mismatch!(val) }
|
9
|
-
original_target = load_target.dup
|
9
|
+
original_target = skip_strict_loading { load_target }.dup
|
10
10
|
|
11
11
|
if owner.new_record?
|
12
12
|
replace_records(other_array, original_target)
|
@@ -52,7 +52,6 @@ module ActiveRecord
|
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
55
|
-
|
56
55
|
end
|
57
56
|
|
58
57
|
class HasManyThroughAssociation
|
@@ -25,13 +25,13 @@ module ActiveRecord
|
|
25
25
|
|
26
26
|
include Module.new {
|
27
27
|
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
def destroy_associations
|
29
|
+
if !self.class.connection.is_a?(ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter)
|
30
|
+
association(:#{middle_reflection.name}).delete_all(:delete_all)
|
31
|
+
association(:#{name}).reset
|
32
|
+
end
|
33
|
+
super
|
32
34
|
end
|
33
|
-
super
|
34
|
-
end
|
35
35
|
RUBY
|
36
36
|
}
|
37
37
|
|
@@ -44,7 +44,7 @@ module ActiveRecord
|
|
44
44
|
end
|
45
45
|
|
46
46
|
has_many name, scope, **hm_options, &extension
|
47
|
-
_reflections[name
|
47
|
+
_reflections[name].parent_reflection = habtm_reflection
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
@@ -8,6 +8,11 @@ module ActiveRecord
|
|
8
8
|
return ["1=0"] if attributes.empty?
|
9
9
|
|
10
10
|
attributes.flat_map do |key, value|
|
11
|
+
if key.is_a?(Array) && key.size == 1
|
12
|
+
key = key.first
|
13
|
+
value = value.flatten
|
14
|
+
end
|
15
|
+
|
11
16
|
if key.is_a?(Array)
|
12
17
|
queries = Array(value).map do |ids_set|
|
13
18
|
raise ArgumentError, "Expected corresponding value for #{key} to be an Array" unless ids_set.is_a?(Array)
|
@@ -104,18 +104,22 @@ module ActiveRecord
|
|
104
104
|
def _create_record(attribute_names = self.attribute_names)
|
105
105
|
attribute_names = attributes_for_create(attribute_names)
|
106
106
|
attribute_values = attributes_with_values(attribute_names)
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
107
|
+
returning_values = nil
|
108
|
+
|
109
|
+
self.class.with_connection do |connection|
|
110
|
+
returning_columns = self.class._returning_columns_for_insert(connection)
|
111
|
+
|
112
|
+
returning_values = self.class._insert_record(
|
113
|
+
connection,
|
114
|
+
attribute_values,
|
115
|
+
returning_columns
|
116
|
+
)
|
117
|
+
|
118
|
+
if !self.class.connection.is_a?(ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter)
|
119
|
+
returning_columns.zip(returning_values).each do |column, value|
|
120
|
+
_write_attribute(column, value) if !_read_attribute(column)
|
121
|
+
end if returning_values
|
122
|
+
end
|
119
123
|
end
|
120
124
|
|
121
125
|
@new_record = false
|
@@ -4,30 +4,68 @@
|
|
4
4
|
module ActiveRecord
|
5
5
|
module Calculations
|
6
6
|
|
7
|
+
# Prior to Rails 8 we didn't need this method becuase it would
|
8
|
+
# return the first value if there was just one - so we'll just
|
9
|
+
# do the same as prevously because it doesn't have to be joined
|
10
|
+
def select_for_count
|
11
|
+
if select_values.empty?
|
12
|
+
:all
|
13
|
+
else
|
14
|
+
with_connection do |conn|
|
15
|
+
# Rails compiles this to a string, but we don't have string we
|
16
|
+
# have a hash
|
17
|
+
if model.connection.is_a?(ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter)
|
18
|
+
sv = arel_columns(select_values)
|
19
|
+
sv.one? ? sv.first : sv
|
20
|
+
else
|
21
|
+
sv = arel_columns(select_values).map { |column| conn.visitor.compile(column) }
|
22
|
+
sv.one? ? sv.first : sv.join(", ")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
7
28
|
def pluck(*column_names)
|
29
|
+
if @none
|
30
|
+
if @async
|
31
|
+
return Promise::Complete.new([])
|
32
|
+
else
|
33
|
+
return []
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
8
37
|
if loaded? && all_attributes?(column_names)
|
9
|
-
|
38
|
+
result = records.pluck(*column_names)
|
39
|
+
if @async
|
40
|
+
return Promise::Complete.new(result)
|
41
|
+
else
|
42
|
+
return result
|
43
|
+
end
|
10
44
|
end
|
11
|
-
|
45
|
+
|
12
46
|
if has_include?(column_names.first)
|
13
47
|
relation = apply_join_dependency
|
14
48
|
relation.pluck(*column_names)
|
15
|
-
elsif
|
49
|
+
elsif model.connection.is_a?(ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter)
|
16
50
|
load
|
17
|
-
return records.pluck(*column_names.map{|n| n.to_s.sub(/^#{
|
51
|
+
return records.pluck(*column_names.map{|n| n.to_s.sub(/^#{model.table_name}\./, "")})
|
18
52
|
else
|
19
|
-
|
20
|
-
columns = arel_columns(column_names)
|
53
|
+
model.disallow_raw_sql!(flattened_args(column_names))
|
21
54
|
relation = spawn
|
55
|
+
columns = relation.arel_columns(column_names)
|
22
56
|
relation.select_values = columns
|
23
57
|
result = skip_query_cache_if_necessary do
|
24
58
|
if where_clause.contradiction?
|
25
|
-
ActiveRecord::Result.empty
|
59
|
+
ActiveRecord::Result.empty(async: @async)
|
26
60
|
else
|
27
|
-
|
61
|
+
model.with_connection do |c|
|
62
|
+
c.select_all(relation.arel, "#{model.name} Pluck", async: @async)
|
63
|
+
end
|
28
64
|
end
|
29
65
|
end
|
30
|
-
|
66
|
+
result.then do |result|
|
67
|
+
type_cast_pluck_values(result, columns)
|
68
|
+
end
|
31
69
|
end
|
32
70
|
end
|
33
71
|
|
@@ -1,9 +1,11 @@
|
|
1
1
|
module ActiveRecord
|
2
2
|
module QueryMethods
|
3
3
|
private
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
|
5
|
+
def assert_modifiable!
|
6
|
+
raise UnmodifiableRelation if @loaded
|
7
|
+
raise UnmodifiableRelation if @arel && !model.connection.is_a?(ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter)
|
8
|
+
end
|
9
|
+
|
8
10
|
end
|
9
11
|
end
|
@@ -34,23 +34,25 @@ module ActiveRecord
|
|
34
34
|
# end
|
35
35
|
|
36
36
|
def with_transaction_returning_status
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
if connection.is_a?(ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter) && instance_variable_defined?(:@sunstone_updating) && @sunstone_updating
|
41
|
-
status = yield
|
42
|
-
else
|
43
|
-
ensure_finalize = !connection.transaction_open?
|
44
|
-
connection.transaction do
|
45
|
-
add_to_transaction(ensure_finalize || has_transactional_callbacks?)
|
46
|
-
remember_transaction_record_state
|
37
|
+
self.class.with_connection do |connection|
|
38
|
+
status = nil
|
39
|
+
# connection = self.class.connection
|
47
40
|
|
41
|
+
if connection.is_a?(ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter) && instance_variable_defined?(:@sunstone_updating) && @sunstone_updating
|
48
42
|
status = yield
|
49
|
-
|
43
|
+
else
|
44
|
+
ensure_finalize = !connection.transaction_open?
|
45
|
+
connection.transaction do
|
46
|
+
add_to_transaction(ensure_finalize || has_transactional_callbacks?)
|
47
|
+
remember_transaction_record_state
|
48
|
+
|
49
|
+
status = yield
|
50
|
+
raise ActiveRecord::Rollback unless status
|
51
|
+
end
|
50
52
|
end
|
51
|
-
end
|
52
53
|
|
53
|
-
|
54
|
+
status
|
55
|
+
end
|
54
56
|
end
|
55
57
|
|
56
58
|
|
@@ -29,7 +29,7 @@ module ActiveRecord
|
|
29
29
|
sar.compile(binds)
|
30
30
|
end
|
31
31
|
|
32
|
-
def to_sar_and_binds(arel_or_sar_string, binds = [], preparable = nil
|
32
|
+
def to_sar_and_binds(arel_or_sar_string, binds = [], preparable = nil, allow_retry = false)
|
33
33
|
# Arel::TreeManager -> Arel::Node
|
34
34
|
if arel_or_sar_string.respond_to?(:ast)
|
35
35
|
arel_or_sar_string = arel_or_sar_string.ast
|
@@ -41,10 +41,13 @@ module ActiveRecord
|
|
41
41
|
"The values must be stored on the AST directly"
|
42
42
|
end
|
43
43
|
|
44
|
-
|
45
|
-
|
44
|
+
col = collector()
|
45
|
+
col.retryable = true
|
46
|
+
sar = visitor.compile(arel_or_sar_string, col)
|
47
|
+
[sar.freeze, sar.binds, false, allow_retry]
|
46
48
|
else
|
47
|
-
|
49
|
+
arel_or_sar_string = arel_or_sar_string.dup.freeze unless arel_or_sar_string.frozen?
|
50
|
+
[arel_or_sar_string, binds, false, allow_retry]
|
48
51
|
end
|
49
52
|
end
|
50
53
|
|
@@ -90,11 +93,15 @@ module ActiveRecord
|
|
90
93
|
end
|
91
94
|
|
92
95
|
# Returns an ActiveRecord::Result instance.
|
93
|
-
def select_all(arel, name = nil, binds = [], preparable: nil, async: false)
|
96
|
+
def select_all(arel, name = nil, binds = [], preparable: nil, async: false, allow_retry: false)
|
94
97
|
arel = arel_from_relation(arel)
|
95
|
-
sar, binds, preparable = to_sar_and_binds(arel, binds, preparable)
|
98
|
+
sar, binds, preparable, allow_retry = to_sar_and_binds(arel, binds, preparable, allow_retry)
|
96
99
|
|
97
|
-
select(sar, name, binds,
|
100
|
+
select(sar, name, binds,
|
101
|
+
prepare: prepared_statements && preparable,
|
102
|
+
async: async && FutureResult::SelectAll,
|
103
|
+
allow_retry: allow_retry
|
104
|
+
)
|
98
105
|
rescue ::RangeError
|
99
106
|
ActiveRecord::Result.empty(async: async)
|
100
107
|
end
|
@@ -112,8 +119,8 @@ module ActiveRecord
|
|
112
119
|
internal_exec_query(sar, name, binds)
|
113
120
|
end
|
114
121
|
|
115
|
-
|
116
|
-
|
122
|
+
# Lowest level way to execute a query. Doesn't check for illegal writes, doesn't annotate queries, yields a native result object.
|
123
|
+
def raw_execute(arel, name = nil, binds = [], prepare: false, async: false, allow_retry: false, materialize_transactions: true, batch: false)
|
117
124
|
multiple_requests = arel.is_a?(Arel::Collectors::Sunstone)
|
118
125
|
type_casted_binds = binds#type_casted_binds(binds)
|
119
126
|
|
@@ -134,66 +141,94 @@ module ActiveRecord
|
|
134
141
|
multiple_requests = true
|
135
142
|
end
|
136
143
|
end
|
137
|
-
|
138
|
-
send_request = lambda { |req_arel|
|
144
|
+
|
145
|
+
send_request = lambda { |conn, req_arel, batch|
|
139
146
|
sar = to_sar(req_arel, type_casted_binds)
|
140
|
-
sars.push(sar)
|
141
147
|
log_mess = sar.path.split('?', 2)
|
142
|
-
log("#{sar.method} #{log_mess[0]} #{(log_mess[1] && !log_mess[1].empty?) ? MessagePack.unpack(CGI.unescape(log_mess[1])) : '' }", name) do
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
148
|
+
log("#{sar.method} #{log_mess[0]} #{(log_mess[1] && !log_mess[1].empty?) ? MessagePack.unpack(CGI.unescape(log_mess[1])) : '' }", name) do |notification_payload|
|
149
|
+
result = perform_query(conn, sar, prepare:, notification_payload:, batch: batch)
|
150
|
+
result.instance_variable_set(:@sunstone_calculation, true) if result && sar.instance_variable_get(:@sunstone_calculation)
|
151
|
+
result
|
152
|
+
end
|
153
|
+
}
|
154
|
+
|
155
|
+
result = with_raw_connection(allow_retry: allow_retry, materialize_transactions: materialize_transactions) do |conn|
|
156
|
+
if multiple_requests
|
157
|
+
binds.delete_at(limit_bind_index) if limit_bind_index
|
158
|
+
|
159
|
+
limit, offset, results = allowed_limit, 0, nil
|
160
|
+
last_affected_rows = 0
|
161
|
+
while requested_limit ? offset < requested_limit : true
|
162
|
+
split_arel = arel.dup
|
163
|
+
split_arel.limit = limit
|
164
|
+
split_arel.offset = offset
|
165
|
+
request_results = send_request.call(conn, split_arel, true)
|
166
|
+
last_affected_rows += @last_affected_rows
|
167
|
+
if results
|
168
|
+
results.push(*request_results)
|
147
169
|
else
|
148
|
-
|
170
|
+
results = request_results
|
149
171
|
end
|
172
|
+
break if request_results.size < limit
|
173
|
+
offset = offset + limit
|
150
174
|
end
|
175
|
+
@last_affected_rows = last_affected_rows
|
176
|
+
results
|
177
|
+
else
|
178
|
+
send_request.call(conn, arel, true)
|
151
179
|
end
|
152
|
-
}
|
153
|
-
|
154
|
-
result = if multiple_requests
|
155
|
-
binds.delete_at(limit_bind_index) if limit_bind_index
|
156
|
-
|
157
|
-
limit, offset, results = allowed_limit, 0, []
|
158
|
-
while requested_limit ? offset < requested_limit : true
|
159
|
-
split_arel = arel.dup
|
160
|
-
split_arel.limit = limit
|
161
|
-
split_arel.offset = offset
|
162
|
-
request_results = send_request.call(split_arel)
|
163
|
-
results = results + request_results
|
164
|
-
break if request_results.size < limit
|
165
|
-
offset = offset + limit
|
166
|
-
end
|
167
|
-
results
|
168
|
-
else
|
169
|
-
send_request.call(arel)
|
170
180
|
end
|
171
|
-
|
172
|
-
|
181
|
+
|
182
|
+
result
|
183
|
+
end
|
184
|
+
|
185
|
+
def perform_query(raw_connection, sar, prepare:, notification_payload:, batch: false)
|
186
|
+
response = raw_connection.send_request(sar)
|
187
|
+
result = response.is_a?(Net::HTTPNoContent) ? nil : JSON.parse(response.body)
|
188
|
+
|
189
|
+
verified!
|
190
|
+
# handle_warnings(result)
|
191
|
+
@last_affected_rows = response['Affected-Rows'] || result&.count || 0
|
192
|
+
notification_payload[:row_count] = @last_affected_rows
|
193
|
+
result
|
194
|
+
end
|
195
|
+
|
196
|
+
# Receive a native adapter result object and returns an ActiveRecord::Result object.
|
197
|
+
def cast_result(raw_result)
|
198
|
+
if raw_result.instance_variable_defined?(:@sunstone_calculation) && raw_result.instance_variable_get(:@sunstone_calculation)
|
173
199
|
# this is a count, min, max.... yea i know..
|
174
|
-
ActiveRecord::Result.new(['all'], [
|
175
|
-
elsif
|
176
|
-
ActiveRecord::Result.new(
|
200
|
+
ActiveRecord::Result.new(['all'], [raw_result], {:all => @type_map.lookup('integer', {})})
|
201
|
+
elsif raw_result.is_a?(Array)
|
202
|
+
ActiveRecord::Result.new(raw_result[0] ? raw_result[0].keys : [], raw_result.map{|r| r.values})
|
177
203
|
else
|
178
|
-
ActiveRecord::Result.new(
|
204
|
+
ActiveRecord::Result.new(raw_result.keys, [raw_result.values])
|
179
205
|
end
|
180
206
|
end
|
207
|
+
|
208
|
+
def affected_rows(raw_result)
|
209
|
+
@last_affected_rows
|
210
|
+
end
|
181
211
|
|
182
|
-
def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
|
212
|
+
def insert(arel, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [], returning: nil)
|
183
213
|
sar, binds = to_sar_and_binds(arel, binds)
|
184
|
-
value = exec_insert(sar, name, binds, pk, sequence_name)
|
214
|
+
value = exec_insert(sar, name, binds, pk, sequence_name, returning: returning)
|
185
215
|
|
186
216
|
return returning_column_values(value) unless returning.nil?
|
187
217
|
|
188
218
|
id_value || last_inserted_id(value)
|
189
219
|
end
|
190
|
-
|
220
|
+
alias create insert
|
221
|
+
|
222
|
+
# Executes the update statement and returns the number of rows affected.
|
191
223
|
def update(arel, name = nil, binds = [])
|
192
|
-
|
224
|
+
sar, binds = to_sar_and_binds(arel, binds)
|
225
|
+
internal_exec_query(sar, name, binds)
|
193
226
|
end
|
194
227
|
|
228
|
+
# Executes the delete statement and returns the number of rows affected.
|
195
229
|
def delete(arel, name = nil, binds = [])
|
196
|
-
|
230
|
+
sql, binds = to_sar_and_binds(arel, binds)
|
231
|
+
exec_delete(sql, name, binds)
|
197
232
|
end
|
198
233
|
|
199
234
|
def last_inserted_id(result)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
module ConnectionAdapters
|
3
|
+
module Sunstone
|
4
|
+
module Quoting
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
module ClassMethods # :nodoc:
|
8
|
+
|
9
|
+
# Quotes column names for use in SQL queries.
|
10
|
+
def quote_column_name(name) # :nodoc:
|
11
|
+
name
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -3,6 +3,7 @@ require 'active_record/connection_adapters/abstract_adapter'
|
|
3
3
|
require 'arel/nodes/relation'
|
4
4
|
require 'arel/visitors/to_sql_extensions'
|
5
5
|
|
6
|
+
require 'active_record/connection_adapters/sunstone/quoting'
|
6
7
|
require 'active_record/connection_adapters/sunstone/database_statements'
|
7
8
|
require 'active_record/connection_adapters/sunstone/schema_statements'
|
8
9
|
require 'active_record/connection_adapters/sunstone/schema_dumper'
|
@@ -15,19 +16,6 @@ require 'active_record/connection_adapters/sunstone/type/uuid'
|
|
15
16
|
require 'active_record/connection_adapters/sunstone/type/json'
|
16
17
|
|
17
18
|
module ActiveRecord
|
18
|
-
module ConnectionHandling # :nodoc:
|
19
|
-
|
20
|
-
def sunstone_adapter_class
|
21
|
-
ConnectionAdapters::SunstoneAPIAdapter
|
22
|
-
end
|
23
|
-
|
24
|
-
# Establishes a connection to the database that's used by all Active Record
|
25
|
-
# objects
|
26
|
-
def sunstone_connection(config)
|
27
|
-
sunstone_adapter_class.new(config)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
19
|
module ConnectionAdapters
|
32
20
|
# The SunstoneAPI adapter.
|
33
21
|
#
|
@@ -56,7 +44,7 @@ module ActiveRecord
|
|
56
44
|
end
|
57
45
|
end
|
58
46
|
|
59
|
-
|
47
|
+
include Sunstone::Quoting
|
60
48
|
# include PostgreSQL::ReferentialIntegrity
|
61
49
|
include Sunstone::SchemaStatements
|
62
50
|
include Sunstone::DatabaseStatements
|
@@ -104,23 +92,30 @@ module ActiveRecord
|
|
104
92
|
end
|
105
93
|
|
106
94
|
def active?
|
107
|
-
@
|
108
|
-
|
109
|
-
|
110
|
-
def load_type_map
|
111
|
-
@type_map = Type::HashLookupTypeMap.new
|
112
|
-
initialize_type_map(@type_map)
|
95
|
+
@lock.synchronize do
|
96
|
+
@raw_connection&.active?
|
97
|
+
end
|
113
98
|
end
|
114
99
|
|
115
|
-
|
116
|
-
|
117
|
-
|
100
|
+
# Connects to a StandardAPI server and sets up the adapter depending
|
101
|
+
# on the connected server's characteristics.
|
102
|
+
def connect
|
103
|
+
@raw_connection = self.class.new_client(@connection_parameters)
|
118
104
|
end
|
119
105
|
|
106
|
+
def reconnect
|
107
|
+
@lock.synchronize do
|
108
|
+
@raw_connection&.reconnect!
|
109
|
+
connect unless @raw_connection
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
120
113
|
def disconnect!
|
121
|
-
|
122
|
-
|
123
|
-
|
114
|
+
@lock.synchronize do
|
115
|
+
super
|
116
|
+
@raw_connection&.disconnect!
|
117
|
+
@raw_connection = nil
|
118
|
+
end
|
124
119
|
end
|
125
120
|
|
126
121
|
def discard! # :nodoc:
|
@@ -128,12 +123,6 @@ module ActiveRecord
|
|
128
123
|
@raw_connection = nil
|
129
124
|
end
|
130
125
|
|
131
|
-
# Executes the delete statement and returns the number of rows affected.
|
132
|
-
def delete(arel, name = nil, binds = [])
|
133
|
-
r = exec_delete(arel, name, binds)
|
134
|
-
r.rows.first.to_i
|
135
|
-
end
|
136
|
-
|
137
126
|
def native_database_types #:nodoc:
|
138
127
|
NATIVE_DATABASE_TYPES
|
139
128
|
end
|
@@ -169,6 +158,7 @@ module ActiveRecord
|
|
169
158
|
end
|
170
159
|
|
171
160
|
def lookup_cast_type_from_column(column) # :nodoc:
|
161
|
+
verify! if type_map.nil?
|
172
162
|
cast_type = @type_map.lookup(column.sql_type, {
|
173
163
|
limit: column.limit,
|
174
164
|
precision: column.precision,
|
@@ -205,20 +195,11 @@ module ActiveRecord
|
|
205
195
|
end
|
206
196
|
alias create insert
|
207
197
|
|
208
|
-
# Connects to a StandardAPI server and sets up the adapter depending
|
209
|
-
# on the connected server's characteristics.
|
210
|
-
def connect
|
211
|
-
@raw_connection = self.class.new_client(@connection_parameters)
|
212
|
-
end
|
213
|
-
|
214
|
-
def reconnect
|
215
|
-
@raw_connection&.reconnect!
|
216
|
-
connect unless @raw_connection
|
217
|
-
end
|
218
|
-
|
219
198
|
# Configures the encoding, verbosity, schema search path, and time zone of the connection.
|
220
199
|
# This is called by #connect and should not be called manually.
|
221
200
|
def configure_connection
|
201
|
+
super
|
202
|
+
|
222
203
|
reload_type_map
|
223
204
|
end
|
224
205
|
|
@@ -233,7 +214,9 @@ module ActiveRecord
|
|
233
214
|
end
|
234
215
|
|
235
216
|
private
|
236
|
-
|
217
|
+
|
218
|
+
attr_reader :type_map
|
219
|
+
|
237
220
|
def initialize_type_map(m = nil)
|
238
221
|
self.class.initialize_type_map(m || @type_map)
|
239
222
|
end
|
data/lib/sunstone/connection.rb
CHANGED
@@ -203,7 +203,7 @@ module Sunstone
|
|
203
203
|
close_connection = false
|
204
204
|
@connection.request(request) do |response|
|
205
205
|
if response['Deprecation-Notice']
|
206
|
-
|
206
|
+
::ActiveRecord.deprecator.warn(response['Deprecation-Notice'])
|
207
207
|
end
|
208
208
|
|
209
209
|
validate_response_code(response)
|
data/lib/sunstone/version.rb
CHANGED
data/lib/sunstone.rb
CHANGED
@@ -39,17 +39,5 @@ require File.expand_path(File.join(__FILE__, '../../ext/arel/attributes/empty_re
|
|
39
39
|
require File.expand_path(File.join(__FILE__, '../../ext/arel/nodes/select_statement'))
|
40
40
|
require File.expand_path(File.join(__FILE__, '../../ext/active_record/finder_methods'))
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
require 'active_record/database_configurations'
|
45
|
-
class ActiveRecord::DatabaseConfigurations::UrlConfig
|
46
|
-
private
|
47
|
-
def build_url_hash
|
48
|
-
if url.nil? || %w(jdbc: http: https:).any? { |protocol| url.start_with?(protocol) }
|
49
|
-
{ url: url }
|
50
|
-
else
|
51
|
-
ConnectionUrlResolver.new(url).to_hash
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
42
|
+
|
43
|
+
ActiveRecord::ConnectionAdapters.register("sunstone", "ActiveRecord::ConnectionAdapters::SunstoneAPIAdapter", "active_record/connection_adapters/sunstone_adapter")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sunstone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 8.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jon Bracy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
117
|
+
version: 6.5.0
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
124
|
+
version: 6.5.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: webmock
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -184,14 +184,14 @@ dependencies:
|
|
184
184
|
requirements:
|
185
185
|
- - ">="
|
186
186
|
- !ruby/object:Gem::Version
|
187
|
-
version: 7.
|
187
|
+
version: 7.2.0
|
188
188
|
type: :development
|
189
189
|
prerelease: false
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
191
191
|
requirements:
|
192
192
|
- - ">="
|
193
193
|
- !ruby/object:Gem::Version
|
194
|
-
version: 7.
|
194
|
+
version: 7.2.0
|
195
195
|
- !ruby/object:Gem::Dependency
|
196
196
|
name: msgpack
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -226,14 +226,14 @@ dependencies:
|
|
226
226
|
requirements:
|
227
227
|
- - ">="
|
228
228
|
- !ruby/object:Gem::Version
|
229
|
-
version:
|
229
|
+
version: 8.0.1
|
230
230
|
type: :runtime
|
231
231
|
prerelease: false
|
232
232
|
version_requirements: !ruby/object:Gem::Requirement
|
233
233
|
requirements:
|
234
234
|
- - ">="
|
235
235
|
- !ruby/object:Gem::Version
|
236
|
-
version:
|
236
|
+
version: 8.0.1
|
237
237
|
- !ruby/object:Gem::Dependency
|
238
238
|
name: arel-extensions
|
239
239
|
requirement: !ruby/object:Gem::Requirement
|
@@ -288,6 +288,7 @@ files:
|
|
288
288
|
- ext/arel/select_manager.rb
|
289
289
|
- lib/active_record/connection_adapters/sunstone/column.rb
|
290
290
|
- lib/active_record/connection_adapters/sunstone/database_statements.rb
|
291
|
+
- lib/active_record/connection_adapters/sunstone/quoting.rb
|
291
292
|
- lib/active_record/connection_adapters/sunstone/schema_dumper.rb
|
292
293
|
- lib/active_record/connection_adapters/sunstone/schema_statements.rb
|
293
294
|
- lib/active_record/connection_adapters/sunstone/type/array.rb
|
@@ -323,7 +324,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
323
324
|
- !ruby/object:Gem::Version
|
324
325
|
version: '0'
|
325
326
|
requirements: []
|
326
|
-
rubygems_version: 3.
|
327
|
+
rubygems_version: 3.5.21
|
327
328
|
signing_key:
|
328
329
|
specification_version: 4
|
329
330
|
summary: A library for interacting with REST APIs
|