Skip to content

Commit 240bef0

Browse files
committed
refactor: optimize multi-packet handling in read_payload
1 parent a9c256c commit 240bef0

File tree

1 file changed

+11
-18
lines changed

1 file changed

+11
-18
lines changed

mariadb/impl/client/sync_client.py

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -172,34 +172,26 @@ def read_payload(self):
172172

173173
total_size += packet_length
174174

175-
# check if data is in buffer
176-
missing = 0
177-
if bytes_in_buffer == PKT_HDR_SIZE:
178-
missing= packet_length
179-
self._recv_pos += 4
180-
elif bytes_in_buffer < PKT_HDR_SIZE + packet_length:
175+
# check if we have complete packet data
176+
if bytes_in_buffer < PKT_HDR_SIZE + packet_length:
177+
# Need to read more data
181178
missing = PKT_HDR_SIZE + packet_length - bytes_in_buffer
182-
# Beside data we want to read also the next packet header
179+
# For MAX_PKT_SIZE packets, also try to read next packet header
183180
if packet_length == MAX_PKT_SIZE:
184181
missing += 4
185-
# ensure that the buffer can store all data
186-
if missing > 0:
187182
self._ensure_space(missing)
188183
self._recv_len += self._recv_into_buffer(missing)
189184
continue
190185

191-
# if packet_size is
192-
# below MAX_PACKET_SIZE we stored all data
186+
# We have complete packet (header + payload)
187+
# Check if this is the last packet
193188
if packet_length < MAX_PKT_SIZE:
189+
# Last packet - return accumulated payload
194190
self._recv_pos = first_pos + 4 + total_size
195-
# Todo: memoryview doesn't speed up for smaller packets, so we need
196-
# to check the packet size and return either a bytearray or a memoryview
197191
return memoryview(self._recv_buf[first_pos + 4:first_pos + 4 + total_size])
198-
else:
199-
multi_packet= 1
200192

201-
# don't store packet lengths for subsequent packages
202-
self._recv_pos= self._recv_len - 4
193+
# Multi-packet: advance to next packet header
194+
self._recv_pos += PKT_HDR_SIZE + packet_length
203195
else:
204196
self._recv_len += self._recv_into_buffer()
205197

@@ -427,6 +419,7 @@ def execute(self, message: ClientMessage, config: 'Configuration' = None, buffer
427419

428420
try:
429421
self.write_stream.write_payload(message.payload(self.context), message.type(), True)
422+
self.reset_buffer()
430423
return self._read_result(message.is_binary(), config, buffered, prepare_stmt_packet)
431424
except DatabaseError as e:
432425
raise e
@@ -443,6 +436,7 @@ def execute_many(self, messages: List[ClientMessage], config: 'Configuration' =
443436
try:
444437
for message in messages:
445438
self.write_stream.write_payload(message.payload(self.context), message.type(), True)
439+
self.reset_buffer()
446440
for message in messages:
447441
results.append(self._read_result(message.is_binary(), config, buffered, prepare_stmt_packet))
448442
except DatabaseError as e:
@@ -456,7 +450,6 @@ def execute_many(self, messages: List[ClientMessage], config: 'Configuration' =
456450
def _read_result(self, is_binary: bool, config: 'Configuration' = None, buffered: bool = True, prepare_stmt_packet: Optional[PrepareStmtPacket] = None) -> List[Completion]:
457451

458452
results = []
459-
self.reset_buffer()
460453
while True:
461454
packet = self.read_payload()
462455
if packet[0] == self.OK_PACKET:

0 commit comments

Comments
 (0)