@@ -199,8 +199,8 @@ cdef class ReadBuffer(Buffer):
199
199
cdef:
200
200
ssize_t _saved_packet_pos, _next_packet_pos, _saved_pos
201
201
ChunkedBytesBuffer _chunked_bytes_buf
202
- bint _session_needs_to_be_closed
203
202
const char_type _split_data[255 ]
203
+ uint32_t _pending_error_num
204
204
Packet _current_packet
205
205
Transport _transport
206
206
list _saved_packets
@@ -214,6 +214,23 @@ cdef class ReadBuffer(Buffer):
214
214
self ._caps = caps
215
215
self ._chunked_bytes_buf = ChunkedBytesBuffer()
216
216
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
+
217
234
cdef int _get_int_length_and_sign(self , uint8_t * length,
218
235
bint * is_negative,
219
236
uint8_t max_length) except - 1 :
@@ -311,7 +328,6 @@ cdef class ReadBuffer(Buffer):
311
328
"""
312
329
cdef:
313
330
uint16_t control_type
314
- uint32_t error_num
315
331
Buffer buf
316
332
buf = Buffer.__new__ (Buffer)
317
333
buf._populate_from_bytes(packet.buf)
@@ -321,16 +337,11 @@ cdef class ReadBuffer(Buffer):
321
337
self ._caps.supports_oob = False
322
338
elif control_type == TNS_CONTROL_TYPE_INBAND_NOTIFICATION:
323
339
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)
331
341
332
342
cdef int _process_packet(self , Packet packet,
333
- bint * notify_waiter) except - 1 :
343
+ bint * notify_waiter,
344
+ bint check_connected) except - 1 :
334
345
"""
335
346
Processes a packet. If the packet is a control packet it is processed
336
347
immediately and discarded; otherwise, it is added to the list of saved
@@ -341,6 +352,8 @@ cdef class ReadBuffer(Buffer):
341
352
if packet.packet_type == TNS_PACKET_TYPE_CONTROL:
342
353
self ._process_control_packet(packet)
343
354
notify_waiter[0 ] = False
355
+ if check_connected:
356
+ self ._check_connected()
344
357
else :
345
358
self ._saved_packets.append(packet)
346
359
notify_waiter[0 ] = \
@@ -379,7 +392,7 @@ cdef class ReadBuffer(Buffer):
379
392
if self ._current_packet.packet_type == TNS_PACKET_TYPE_DATA:
380
393
self .read_uint16(& data_flags)
381
394
if data_flags == TNS_DATA_FLAGS_EOF:
382
- self ._session_needs_to_be_closed = True
395
+ self ._pending_error_num = TNS_ERR_SESSION_SHUTDOWN
383
396
384
397
cdef int notify_packet_received(self ) except - 1 :
385
398
"""
@@ -618,7 +631,7 @@ cdef class ReadBuffer(Buffer):
618
631
bint notify_waiter
619
632
Packet packet
620
633
packet = self ._transport.read_packet()
621
- self ._process_packet(packet, & notify_waiter)
634
+ self ._process_packet(packet, & notify_waiter, False )
622
635
if notify_waiter:
623
636
self ._start_packet()
624
637
@@ -698,7 +711,7 @@ cdef class ReadBuffer(Buffer):
698
711
raise OutOfPackets()
699
712
while True :
700
713
packet = self ._transport.read_packet()
701
- self ._process_packet(packet, & notify_waiter)
714
+ self ._process_packet(packet, & notify_waiter, True )
702
715
if notify_waiter:
703
716
break
704
717
self ._start_packet()
0 commit comments