Skip to content

Commit c372c21

Browse files
committed
Replace FastReadBuffer object with a struct+inline functions
1 parent 5c31700 commit c372c21

22 files changed

+208
-196
lines changed

buffer.pxd

-41
Original file line numberDiff line numberDiff line change
@@ -142,44 +142,3 @@ cdef class ReadBuffer:
142142

143143
@staticmethod
144144
cdef ReadBuffer new_message_parser(object data)
145-
146-
147-
@cython.no_gc_clear
148-
@cython.final
149-
@cython.freelist(_BUFFER_FREELIST_SIZE)
150-
cdef class FastReadBuffer:
151-
152-
cdef:
153-
const char* buf
154-
ssize_t len
155-
156-
cdef inline const char* read(self, ssize_t n) except NULL:
157-
cdef const char *result
158-
159-
if n > self.len:
160-
self._raise_ins_err(n, self.len)
161-
162-
result = self.buf
163-
self.buf += n
164-
self.len -= n
165-
166-
return result
167-
168-
cdef inline const char* read_all(self):
169-
cdef const char *result
170-
result = self.buf
171-
self.buf += self.len
172-
self.len = 0
173-
return result
174-
175-
cdef inline FastReadBuffer slice_from(self, FastReadBuffer source,
176-
ssize_t len):
177-
self.buf = source.read(len)
178-
self.len = len
179-
return self
180-
181-
cdef _raise_ins_err(self, ssize_t n, ssize_t len)
182-
183-
@staticmethod
184-
cdef inline FastReadBuffer new():
185-
return FastReadBuffer.__new__(FastReadBuffer)

buffer.pyx

-11
Original file line numberDiff line numberDiff line change
@@ -658,14 +658,3 @@ cdef class ReadBuffer:
658658
buf._current_message_len_unread = buf._len0
659659

660660
return buf
661-
662-
663-
@cython.no_gc_clear
664-
@cython.final
665-
@cython.freelist(_BUFFER_FREELIST_SIZE)
666-
cdef class FastReadBuffer:
667-
668-
cdef _raise_ins_err(self, ssize_t n, ssize_t len):
669-
raise exceptions.BufferError(
670-
'insufficient data in buffer: requested {}, remaining {}'.
671-
format(n, self.len))

codecs/__init__.pxd

+38-38
Original file line numberDiff line numberDiff line change
@@ -16,128 +16,128 @@ ctypedef object (*encode_func)(CodecContext settings,
1616
object obj)
1717

1818
ctypedef object (*decode_func)(CodecContext settings,
19-
FastReadBuffer buf)
19+
FRBuffer *buf)
2020

2121

2222
# Datetime
2323
cdef date_encode(CodecContext settings, WriteBuffer buf, obj)
24-
cdef date_decode(CodecContext settings, FastReadBuffer buf)
24+
cdef date_decode(CodecContext settings, FRBuffer * buf)
2525
cdef date_encode_tuple(CodecContext settings, WriteBuffer buf, obj)
26-
cdef date_decode_tuple(CodecContext settings, FastReadBuffer buf)
26+
cdef date_decode_tuple(CodecContext settings, FRBuffer * buf)
2727
cdef timestamp_encode(CodecContext settings, WriteBuffer buf, obj)
28-
cdef timestamp_decode(CodecContext settings, FastReadBuffer buf)
28+
cdef timestamp_decode(CodecContext settings, FRBuffer * buf)
2929
cdef timestamp_encode_tuple(CodecContext settings, WriteBuffer buf, obj)
30-
cdef timestamp_decode_tuple(CodecContext settings, FastReadBuffer buf)
30+
cdef timestamp_decode_tuple(CodecContext settings, FRBuffer * buf)
3131
cdef timestamptz_encode(CodecContext settings, WriteBuffer buf, obj)
32-
cdef timestamptz_decode(CodecContext settings, FastReadBuffer buf)
32+
cdef timestamptz_decode(CodecContext settings, FRBuffer * buf)
3333
cdef time_encode(CodecContext settings, WriteBuffer buf, obj)
34-
cdef time_decode(CodecContext settings, FastReadBuffer buf)
34+
cdef time_decode(CodecContext settings, FRBuffer * buf)
3535
cdef time_encode_tuple(CodecContext settings, WriteBuffer buf, obj)
36-
cdef time_decode_tuple(CodecContext settings, FastReadBuffer buf)
36+
cdef time_decode_tuple(CodecContext settings, FRBuffer * buf)
3737
cdef timetz_encode(CodecContext settings, WriteBuffer buf, obj)
38-
cdef timetz_decode(CodecContext settings, FastReadBuffer buf)
38+
cdef timetz_decode(CodecContext settings, FRBuffer * buf)
3939
cdef timetz_encode_tuple(CodecContext settings, WriteBuffer buf, obj)
40-
cdef timetz_decode_tuple(CodecContext settings, FastReadBuffer buf)
40+
cdef timetz_decode_tuple(CodecContext settings, FRBuffer * buf)
4141
cdef interval_encode(CodecContext settings, WriteBuffer buf, obj)
42-
cdef interval_decode(CodecContext settings, FastReadBuffer buf)
42+
cdef interval_decode(CodecContext settings, FRBuffer * buf)
4343
cdef interval_encode_tuple(CodecContext settings, WriteBuffer buf, tuple obj)
44-
cdef interval_decode_tuple(CodecContext settings, FastReadBuffer buf)
44+
cdef interval_decode_tuple(CodecContext settings, FRBuffer * buf)
4545

