Skip to content

Commit 8ba2e76

Browse files
liutecZhen
authored andcommitted
Test hotfix for large values
1 parent 12c604b commit 8ba2e76

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):
@@ -206,6 +209,7 @@ def discard_message(self):
206209
self._frame.close()
207210
self._origin = self._limit
208211
self._limit = -1
212+
self._frame.close() # close the frame to release the reference
209213
self._frame = None
210214

211215

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

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

249255
def chunk(self):
250256
self._header = self._end

0 commit comments

Comments
 (0)