Skip to content

Commit 7b56264

Browse files
committed
Test hotfix for large values
1 parent 2c3735f commit 7b56264

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

neo4j/bolt/io.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ def __init__(self, view, panes):
3939
self._current_pane = 0
4040
self._current_offset = 0
4141

42+
def close(self):
43+
self._view = None
44+
4245
def _next_pane(self):
4346
self._current_pane += 1
4447
if self._current_pane < len(self._panes):
@@ -202,6 +205,7 @@ def discard_message(self):
202205
if self._frame is not None:
203206
self._origin = self._limit
204207
self._limit = -1
208+
self._frame.close() # close the frame to release the reference
205209
self._frame = None
206210

207211

@@ -224,23 +228,25 @@ def clear(self):
224228
self._data[0:2] = b"\x00\x00"
225229

226230
def write(self, b):
227-
data = self._data
231+
new_data_start = 0
228232
new_data_size = len(b)
229-
chunk_size = self._end - self._start
230-
max_chunk_size = self._max_chunk_size
231-
chunk_remaining = max_chunk_size - chunk_size
232-
if new_data_size > max_chunk_size:
233-
self.write(b[:chunk_remaining])
234-
self.chunk()
235-
self.write(b[chunk_remaining:])
236-
return
237-
if new_data_size > chunk_remaining:
238-
self.chunk()
239-
new_end = self._end + new_data_size
240-
new_chunk_size = new_end - self._start
241-
data[self._end:new_end] = b
242-
self._end = new_end
243-
data[self._header:(self._header + 2)] = struct_pack(">H", new_chunk_size)
233+
data_size = self._end - self._start
234+
if data_size > new_data_size:
235+
new_end = self._end + new_data_size
236+
self._data[self._end:new_end] = bytearray(data_size)
237+
while new_data_start < new_data_size:
238+
chunk_occupied = self._end - self._start
239+
chunk_remaining = self._max_chunk_size - chunk_occupied
240+
if chunk_remaining == 0:
241+
self.chunk()
242+
chunk_remaining = self._max_chunk_size
243+
chunk_write_size = min(chunk_remaining, new_data_size - new_data_start)
244+
new_end = self._end + chunk_write_size
245+
new_chunk_size = new_end - self._start
246+
self._data[self._end:new_end] = b[new_data_start:(new_data_start + chunk_write_size)]
247+
new_data_start += chunk_write_size
248+
self._end = new_end
249+
self._data[self._header:(self._header + 2)] = struct_pack(">H", new_chunk_size)
244250

245251
def chunk(self):
246252
self._header = self._end

0 commit comments

Comments
 (0)