4646

4747
# Bits
4848
cdef bits_encode(CodecContext settings, WriteBuffer wbuf, obj)
49-
cdef bits_decode(CodecContext settings, FastReadBuffer buf)
49+
cdef bits_decode(CodecContext settings, FRBuffer * buf)
5050

5151

5252
# Bools
5353
cdef bool_encode(CodecContext settings, WriteBuffer buf, obj)
54-
cdef bool_decode(CodecContext settings, FastReadBuffer buf)
54+
cdef bool_decode(CodecContext settings, FRBuffer * buf)
5555

5656

5757
# Geometry
5858
cdef box_encode(CodecContext settings, WriteBuffer wbuf, obj)
59-
cdef box_decode(CodecContext settings, FastReadBuffer buf)
59+
cdef box_decode(CodecContext settings, FRBuffer * buf)
6060
cdef line_encode(CodecContext settings, WriteBuffer wbuf, obj)
61-
cdef line_decode(CodecContext settings, FastReadBuffer buf)
61+
cdef line_decode(CodecContext settings, FRBuffer * buf)
6262
cdef lseg_encode(CodecContext settings, WriteBuffer wbuf, obj)
63-
cdef lseg_decode(CodecContext settings, FastReadBuffer buf)
63+
cdef lseg_decode(CodecContext settings, FRBuffer * buf)
6464
cdef point_encode(CodecContext settings, WriteBuffer wbuf, obj)
65-
cdef point_decode(CodecContext settings, FastReadBuffer buf)
65+
cdef point_decode(CodecContext settings, FRBuffer * buf)
6666
cdef path_encode(CodecContext settings, WriteBuffer wbuf, obj)
67-
cdef path_decode(CodecContext settings, FastReadBuffer buf)
67+
cdef path_decode(CodecContext settings, FRBuffer * buf)
6868
cdef poly_encode(CodecContext settings, WriteBuffer wbuf, obj)
69-
cdef poly_decode(CodecContext settings, FastReadBuffer buf)
69+
cdef poly_decode(CodecContext settings, FRBuffer * buf)
7070
cdef circle_encode(CodecContext settings, WriteBuffer wbuf, obj)
71-
cdef circle_decode(CodecContext settings, FastReadBuffer buf)
71+
cdef circle_decode(CodecContext settings, FRBuffer * buf)
7272

7373

7474
# Hstore
7575
cdef hstore_encode(CodecContext settings, WriteBuffer buf, obj)
76-
cdef hstore_decode(CodecContext settings, FastReadBuffer buf)
76+
cdef hstore_decode(CodecContext settings, FRBuffer * buf)
7777

7878

7979
# Ints
8080
cdef int2_encode(CodecContext settings, WriteBuffer buf, obj)
81-
cdef int2_decode(CodecContext settings, FastReadBuffer buf)
81+
cdef int2_decode(CodecContext settings, FRBuffer * buf)
8282
cdef int4_encode(CodecContext settings, WriteBuffer buf, obj)
83-
cdef int4_decode(CodecContext settings, FastReadBuffer buf)
83+
cdef int4_decode(CodecContext settings, FRBuffer * buf)
8484
cdef uint4_encode(CodecContext settings, WriteBuffer buf, obj)
85-
cdef uint4_decode(CodecContext settings, FastReadBuffer buf)
85+
cdef uint4_decode(CodecContext settings, FRBuffer * buf)
8686
cdef int8_encode(CodecContext settings, WriteBuffer buf, obj)
87-
cdef int8_decode(CodecContext settings, FastReadBuffer buf)
87+
cdef int8_decode(CodecContext settings, FRBuffer * buf)
8888

