Skip to content

Commit 8122392

Browse files
committed
wip
1 parent 93f8959 commit 8122392

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

buffer.pxd

+1-1
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ cdef class ReadBuffer:
122122
cdef inline const char* try_consume_message(self, ssize_t* len)
123123
cdef bytes consume_message(self)
124124
cdef discard_message(self)
125-
cdef redirect_messages(self, WriteBuffer buf, char mtype)
125+
cdef redirect_messages(self, WriteBuffer buf, char mtype, int stop_at=?)
126126
cdef bytearray consume_messages(self, char mtype)
127127
cdef finish_message(self)
128128
cdef inline _finish_message(self)

buffer.pyx

+12-6
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,8 @@ cdef class ReadBuffer:
609609
self._finish_message()
610610
return mem
611611

612-
cdef redirect_messages(self, WriteBuffer buf, char mtype):
612+
cdef redirect_messages(self, WriteBuffer buf, char mtype,
613+
int stop_at=0):
613614
if not self._current_message_ready:
614615
raise exceptions.BufferError(
615616
'consume_full_messages called on a buffer without a '
@@ -644,7 +645,10 @@ cdef class ReadBuffer:
644645
else:
645646
return
646647

647-
# Fast path: exhaust buf0 as efficiently as possible.
648+
if stop_at and buf._length >= stop_at:
649+
return
650+
651+
# Fast path: exhaust buf0 as efficiently as possible.
648652
if self._pos0 + 5 <= self._len0:
649653
cbuf = cpython.PyBytes_AS_STRING(self._buf0)
650654
new_pos0 = self._pos0
@@ -657,14 +661,17 @@ cdef class ReadBuffer:
657661
if (cbuf + new_pos0)[0] != mtype:
658662
done = 1
659663
break
664+
if (stop_at and
665+
(buf._length + new_pos0 - self._pos0) > stop_at):
666+
done = 1
667+
break
660668
msg_len = hton.unpack_int32(cbuf + new_pos0 + 1) + 1
661669
if new_pos0 + msg_len > cbuf_len:
662670
break
663671
new_pos0 += msg_len
664672

665673
if new_pos0 != self._pos0:
666-
if PG_DEBUG:
667-
assert self._pos0 < new_pos0 <= self._len0
674+
assert self._pos0 < new_pos0 <= self._len0
668675

669676
pos_delta = new_pos0 - self._pos0
670677
buf.write_cstr(
@@ -674,8 +681,7 @@ cdef class ReadBuffer:
674681
self._pos0 = new_pos0
675682
self._length -= pos_delta
676683

677-
if PG_DEBUG:
678-
assert self._length >= 0
684+
assert self._length >= 0
679685

680686
if done:
681687
# The next message is of a different type.

0 commit comments

Comments
 (0)