neo4j-ruby-driver 4.4.6 → 5.7.0.alpha.2

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.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/neo4j/driver/exceptions/unsupported_feature_exception.rb +11 -0
  3. data/lib/neo4j/driver/internal/duration_normalizer.rb +5 -0
  4. data/lib/neo4j-ruby-driver_loader.rb +0 -1
  5. data/ruby/neo4j/driver/graph_database.rb +3 -3
  6. data/ruby/neo4j/driver/internal/async/connection/bolt_protocol_util.rb +1 -1
  7. data/ruby/neo4j/driver/internal/async/pool/channel.rb +1 -2
  8. data/ruby/neo4j/driver/internal/driver_factory.rb +2 -2
  9. data/ruby/neo4j/driver/internal/internal_entity.rb +3 -2
  10. data/ruby/neo4j/driver/internal/internal_node.rb +2 -2
  11. data/ruby/neo4j/driver/internal/internal_relationship.rb +7 -6
  12. data/ruby/neo4j/driver/internal/messaging/bolt_protocol.rb +2 -0
  13. data/ruby/neo4j/driver/internal/messaging/common/common_value.rb +2 -0
  14. data/ruby/neo4j/driver/internal/messaging/common/common_value_packer.rb +6 -3
  15. data/ruby/neo4j/driver/internal/messaging/common/common_value_unpacker.rb +36 -14
  16. data/ruby/neo4j/driver/internal/messaging/encode/logoff_message_encoder.rb +14 -0
  17. data/ruby/neo4j/driver/internal/messaging/encode/logon_message_encoder.rb +15 -0
  18. data/ruby/neo4j/driver/internal/messaging/request/hello_message.rb +1 -2
  19. data/ruby/neo4j/driver/internal/messaging/request/logoff_message.rb +13 -0
  20. data/ruby/neo4j/driver/internal/messaging/request/logon_message.rb +13 -0
  21. data/ruby/neo4j/driver/internal/messaging/request/message_with_metadata.rb +7 -0
  22. data/ruby/neo4j/driver/internal/messaging/v3/bolt_protocol_v3.rb +2 -2
  23. data/ruby/neo4j/driver/internal/messaging/v3/message_format_v3.rb +3 -3
  24. data/ruby/neo4j/driver/internal/messaging/v4/message_format_v4.rb +1 -5
  25. data/ruby/neo4j/driver/internal/messaging/v43/message_format_v43.rb +1 -5
  26. data/ruby/neo4j/driver/internal/messaging/v44/message_format_v44.rb +1 -5
  27. data/ruby/neo4j/driver/internal/messaging/v5/bolt_protocol_v5.rb +21 -0
  28. data/ruby/neo4j/driver/internal/messaging/v5/message_format_v5.rb +18 -0
  29. data/ruby/neo4j/driver/internal/messaging/v5/value_unpacker_v5.rb +17 -0
  30. data/ruby/neo4j/driver/internal/messaging/v51/bolt_protocol_v51.rb +40 -0
  31. data/ruby/neo4j/driver/internal/messaging/v51/message_format_v51.rb +14 -0
  32. data/ruby/neo4j/driver/internal/messaging/v51/message_writer_v51.rb +17 -0
  33. data/ruby/neo4j/driver/version.rb +1 -1
  34. metadata +30 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 547d6edd957d3cc9990a30d5e53a8c020f687e35fdd4bef2f930a74396123597
4
- data.tar.gz: 0c2c2bddbc65bd841560b9584f2bff1cb895459b7227080331d98cc0470f9d98
3
+ metadata.gz: 71b95e5c46e4972f99faf4ae2022d22080dfc3c1dc9bdefa41f32d673fbbe12d
4
+ data.tar.gz: 2f835765a09b106233846a5fb6b27b7c4294432ddcf529e97e24a12d95453b41
5
5
  SHA512:
6
- metadata.gz: d75c2d6477bb1277d3d26a834c13993f1a20ac99d80115b60de2988011d363941d8af5bcb74fb9bd4facf02d63250fca98c6de446d090bf7a488aa1702e3c42f
7
- data.tar.gz: 8495cf5c594d70fdf2e8741e8ae00ed7211e59162d2db820a5df5997219c2bad78c350a24cf22f54b16b46bb4a92fd501b4587764f163bfd45e81fc53a8e15e9
6
+ metadata.gz: b8fdbc3550b26212a79b6a88d8162fb1d3098ae6bf96e421a857a17ea3964fc4baa24a068aaa6876c49b17a19fe1fe2303ccda40cb3c17694ba768f74ac9e7c8
7
+ data.tar.gz: 553a6511cc8ea7d464d8e3d4e26ccb8eef4611c03ad6c758cac656f623bbd0d27053e4b071194ad8356bfb0fb25286577a18b7168d4c40ffccb4c2158c0c540c
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Neo4j
4
+ module Driver
5
+ module Exceptions
6
+ # A feature is not supported in a given setup.
7
+ class UnsupportedFeatureException < ClientException
8
+ end
9
+ end
10
+ end
11
+ end
@@ -21,6 +21,11 @@ module Neo4j
21
21
  duration&.in_milliseconds&.round
22
22
  end
23
23
 
24
+ def create(months, days, seconds, nanoseconds)
25
+ { months:, days:, seconds: seconds + (nanoseconds.zero? ? 0 : nanoseconds * BigDecimal('1e-9')) }
26
+ .sum { |key, value| ActiveSupport::Duration.send(key, value) }
27
+ end
28
+
24
29
  private
25
30
 
26
31
  def divmod(number, factor)
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'active_support/concern'
4
4
  require 'active_support/core_ext/hash/indifferent_access'
5
- require 'active_support/core_ext/object/blank'
6
5
  require 'active_support/isolated_execution_state' if Gem::Requirement.create('>= 7').satisfied_by?(Gem.loaded_specs["activesupport"].version) # TODO: this should not be necessary https://github.com/rails/rails/issues/43851
7
6
  require 'active_support/deprecator' if Gem::Requirement.create('>= 7.1').satisfied_by?(Gem.loaded_specs["activesupport"].version)
8
7
  require 'active_support/deprecation'
@@ -7,14 +7,14 @@ module Neo4j::Driver
7
7
  auto_closable :driver, :routing_driver
8
8
 
9
9
  def driver(uri, auth_token = nil, **config)
10
- internal_driver(uri, auth_token, config, Internal::DriverFactory.new)
10
+ internal_driver(uri, auth_token, config)
11
11
  end
12
12
 
13
- def internal_driver(uri, auth_token, config, factory)
13
+ def internal_driver(uri, auth_token, config, &domain_name_resolver)
14
14
  uri = URI(uri)
15
15
  config = Config.new(**config)
16
16
 