8989

9090
# Floats
9191
cdef float4_encode(CodecContext settings, WriteBuffer buf, obj)
92-
cdef float4_decode(CodecContext settings, FastReadBuffer buf)
92+
cdef float4_decode(CodecContext settings, FRBuffer * buf)
9393
cdef float8_encode(CodecContext settings, WriteBuffer buf, obj)
94-
cdef float8_decode(CodecContext settings, FastReadBuffer buf)
94+
cdef float8_decode(CodecContext settings, FRBuffer * buf)
9595

9696

9797
# JSON
9898
cdef jsonb_encode(CodecContext settings, WriteBuffer buf, obj)
99-
cdef jsonb_decode(CodecContext settings, FastReadBuffer buf)
99+
cdef jsonb_decode(CodecContext settings, FRBuffer * buf)
100100

101101

102102
# Text
103103
cdef as_pg_string_and_size(
104104
CodecContext settings, obj, char **cstr, ssize_t *size)
105105
cdef text_encode(CodecContext settings, WriteBuffer buf, obj)
106-
cdef text_decode(CodecContext settings, FastReadBuffer buf)
106+
cdef text_decode(CodecContext settings, FRBuffer * buf)
107107

108108
# Bytea
109109
cdef bytea_encode(CodecContext settings, WriteBuffer wbuf, obj)
110-
cdef bytea_decode(CodecContext settings, FastReadBuffer buf)
110+
cdef bytea_decode(CodecContext settings, FRBuffer * buf)
111111

112112

113113
# UUID
114114
cdef uuid_encode(CodecContext settings, WriteBuffer wbuf, obj)
115-
cdef uuid_decode(CodecContext settings, FastReadBuffer buf)
115+
cdef uuid_decode(CodecContext settings, FRBuffer * buf)
116116

117117

118118
# Numeric
119119
cdef numeric_encode_text(CodecContext settings, WriteBuffer buf, obj)
120-
cdef numeric_decode_text(CodecContext settings, FastReadBuffer buf)
120+
cdef numeric_decode_text(CodecContext settings, FRBuffer * buf)
121121
cdef numeric_encode_binary(CodecContext settings, WriteBuffer buf, obj)
122-
cdef numeric_decode_binary(CodecContext settings, FastReadBuffer buf)
122+
cdef numeric_decode_binary(CodecContext settings, FRBuffer * buf)
123123

124124

125125
# Void
126126
cdef void_encode(CodecContext settings, WriteBuffer buf, obj)
127-
cdef void_decode(CodecContext settings, FastReadBuffer buf)
127+
cdef void_decode(CodecContext settings, FRBuffer * buf)
128128

129129

130130
# tid
131131
cdef tid_encode(CodecContext settings, WriteBuffer buf, obj)
132-
cdef tid_decode(CodecContext settings, FastReadBuffer buf)
132+
cdef tid_decode(CodecContext settings, FRBuffer * buf)
133133

134134

135135
# Network
136-
cdef net_decode(CodecContext settings, FastReadBuffer buf)
136+
cdef net_decode(CodecContext settings, FRBuffer * buf)
137137
cdef cidr_encode(CodecContext settings, WriteBuffer buf, obj)
138138
cdef inet_encode(CodecContext settings, WriteBuffer buf, obj)
139139

140140

141141
# txid
142142
cdef txid_snapshot_encode(CodecContext settings, WriteBuffer buf, obj)
143-
cdef txid_snapshot_decode(CodecContext settings, FastReadBuffer buf)
143+
cdef txid_snapshot_decode(CodecContext settings, FRBuffer * buf)

codecs/bits.pyx

+3-3
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ cdef bits_encode(CodecContext settings, WriteBuffer wbuf, obj):
4141
cpython.PyBuffer_Release(&pybuf)
4242

4343

