@@ -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