neo4j-ruby-driver 4.4.0.alpha.7 → 4.4.0.alpha.8
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/ruby/neo4j/driver/graph_database.rb +2 -2
- data/ruby/neo4j/driver/internal/async/inbound/inbound_message_dispatcher.rb +2 -3
- data/ruby/neo4j/driver/internal/async/unmanaged_transaction.rb +18 -20
- data/ruby/neo4j/driver/internal/cluster/cluster_routing_table.rb +2 -2
- data/ruby/neo4j/driver/internal/cluster/single_database_routing_procedure_runner.rb +11 -13
- data/ruby/neo4j/driver/internal/cursor/async_result_cursor_impl.rb +29 -18
- data/ruby/neo4j/driver/internal/cursor/disposable_async_result_cursor.rb +2 -2
- data/ruby/neo4j/driver/internal/handlers/commit_tx_response_handler.rb +4 -4
- data/ruby/neo4j/driver/internal/handlers/legacy_pull_all_response_handler.rb +60 -31
- data/ruby/neo4j/driver/internal/handlers/pulln/auto_pull_response_handler.rb +33 -44
- data/ruby/neo4j/driver/internal/handlers/rollback_tx_response_handler.rb +7 -1
- data/ruby/neo4j/driver/internal/internal_result.rb +5 -5
- data/ruby/neo4j/driver/internal/internal_session.rb +1 -1
- data/ruby/neo4j/driver/internal/internal_transaction.rb +4 -4
- data/ruby/neo4j/driver/internal/messaging/request/abstract_streaming_message.rb +4 -1
- data/ruby/neo4j/driver/internal/messaging/v3/bolt_protocol_v3.rb +7 -3
- data/ruby/neo4j/driver/internal/resolved_bolt_server_address.rb +1 -1
- data/ruby/neo4j/driver/internal/util/result_holder.rb +70 -0
- data/ruby/neo4j/driver/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d282964e01764e3a21d07c1e836567b3bc1f334e08d45b7392984db661faa14a
|
4
|
+
data.tar.gz: afc45978f3583f6f491c75c5f4f9da89099620d0be88c0367c8e9469554ecc20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a40657edbf022793691d6926f93ae779d4b671878cdbd29538a0ff83bd82de1912210380715390219503a1fbfb3ada37ae70cce66e6184664b1a90fbff12f80
|
7
|
+
data.tar.gz: 4ae8f0cb141fc923df3fc8bfab0696adb979a40331e76a440096eb64b3d8060a2f70e49934ed6af06015f734cc1d4f85468b0118b3231db1df4369ff93c0fa63
|
@@ -26,12 +26,12 @@ module Neo4j::Driver
|
|
26
26
|
)
|
27
27
|
end
|
28
28
|
|
29
|
-
def routing_driver(routing_uris,
|
29
|
+
def routing_driver(routing_uris, auth_token, **config)
|
30
30
|
assert_routing_uris(routing_uris)
|
31
31
|
log = Config.new(**config)[:logger]
|
32
32
|
|
33
33
|
routing_uris.each do |uri|
|
34
|
-
driver = driver(uri,
|
34
|
+
driver = driver(uri, auth_token, **config)
|
35
35
|
begin
|
36
36
|
return driver.tap(&:verify_connectivity)
|
37
37
|
rescue Exceptions::ServiceUnavailableException => e
|
@@ -59,7 +59,8 @@ module Neo4j::Driver
|
|
59
59
|
raise @current_error if Util::ErrorUtil.fatal?(@current_error) # TODO clarify
|
60
60
|
|
61
61
|
if @current_error.is_a?(Exceptions::AuthorizationExpiredException)
|
62
|
-
|
62
|
+
# TODO: ??????
|
63
|
+
# Connection::ChannelAttributes.authorization_state_listener(@channel).on_expired(@current_error, @channel)
|
63
64
|
else
|
64
65
|
# write a RESET to "acknowledge" the failure
|
65
66
|
enqueue(Handlers::ResetResponseHandler.new(self))
|
@@ -115,8 +116,6 @@ module Neo4j::Driver
|
|
115
116
|
end
|
116
117
|
|
117
118
|
def clear_current_error
|
118
|
-
raise @current_error if @current_error
|
119
|
-
ensure
|
120
119
|
@current_error = nil
|
121
120
|
end
|
122
121
|
|
@@ -52,28 +52,30 @@ module Neo4j::Driver
|
|
52
52
|
def close_async(commit = false, complete_with_null_if_not_open = true)
|
53
53
|
@lock.synchronize do
|
54
54
|
if complete_with_null_if_not_open && !open?
|
55
|
-
nil
|
55
|
+
Util::ResultHolder.successful(nil)
|
56
56
|
elsif @state == State::COMMITTED
|
57
|
-
|
57
|
+
Util::ResultHolder.failed(Neo4j::Driver::Exceptions::ClientException.new(
|
58
|
+
commit ? CANT_COMMIT_COMMITTED_MSG : CANT_ROLLBACK_COMMITTED_MSG))
|
58
59
|
elsif @state == State::ROLLED_BACK
|
59
|
-
|
60
|
+
Util::ResultHolder.failed(Neo4j::Driver::Exceptions::ClientException.new(
|
61
|
+
commit ? CANT_COMMIT_ROLLED_BACK_MSG : CANT_ROLLBACK_ROLLED_BACK_MSG))
|
60
62
|
else
|
61
63
|
if commit
|
62
64
|
if @rollback_pending
|
63
|
-
|
65
|
+
Util::ResultHolder.failed(Neo4j::Driver::Exceptions::ClientException.new(CANT_COMMIT_ROLLING_BACK_MSG))
|
64
66
|
elsif @commit_pending
|
65
67
|
@commit_pending
|
66
68
|
else
|
67
|
-
@commit_pending =
|
69
|
+
@commit_pending = Util::ResultHolder.new
|
68
70
|
nil
|
69
71
|
end
|
70
72
|
else
|
71
73
|
if @commit_pending
|
72
|
-
|
74
|
+
Util::ResultHolder.failed(Neo4j::Driver::Exceptions::ClientException.new(CANT_ROLLBACK_COMMITTING_MSG))
|
73
75
|
elsif @rollback_pending
|
74
76
|
@rollback_pending
|
75
77
|
else
|
76
|
-
@rollback_pending =
|
78
|
+
@rollback_pending = Util::ResultHolder.new
|
77
79
|
nil
|
78
80
|
end
|
79
81
|
end
|
@@ -83,22 +85,18 @@ module Neo4j::Driver
|
|
83
85
|
if commit
|
84
86
|
target_future = @commit_pending
|
85
87
|
target_action = lambda { |throwable|
|
86
|
-
do_commit_async(throwable)
|
87
|
-
handle_commit_or_rollback(throwable)
|
88
|
+
do_commit_async(throwable).chain(&handle_commit_or_rollback(throwable))
|
88
89
|
}
|
89
90
|
else
|
90
91
|
target_future = @rollback_pending
|
91
92
|
target_action = lambda { |throwable|
|
92
|
-
do_rollback_async
|
93
|
-
handle_commit_or_rollback(throwable)
|
93
|
+
do_rollback_async.chain(&handle_commit_or_rollback(throwable))
|
94
94
|
}
|
95
95
|
end
|
96
96
|
|
97
97
|
@result_cursors.retrieve_not_consumed_error.then(&target_action)
|
98
|
-
|
98
|
+
.side { |_, error| handle_transaction_completion(commit, error) }.copy_to(target_future)
|
99
99
|
target_future
|
100
|
-
rescue => throwable
|
101
|
-
handle_transaction_completion(commit, throwable)
|
102
100
|
end
|
103
101
|
end
|
104
102
|
|
@@ -148,7 +146,7 @@ module Neo4j::Driver
|
|
148
146
|
raise Neo4j::Driver::Exceptions::ClientException, 'Cannot run more queries in this transaction, it has been rolled back'
|
149
147
|
when State::TERMINATED
|
150
148
|
# TODO clunky positional arguments of Neo4jException#initialize, move to named parameters
|
151
|
-
raise Neo4j::Driver::Exceptions::ClientException, 'Cannot run more queries in this transaction, it has either experienced an fatal error or was explicitly terminated'#, # TODO should be able to pass @cause_of_termination
|
149
|
+
raise Neo4j::Driver::Exceptions::ClientException, 'Cannot run more queries in this transaction, it has either experienced an fatal error or was explicitly terminated' #, # TODO should be able to pass @cause_of_termination
|
152
150
|
end
|
153
151
|
end
|
154
152
|
end
|
@@ -175,23 +173,23 @@ module Neo4j::Driver
|
|
175
173
|
end
|
176
174
|
|
177
175
|
if exception
|
178
|
-
Util::
|
176
|
+
Util::ResultHolder.failed(exception)
|
179
177
|
else
|
180
|
-
@protocol.commit_transaction(@connection
|
178
|
+
@protocol.commit_transaction(@connection).then(&@bookmark_holder.method(:bookmark=))
|
181
179
|
end
|
182
180
|
end
|
183
181
|
|
184
182
|
def do_rollback_async
|
185
183
|
if @lock.synchronize { @state } == State::TERMINATED
|
186
|
-
Util::
|
184
|
+
Util::ResultHolder.successful(nil)
|
187
185
|
else
|
188
186
|
@protocol.rollback_transaction(@connection)
|
189
187
|
end
|
190
188
|
end
|
191
189
|
|
192
190
|
def handle_commit_or_rollback(cursor_failure)
|
193
|
-
lambda { |
|
194
|
-
combined_error = Util::Futures.
|
191
|
+
lambda { |_value, commit_or_rollback_error|
|
192
|
+
combined_error = Util::Futures.combine_errors(cursor_failure, commit_or_rollback_error)
|
195
193
|
raise combined_error if combined_error
|
196
194
|
}
|
197
195
|
end
|
@@ -105,8 +105,8 @@ module Neo4j::Driver
|
|
105
105
|
addresses.map { |address| address == old_address ? new_address : address }.freeze
|
106
106
|
end
|
107
107
|
|
108
|
-
def new_with_reused_addresses(
|
109
|
-
(
|
108
|
+
def new_with_reused_addresses(*addresses)
|
109
|
+
addresses.map(&:to_set).reduce(&:+).freeze
|
110
110
|
end
|
111
111
|
|
112
112
|
def to_bolt_server_address(address)
|
@@ -16,9 +16,9 @@ module Neo4j::Driver
|
|
16
16
|
delegate = connection(connection)
|
17
17
|
procedure = procedure_query(connection.server_version, database_name)
|
18
18
|
bookmark_holder = bookmark_holder(bookmark)
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
run_procedure(delegate, procedure, bookmark_holder)
|
20
|
+
.side { release_connection(delegate) }
|
21
|
+
.chain { |records, error| process_procedure_response(procedure, records, error) }
|
22
22
|
end
|
23
23
|
|
24
24
|
private
|
@@ -32,7 +32,7 @@ module Neo4j::Driver
|
|
32
32
|
raise Exceptions::FatalDiscoveryException, "Refreshing routing table for multi-databases is not supported in server version lower than 4.0. Current server version: #{server_version}. Database name: '#{database_name.description}'"
|
33
33
|
end
|
34
34
|
|
35
|
-
Query.new(GET_ROUTING_TABLE,
|
35
|
+
Query.new(GET_ROUTING_TABLE, ROUTING_CONTEXT => @context.to_h)
|
36
36
|
end
|
37
37
|
|
38
38
|
def bookmark_holder(_ignored)
|
@@ -43,7 +43,7 @@ module Neo4j::Driver
|
|
43
43
|
connection.protocol
|
44
44
|
.run_in_auto_commit_transaction(connection, procedure, bookmark_holder, TransactionConfig.empty,
|
45
45
|
Handlers::Pulln::FetchSizeUtil::UNLIMITED_FETCH_SIZE)
|
46
|
-
.async_result.to_a
|
46
|
+
.async_result.then(&:to_a)
|
47
47
|
end
|
48
48
|
|
49
49
|
def release_connection(connection)
|
@@ -56,17 +56,15 @@ module Neo4j::Driver
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def process_procedure_response(procedure, records, error)
|
59
|
-
|
60
|
-
|
61
|
-
return RoutingProcedureResponse.new(procedure, records) if cause.nil?
|
62
|
-
|
63
|
-
handle_error(procedure, cause)
|
59
|
+
error ? handle_error(procedure, error) : RoutingProcedureResponse.new(procedure, records: records)
|
64
60
|
end
|
65
61
|
|
66
62
|
def handle_error(procedure, error)
|
67
|
-
|
68
|
-
|
69
|
-
|
63
|
+
if error.is_a? Exceptions::ClientException
|
64
|
+
RoutingProcedureResponse.new(procedure, error: error)
|
65
|
+
else
|
66
|
+
raise error
|
67
|
+
end
|
70
68
|
end
|
71
69
|
end
|
72
70
|
end
|
@@ -15,20 +15,24 @@ module Neo4j::Driver
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def single_async
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
18
|
+
next_async.compose do |first_record|
|
19
|
+
unless first_record
|
20
|
+
raise Exceptions::NoSuchRecordException, 'Cannot retrieve a single record, because this result is empty.'
|
21
|
+
end
|
22
|
+
next_async.then do |second_record|
|
23
|
+
if second_record
|
24
|
+
raise Exceptions::NoSuchRecordException,
|
25
|
+
'Expected a result with a single record, but this result contains at least one more. Ensure your query returns only one record.'
|
26
|
+
end
|
27
|
+
first_record
|
28
|
+
end
|
25
29
|
end
|
26
|
-
first_record
|
27
30
|
end
|
28
31
|
|
29
32
|
def each(&action)
|
30
|
-
|
31
|
-
|
33
|
+
result_holder = Util::ResultHolder.new
|
34
|
+
internal_for_each_async(result_holder, &action)
|
35
|
+
result_holder.then { consume_async }
|
32
36
|
end
|
33
37
|
|
34
38
|
def to_async(&map_function)
|
@@ -37,7 +41,7 @@ module Neo4j::Driver
|
|
37
41
|
|
38
42
|
def discard_all_failure_async
|
39
43
|
# runError has priority over other errors and is expected to have been reported to user by now
|
40
|
-
consume_async
|
44
|
+
consume_async.chain { |_summary, error| run_error ? nil : error }
|
41
45
|
nil
|
42
46
|
end
|
43
47
|
|
@@ -46,18 +50,25 @@ module Neo4j::Driver
|
|
46
50
|
@pull_all_handler.pull_all_failure_async.then { |error| run_error ? nil : error }
|
47
51
|
end
|
48
52
|
|
49
|
-
private def internal_for_each_async
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
53
|
+
private def internal_for_each_async(result_holder, &action)
|
54
|
+
next_async.chain do |record, error|
|
55
|
+
if error
|
56
|
+
result_holder.fail(error)
|
57
|
+
elsif record
|
58
|
+
begin
|
59
|
+
yield record
|
60
|
+
rescue => action_error
|
61
|
+
result_holder.fail(action_error)
|
62
|
+
end
|
63
|
+
internal_for_each_async(result_holder, &action)
|
64
|
+
else
|
65
|
+
result_holder.succeed(nil)
|
55
66
|
end
|
56
67
|
end
|
57
68
|
end
|
58
69
|
|
59
70
|
def map_successful_run_completion_async
|
60
|
-
run_error || self
|
71
|
+
run_error&.then(&Util::ResultHolder.method(:failed)) || Util::ResultHolder.successful(self)
|
61
72
|
end
|
62
73
|
|
63
74
|
def run_error
|
@@ -40,7 +40,7 @@ module Neo4j::Driver
|
|
40
40
|
end
|
41
41
|
|
42
42
|
private def assert_not_disposed
|
43
|
-
raise
|
43
|
+
raise Util::ErrorUtil.new_result_consumed_error if @disposed
|
44
44
|
end
|
45
45
|
|
46
46
|
def disposed?
|
@@ -48,7 +48,7 @@ module Neo4j::Driver
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def map_successful_run_completion_async
|
51
|
-
@delegate.map_successful_run_completion_async
|
51
|
+
@delegate.map_successful_run_completion_async.then { self }
|
52
52
|
end
|
53
53
|
end
|
54
54
|
end
|
@@ -4,16 +4,16 @@ module Neo4j::Driver
|
|
4
4
|
class CommitTxResponseHandler
|
5
5
|
include Spi::ResponseHandler
|
6
6
|
|
7
|
-
def initialize(
|
8
|
-
@
|
7
|
+
def initialize(result_holder)
|
8
|
+
@result_holder = result_holder
|
9
9
|
end
|
10
10
|
|
11
11
|
def on_success(metadata)
|
12
|
-
@
|
12
|
+
@result_holder.succeed(metadata[:bookmark]&.then(&InternalBookmark.method(:parse)))
|
13
13
|
end
|
14
14
|
|
15
15
|
def on_failure(error)
|
16
|
-
|
16
|
+
@result_holder.fail(error)
|
17
17
|
end
|
18
18
|
|
19
19
|
def on_record(fields)
|
@@ -4,6 +4,7 @@ module Neo4j::Driver
|
|
4
4
|
# This is the Pull All response handler that handles pull all messages in Bolt v3 and previous protocol versions.
|
5
5
|
class LegacyPullAllResponseHandler
|
6
6
|
include Spi::ResponseHandler
|
7
|
+
include Enumerable
|
7
8
|
RECORD_BUFFER_LOW_WATERMARK = ENV['record_buffer_low_watermark']&.to_i || 300
|
8
9
|
RECORD_BUFFER_HIGH_WATERMARK = ENV['record_buffer_high_watermark']&.to_i || 1000
|
9
10
|
|
@@ -67,7 +68,9 @@ module Neo4j::Driver
|
|
67
68
|
while @records.empty? && !(@ignore_records || @finished)
|
68
69
|
@records.wait
|
69
70
|
end
|
70
|
-
@records.items.first
|
71
|
+
record = @records.items.first
|
72
|
+
|
73
|
+
Util::ResultHolder.successful(record)
|
71
74
|
|
72
75
|
# if record.nil?
|
73
76
|
# return Util::Futures.failed_future(extract_failure) unless @failure.nil?
|
@@ -84,17 +87,25 @@ module Neo4j::Driver
|
|
84
87
|
end
|
85
88
|
|
86
89
|
def next_async
|
87
|
-
dequeue_record if peek_async
|
90
|
+
# dequeue_record if peek_async
|
91
|
+
peek_async.then { |record| dequeue_record if record }
|
88
92
|
end
|
89
93
|
|
90
94
|
def consume_async
|
91
95
|
@ignore_records = true
|
92
96
|
@records.items.clear
|
93
97
|
|
94
|
-
if pull_all_failure_async.nil?
|
95
|
-
|
98
|
+
# if pull_all_failure_async.nil?
|
99
|
+
# # @summary.then(&Util::ResultHolder.method(:successful))
|
100
|
+
# Util::ResultHolder.successful(@summary)
|
101
|
+
# else
|
102
|
+
# raise pull_all_failure_async
|
103
|
+
# end
|
104
|
+
|
105
|
+
if @failure
|
106
|
+
Util::ResultHolder.failed(extract_failure)
|
96
107
|
else
|
97
|
-
|
108
|
+
Util::ResultHolder.successful(@summary)
|
98
109
|
end
|
99
110
|
|
100
111
|
# pull_all_failure_async do |error|
|
@@ -106,13 +117,22 @@ module Neo4j::Driver
|
|
106
117
|
# end
|
107
118
|
end
|
108
119
|
|
109
|
-
def list_async(map_function)
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
120
|
+
# def list_async(map_function)
|
121
|
+
# pull_all_failure_async.then_apply do |error|
|
122
|
+
# unless error.nil?
|
123
|
+
# raise Util::Futures.as_completion_exception, error
|
124
|
+
# end
|
114
125
|
|
115
|
-
|
126
|
+
# records_as_list(map_function)
|
127
|
+
# end
|
128
|
+
# end
|
129
|
+
|
130
|
+
def each
|
131
|
+
pull_all_failure_async.then do
|
132
|
+
unless @finished
|
133
|
+
raise Exceptions::IllegalStateException, "Can't get records as list because SUCCESS or FAILURE did not arrive"
|
134
|
+
end
|
135
|
+
@records.each { |record| yield record }
|
116
136
|
end
|
117
137
|
end
|
118
138
|
|
@@ -122,7 +142,8 @@ module Neo4j::Driver
|
|
122
142
|
|
123
143
|
def pull_all_failure_async
|
124
144
|
if !@failure.nil?
|
125
|
-
return
|
145
|
+
return Util::ResultHolder.failed(extract_failure)
|
146
|
+
# return java.util.concurrent.CompletableFuture.completed_future(extract_failure)
|
126
147
|
elsif @finished
|
127
148
|
return nil
|
128
149
|
# return Util::Futures.completed_with_null
|
@@ -191,33 +212,41 @@ module Neo4j::Driver
|
|
191
212
|
end
|
192
213
|
|
193
214
|
def complete_record_future(record)
|
194
|
-
unless @record_future.nil?
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
end
|
215
|
+
# unless @record_future.nil?
|
216
|
+
# future = @record_future
|
217
|
+
# @record_future = nil
|
218
|
+
# future.complete(record)
|
219
|
+
# end
|
220
|
+
@record_future&.succeed(record)
|
221
|
+
@record_future = nil
|
199
222
|
end
|
200
223
|
|
201
224
|
def fail_record_future(error)
|
202
|
-
unless @record_future.nil?
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
end
|
225
|
+
# unless @record_future.nil?
|
226
|
+
# future = @record_future
|
227
|
+
# @record_future = nil
|
228
|
+
# future.complete_exceptionally(error)
|
229
|
+
# return true
|
230
|
+
# end
|
208
231
|
|
209
|
-
false
|
232
|
+
# false
|
233
|
+
@record_future&.fail(error)
|
234
|
+
ensure
|
235
|
+
@record_future = nil
|
210
236
|
end
|
211
237
|
|
212
238
|
def complete_failure_future(error)
|
213
|
-
unless @failure_future.nil?
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
end
|
239
|
+
# unless @failure_future.nil?
|
240
|
+
# future = @failure_future
|
241
|
+
# @failure_future = nil
|
242
|
+
# future.complete(error)
|
243
|
+
# return true
|
244
|
+
# end
|
219
245
|
|
220
|
-
false
|
246
|
+
# false
|
247
|
+
@failure_future&.fail(error)
|
248
|
+
ensure
|
249
|
+
@failure_future = nil
|
221
250
|
end
|
222
251
|
|
223
252
|
def extract_result_summary(metadata)
|
@@ -3,6 +3,7 @@ module Neo4j::Driver
|
|
3
3
|
module Handlers
|
4
4
|
module Pulln
|
5
5
|
class AutoPullResponseHandler < BasicPullResponseHandler
|
6
|
+
include Enumerable
|
6
7
|
delegate :signal, to: :@records
|
7
8
|
LONG_MAX_VALUE = 2 ** 63 - 1
|
8
9
|
|
@@ -55,7 +56,7 @@ module Neo4j::Driver
|
|
55
56
|
|
56
57
|
private def handle_failure(error)
|
57
58
|
# error has not been propagated to the user, remember it
|
58
|
-
unless fail_record_future(error)
|
59
|
+
unless fail_record_future(error) || fail_summary_future(error)
|
59
60
|
@failure = error
|
60
61
|
end
|
61
62
|
end
|
@@ -64,26 +65,31 @@ module Neo4j::Driver
|
|
64
65
|
while @records.empty? && !done?
|
65
66
|
@records.wait
|
66
67
|
end
|
67
|
-
@records.items.first
|
68
|
+
@records.items.first&.then(&Util::ResultHolder.method(:successful)) or
|
69
|
+
completed_with_value_if_no_failure(nil)
|
68
70
|
end
|
69
71
|
|
70
72
|
def next_async
|
71
|
-
dequeue_record if
|
73
|
+
peek_async.then { |record| dequeue_record if record }
|
72
74
|
end
|
73
75
|
|
74
76
|
def consume_async
|
75
77
|
@records.items.clear
|
76
|
-
|
77
|
-
|
78
|
-
@summary
|
78
|
+
cancel unless done?
|
79
|
+
completed_with_value_if_no_failure(@summary)
|
79
80
|
end
|
80
81
|
|
81
|
-
def
|
82
|
-
pull_all_async.
|
82
|
+
def each
|
83
|
+
pull_all_async.then do
|
84
|
+
unless done?
|
85
|
+
raise Exceptions::IllegalStateException, "Can't get records as list because SUCCESS or FAILURE did not arrive"
|
86
|
+
end
|
87
|
+
@records.each { |record| yield record }
|
88
|
+
end
|
83
89
|
end
|
84
90
|
|
85
91
|
def pull_all_failure_async
|
86
|
-
pull_all_async
|
92
|
+
pull_all_async.chain { |_, error| error }
|
87
93
|
end
|
88
94
|
|
89
95
|
def pre_populate_records
|
@@ -94,12 +100,8 @@ module Neo4j::Driver
|
|
94
100
|
|
95
101
|
def pull_all_async
|
96
102
|
return completed_with_value_if_no_failure(@summary) if done?
|
97
|
-
|
98
103
|
request(FetchSizeUtil::UNLIMITED_FETCH_SIZE)
|
99
|
-
|
100
|
-
@summary_future = java.util.concurrent.CompletableFuture.new if @summary_future.nil?
|
101
|
-
|
102
|
-
@summary_future
|
104
|
+
@summary_future ||= Util::ResultHolder.new
|
103
105
|
end
|
104
106
|
|
105
107
|
def enqueue_record(record)
|
@@ -122,14 +124,6 @@ module Neo4j::Driver
|
|
122
124
|
record
|
123
125
|
end
|
124
126
|
|
125
|
-
def records_as_list(&map_function)
|
126
|
-
unless done?
|
127
|
-
raise Exceptions::IllegalStateException, "Can't get records as list because SUCCESS or FAILURE did not arrive"
|
128
|
-
end
|
129
|
-
|
130
|
-
@records.each.map(&map_function)
|
131
|
-
end
|
132
|
-
|
133
127
|
def extract_failure
|
134
128
|
@failure or raise Exceptions::IllegalStateException, "Can't extract failure because it does not exist"
|
135
129
|
ensure
|
@@ -137,39 +131,34 @@ module Neo4j::Driver
|
|
137
131
|
end
|
138
132
|
|
139
133
|
def complete_record_future(record)
|
140
|
-
|
141
|
-
|
142
|
-
@record_future = nil
|
143
|
-
future.complete(record)
|
144
|
-
end
|
134
|
+
@record_future&.succeed(record)
|
135
|
+
@record_future = nil
|
145
136
|
end
|
146
137
|
|
147
138
|
def complete_summary_future(summary)
|
148
|
-
|
149
|
-
|
150
|
-
@summary_future = nil
|
151
|
-
future.complete(summary)
|
152
|
-
end
|
139
|
+
@summary_future&.succeed(summary)
|
140
|
+
@summary_future = nil
|
153
141
|
end
|
154
142
|
|
155
143
|
def fail_record_future(error)
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
return true
|
161
|
-
end
|
144
|
+
@record_future&.fail(error)
|
145
|
+
ensure
|
146
|
+
@record_future = nil
|
147
|
+
end
|
162
148
|
|
163
|
-
|
149
|
+
def fail_summary_future(error)
|
150
|
+
@summary_future&.fail(error)
|
151
|
+
ensure
|
152
|
+
@summary_future = nil
|
164
153
|
end
|
165
154
|
|
166
155
|
def completed_with_value_if_no_failure(value)
|
167
|
-
@failure
|
156
|
+
if @failure
|
157
|
+
Util::ResultHolder.failed(extract_failure)
|
158
|
+
else
|
159
|
+
Util::ResultHolder.successful(value)
|
160
|
+
end
|
168
161
|
end
|
169
|
-
|
170
|
-
# def request(size)
|
171
|
-
# @auto_pull_enabled ? Async { super } : super
|
172
|
-
# end
|
173
162
|
end
|
174
163
|
end
|
175
164
|
end
|
@@ -3,11 +3,17 @@ module Neo4j::Driver
|
|
3
3
|
module Handlers
|
4
4
|
class RollbackTxResponseHandler
|
5
5
|
include Spi::ResponseHandler
|
6
|
+
|
7
|
+
def initialize(result_holder)
|
8
|
+
@result_holder = result_holder
|
9
|
+
end
|
10
|
+
|
6
11
|
def on_success(_metadata)
|
12
|
+
@result_holder.succeed
|
7
13
|
end
|
8
14
|
|
9
15
|
def on_failure(error)
|
10
|
-
|
16
|
+
@result_holder.fail(error)
|
11
17
|
end
|
12
18
|
|
13
19
|
def on_record(fields)
|
@@ -19,19 +19,19 @@ module Neo4j::Driver
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def has_next?
|
22
|
-
@cursor.peek_async
|
22
|
+
@cursor.peek_async.result!
|
23
23
|
end
|
24
24
|
|
25
25
|
def next
|
26
|
-
@cursor.next_async || raise(Exceptions::NoSuchRecordException.no_more)
|
26
|
+
@cursor.next_async.result! || raise(Exceptions::NoSuchRecordException.no_more)
|
27
27
|
end
|
28
28
|
|
29
29
|
def single
|
30
|
-
@cursor.single_async
|
30
|
+
@cursor.single_async.result!
|
31
31
|
end
|
32
32
|
|
33
33
|
def peek
|
34
|
-
@cursor.peek_async or raise Exceptions::NoSuchRecordException.no_peek_past
|
34
|
+
@cursor.peek_async.result! or raise Exceptions::NoSuchRecordException.no_peek_past
|
35
35
|
end
|
36
36
|
|
37
37
|
def each
|
@@ -39,7 +39,7 @@ module Neo4j::Driver
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def consume
|
42
|
-
@cursor.consume_async
|
42
|
+
@cursor.consume_async.result!
|
43
43
|
end
|
44
44
|
|
45
45
|
def remove
|
@@ -17,7 +17,7 @@ module Neo4j::Driver
|
|
17
17
|
Validator.require_hash_parameters!(parameters)
|
18
18
|
cursor = @session.run_async(Query.new(query, **parameters), **TransactionConfig.new(**config.compact)) do
|
19
19
|
terminate_connection_on_thread_interrupt('Thread interrupted while running query in session')
|
20
|
-
end
|
20
|
+
end.result!
|
21
21
|
|
22
22
|
# query executed, it is safe to obtain a connection in a blocking way
|
23
23
|
connection = @session.connection_async
|
@@ -10,28 +10,28 @@ module Neo4j::Driver
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def commit
|
13
|
-
@tx.commit_async
|
13
|
+
@tx.commit_async.result!
|
14
14
|
# org.neo4j.driver.internal.util.Futures.blockingGet(@tx.commit_async) do
|
15
15
|
# terminate_connection_on_thread_interrupt('Thread interrupted while committing the transaction')
|
16
16
|
# end
|
17
17
|
end
|
18
18
|
|
19
19
|
def rollback
|
20
|
-
@tx.rollback_async
|
20
|
+
@tx.rollback_async.result!
|
21
21
|
# org.neo4j.driver.internal.util.Futures.blockingGet(@tx.rollback_async) do
|
22
22
|
# terminate_connection_on_thread_interrupt('Thread interrupted while rolling back the transaction')
|
23
23
|
# end
|
24
24
|
end
|
25
25
|
|
26
26
|
def close
|
27
|
-
@tx.close_async
|
27
|
+
@tx.close_async.result!
|
28
28
|
# org.neo4j.driver.internal.util.Futures.blockingGet(@tx.close_async) do
|
29
29
|
# terminate_connection_on_thread_interrupt('Thread interrupted while closing the transaction')
|
30
30
|
# end
|
31
31
|
end
|
32
32
|
|
33
33
|
def run(query, **parameters)
|
34
|
-
cursor = @tx.run_async(Query.new(query, **parameters))
|
34
|
+
cursor = @tx.run_async(Query.new(query, **parameters)).result!
|
35
35
|
# cursor = org.neo4j.driver.internal.util.Futures.blockingGet(@tx.run_async(to_statement(query, parameters))) do
|
36
36
|
# terminate_connection_on_thread_interrupt('Thread interrupted while running query in transaction')
|
37
37
|
# end
|
@@ -36,12 +36,16 @@ module Neo4j::Driver
|
|
36
36
|
connection.write_and_flush(begin_message, Handlers::BeginTxResponseHandler.new)
|
37
37
|
end
|
38
38
|
|
39
|
-
def commit_transaction(connection
|
40
|
-
|
39
|
+
def commit_transaction(connection)
|
40
|
+
Util::ResultHolder.new.tap do |result_holder|
|
41
|
+
connection.write_and_flush(Request::CommitMessage::COMMIT, Handlers::CommitTxResponseHandler.new(result_holder))
|
42
|
+
end
|
41
43
|
end
|
42
44
|
|
43
45
|
def rollback_transaction(connection)
|
44
|
-
|
46
|
+
Util::ResultHolder.new.tap do |result_holder|
|
47
|
+
connection.write_and_flush(Request::RollbackMessage::ROLLBACK, Handlers::RollbackTxResponseHandler.new(result_holder))
|
48
|
+
end
|
45
49
|
end
|
46
50
|
|
47
51
|
def run_in_auto_commit_transaction(connection, query, bookmark_holder, config, fetch_size)
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Neo4j::Driver
|
2
|
+
module Internal
|
3
|
+
module Util
|
4
|
+
class ResultHolder
|
5
|
+
def self.successful(result = nil)
|
6
|
+
new.tap { |holder| holder.succeed(result) }
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.failed(error)
|
10
|
+
new.tap { |holder| holder.fail(error) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def succeed(result = nil)
|
14
|
+
if @completed
|
15
|
+
false
|
16
|
+
else
|
17
|
+
@result = result
|
18
|
+
true
|
19
|
+
end
|
20
|
+
ensure
|
21
|
+
@completed = true
|
22
|
+
end
|
23
|
+
|
24
|
+
def fail(error)
|
25
|
+
if @completed
|
26
|
+
false
|
27
|
+
else
|
28
|
+
@error = error
|
29
|
+
true
|
30
|
+
end
|
31
|
+
ensure
|
32
|
+
@completed = true
|
33
|
+
end
|
34
|
+
|
35
|
+
def result!
|
36
|
+
raise @error if @error
|
37
|
+
@result
|
38
|
+
end
|
39
|
+
|
40
|
+
def then
|
41
|
+
@error ? self : ResultHolder.successful(yield(@result))
|
42
|
+
end
|
43
|
+
|
44
|
+
# &block returns a ResultHolder
|
45
|
+
def compose
|
46
|
+
@error ? self : yield(@result)
|
47
|
+
end
|
48
|
+
|
49
|
+
def chain
|
50
|
+
ResultHolder.successful(yield(@result, @error))
|
51
|
+
rescue => error
|
52
|
+
ResultHolder.failed(error)
|
53
|
+
end
|
54
|
+
|
55
|
+
def side
|
56
|
+
yield(@result, @error)
|
57
|
+
self
|
58
|
+
end
|
59
|
+
|
60
|
+
def copy_to(result_holder)
|
61
|
+
if @error
|
62
|
+
result_holder.fail(@error)
|
63
|
+
else
|
64
|
+
result_holder.succeed(@result)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: neo4j-ruby-driver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.4.0.alpha.
|
4
|
+
version: 4.4.0.alpha.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Heinrich Klobuczek
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-08-
|
11
|
+
date: 2022-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -467,6 +467,7 @@ files:
|
|
467
467
|
- ruby/neo4j/driver/internal/util/metadata_extractor.rb
|
468
468
|
- ruby/neo4j/driver/internal/util/mutex.rb
|
469
469
|
- ruby/neo4j/driver/internal/util/preconditions.rb
|
470
|
+
- ruby/neo4j/driver/internal/util/result_holder.rb
|
470
471
|
- ruby/neo4j/driver/internal/util/server_version.rb
|
471
472
|
- ruby/neo4j/driver/logging1.rb
|
472
473
|
- ruby/neo4j/driver/net/server_address.rb
|