44-
cdef bits_decode(CodecContext settings, FastReadBuffer buf):
44+
cdef bits_decode(CodecContext settings, FRBuffer *buf):
4545
cdef:
46-
int32_t bitlen = hton.unpack_int32(buf.read(4))
46+
int32_t bitlen = hton.unpack_int32(frb_read(buf, 4))
4747
ssize_t buf_len = buf.len
4848

49-
bytes_ = cpython.PyBytes_FromStringAndSize(buf.read_all(), buf_len)
49+
bytes_ = cpython.PyBytes_FromStringAndSize(frb_read_all(buf), buf_len)
5050
return BitString.frombytes(bytes_, bitlen)

codecs/bytea.pyx

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ cdef bytea_encode(CodecContext settings, WriteBuffer wbuf, obj):
2929
cpython.PyBuffer_Release(&pybuf)
3030

3131

32-
cdef bytea_decode(CodecContext settings, FastReadBuffer buf):
32+
cdef bytea_decode(CodecContext settings, FRBuffer *buf):
3333
cdef ssize_t buf_len = buf.len
34-
return cpython.PyBytes_FromStringAndSize(buf.read_all(), buf_len)
34+
return cpython.PyBytes_FromStringAndSize(frb_read_all(buf), buf_len)

codecs/datetime.pyx