17
- factory.new_instance(
17
+ Internal::DriverFactory.new(&domain_name_resolver).new_instance(
18
18
  uri,
19
19
  auth_token || AuthTokens.none,
20
20
  config.routing_settings,
@@ -9,9 +9,9 @@ module Neo4j::Driver
9
9
  DEFAULT_MAX_OUTBOUND_CHUNK_SIZE_BYTES = 2 ** 15 - 1
10
10
  HANDSHAKE = [
11
11
  BOLT_MAGIC_PREAMBLE,
12
+ Messaging::V5::BoltProtocolV5::VERSION.to_int,
12
13
  Messaging::V44::BoltProtocolV44::VERSION.to_int_range(Messaging::V42::BoltProtocolV42::VERSION),
13
14
  Messaging::V41::BoltProtocolV41::VERSION.to_int,
14
- Messaging::V4::BoltProtocolV4::VERSION.to_int,
15
15
  Messaging::V3::BoltProtocolV3::VERSION.to_int]
16
16
  HANDSHAKE_BUF = HANDSHAKE.pack('N*').freeze
17
17
 
@@ -14,12 +14,11 @@ module Neo4j::Driver
14
14
  @stream.write(Connection::BoltProtocolUtil.handshake_buf)
15
15
  @stream.flush
16
16
  Connection::HandshakeHandler.new(logger).decode(self)
17
- stream_reader = Connection::StreamReader.new(@stream)
18
17
  stream_writer = Outbound::ChunkAwareByteBufOutput.new(@stream)
19
18
  @message_dispatcher = Inbound::InboundMessageDispatcher.new(self, logger)
20
19
  @attributes[:message_dispatcher] = @message_dispatcher
21
20
  @outbound_handler = Outbound::OutboundMessageHandler.new(stream_writer, message_format, logger)
22
- @common_message_reader = Messaging::Common::CommonMessageReader.new(stream_reader)
21
+ @common_message_reader = message_format.new_reader(@stream)
23
22
  connector.initialize_channel(self, protocol)
24
23
  end
25
24
 
@@ -3,8 +3,8 @@ module Neo4j::Driver::Internal
3
3
  include Scheme
4
4
  NO_ROUTING_CONTEXT_ERROR_MESSAGE = "Routing parameters are not supported with scheme 'bolt'. Given URI: "
5
5
 
6
- def initialize(domain_name_resolver = ->(name) { [name] })
7
- @domain_name_resolver = domain_name_resolver
6
+ def initialize(&domain_name_resolver)
7
+ @domain_name_resolver = domain_name_resolver || ->(name) { [name] }
8
8
  end
9
9
 
10
10
  def new_instance(uri, auth_token, routing_settings, retry_settings, config, security_plan, event_loop_group = nil)
@@ -1,12 +1,13 @@
1
1
  module Neo4j::Driver
2
2
  module Internal
3
3
  class InternalEntity
4
- attr_reader :id, :properties
4
+ attr_reader :id, :element_id, :properties
5
5
  delegate :hash, to: :id
6
6
  delegate :[], :size, :key?, :keys, :values, :to_h, to: :properties
7
7
 
8
- def initialize(id, properties)
8
+ def initialize(id, element_id, **properties)
9
9
  @id = id
10
+ @element_id = element_id || id.to_s
10
11
  @properties = properties
11
12
  end
12
13
 
@@ -4,8 +4,8 @@ module Neo4j::Driver
4
4
  class InternalNode < InternalEntity
5
5
  attr_reader :labels
6
6
 
7
- def initialize(id, *labels, **properties)
8
- super(id, properties)
7
+ def initialize(id, element_id, *labels, **properties)
8
+ super(id, element_id, **properties)
9
9
  @labels = labels
10
10
  end
11
11
 
@@ -3,19 +3,20 @@
3
3
  module Neo4j::Driver
4
4
  module Internal
5
5
  class InternalRelationship < InternalEntity
6
- attr_accessor :start_node_id, :end_node_id
6
+ attr_accessor :start_node_id, :end_node_id, :start_element_id, :end_element_id
7
7
  attr_reader :type
8
8
 
9
- def initialize(id, start_node_id, end_node_id, type, **properties)
10
- super(id, properties)
11
- @start_node_id = start_node_id
12
- @end_node_id = end_node_id
9
+ def initialize(id, element_id, start_node_id, start_element_id, end_node_id, end_element_id, type, **properties)
10
+ super(id, element_id, **properties)
11
+ set_start_and_end_node_ids(start_node_id, start_element_id, end_node_id, end_element_id)
13
12
  @type = type.to_sym
14
13
  end
15
14
 
16
- def start_and_end_node_ids=(start_node_id, end_node_id)
15
+ def set_start_and_end_node_ids(start_node_id, start_element_id, end_node_id, end_element_id)
17
16
  @start_node_id = start_node_id
17
+ @start_element_id = start_element_id || start_node_id.to_s
18
18
  @end_node_id = end_node_id
19
+ @end_element_id = end_element_id || end_node_id.to_s
19
20
  end
20
21
 
21
22
  def to_s
@@ -20,6 +20,8 @@ module Neo4j::Driver
20
20
  V43::BoltProtocolV43::INSTANCE
21
21
  when V44::BoltProtocolV44::VERSION
22
22
  V44::BoltProtocolV44::INSTANCE
23
+ when V5::BoltProtocolV5::VERSION
24
+ V5::BoltProtocolV5::INSTANCE
23
25
  else
24
26
  raise Exceptions::ClientException, "Unknown protocol version: #{version}"
25
27
  end
@@ -13,7 +13,9 @@ module Neo4j::Driver
13
13
  LOCAL_DATE_TIME = 'd'
14
14
  LOCAL_DATE_TIME_STRUCT_SIZE = 2
15
15
  DATE_TIME_WITH_ZONE_OFFSET = 'F'
16
+ DATE_TIME_WITH_ZONE_OFFSET_UTC = 'I'
16
17
  DATE_TIME_WITH_ZONE_ID = 'f'
18
+ DATE_TIME_WITH_ZONE_ID_UTC = 'i'
17
19
  DATE_TIME_STRUCT_SIZE = 3
18
20
  DURATION = 'E'
19
21
  DURATION_TIME_STRUCT_SIZE = 4
@@ -4,6 +4,7 @@ module Neo4j::Driver
4
4
  module Common
5
5
  module CommonValuePacker
6
6
  include CommonValue
7
+ attr_writer :date_time_utc_enabled
7
8
 
8
9
  def pack(value)
9
10
  case value
@@ -61,18 +62,20 @@ module Neo4j::Driver
61
62
  end
62
63
 
63
64
  def pack_date_time_with_zone_id(time)
64
- pack_struct_header(DATE_TIME_STRUCT_SIZE, DATE_TIME_WITH_ZONE_ID)
65
+ pack_struct_header(DATE_TIME_STRUCT_SIZE,
66
+ @date_time_utc_enabled ? DATE_TIME_WITH_ZONE_ID_UTC : DATE_TIME_WITH_ZONE_ID)
65
67
  pack_date_time(time)
66
68
  pack_string(time.time_zone.tzinfo.identifier)
67
69
  end
68
70
 
69
71
  def pack_date_time(time)
70
- pack_integer(time.to_i + time.utc_offset)
72
+ pack_integer(time.to_i + (@date_time_utc_enabled ? 0 : time.utc_offset))
71
73
  pack_integer(time.nsec)
72
74
  end
73
75
 
74
76
  def pack_date_time_with_zone_offset(time)
75
- pack_struct_header(DATE_TIME_STRUCT_SIZE, DATE_TIME_WITH_ZONE_OFFSET)
77
+ pack_struct_header(DATE_TIME_STRUCT_SIZE,
78
+ @date_time_utc_enabled ? DATE_TIME_WITH_ZONE_OFFSET_UTC : DATE_TIME_WITH_ZONE_OFFSET)
76
79
  pack_date_time(time)
77
80
  pack_utc_offset(time)
78
81
  end
@@ -9,6 +9,7 @@ module Neo4j::Driver
9
9
  UNBOUND_RELATIONSHIP = 'r'
10
10
  PATH = 'P'
11
11
  NODE_FIELDS = 3
12
+ RELATIONSHIP_FIELDS = 5
12
13
 
13
14
  def unpack_map(size)
14
15
  size.times.to_h { [unpack.to_sym, unpack] }
@@ -91,9 +92,15 @@ module Neo4j::Driver
91
92
  when DATE_TIME_WITH_ZONE_OFFSET
92
93
  ensure_correct_struct_size(:DATE_TIME_WITH_ZONE_OFFSET, DATE_TIME_STRUCT_SIZE, size)
93
94
  unpack_date_time_with_zone_offset
95
+ when DATE_TIME_WITH_ZONE_OFFSET_UTC
96
+ ensure_correct_struct_size(:DATE_TIME_WITH_ZONE_OFFSET_UTC, DATE_TIME_STRUCT_SIZE, size)
97
+ unpack_date_time_with_zone_offset(true)
94
98
  when DATE_TIME_WITH_ZONE_ID
95
99
  ensure_correct_struct_size(:DATE_TIME_WITH_ZONE_ID, DATE_TIME_STRUCT_SIZE, size)
96
100
  unpack_date_time_with_zone_id
101
+ when DATE_TIME_WITH_ZONE_ID_UTC
102
+ ensure_correct_struct_size(:DATE_TIME_WITH_ZONE_ID_UTC, DATE_TIME_STRUCT_SIZE, size)
103
+ unpack_date_time_with_zone_id(true)
97
104
  when DURATION
98
105
  ensure_correct_struct_size(:DURATION, DURATION_TIME_STRUCT_SIZE, size)
99
106
  unpack_duration
@@ -104,13 +111,13 @@ module Neo4j::Driver
104
111
  ensure_correct_struct_size(:POINT, POINT_3D_STRUCT_SIZE, size)
105
112
  unpack_point3_d
106
113
  when NODE
107
- ensure_correct_struct_size(:NODE, NODE_FIELDS, size)
114
+ ensure_correct_struct_size(:NODE, node_fields, size)
108
115
  adapted = unpack_node
109
116
  when RELATIONSHIP
110
- ensure_correct_struct_size(:RELATIONSHIP, 5, size)
117
+ ensure_correct_struct_size(:RELATIONSHIP, relationship_fields, size)
111
118
  unpack_relationship
112
119
  when UNBOUND_RELATIONSHIP
113
- ensure_correct_struct_size(:RELATIONSHIP, 3, size)
120
+ ensure_correct_struct_size(:RELATIONSHIP, unbound_relationship_fields, size)
114
121
  unpack_unbound_relationship
115
122
  when PATH
116
123
  ensure_correct_struct_size(:PATH, 3, size)
@@ -123,15 +130,26 @@ module Neo4j::Driver
123
130
  private
124
131
 
125
132
  def unpack_relationship
126
- InternalRelationship.new(*4.times.map { unpack }, **unpack)
133
+ id = unpack
134
+ start_node_id = unpack
135
+ end_node_id = unpack
136
+ type = unpack
137
+ properties = unpack
138
+ InternalRelationship.new(id, unpack_element_id, start_node_id, unpack_element_id, end_node_id, unpack_element_id, type, **properties)
127
139
  end
128
140
 
129
141
  def unpack_unbound_relationship
130
- InternalRelationship.new(unpack, nil, nil, unpack, **unpack)
142
+ id = unpack
143
+ type = unpack
144
+ properties = unpack
145
+ InternalRelationship.new(id, unpack_element_id, *[nil] * 4, type, **properties)
131
146
  end
132
147
 
133
148
  def unpack_node
134
- InternalNode.new(unpack, *unpack.map(&:to_sym), **unpack)
149
+ id = unpack
150
+ labels = unpack.map(&:to_sym)
151
+ properties = unpack
152
+ InternalNode.new(id, unpack_element_id, *labels, **properties)
135
153
  end
136
154
 
137
155
  def unpack_path
@@ -168,7 +186,13 @@ module Neo4j::Driver
168
186
  end
169
187
  end
170
188
 
171
- private
189
+ def node_fields = NODE_FIELDS
190
+
191
+ def relationship_fields = RELATIONSHIP_FIELDS
192
+
193
+ def unbound_relationship_fields = 3
194
+
195
+ def unpack_element_id = nil
172
196
 
173
197
  def ensure_correct_struct_signature(struct_name, expected, actual)
174
198
  if expected != actual
@@ -198,26 +222,24 @@ module Neo4j::Driver
198
222
  Types::LocalDateTime.new(Time.at(unpack, unpack, :nsec).utc)
199
223
  end
200
224
 
201
- def unpack_date_time_with_zone_offset
225
+ def unpack_date_time_with_zone_offset(utc = false)
202
226
  # Time.at(unpack, unpack, :nsec, in: unpack)
203
227
  sec = unpack
204
228
  nsec = unpack
205
229
  offset = unpack
206
230
  time = Time.at(sec, nsec, :nsec).utc
231
+ time += offset if utc
207
232
  Time.new(time.year, time.month, time.mday, time.hour, time.min, time.sec + Rational(nsec, 1_000_000_000),
208
233
  offset)
209
234
  end
210
235
 
211
- def unpack_date_time_with_zone_id
236
+ def unpack_date_time_with_zone_id(utc = false)
212
237
  time = Time.at(unpack, unpack, :nsec).in_time_zone(TZInfo::Timezone.get(unpack))
213
- time - time.utc_offset
238
+ utc ? time : time - time.utc_offset
214
239
  end
215
240
 
216
241
  def unpack_duration
217
- ActiveSupport::Duration.months(unpack) +
218
- ActiveSupport::Duration.days(unpack) +
219
- ActiveSupport::Duration.seconds(unpack) +
220
- ActiveSupport::Duration.seconds(unpack * BigDecimal('1e-9'))
242
+ DurationNormalizer.create(*4.times.map { unpack })
221
243
  end
222
244
 
223
245
  def unpack_point2_d
@@ -0,0 +1,14 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module Encode
5
+ class LogoffMessageEncoder
6
+ def encode(message, packer)
7
+ Util::Preconditions.check_argument(message, Request::LogoffMessage)
8
+ packer.pack_struct_header(0, message.class::SIGNATURE)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module Encode
5
+ class LogonMessageEncoder
6
+ def encode(message, packer)
7
+ Util::Preconditions.check_argument(message, Request::LogonMessage)
8
+ packer.pack_struct_header(1, message.class::SIGNATURE)
9
+ packer.pack(message.metadata)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -12,8 +12,7 @@ module Neo4j::Driver
12
12
  end
13
13
 
14
14
  def to_s
15
- metadata_copy = metadata.merge(Security::InternalAuthToken::CREDENTIALS_KEY => '******')
16
- "HELLO #{metadata_copy}"
15
+ "HELLO #{safe_metadata}"
17
16
  end
18
17
 
19
18
  private
@@ -0,0 +1,13 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module Request
5
+ class LogoffMessage < MessageWithMetadata
6
+ SIGNATURE = 0x6B
7
+
8
+ def to_s = 'LOGOFF'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module Request
5
+ class LogonMessage < MessageWithMetadata
6
+ SIGNATURE = 0x6A
7
+
8
+ def to_s = "LOGON #{safe_metadata}"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -3,6 +3,13 @@ module Neo4j::Driver
3
3
  module Messaging
4
4
  module Request
5
5
  class MessageWithMetadata < Struct.new(:metadata)
6
+ protected
7
+
8
+ def safe_metadata = replace(metadata, Security::InternalAuthToken::CREDENTIALS_KEY, '******')
9
+
10
+ private
11
+
12
+ def replace(hash, key, value) = hash.key?(key) ? hash.merge(key => value) : hash
6
13
  end
7
14
  end
8
15
  end
@@ -21,11 +21,11 @@ module Neo4j::Driver
21
21
  end
22
22
 
23
23
  def prepare_to_close_channel(channel)
24
- message_dispatcher = Connection::ChannelAttributes.message_dispatcher(channel)
24
+ message_dispatcher = channel.message_dispatcher
25
25
 
26
26
  message = Request::GoodbyeMessage::GOODBYE
27
27
  message_dispatcher.enqueue(Handlers::NoOpResponseHandler::INSTANCE)
28
- channel.write_and_flush(message, channel.void_promise)
28
+ channel.write_and_flush(message)
29
29
 
30
30
  message_dispatcher.prepare_to_close_channel
31
31
  end
@@ -7,9 +7,9 @@ module Neo4j::Driver
7
7
  MessageWriterV3.new(output)
8
8
  end
9
9
 
10
- def new_reader(input)
11
- Common::CommonMessageReader.new(input)
12
- end
10
+ def new_reader(input) = Common::CommonMessageReader.new(new_value_unpacker(input))
11
+
12
+ def new_value_unpacker(input) = Async::Connection::StreamReader.new(input)
13
13
  end
14
14
  end
15
15
  end
@@ -2,14 +2,10 @@ module Neo4j::Driver
2
2
  module Internal
3
3
  module Messaging
4
4
  module V4
5
- class MessageFormatV4
5
+ class MessageFormatV4 < V3::MessageFormatV3
6
6
  def new_writer(output)
7
7
  MessageWriterV4.new(output)
8
8
  end
9
-
10
- def new_reader(input)
11
- Common::CommonMessageReader.new(input)
12
- end
13
9
  end
14
10
  end
15
11
  end
@@ -3,14 +3,10 @@ module Neo4j::Driver
3
3
  module Messaging
4
4
  module V43
5
5
  # Bolt message format v4.3
6
- class MessageFormatV43
6
+ class MessageFormatV43 < V4::MessageFormatV4
7
7
  def new_writer(output)
8
8
  MessageWriterV43.new(output)
9
9
  end
10
-
11
- def new_reader(input)
12
- Common::CommonMessageReader.new(input)
13
- end
14
10
  end
15
11
  end
16
12
  end
@@ -3,14 +3,10 @@ module Neo4j::Driver
3
3
  module Messaging
4
4
  module V44
5
5
  # Bolt message format v4.4
6
- class MessageFormatV44
6
+ class MessageFormatV44 < V43::MessageFormatV43
7
7
  def new_writer(output)
8
8
  MessageWriterV44.new(output)
9
9
  end
10
-
11
- def new_reader(input)
12
- CommonMessageReader.new(input)
13
- end
14
10
  end
15
11
  end
16
12
  end
@@ -0,0 +1,21 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V5
5
+ # Definition of the Bolt Protocol 5.0
6
+ class BoltProtocolV5 < V44::BoltProtocolV44
7
+ VERSION = BoltProtocolVersion.new(5, 0)
8
+ INSTANCE = new
9
+
10
+ def create_message_format
11
+ MessageFormatV5.new
12
+ end
13
+
14
+ protected
15
+
16
+ def include_date_time_utc_patch_in_hello = false
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V5
5
+ # Bolt message format v5.0
6
+ class MessageFormatV5 < V44::MessageFormatV44
7
+ def new_writer(output)
8
+ output.date_time_utc_enabled = true
9
+ super
10
+ end
11
+ def new_value_unpacker(input)
12
+ ValueUnpackerV5.new(input)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V5
5
+ class ValueUnpackerV5 < Async::Connection::StreamReader
6
+ alias unpack_element_id unpack
7
+
8
+ def node_fields = 4
9
+
10
+ def relationship_fields = 8
11
+
12
+ def unbound_relationship_fields = 4
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,40 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V51
5
+ class BoltProtocolV51 < V5::BoltProtocolV5
6
+ VERSION = BoltProtocolVersion.new(5, 1)
7
+ INSTANCE = new
8
+
9
+ def create_message_format
10
+ MessageFormatV51.new
11
+ end
12
+
13
+ def initialize_channel(channel, user_agent, auth_token, routing_context)
14
+ message = Request::HelloMessage.new(user_agent, {},
15
+ (routing_context.to_h if routing_context.server_routing_enabled?))
16
+ handler = Handlers::HelloV51ResponseHandler.new(channel, VERSION)
17
+
18
+ channel.message_dispatcher.enqueue(handler)
19
+ channel.write(message)
20
+ message = Request::LogonMessage(auth_token)
21
+ channel.message_dispatcher.enqueue(LogonResponseHandle.new(channel, auth_token))
22
+ channel.write_and_flush(message)
23
+ end
24
+
25
+ def logoff
26
+
27
+ end
28
+
29
+ def logon
30
+
31
+ end
32
+
33
+ def version
34
+ self.class::VERSION
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,14 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V51
5
+ # Bolt message format v4.4
6
+ class MessageFormatV51 < V5::MessageFormatV5
7
+ def new_writer(output)
8
+ MessageWriterV51.new(output)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ module Neo4j::Driver
2
+ module Internal
3
+ module Messaging
4
+ module V51
5
+ class MessageWriterV51 < V44::MessageWriterV44
6
+ private
7
+
8
+ def build_encoders
9
+ super.merge(
10
+ LogonMessage.SIGNATURE => Encode::LogonMessageEncoder,
11
+ LogoffMessage.SIGNATURE => Encode::LogoffMessageEncoder)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Neo4j
4
4
  module Driver
5
- VERSION = '4.4.6'
5
+ VERSION = '5.7.0.alpha.2'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neo4j-ruby-driver
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.4.6
4
+ version: 5.7.0.alpha.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Heinrich Klobuczek
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-12-16 00:00:00.000000000 Z
10
+ date: 2025-01-13 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: activesupport
@@ -16,14 +15,14 @@ dependencies:
16
15
  requirements:
17
16
  - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: 5.2.0
18
+ version: '7.1'
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
23
  - - ">="
25
24
  - !ruby/object:Gem::Version
26
- version: 5.2.0
25
+ version: '7.1'
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: zeitwerk
29
28
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +79,20 @@ dependencies:
80
79
  - - ">="
81
80
  - !ruby/object:Gem::Version
82
81
  version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: csv
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
83
96
  - !ruby/object:Gem::Dependency
84
97
  name: ffaker
85
98
  requirement: !ruby/object:Gem::Requirement
@@ -231,6 +244,7 @@ files:
231
244
  - lib/neo4j/driver/exceptions/token_expired_exception.rb
232
245
  - lib/neo4j/driver/exceptions/transaction_nesting_exception.rb
233
246
  - lib/neo4j/driver/exceptions/transient_exception.rb
247
+ - lib/neo4j/driver/exceptions/unsupported_feature_exception.rb
234
248
  - lib/neo4j/driver/exceptions/untrusted_server_exception.rb
235
249
  - lib/neo4j/driver/exceptions/value/lossy_coercion.rb
236
250
  - lib/neo4j/driver/exceptions/value/not_multi_valued.rb
@@ -379,6 +393,8 @@ files:
379
393
  - ruby/neo4j/driver/internal/messaging/encode/goodbye_message_encoder.rb
380
394
  - ruby/neo4j/driver/internal/messaging/encode/hello_message_encoder.rb
381
395
  - ruby/neo4j/driver/internal/messaging/encode/init_message_encoder.rb
396
+ - ruby/neo4j/driver/internal/messaging/encode/logoff_message_encoder.rb
397
+ - ruby/neo4j/driver/internal/messaging/encode/logon_message_encoder.rb
382
398
  - ruby/neo4j/driver/internal/messaging/encode/pull_all_message_encoder.rb
383
399
  - ruby/neo4j/driver/internal/messaging/encode/pull_message_encoder.rb
384
400
  - ruby/neo4j/driver/internal/messaging/encode/reset_message_encoder.rb
@@ -395,6 +411,8 @@ files:
395
411
  - ruby/neo4j/driver/internal/messaging/request/goodbye_message.rb
396
412
  - ruby/neo4j/driver/internal/messaging/request/hello_message.rb
397
413
  - ruby/neo4j/driver/internal/messaging/request/init_message.rb
414
+ - ruby/neo4j/driver/internal/messaging/request/logoff_message.rb
415
+ - ruby/neo4j/driver/internal/messaging/request/logon_message.rb
398
416
  - ruby/neo4j/driver/internal/messaging/request/message_with_metadata.rb
399
417
  - ruby/neo4j/driver/internal/messaging/request/multi_database_util.rb
400
418
  - ruby/neo4j/driver/internal/messaging/request/pull_all_message.rb
@@ -423,6 +441,12 @@ files:
423
441
  - ruby/neo4j/driver/internal/messaging/v44/bolt_protocol_v44.rb
424
442
  - ruby/neo4j/driver/internal/messaging/v44/message_format_v44.rb
425
443
  - ruby/neo4j/driver/internal/messaging/v44/message_writer_v44.rb
444
+ - ruby/neo4j/driver/internal/messaging/v5/bolt_protocol_v5.rb
445
+ - ruby/neo4j/driver/internal/messaging/v5/message_format_v5.rb
446
+ - ruby/neo4j/driver/internal/messaging/v5/value_unpacker_v5.rb
447
+ - ruby/neo4j/driver/internal/messaging/v51/bolt_protocol_v51.rb
448
+ - ruby/neo4j/driver/internal/messaging/v51/message_format_v51.rb
449
+ - ruby/neo4j/driver/internal/messaging/v51/message_writer_v51.rb
426
450
  - ruby/neo4j/driver/internal/metrics/connection_pool_metrics_listener.rb
427
451
  - ruby/neo4j/driver/internal/metrics/internal_abstract_metrics.rb
428
452
  - ruby/neo4j/driver/internal/metrics/internal_connection_pool_metrics.rb
@@ -483,7 +507,6 @@ licenses:
483
507
  - MIT
484
508
  metadata:
485
509
  homepage_uri: https://github.com/neo4jrb/neo4j-ruby-driver
486
- post_install_message:
487
510
  rdoc_options:
488
511
  - "--main"
489
512
  - README.md
@@ -501,8 +524,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
501
524
  - !ruby/object:Gem::Version
502
525
  version: '0'
503
526
  requirements: []
504
- rubygems_version: 3.5.22
505
- signing_key:
527
+ rubygems_version: 3.6.2
506
528
  specification_version: 4
507
529
  summary: ''
508
530
  test_files: []