neo4j-ruby-driver 0.1.11 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fc232aeb41f6d375e3b6b4b10add564b614bab08b4b10da7ac2a0e3be87c47b3
4
- data.tar.gz: c5106737007e4b022902e966b477edf212b6b37b8888835a491e08cc63736ebd
3
+ metadata.gz: ac7628f26dea26f54328c47736001a148b7b864771b50036b659f7f4d92ffa50
4
+ data.tar.gz: 318537bb1949cb5f917b0f34183edbffc9ff1927239d7a3d8180ea07fdb97924
5
5
  SHA512:
6
- metadata.gz: dabbfa13632a1456ba101c5d4cf60d2e51562d9debbbc4b5222958655b5f98e027cd68a1453f0d3f014e7380540bbb50e4ff04c6d0361e26a7dc734927a9d8d8
7
- data.tar.gz: 9f7a54ac9c14240b191b34079e8e843e227d5e248cd04811b2fdaeebd7b536e43d9707a18056c704307380abf75b2246364ca2181f3baba2a19a6c17e2525201
6
+ metadata.gz: 03a0ed4e03c81c7ba6d3804adf329c8a44cf3a1a13437b2f147ca398789300b4736cfca683d1b928fb709351464e4d1cd930d89acf439efab8ac19d750dd75b0
7
+ data.tar.gz: acff913f890a863009fe45ac24ca63ed56fd89414ba81183e5740fcbc77e2e3b10f9b0f444113f8f38ea615f43ecde81eb7813ebfc67aa6ce080a6d5fe3d6407
@@ -3,6 +3,10 @@
3
3
  module Bolt
4
4
  module Config
5
5
  extend Bolt::Library
6
+
7
+ BOLT_SCHEME_DIRECT = 0
8
+ BOLT_SCHEME_NEO4J = 1
9
+
6
10
  typedef :int32_t, :bolt_scheme
7
11
  typedef :int32_t, :bolt_transport
8
12
 
@@ -3,6 +3,9 @@
3
3
  module Neo4j
4
4
  module Driver
5
5
  class GraphDatabase
6
+ VALID_ROUTING_SCHEMES =
7
+ [Internal::DriverFactory::BOLT_ROUTING_URI_SCHEME, Internal::DriverFactory::NEO4J_URI_SCHEME].freeze
8
+
6
9
  Bolt::Lifecycle.startup
7
10
 
8
11
  at_exit do
@@ -12,17 +15,36 @@ module Neo4j
12
15
  class << self
13
16
  extend AutoClosable
14
17
 
15
- auto_closable :driver
18
+ auto_closable :driver, :routing_driver
16
19
 
17
20
  def driver(uri, auth_token = Neo4j::Driver::AuthTokens.none, config = nil)
18
- raise Exceptions::AuthenticationException, 'Unsupported authentication token' unless auth_token
21
+ unless auth_token.is_a? FFI::Pointer
22
+ raise Exceptions::AuthenticationException, 'Unsupported authentication token'
23
+ end
19
24
  config ||= Config.default_config
20
- # routing_settings = config.routing_settings
21
- # retry_settings = config.retry_settings
22
- routing_settings = nil
23
- retry_settings = nil
24
25
 
25
- Internal::DriverFactory.new.new_instance(uri, auth_token, routing_settings, retry_settings, config)
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 ', '}]"
26
48
  end
27
49
  end
28
50
  end
@@ -10,20 +10,23 @@ module Neo4j
10
10
  NEO4J_URI_SCHEME = 'neo4j'
11
11
  DEFAULT_PORT = 7687
12
12
 
13
- def new_instance(uri, auth_token, routing_settings, retry_settings, config)
13
+ def new_instance(uri, auth_token, config)
14
14
  uri = URI(uri)
15
- connector, logger = create_connector(uri, auth_token, config)
15
+ routing_context = routing_context(uri)
16
+ connector, logger = create_connector(uri, auth_token, routing_context, config)
16
17
  retry_logic = Retry::ExponentialBackoffRetryLogic.new(config[:max_transaction_retry_time], config[:logger])
17
- create_driver(uri.scheme, connector, logger, routing_settings, retry_logic, config).tap(&:verify_connectivity)
18
+ create_driver(connector, logger, retry_logic, config).tap(&:verify_connectivity)
18
19
  end
19
20
 
20
21
  private
21
22
 
22
- def create_connector(uri, auth_token, config)
23
+ def create_connector(uri, auth_token, routing_context, config)
23
24
  address = Bolt::Address.create(host(uri).gsub(/^\[(.*)\]$/, '\\1'), port(uri).to_s)
24
25
  bolt_config = bolt_config(config)
25
26
  logger = InternalLogger.register(bolt_config, config[:logger])
26
27
  set_socket_options(bolt_config, config)
28
+ set_routing_context(bolt_config, routing_context)
29
+ set_scheme(bolt_config, uri, routing_context)
27
30
  [Bolt::Connector.create(address, auth_token, bolt_config), logger]
28
31
  end
29
32
 
@@ -54,6 +57,17 @@ module Neo4j
54
57
  check_error Bolt::Config.set_socket_options(bolt_config, socket_options) if socket_options
55
58
  end
56
59
 