+25-25
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ cdef inline _encode_time(WriteBuffer buf, int64_t seconds,
7878
buf.write_int64(ts)
7979

8080

81-
cdef inline int32_t _decode_time(FastReadBuffer buf, int64_t *seconds,
81+
cdef inline int32_t _decode_time(FRBuffer *buf, int64_t *seconds,
8282
int32_t *microseconds):
83-
cdef int64_t ts = hton.unpack_int64(buf.read(8))
83+
cdef int64_t ts = hton.unpack_int64(frb_read(buf, 8))
8484

8585
if ts == pg_time64_infinity:
8686
return 1
@@ -122,8 +122,8 @@ cdef date_encode_tuple(CodecContext settings, WriteBuffer buf, obj):
122122
buf.write_int32(pg_ordinal)
123123

124124

125-
cdef date_decode(CodecContext settings, FastReadBuffer buf):
126-
cdef int32_t pg_ordinal = hton.unpack_int32(buf.read(4))
125+
cdef date_decode(CodecContext settings, FRBuffer *buf):
126+
cdef int32_t pg_ordinal = hton.unpack_int32(frb_read(buf, 4))
127127

128128
if pg_ordinal == pg_date_infinity:
129129
return infinity_date
@@ -133,8 +133,8 @@ cdef date_decode(CodecContext settings, FastReadBuffer buf):
133133
return date_from_ordinal(pg_ordinal + pg_date_offset_ord)
134134

135135

136-
cdef date_decode_tuple(CodecContext settings, FastReadBuffer buf):
137-
cdef int32_t pg_ordinal = hton.unpack_int32(buf.read(4))
136+
cdef date_decode_tuple(CodecContext settings, FRBuffer *buf):
137+
cdef int32_t pg_ordinal = hton.unpack_int32(frb_read(buf, 4))
138138

139139
return (pg_ordinal,)
140140

@@ -175,7 +175,7 @@ cdef timestamp_encode_tuple(CodecContext settings, WriteBuffer buf, obj):
175175
buf.write_int64(microseconds)
176176

177177

178-
cdef timestamp_decode(CodecContext settings, FastReadBuffer buf):
178+
cdef timestamp_decode(CodecContext settings, FRBuffer *buf):
179179
cdef:
180180
int64_t seconds = 0
181181
int32_t microseconds = 0
@@ -192,9 +192,9 @@ cdef timestamp_decode(CodecContext settings, FastReadBuffer buf):
192192
timedelta(0, seconds, microseconds))
193193

194194

195-
cdef timestamp_decode_tuple(CodecContext settings, FastReadBuffer buf):
195+
cdef timestamp_decode_tuple(CodecContext settings, FRBuffer *buf):
196196
cdef:
197-
int64_t ts = hton.unpack_int64(buf.read(8))
197+
int64_t ts = hton.unpack_int64(frb_read(buf, 8))
198198

199199
return (ts,)
200200

@@ -236,7 +236,7 @@ cdef timestamptz_encode(CodecContext settings, WriteBuffer buf, obj):
236236
_encode_time(buf, seconds, microseconds)
237237

238238

239-
cdef timestamptz_decode(CodecContext settings, FastReadBuffer buf):
239+
cdef timestamptz_decode(CodecContext settings, FRBuffer *buf):
240240
cdef:
241241
int64_t seconds = 0
242242
int32_t microseconds = 0
@@ -279,7 +279,7 @@ cdef time_encode_tuple(CodecContext settings, WriteBuffer buf, obj):
279279
buf.write_int64(microseconds)
280280

281281

282-
cdef time_decode(CodecContext settings, FastReadBuffer buf):
282+
cdef time_decode(CodecContext settings, FRBuffer *buf):
283283
cdef:
284284
int64_t seconds = 0
285285
int32_t microseconds = 0
@@ -295,9 +295,9 @@ cdef time_decode(CodecContext settings, FastReadBuffer buf):
295295
return datetime.time(hours, min, sec, microseconds)
296296

297297

298-
cdef time_decode_tuple(CodecContext settings, FastReadBuffer buf):
298+
cdef time_decode_tuple(CodecContext settings, FRBuffer *buf):
299299
cdef:
300-
int64_t ts = hton.unpack_int64(buf.read(8))
300+
int64_t ts = hton.unpack_int64(frb_read(buf, 8))
301301

302302
return (ts,)
303303

@@ -342,17 +342,17 @@ cdef timetz_encode_tuple(CodecContext settings, WriteBuffer buf, obj):
342342
buf.write_int32(offset_sec)
343343

344344

345-
cdef timetz_decode(CodecContext settings, FastReadBuffer buf):
345+
cdef timetz_decode(CodecContext settings, FRBuffer *buf):
346346
time = time_decode(settings, buf)
347-
cdef int32_t offset = <int32_t>(hton.unpack_int32(buf.read(4)) / 60)
347+
cdef int32_t offset = <int32_t>(hton.unpack_int32(frb_read(buf, 4)) / 60)
348348
# See the comment in the `timetz_encode` method.
349349
return time.replace(tzinfo=datetime.timezone(timedelta(minutes=-offset)))
350350

351351

352-
cdef timetz_decode_tuple(CodecContext settings, FastReadBuffer buf):
352+
cdef timetz_decode_tuple(CodecContext settings, FRBuffer *buf):
353353
cdef:
354-
int64_t microseconds = hton.unpack_int64(buf.read(8))
355-
int32_t offset_sec = hton.unpack_int32(buf.read(4))
354+
int64_t microseconds = hton.unpack_int64(frb_read(buf, 8))
355+
int32_t offset_sec = hton.unpack_int32(frb_read(buf, 4))
356356

357357
return (microseconds, offset_sec)
358358

@@ -391,7 +391,7 @@ cdef interval_encode_tuple(CodecContext settings, WriteBuffer buf,
391391
buf.write_int32(months)
392392

393393

394-
cdef interval_decode(CodecContext settings, FastReadBuffer buf):
394+
cdef interval_decode(CodecContext settings, FRBuffer *buf):
395395
cdef:
396396
int32_t days
397397
int32_t months
@@ -401,8 +401,8 @@ cdef interval_decode(CodecContext settings, FastReadBuffer buf):
401401

402402
_decode_time(buf, &seconds, &microseconds)
403403

404-
days = hton.unpack_int32(buf.read(4))
405-
months = hton.unpack_int32(buf.read(4))
404+
days = hton.unpack_int32(frb_read(buf, 4))
405+
months = hton.unpack_int32(frb_read(buf, 4))
406406

407407
if months < 0:
408408
years = -<int32_t>(-months // 12)
@@ -415,14 +415,14 @@ cdef interval_decode(CodecContext settings, FastReadBuffer buf):
415415
seconds=seconds, microseconds=microseconds)
416416

417417

418-
cdef interval_decode_tuple(CodecContext settings, FastReadBuffer buf):
418+
cdef interval_decode_tuple(CodecContext settings, FRBuffer *buf):
419419
cdef:
420420
int32_t days
421421
int32_t months
422422
int64_t microseconds
423423

424-
microseconds = hton.unpack_int64(buf.read(8))
425-
days = hton.unpack_int32(buf.read(4))
426-
months = hton.unpack_int32(buf.read(4))
424+
microseconds = hton.unpack_int64(frb_read(buf, 8))
425+
days = hton.unpack_int32(frb_read(buf, 4))
426+
months = hton.unpack_int32(frb_read(buf, 4))
427427

428428
return (months, days, microseconds)

0 commit comments

Comments
 (0)