neospace 0.0.1 → 1.7.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/LICENSE.txt +21 -0
- data/README.md +88 -0
- data/ffi/bolt/address.rb +11 -0
- data/ffi/bolt/address_resolver.rb +12 -0
- data/ffi/bolt/address_set.rb +9 -0
- data/ffi/bolt/auth.rb +10 -0
- data/ffi/bolt/auto_releasable.rb +22 -0
- data/ffi/bolt/boolean.rb +9 -0
- data/ffi/bolt/bytes.rb +10 -0
- data/ffi/bolt/config.rb +45 -0
- data/ffi/bolt/connection.rb +44 -0
- data/ffi/bolt/connector.rb +17 -0
- data/ffi/bolt/dictionary.rb +15 -0
- data/ffi/bolt/error.rb +74 -0
- data/ffi/bolt/float.rb +9 -0
- data/ffi/bolt/integer.rb +9 -0
- data/ffi/bolt/library.rb +12 -0
- data/ffi/bolt/lifecycle.rb +9 -0
- data/ffi/bolt/list.rb +10 -0
- data/ffi/bolt/log.rb +16 -0
- data/ffi/bolt/socket_options.rb +14 -0
- data/ffi/bolt/status.rb +25 -0
- data/ffi/bolt/string.rb +9 -0
- data/ffi/bolt/structure.rb +10 -0
- data/ffi/bolt/value.rb +35 -0
- data/ffi/neo4j/driver.rb +60 -0
- data/ffi/neo4j/driver/access_mode.rb +10 -0
- data/ffi/neo4j/driver/auth_tokens.rb +18 -0
- data/ffi/neo4j/driver/config.rb +40 -0
- data/ffi/neo4j/driver/graph_database.rb +52 -0
- data/ffi/neo4j/driver/internal/async/access_mode_connection.rb +19 -0
- data/ffi/neo4j/driver/internal/async/direct_connection.rb +106 -0
- data/ffi/neo4j/driver/internal/bolt_server_address.rb +18 -0
- data/ffi/neo4j/driver/internal/bookmarks_holder.rb +30 -0
- data/ffi/neo4j/driver/internal/direct_connection_provider.rb +28 -0
- data/ffi/neo4j/driver/internal/driver_factory.rb +125 -0
- data/ffi/neo4j/driver/internal/error_handling.rb +108 -0
- data/ffi/neo4j/driver/internal/explicit_transaction.rb +146 -0
- data/ffi/neo4j/driver/internal/handlers/pull_all_response_handler.rb +105 -0
- data/ffi/neo4j/driver/internal/handlers/response_handler.rb +49 -0
- data/ffi/neo4j/driver/internal/handlers/run_response_handler.rb +32 -0
- data/ffi/neo4j/driver/internal/handlers/session_pull_all_response_handler.rb +32 -0
- data/ffi/neo4j/driver/internal/handlers/transaction_pull_all_response_handler.rb +23 -0
- data/ffi/neo4j/driver/internal/internal_driver.rb +45 -0
- data/ffi/neo4j/driver/internal/internal_logger.rb +32 -0
- data/ffi/neo4j/driver/internal/internal_record.rb +26 -0
- data/ffi/neo4j/driver/internal/internal_resolver.rb +31 -0
- data/ffi/neo4j/driver/internal/internal_statement_result.rb +52 -0
- data/ffi/neo4j/driver/internal/messaging/bolt_protocol.rb +24 -0
- data/ffi/neo4j/driver/internal/messaging/v1/bolt_protocol_v1.rb +59 -0
- data/ffi/neo4j/driver/internal/messaging/v2/bolt_protocol_v2.rb +16 -0
- data/ffi/neo4j/driver/internal/messaging/v3/bolt_protocol_v3.rb +63 -0
- data/ffi/neo4j/driver/internal/network_session.rb +129 -0
- data/ffi/neo4j/driver/internal/retry/exponential_backoff_retry_logic.rb +80 -0
- data/ffi/neo4j/driver/internal/session_factory_impl.rb +28 -0
- data/ffi/neo4j/driver/internal/summary/internal_result_summary.rb +67 -0
- data/ffi/neo4j/driver/internal/summary/internal_server_info.rb +19 -0
- data/ffi/neo4j/driver/internal/summary/internal_summary_counters.rb +23 -0
- data/ffi/neo4j/driver/internal/util/metadata_extractor.rb +15 -0
- data/ffi/neo4j/driver/internal/value/base_time_value.rb +22 -0
- data/ffi/neo4j/driver/internal/value/date_value.rb +25 -0
- data/ffi/neo4j/driver/internal/value/duration_value.rb +27 -0
- data/ffi/neo4j/driver/internal/value/local_date_time_value.rb +24 -0
- data/ffi/neo4j/driver/internal/value/local_time_value.rb +19 -0
- data/ffi/neo4j/driver/internal/value/node_value.rb +18 -0
- data/ffi/neo4j/driver/internal/value/offset_time_value.rb +25 -0
- data/ffi/neo4j/driver/internal/value/path_value.rb +41 -0
- data/ffi/neo4j/driver/internal/value/point2_d_value.rb +24 -0
- data/ffi/neo4j/driver/internal/value/point3_d_value.rb +24 -0
- data/ffi/neo4j/driver/internal/value/relationship_value.rb +18 -0
- data/ffi/neo4j/driver/internal/value/structure_value.rb +42 -0
- data/ffi/neo4j/driver/internal/value/time_with_zone_id_value.rb +25 -0
- data/ffi/neo4j/driver/internal/value/time_with_zone_offset_value.rb +28 -0
- data/ffi/neo4j/driver/internal/value/unbound_relationship_value.rb +18 -0
- data/ffi/neo4j/driver/internal/value/value_adapter.rb +99 -0
- data/ffi/neo4j/driver/net/server_address.rb +13 -0
- data/ffi/neo4j/driver/statement.rb +15 -0
- data/ffi/neo4j/driver/summary/statement_type.rb +14 -0
- data/ffi/neo4j/driver/types/entity.rb +21 -0
- data/ffi/neo4j/driver/types/node.rb +16 -0
- data/ffi/neo4j/driver/types/path.rb +35 -0
- data/ffi/neo4j/driver/types/relationship.rb +19 -0
- data/lib/loader.rb +18 -0
- data/lib/neo4j/driver/auto_closable.rb +32 -0
- data/lib/neo4j/driver/exceptions/authentication_exception.rb +10 -0
- data/lib/neo4j/driver/exceptions/client_exception.rb +15 -0
- data/lib/neo4j/driver/exceptions/database_exception.rb +10 -0
- data/lib/neo4j/driver/exceptions/illegal_state_exception.rb +10 -0
- data/lib/neo4j/driver/exceptions/neo4j_exception.rb +23 -0
- data/lib/neo4j/driver/exceptions/no_such_record_exception.rb +33 -0
- data/lib/neo4j/driver/exceptions/protocol_exception.rb +10 -0
- data/lib/neo4j/driver/exceptions/security_exception.rb +10 -0
- data/lib/neo4j/driver/exceptions/service_unavailable_exception.rb +10 -0
- data/lib/neo4j/driver/exceptions/session_expired_exception.rb +10 -0
- data/lib/neo4j/driver/exceptions/transient_exception.rb +10 -0
- data/lib/neo4j/driver/exceptions/untrusted_server_exception.rb +10 -0
- data/lib/neo4j/driver/internal/duration_normalizer.rb +46 -0
- data/lib/neo4j/driver/internal/ruby_signature.rb +18 -0
- data/lib/neo4j/driver/internal/validator.rb +28 -0
- data/lib/neo4j/driver/types/bytes.rb +10 -0
- data/lib/neo4j/driver/types/local_date_time.rb +20 -0
- data/lib/neo4j/driver/types/local_time.rb +19 -0
- data/lib/neo4j/driver/types/offset_time.rb +19 -0
- data/lib/neo4j/driver/types/point.rb +39 -0
- data/lib/neo4j/driver/types/time.rb +43 -0
- data/lib/neo4j/driver/version.rb +7 -0
- data/lib/neo4j_ruby_driver.rb +20 -0
- metadata +314 -12
data/ffi/bolt/list.rb
ADDED
data/ffi/bolt/log.rb
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bolt
|
|
4
|
+
module Log
|
|
5
|
+
extend Bolt::Library
|
|
6
|
+
|
|
7
|
+
callback :log_func, %i[pointer string], :void
|
|
8
|
+
|
|
9
|
+
attach_function :create, :BoltLog_create, %i[pointer], :auto_pointer
|
|
10
|
+
attach_function :destroy, :BoltLog_destroy, %i[pointer], :void
|
|
11
|
+
attach_function :set_error_func, :BoltLog_set_error_func, %i[pointer log_func], :void
|
|
12
|
+
attach_function :set_warning_func, :BoltLog_set_warning_func, %i[pointer log_func], :void
|
|
13
|
+
attach_function :set_info_func, :BoltLog_set_info_func, %i[pointer log_func], :void
|
|
14
|
+
attach_function :set_debug_func, :BoltLog_set_debug_func, %i[pointer log_func], :void
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bolt
|
|
4
|
+
module SocketOptions
|
|
5
|
+
extend Bolt::Library
|
|
6
|
+
|
|
7
|
+
attach_function :create, :BoltSocketOptions_create, [], :auto_pointer
|
|
8
|
+
attach_function :destroy, :BoltSocketOptions_destroy, [:pointer], :void
|
|
9
|
+
attach_function :get_connect_timeout, :BoltSocketOptions_get_connect_timeout, [:pointer], :int32_t
|
|
10
|
+
attach_function :set_connect_timeout, :BoltSocketOptions_set_connect_timeout, %i[pointer int32_t], :int32_t
|
|
11
|
+
attach_function :get_keep_alive, :BoltSocketOptions_get_keep_alive, [:pointer], :int32_t
|
|
12
|
+
attach_function :set_keep_alive, :BoltSocketOptions_set_keep_alive, %i[pointer int32_t], :int32_t
|
|
13
|
+
end
|
|
14
|
+
end
|
data/ffi/bolt/status.rb
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bolt
|
|
4
|
+
module Status
|
|
5
|
+
extend Bolt::Library
|
|
6
|
+
# Not connected
|
|
7
|
+
BOLT_CONNECTION_STATE_DISCONNECTED = 0
|
|
8
|
+
# Connected but not authenticated
|
|
9
|
+
BOLT_CONNECTION_STATE_CONNECTED = 1
|
|
10
|
+
# Connected and authenticated
|
|
11
|
+
BOLT_CONNECTION_STATE_READY = 2
|
|
12
|
+
# Recoverable failure
|
|
13
|
+
BOLT_CONNECTION_STATE_FAILED = 3
|
|
14
|
+
# Unrecoverable failure
|
|
15
|
+
BOLT_CONNECTION_STATE_DEFUNCT = 4
|
|
16
|
+
|
|
17
|
+
typedef :int32, :bolt_connection_state
|
|
18
|
+
|
|
19
|
+
attach_function :create, :BoltStatus_create, [], :auto_pointer
|
|
20
|
+
attach_function :destroy, :BoltStatus_destroy, [:pointer], :void
|
|
21
|
+
attach_function :get_state, :BoltStatus_get_state, [:pointer], :bolt_connection_state
|
|
22
|
+
attach_function :get_error, :BoltStatus_get_error, [:pointer], :int32
|
|
23
|
+
attach_function :get_error_context, :BoltStatus_get_error_context, [:pointer], :string
|
|
24
|
+
end
|
|
25
|
+
end
|
data/ffi/bolt/string.rb
ADDED
data/ffi/bolt/value.rb
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Bolt
|
|
4
|
+
module Value
|
|
5
|
+
extend Bolt::Library
|
|
6
|
+
|
|
7
|
+
enum :bolt_type,
|
|
8
|
+
%i[bolt_null
|
|
9
|
+
bolt_boolean
|
|
10
|
+
bolt_integer
|
|
11
|
+
bolt_float
|
|
12
|
+
bolt_string
|
|
13
|
+
bolt_dictionary
|
|
14
|
+
bolt_list
|
|
15
|
+
bolt_bytes
|
|
16
|
+
bolt_structure]
|
|
17
|
+
|
|
18
|
+
attach_function :create, :BoltValue_create, [], :auto_pointer
|
|
19
|
+
attach_function :destroy, :BoltValue_destroy, %i[pointer], :void
|
|
20
|
+
attach_function :duplicate, :BoltValue_duplicate, %i[pointer], :auto_pointer
|
|
21
|
+
attach_function :copy, :BoltValue_copy, %i[pointer pointer], :void
|
|
22
|
+
attach_function :size, :BoltValue_size, %i[pointer], :int32
|
|
23
|
+
attach_function :type, :BoltValue_type, %i[pointer], :bolt_type
|
|
24
|
+
attach_function :to_string, :BoltValue_to_string, %i[pointer pointer int32 pointer], :int32
|
|
25
|
+
attach_function :format_as_null, :BoltValue_format_as_Null, %i[pointer], :void
|
|
26
|
+
attach_function :format_as_boolean, :BoltValue_format_as_Boolean, %i[pointer char], :void
|
|
27
|
+
attach_function :format_as_integer, :BoltValue_format_as_Integer, %i[pointer int64], :void
|
|
28
|
+
attach_function :format_as_float, :BoltValue_format_as_Float, %i[pointer double], :void
|
|
29
|
+
attach_function :format_as_string, :BoltValue_format_as_String, %i[pointer string int32], :void
|
|
30
|
+
attach_function :format_as_dictionary, :BoltValue_format_as_Dictionary, %i[pointer int32], :void
|
|
31
|
+
attach_function :format_as_list, :BoltValue_format_as_List, %i[pointer int32], :void
|
|
32
|
+
attach_function :format_as_bytes, :BoltValue_format_as_Bytes, %i[pointer pointer int32], :void
|
|
33
|
+
attach_function :format_as_structure, :BoltValue_format_as_Structure, %i[pointer int16 int32], :void
|
|
34
|
+
end
|
|
35
|
+
end
|
data/ffi/neo4j/driver.rb
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Workaround for missing zeitwerk support in jruby-9.2.8.0
|
|
4
|
+
if RUBY_PLATFORM.match?(/java/)
|
|
5
|
+
module Bolt
|
|
6
|
+
end
|
|
7
|
+
module Neo4j
|
|
8
|
+
module Driver
|
|
9
|
+
module Internal
|
|
10
|
+
module Async
|
|
11
|
+
end
|
|
12
|
+
module Handlers
|
|
13
|
+
end
|
|
14
|
+
module Messaging
|
|
15
|
+
module V1
|
|
16
|
+
end
|
|
17
|
+
module V2
|
|
18
|
+
end
|
|
19
|
+
module V3
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
module Retry
|
|
23
|
+
end
|
|
24
|
+
module Summary
|
|
25
|
+
end
|
|
26
|
+
module Util
|
|
27
|
+
end
|
|
28
|
+
module Value
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
module Net
|
|
32
|
+
end
|
|
33
|
+
module Summary
|
|
34
|
+
end
|
|
35
|
+
module Types
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
# End workaround
|
|
41
|
+
|
|
42
|
+
require 'active_support/concern'
|
|
43
|
+
require 'active_support/core_ext/array/grouping'
|
|
44
|
+
require 'concurrent/atomic/atomic_boolean'
|
|
45
|
+
require 'concurrent/atomic/atomic_reference'
|
|
46
|
+
require 'ffi'
|
|
47
|
+
require 'fiddle'
|
|
48
|
+
require 'loader'
|
|
49
|
+
require 'recursive-open-struct'
|
|
50
|
+
|
|
51
|
+
module Neo4j
|
|
52
|
+
module Driver
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
Loader.load
|
|
57
|
+
|
|
58
|
+
Neo4j::Driver::Record = Neo4j::Driver::Internal::InternalRecord
|
|
59
|
+
Neo4j::Driver::StatementResult = Neo4j::Driver::Internal::InternalStatementResult
|
|
60
|
+
Neo4j::Driver::Transaction = Neo4j::Driver::Internal::ExplicitTransaction
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
class AuthTokens
|
|
6
|
+
class << self
|
|
7
|
+
def basic(username, password)
|
|
8
|
+
Internal::Validator.require_non_nil_credentials!(username, password)
|
|
9
|
+
Bolt::Auth.basic(username, password, nil)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def none
|
|
13
|
+
Bolt::Auth.none
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
class Config < Hash
|
|
6
|
+
class TrustStrategy
|
|
7
|
+
class << self
|
|
8
|
+
def trust_all_certificates; end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class << self
|
|
13
|
+
# How can following Java config options be expressed in seabolt:
|
|
14
|
+
# withLeakedSessionsLogging
|
|
15
|
+
# withConnectionLivenessCheckTimeout
|
|
16
|
+
# withTrustStrategy TRUST_ALL_CERTIFICATES, TRUST_CUSTOM_CA_SIGNED_CERTIFICATES, TRUST_SYSTEM_CA_SIGNED_CERTIFICATE
|
|
17
|
+
# and in the reverse what those seabolt options correspond to in java:
|
|
18
|
+
# BoltConfig_set_user_agent
|
|
19
|
+
|
|
20
|
+
def default_config
|
|
21
|
+
{
|
|
22
|
+
logger: ActiveSupport::Logger.new(STDOUT, level: ::Logger::ERROR), # :set_log
|
|
23
|
+
leaked_session_logging: false,
|
|
24
|
+
#connection_liveness_check_timeout: -1, # Not configured
|
|
25
|
+
max_connection_lifetime: 1.hour, # :set_max_connection_life_time
|
|
26
|
+
max_connection_pool_size: 100, #:set_max_pool_size
|
|
27
|
+
connection_acquisition_timeout: 1.minute, #:set_max_connection_acquisition_time
|
|
28
|
+
encryption: true, # :set_transport
|
|
29
|
+
trust_strategy: :trust_all_certificates,
|
|
30
|
+
connection_timeout: 30.seconds, # BoltSocketOptions_set_connect_timeout
|
|
31
|
+
max_transaction_retry_time: Internal::Retry::ExponentialBackoffRetryLogic::DEFAULT_MAX_RETRY_TIME,
|
|
32
|
+
#resolver: nil # :set_address_resolver
|
|
33
|
+
keep_alive: true, # BoltSocketOptions_set_keep_alive
|
|
34
|
+
# ???? BoltConfig_set_user_agent
|
|
35
|
+
}
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
class GraphDatabase
|
|
6
|
+
VALID_ROUTING_SCHEMES =
|
|
7
|
+
[Internal::DriverFactory::BOLT_ROUTING_URI_SCHEME, Internal::DriverFactory::NEO4J_URI_SCHEME].freeze
|
|
8
|
+
|
|
9
|
+
Bolt::Lifecycle.startup
|
|
10
|
+
|
|
11
|
+
at_exit do
|
|
12
|
+
Bolt::Lifecycle.shutdown
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class << self
|
|
16
|
+
extend AutoClosable
|
|
17
|
+
|
|
18
|
+
auto_closable :driver, :routing_driver
|
|
19
|
+
|
|
20
|
+
def driver(uri, auth_token = Neo4j::Driver::AuthTokens.none, config = nil)
|
|
21
|
+
unless auth_token.is_a? FFI::Pointer
|
|
22
|
+
raise Exceptions::AuthenticationException, 'Unsupported authentication token'
|
|
23
|
+
end
|
|
24
|
+
config = Config.default_config.merge(config || {})
|
|
25
|
+
|
|
26
|
+
Internal::DriverFactory.new.new_instance(uri, auth_token, config)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def routing_driver(routing_uris, auth_toke, config)
|
|
30
|
+
assert_routing_uris(routing_uris)
|
|
31
|
+
|
|
32
|
+
routing_uris.each do |uri|
|
|
33
|
+
return driver(uri, auth_toke, config)
|
|
34
|
+
rescue Exceptions::ServiceUnavailableException => e
|
|
35
|
+
# log.warn("Unable to create routing driver for URI: #{uri}", e)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
raise Exceptions::ServiceUnavailableException, 'Failed to discover an available server'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def assert_routing_uris(uris)
|
|
44
|
+
scheme = (uris.map(&method(:URI)).map(&:scheme) - VALID_ROUTING_SCHEMES).first
|
|
45
|
+
return unless scheme
|
|
46
|
+
raise ArgumentError,
|
|
47
|
+
"Illegal URI scheme, expected URI scheme '#{scheme}' to be among '[#{VALID_ROUTING_SCHEMES.join ', '}]'"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
module Internal
|
|
6
|
+
module Async
|
|
7
|
+
class AccessModeConnection
|
|
8
|
+
attr_reader :connection, :mode
|
|
9
|
+
delegate :open?, :protocol, :release, :reset, :write_and_flush, to: :connection
|
|
10
|
+
|
|
11
|
+
def initialize(connection, mode)
|
|
12
|
+
@connection = connection
|
|
13
|
+
@mode = mode
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Neo4j
|
|
4
|
+
module Driver
|
|
5
|
+
module Internal
|
|
6
|
+
module Async
|
|
7
|
+
class DirectConnection
|
|
8
|
+
include ErrorHandling
|
|
9
|
+
|
|
10
|
+
attr_reader :protocol
|
|
11
|
+
attr_reader :bolt_connection
|
|
12
|
+
|
|
13
|
+
def initialize(connector, mode, config)
|
|
14
|
+
@connector = connector
|
|
15
|
+
@config = config
|
|
16
|
+
@bolt_connection = with_status { |status| Bolt::Connector.acquire(@connector, mode, status) }
|
|
17
|
+
|
|
18
|
+
# @protocol = Messaging::BoltProtocol.for_version(Bolt::Connection.server(bolt_connection).first)
|
|
19
|
+
@protocol = Messaging::BoltProtocol.for_version(3)
|
|
20
|
+
@status = Concurrent::AtomicReference.new(:open)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def write_and_flush(statement, parameters, boomarks_holder, config, run_handler, pull_handler)
|
|
24
|
+
check_error Bolt::Connection.clear_run(bolt_connection)
|
|
25
|
+
check_error Bolt::Connection.set_run_cypher(bolt_connection, statement, statement.size, parameters.size)
|
|
26
|
+
parameters.each_with_index do |(name, object), index|
|
|
27
|
+
name = name.to_s
|
|
28
|
+
Value::ValueAdapter.to_neo(
|
|
29
|
+
Bolt::Connection.set_run_cypher_parameter(bolt_connection, index, name, name.size), object
|
|
30
|
+
)
|
|
31
|
+
end
|
|
32
|
+
set_bookmarks(:set_run_bookmarks, boomarks_holder.bookmarks)
|
|
33
|
+
set_config(:set_run, config)
|
|
34
|
+
register(run_handler, Bolt::Connection.load_run_request(bolt_connection))
|
|
35
|
+
register(pull_handler, Bolt::Connection.load_pull_request(bolt_connection, -1))
|
|
36
|
+
flush
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def flush
|
|
40
|
+
check_error Bolt::Connection.flush(bolt_connection)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def begin(bookmarks, config, begin_handler)
|
|
44
|
+
check_error Bolt::Connection.clear_begin(bolt_connection)
|
|
45
|
+
set_bookmarks(:set_begin_bookmarks, bookmarks)
|
|
46
|
+
set_config(:set_begin, config)
|
|
47
|
+
register(begin_handler, Bolt::Connection.load_begin_request(bolt_connection))
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def commit(handler)
|
|
51
|
+
register(handler, Bolt::Connection.load_commit_request(bolt_connection))
|
|
52
|
+
flush
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def rollback(handler)
|
|
56
|
+
register(handler, Bolt::Connection.load_rollback_request(bolt_connection))
|
|
57
|
+
flush
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def release
|
|
61
|
+
return unless @status.compare_and_set(:open, :terminated)
|
|
62
|
+
Bolt::Connector.release(@connector, bolt_connection)
|
|
63
|
+
@bolt_connection = nil
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def open?
|
|
67
|
+
@status.get == :open
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def last_bookmark
|
|
71
|
+
Bolt::Connection.last_bookmark(bolt_connection).first.force_encoding(Encoding::UTF_8)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
private
|
|
75
|
+
|
|
76
|
+
def register(handler, error_code)
|
|
77
|
+
check_error(error_code)
|
|
78
|
+
handler.request = Bolt::Connection.last_request(bolt_connection)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def set_bookmarks(method, bookmarks)
|
|
82
|
+
return unless bookmarks.present?
|
|
83
|
+
value = Bolt::Value.create
|
|
84
|
+
Value::ValueAdapter.to_neo(value, bookmarks)
|
|
85
|
+
check_error Bolt::Connection.send(method, bolt_connection, value)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def set_config(method_prefix, config)
|
|
89
|
+
return unless config
|
|
90
|
+
config.each do |key, value|
|
|
91
|
+
case key
|
|
92
|
+
when :timeout
|
|
93
|
+
check_error Bolt::Connection.send("#{method_prefix}_tx_timeout", bolt_connection,
|
|
94
|
+
DurationNormalizer.milliseconds(value))
|
|
95
|
+
when :metadata
|
|
96
|
+
bolt_value = Bolt::Value.create
|
|
97
|
+
Value::ValueAdapter.to_neo(bolt_value, value)
|
|
98
|
+
check_error Bolt::Connection.send("#{method_prefix}_tx_metadata", bolt_connection, bolt_value)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|