Skip to content

Commit ae4d13e

Browse files
author
Zhen
committed
Simplify write in ChunkOutput
1 parent 71515d4 commit ae4d13e

File tree

2 files changed

+18
-27
lines changed

2 files changed

+18
-27
lines changed

neo4j/bolt/io.py

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,8 @@ def read(self, n):
8787
else:
8888
value = bytearray(self._view[start:end])
8989
n -= end - start
90-
continue
9190
return memoryview(value)
9291

93-
def close(self):
94-
self._view = None
95-
9692

9793
class ChunkedInputBuffer(object):
9894

@@ -213,7 +209,6 @@ def discard_message(self):
213209
self._frame.close()
214210
self._origin = self._limit
215211
self._limit = -1
216-
self._frame.close() # close the frame to release the reference
217212
self._frame = None
218213

219214

@@ -236,25 +231,23 @@ def clear(self):
236231
self._data[0:2] = b"\x00\x00"
237232

238233
def write(self, b):
239-
new_data_start = 0
240-
new_data_size = len(b)
241-
data_size = self._end - self._start
242-
if data_size > new_data_size:
243-
new_end = self._end + new_data_size
244-
self._data[self._end:new_end] = bytearray(data_size)
245-
while new_data_start < new_data_size:
246-
chunk_occupied = self._end - self._start
247-
chunk_remaining = self._max_chunk_size - chunk_occupied
248-
if chunk_remaining == 0:
234+
to_write = len(b)
235+
max_chunk_size = self._max_chunk_size
236+
pos = 0
237+
while to_write > 0:
238+
chunk_size = self._end - self._start
239+
remaining = max_chunk_size - chunk_size
240+
if remaining == 0 or remaining < to_write <= max_chunk_size:
249241
self.chunk()
250-
chunk_remaining = self._max_chunk_size
251-
chunk_write_size = min(chunk_remaining, new_data_size - new_data_start)
252-
new_end = self._end + chunk_write_size
253-
new_chunk_size = new_end - self._start
254-
self._data[self._end:new_end] = b[new_data_start:(new_data_start + chunk_write_size)]
255-
new_data_start += chunk_write_size
256-
self._end = new_end
257-
self._data[self._header:(self._header + 2)] = struct_pack(">H", new_chunk_size)
242+
else:
243+
wrote = min(to_write, remaining)
244+
new_end = self._end + wrote
245+
self._data[self._end:new_end] = b[pos:pos+wrote]
246+
self._end = new_end
247+
pos += wrote
248+
new_chunk_size = self._end - self._start
249+
self._data[self._header:(self._header + 2)] = struct_pack(">H", new_chunk_size)
250+
to_write -= wrote
258251

259252
def chunk(self):
260253
self._header = self._end

test/integration/test_session.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
from neo4j.v1 import \
2424
READ_ACCESS, WRITE_ACCESS, \
2525
CypherError, SessionError, TransactionError, \
26-
Node, Relationship, Path, GraphDatabase
26+
Node, Relationship, Path
2727
from neo4j.exceptions import CypherSyntaxError
2828

2929
from test.integration.tools import DirectIntegrationTestCase
@@ -459,12 +459,10 @@ def test_errors_on_begin_transaction(self):
459459
session.begin_transaction()
460460

461461
def test_large_values(self):
462-
driver = GraphDatabase.driver(self.bolt_uri, auth=self.auth_token)
463462
for i in range(1, 7):
464-
session = driver.session()
463+
session = self.driver.session()
465464
session.run("RETURN '{}'".format("A" * 2 ** 20))
466465
session.close()
467-
driver.close()
468466

469467
class TransactionCommittedTestCase(DirectIntegrationTestCase):
470468

0 commit comments

Comments
 (0)