@@ -199,8 +199,8 @@ cdef class ReadBuffer(Buffer):
199199 cdef:
200200 ssize_t _saved_packet_pos, _next_packet_pos, _saved_pos
201201 ChunkedBytesBuffer _chunked_bytes_buf
202- bint _session_needs_to_be_closed
203202 const char_type _split_data[255 ]
203+ uint32_t _pending_error_num
204204 Packet _current_packet
205205 Transport _transport
206206 list _saved_packets
@@ -214,6 +214,23 @@ cdef class ReadBuffer(Buffer):
214214 self ._caps = caps
215215 self ._chunked_bytes_buf = ChunkedBytesBuffer()
216216
217+ cdef int _check_connected(self ):
218+ """
219+ Checks to see if the transport is connected and throws the appropriate
220+ exception if not.
221+ """
222+ if self ._pending_error_num != 0 :
223+ if self ._transport is not None :
224+ self ._transport.disconnect()
225+ self ._transport = None
226+ if self ._pending_error_num == TNS_ERR_EXCEEDED_IDLE_TIME:
227+ errors._raise_err(errors.ERR_EXCEEDED_IDLE_TIME)
228+ else :
229+ errors._raise_err(errors.ERR_UNSUPPORTED_INBAND_NOTIFICATION,
230+ err_num = self ._pending_error_num)
231+ elif self ._transport is None :
232+ errors._raise_err(errors.ERR_NOT_CONNECTED)
233+
217234 cdef int _get_int_length_and_sign(self , uint8_t * length,
218235 bint * is_negative,
219236 uint8_t max_length) except - 1 :
@@ -311,7 +328,6 @@ cdef class ReadBuffer(Buffer):
311328 """
312329 cdef:
313330 uint16_t control_type
314- uint32_t error_num
315331 Buffer buf
316332 buf = Buffer.__new__ (Buffer)
317333 buf._populate_from_bytes(packet.buf)
@@ -321,16 +337,11 @@ cdef class ReadBuffer(Buffer):
321337 self ._caps.supports_oob = False
322338 elif control_type == TNS_CONTROL_TYPE_INBAND_NOTIFICATION:
323339 buf.skip_raw_bytes(4 ) # skip first integer
324- buf.read_uint32(& error_num)
325- if error_num == TNS_ERR_SESSION_SHUTDOWN \
326- or error_num == TNS_ERR_INBAND_MESSAGE:
327- self ._session_needs_to_be_closed = True
328- else :
329- errors._raise_err(errors.ERR_UNSUPPORTED_INBAND_NOTIFICATION,
330- err_num = error_num)
340+ buf.read_uint32(& self ._pending_error_num)
331341
332342 cdef int _process_packet(self , Packet packet,
333- bint * notify_waiter) except - 1 :
343+ bint * notify_waiter,
344+ bint check_connected) except - 1 :
334345 """
335346 Processes a packet. If the packet is a control packet it is processed
336347 immediately and discarded; otherwise, it is added to the list of saved
@@ -341,6 +352,8 @@ cdef class ReadBuffer(Buffer):
341352 if packet.packet_type == TNS_PACKET_TYPE_CONTROL:
342353 self ._process_control_packet(packet)
343354 notify_waiter[0 ] = False
355+ if check_connected:
356+ self ._check_connected()
344357 else :
345358 self ._saved_packets.append(packet)
346359 notify_waiter[0 ] = \
@@ -379,7 +392,7 @@ cdef class ReadBuffer(Buffer):
379392 if self ._current_packet.packet_type == TNS_PACKET_TYPE_DATA:
380393 self .read_uint16(& data_flags)
381394 if data_flags == TNS_DATA_FLAGS_EOF:
382- self ._session_needs_to_be_closed = True
395+ self ._pending_error_num = TNS_ERR_SESSION_SHUTDOWN
383396
384397 cdef int notify_packet_received(self ) except - 1 :
385398 """
@@ -618,7 +631,7 @@ cdef class ReadBuffer(Buffer):
618631 bint notify_waiter
619632 Packet packet
620633 packet = self ._transport.read_packet()
621- self ._process_packet(packet, & notify_waiter)
634+ self ._process_packet(packet, & notify_waiter, False )
622635 if notify_waiter:
623636 self ._start_packet()
624637
@@ -698,7 +711,7 @@ cdef class ReadBuffer(Buffer):
698711 raise OutOfPackets()
699712 while True :
700713 packet = self ._transport.read_packet()
701- self ._process_packet(packet, & notify_waiter)
714+ self ._process_packet(packet, & notify_waiter, True )
702715 if notify_waiter:
703716 break
704717 self ._start_packet()
0 commit comments