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
         |