60
+ def routing_context(uri)
61
+ query = uri.query
62
+ return if query.blank?
63
+ URI.decode_www_form(query).to_h
64
+ end
65
+
66
+ def set_routing_context(bolt_config, routing_context)
67
+ value = Bolt::Value.create
68
+ check_error Bolt::Config.set_routing_context(bolt_config, Value::ValueAdapter.to_neo(value, routing_context))
69
+ end
70
+
57
71
  def host(uri)
58
72
  uri.host.tap { |host| raise ArgumentError, "Invalid address format `#{uri}`" unless host }
59
73
  end
@@ -63,20 +77,30 @@ module Neo4j
63
77
  DEFAULT_PORT
64
78
  end
65
79
 
66
- def create_driver(scheme, connector, logger, routing_settings, retry_logic, config)
80
+ def set_scheme(bolt_config, uri, routing_context)
81
+ check_error Bolt::Config.set_scheme(bolt_config, scheme(uri, routing_context))
82
+ end
83
+
84
+ def scheme(uri, routing_context)
85
+ scheme = uri.scheme
67
86
  case scheme
68
87
  when BOLT_URI_SCHEME
69
- # assert_no_routing_context( uri, routing_settings )
70
- # return createDirectDriver( securityPlan, address, connectionPool, retryLogic, metrics, config );
71
- create_direct_driver(connector, logger, retry_logic, config)
88
+ assert_no_routing_context(uri, routing_context)
89
+ Bolt::Config::BOLT_SCHEME_DIRECT
72
90
  when BOLT_ROUTING_URI_SCHEME, NEO4J_URI_SCHEME
73
- # create_routing_driver( security_plan, address, connection_ool, eventExecutorGroup, routingSettings, retryLogic, metrics, config );
91
+ Bolt::Config::BOLT_SCHEME_NEO4J
74
92
  else
75
93
  raise Exceptions::ClientException, "Unsupported URI scheme: #{scheme}"
76
94
  end
77
95
  end
78
96
 
79
- def create_direct_driver(connector, logger, retry_logic, config)
97
+ def assert_no_routing_context(uri, routing_context)
98
+ if routing_context
99
+ raise ArgumentError, "Routing parameters are not supported with scheme 'bolt'. Given URI: '#{uri}'"
100
+ end
101
+ end
102
+
103
+ def create_driver(connector, logger, retry_logic, config)
80
104
  connection_provider = DirectConnectionProvider.new(connector, config)
81
105
  session_factory = create_session_factory(connection_provider, retry_logic, config)
82
106
  InternalDriver.new(session_factory, logger)
@@ -9,21 +9,29 @@ module Neo4j
9
9
  # Identifies a successful operation which is defined as 0
10
10
  when Bolt::Error::BOLT_SUCCESS # 0
11
11
  nil
12
+
12
13
  # Permission denied
13
14
  when Bolt::Error::BOLT_PERMISSION_DENIED # 7
14
15
  throw Exceptions::AuthenticationException.new(error_code, 'Permission denied')
16
+
15
17
  # Connection refused
16
- when Bolt::Error::BOLT_CONNECTION_REFUSED
18
+ when Bolt::Error::BOLT_CONNECTION_REFUSED # 11
17
19
  throw Exceptions::ServiceUnavailableException.new(error_code, 'unable to acquire connection')
20
+
18
21
  # Connection pool is full
19
- when Bolt::Error::BOLT_POOL_FULL
22
+ when Bolt::Error::BOLT_POOL_FULL # 0x600
20
23
  throw Exceptions::ClientException.new(
21
24
  error_code,
22
25
  'Unable to acquire connection from the pool within configured maximum time of ' \
23
26
  "#{@config[:connection_acquisition_timeout] * 1000}ms"
24
27
  )
28
+
29
+ # Routing table retrieval failed
30
+ when Bolt::Error::BOLT_ROUTING_UNABLE_TO_RETRIEVE_ROUTING_TABLE # 0x800
31
+ throw Exceptions::ServiceUnavailableException.new(error_code, Bolt::Error.get_string(error_code))
32
+
25
33
  # Error set in connection
26
- when Bolt::Error::BOLT_CONNECTION_HAS_MORE_INFO, Bolt::Error::BOLT_STATUS_SET
34
+ when Bolt::Error::BOLT_CONNECTION_HAS_MORE_INFO, Bolt::Error::BOLT_STATUS_SET # 0xFFE, 0xFFF
27
35
  status = Bolt::Connection.status(bolt_connection)
28
36
  unqualified_error(error_code, status, error_text)
29
37
  else
@@ -71,7 +79,7 @@ module Neo4j
71
79
  throw Exceptions::Neo4jException.new(
72
80
  error_code,
73
81
  "#{error_text || 'Unknown Bolt failure'} (code: #{error_code.to_s(16)}, " \
74
- "text: #{Bolt::Error.get_string(error_code)}, context: #{error_ctx})"
82
+ "text: #{Bolt::Error.get_string(error_code)}, context: #{error_ctx})"
75
83
  )
76
84
  end
77
85
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Neo4j
4
4
  module Driver
5
- VERSION = '0.1.11'
5
+ VERSION = '0.2.0'
6
6
  end
7
7
  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: 0.1.11
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Heinrich Klobuczek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-12-30 00:00:00.000000000 Z
11
+ date: 2020-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport