blob: a3527cd47a305e5d9e65b03f2c4c40010fdd1348 [file] [log] [blame]
Roger Meierf4eec7a2011-09-11 18:16:21 +00001#
2# Licensed to the Apache Software Foundation (ASF) under one
3# or more contributor license agreements. See the NOTICE file
4# distributed with this work for additional information
5# regarding copyright ownership. The ASF licenses this file
6# to you under the Apache License, Version 2.0 (the
7# "License"); you may not use this file except in compliance
8# with the License. You may obtain a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing,
13# software distributed under the License is distributed on an
14# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15# KIND, either express or implied. See the License for the
16# specific language governing permissions and limitations
17# under the License.
18#
19
James E. King IIIe44f6a92019-02-07 17:11:21 -050020from .TProtocol import TType, TProtocolBase, TProtocolException, TProtocolFactory, checkIntegerLimits
David Reissabafd792010-09-27 17:28:15 +000021from struct import pack, unpack
22
23__all__ = ['TCompactProtocol', 'TCompactProtocolFactory']
24
25CLEAR = 0
26FIELD_WRITE = 1
27VALUE_WRITE = 2
28CONTAINER_WRITE = 3
29BOOL_WRITE = 4
30FIELD_READ = 5
31CONTAINER_READ = 6
32VALUE_READ = 7
33BOOL_READ = 8
34
Bryan Duxbury69720412012-01-03 17:32:30 +000035
David Reissabafd792010-09-27 17:28:15 +000036def make_helper(v_from, container):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090037 def helper(func):
38 def nested(self, *args, **kwargs):
39 assert self.state in (v_from, container), (self.state, v_from, container)
40 return func(self, *args, **kwargs)
41 return nested
42 return helper
James E. King, III0ad20bd2017-09-30 15:44:16 -070043
44
David Reissabafd792010-09-27 17:28:15 +000045writer = make_helper(VALUE_WRITE, CONTAINER_WRITE)
46reader = make_helper(VALUE_READ, CONTAINER_READ)
47
Bryan Duxbury69720412012-01-03 17:32:30 +000048
David Reissabafd792010-09-27 17:28:15 +000049def makeZigZag(n, bits):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090050 checkIntegerLimits(n, bits)
51 return (n << 1) ^ (n >> (bits - 1))
David Reissabafd792010-09-27 17:28:15 +000052
Bryan Duxbury69720412012-01-03 17:32:30 +000053
David Reissabafd792010-09-27 17:28:15 +000054def fromZigZag(n):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090055 return (n >> 1) ^ -(n & 1)
David Reissabafd792010-09-27 17:28:15 +000056
Bryan Duxbury69720412012-01-03 17:32:30 +000057
David Reissabafd792010-09-27 17:28:15 +000058def writeVarint(trans, n):
James E. King IIIf15b4152019-01-31 13:01:56 -050059 assert n >= 0, "Input to TCompactProtocol writeVarint cannot be negative!"
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090060 out = bytearray()
61 while True:
62 if n & ~0x7f == 0:
63 out.append(n)
64 break
65 else:
66 out.append((n & 0xff) | 0x80)
67 n = n >> 7
68 trans.write(bytes(out))
David Reissabafd792010-09-27 17:28:15 +000069
Bryan Duxbury69720412012-01-03 17:32:30 +000070
David Reissabafd792010-09-27 17:28:15 +000071def readVarint(trans):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090072 result = 0
73 shift = 0
74 while True:
75 x = trans.readAll(1)
76 byte = ord(x)
77 result |= (byte & 0x7f) << shift
78 if byte >> 7 == 0:
79 return result
80 shift += 7
David Reissabafd792010-09-27 17:28:15 +000081
Bryan Duxbury69720412012-01-03 17:32:30 +000082
Nobuaki Sukegawab9c859a2015-12-21 01:10:25 +090083class CompactType(object):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090084 STOP = 0x00
85 TRUE = 0x01
86 FALSE = 0x02
87 BYTE = 0x03
88 I16 = 0x04
89 I32 = 0x05
90 I64 = 0x06
91 DOUBLE = 0x07
92 BINARY = 0x08
93 LIST = 0x09
94 SET = 0x0A
95 MAP = 0x0B
96 STRUCT = 0x0C
David Reissabafd792010-09-27 17:28:15 +000097
James E. King, III0ad20bd2017-09-30 15:44:16 -070098
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090099CTYPES = {
100 TType.STOP: CompactType.STOP,
101 TType.BOOL: CompactType.TRUE, # used for collection
102 TType.BYTE: CompactType.BYTE,
103 TType.I16: CompactType.I16,
104 TType.I32: CompactType.I32,
105 TType.I64: CompactType.I64,
106 TType.DOUBLE: CompactType.DOUBLE,
107 TType.STRING: CompactType.BINARY,
108 TType.STRUCT: CompactType.STRUCT,
109 TType.LIST: CompactType.LIST,
110 TType.SET: CompactType.SET,
111 TType.MAP: CompactType.MAP,
112}
David Reissabafd792010-09-27 17:28:15 +0000113
114TTYPES = {}
115for k, v in CTYPES.items():
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900116 TTYPES[v] = k
David Reissabafd792010-09-27 17:28:15 +0000117TTYPES[CompactType.FALSE] = TType.BOOL
118del k
119del v
120
Bryan Duxbury69720412012-01-03 17:32:30 +0000121
David Reissabafd792010-09-27 17:28:15 +0000122class TCompactProtocol(TProtocolBase):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900123 """Compact implementation of the Thrift protocol driver."""
David Reissabafd792010-09-27 17:28:15 +0000124
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900125 PROTOCOL_ID = 0x82
126 VERSION = 1
127 VERSION_MASK = 0x1f
128 TYPE_MASK = 0xe0
129 TYPE_BITS = 0x07
130 TYPE_SHIFT_AMOUNT = 5
David Reissabafd792010-09-27 17:28:15 +0000131
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900132 def __init__(self, trans,
133 string_length_limit=None,
134 container_length_limit=None):
135 TProtocolBase.__init__(self, trans)
136 self.state = CLEAR
137 self.__last_fid = 0
138 self.__bool_fid = None
139 self.__bool_value = None
140 self.__structs = []
141 self.__containers = []
142 self.string_length_limit = string_length_limit
143 self.container_length_limit = container_length_limit
Nobuaki Sukegawa7b545b52016-01-11 13:46:04 +0900144
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900145 def _check_string_length(self, length):
146 self._check_length(self.string_length_limit, length)
Nobuaki Sukegawa7b545b52016-01-11 13:46:04 +0900147
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900148 def _check_container_length(self, length):
149 self._check_length(self.container_length_limit, length)
David Reissabafd792010-09-27 17:28:15 +0000150
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900151 def __writeVarint(self, n):
152 writeVarint(self.trans, n)
David Reissabafd792010-09-27 17:28:15 +0000153
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900154 def writeMessageBegin(self, name, type, seqid):
155 assert self.state == CLEAR
156 self.__writeUByte(self.PROTOCOL_ID)
157 self.__writeUByte(self.VERSION | (type << self.TYPE_SHIFT_AMOUNT))
James E. King IIIf15b4152019-01-31 13:01:56 -0500158 # The sequence id is a signed 32-bit integer but the compact protocol
159 # writes this out as a "var int" which is always positive, and attempting
160 # to write a negative number results in an infinite loop, so we may
161 # need to do some conversion here...
James E. King III53bd0e62019-01-31 17:11:04 -0500162 tseqid = seqid
James E. King IIIf15b4152019-01-31 13:01:56 -0500163 if tseqid < 0:
164 tseqid = 2147483648 + (2147483648 + tseqid)
165 self.__writeVarint(tseqid)
Alexandre Detiste3494e1c2025-02-19 21:53:40 +0100166 self.__writeBinary(bytes(name, 'utf-8'))
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900167 self.state = VALUE_WRITE
David Reissabafd792010-09-27 17:28:15 +0000168
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900169 def writeMessageEnd(self):
170 assert self.state == VALUE_WRITE
171 self.state = CLEAR
David Reissabafd792010-09-27 17:28:15 +0000172
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900173 def writeStructBegin(self, name):
174 assert self.state in (CLEAR, CONTAINER_WRITE, VALUE_WRITE), self.state
175 self.__structs.append((self.state, self.__last_fid))
176 self.state = FIELD_WRITE
177 self.__last_fid = 0
David Reissabafd792010-09-27 17:28:15 +0000178
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900179 def writeStructEnd(self):
180 assert self.state == FIELD_WRITE
181 self.state, self.__last_fid = self.__structs.pop()
David Reissabafd792010-09-27 17:28:15 +0000182
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900183 def writeFieldStop(self):
184 self.__writeByte(0)
David Reissabafd792010-09-27 17:28:15 +0000185
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900186 def __writeFieldHeader(self, type, fid):
187 delta = fid - self.__last_fid
188 if 0 < delta <= 15:
189 self.__writeUByte(delta << 4 | type)
190 else:
191 self.__writeByte(type)
192 self.__writeI16(fid)
193 self.__last_fid = fid
David Reissabafd792010-09-27 17:28:15 +0000194
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900195 def writeFieldBegin(self, name, type, fid):
196 assert self.state == FIELD_WRITE, self.state
197 if type == TType.BOOL:
198 self.state = BOOL_WRITE
199 self.__bool_fid = fid
200 else:
201 self.state = VALUE_WRITE
202 self.__writeFieldHeader(CTYPES[type], fid)
David Reissabafd792010-09-27 17:28:15 +0000203
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900204 def writeFieldEnd(self):
205 assert self.state in (VALUE_WRITE, BOOL_WRITE), self.state
206 self.state = FIELD_WRITE
David Reissabafd792010-09-27 17:28:15 +0000207
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900208 def __writeUByte(self, byte):
209 self.trans.write(pack('!B', byte))
David Reissabafd792010-09-27 17:28:15 +0000210
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900211 def __writeByte(self, byte):
212 self.trans.write(pack('!b', byte))
David Reissabafd792010-09-27 17:28:15 +0000213
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900214 def __writeI16(self, i16):
215 self.__writeVarint(makeZigZag(i16, 16))
David Reissabafd792010-09-27 17:28:15 +0000216
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900217 def __writeSize(self, i32):
218 self.__writeVarint(i32)
David Reissabafd792010-09-27 17:28:15 +0000219
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900220 def writeCollectionBegin(self, etype, size):
221 assert self.state in (VALUE_WRITE, CONTAINER_WRITE), self.state
222 if size <= 14:
223 self.__writeUByte(size << 4 | CTYPES[etype])
224 else:
225 self.__writeUByte(0xf0 | CTYPES[etype])
226 self.__writeSize(size)
227 self.__containers.append(self.state)
228 self.state = CONTAINER_WRITE
229 writeSetBegin = writeCollectionBegin
230 writeListBegin = writeCollectionBegin
David Reissabafd792010-09-27 17:28:15 +0000231
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900232 def writeMapBegin(self, ktype, vtype, size):
233 assert self.state in (VALUE_WRITE, CONTAINER_WRITE), self.state
234 if size == 0:
235 self.__writeByte(0)
236 else:
237 self.__writeSize(size)
238 self.__writeUByte(CTYPES[ktype] << 4 | CTYPES[vtype])
239 self.__containers.append(self.state)
240 self.state = CONTAINER_WRITE
David Reissabafd792010-09-27 17:28:15 +0000241
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900242 def writeCollectionEnd(self):
243 assert self.state == CONTAINER_WRITE, self.state
244 self.state = self.__containers.pop()
245 writeMapEnd = writeCollectionEnd
246 writeSetEnd = writeCollectionEnd
247 writeListEnd = writeCollectionEnd
David Reissabafd792010-09-27 17:28:15 +0000248
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900249 def writeBool(self, bool):
250 if self.state == BOOL_WRITE:
251 if bool:
252 ctype = CompactType.TRUE
253 else:
254 ctype = CompactType.FALSE
255 self.__writeFieldHeader(ctype, self.__bool_fid)
256 elif self.state == CONTAINER_WRITE:
257 if bool:
258 self.__writeByte(CompactType.TRUE)
259 else:
260 self.__writeByte(CompactType.FALSE)
261 else:
262 raise AssertionError("Invalid state in compact protocol")
David Reissabafd792010-09-27 17:28:15 +0000263
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900264 writeByte = writer(__writeByte)
265 writeI16 = writer(__writeI16)
David Reissabafd792010-09-27 17:28:15 +0000266
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900267 @writer
268 def writeI32(self, i32):
269 self.__writeVarint(makeZigZag(i32, 32))
David Reissabafd792010-09-27 17:28:15 +0000270
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900271 @writer
272 def writeI64(self, i64):
273 self.__writeVarint(makeZigZag(i64, 64))
David Reissabafd792010-09-27 17:28:15 +0000274
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900275 @writer
276 def writeDouble(self, dub):
277 self.trans.write(pack('<d', dub))
David Reissabafd792010-09-27 17:28:15 +0000278
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900279 def __writeBinary(self, s):
280 self.__writeSize(len(s))
281 self.trans.write(s)
282 writeBinary = writer(__writeBinary)
David Reissabafd792010-09-27 17:28:15 +0000283
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900284 def readFieldBegin(self):
285 assert self.state == FIELD_READ, self.state
286 type = self.__readUByte()
287 if type & 0x0f == TType.STOP:
288 return (None, 0, 0)
289 delta = type >> 4
290 if delta == 0:
291 fid = self.__readI16()
292 else:
293 fid = self.__last_fid + delta
294 self.__last_fid = fid
295 type = type & 0x0f
296 if type == CompactType.TRUE:
297 self.state = BOOL_READ
298 self.__bool_value = True
299 elif type == CompactType.FALSE:
300 self.state = BOOL_READ
301 self.__bool_value = False
302 else:
303 self.state = VALUE_READ
304 return (None, self.__getTType(type), fid)
David Reissabafd792010-09-27 17:28:15 +0000305
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900306 def readFieldEnd(self):
307 assert self.state in (VALUE_READ, BOOL_READ), self.state
308 self.state = FIELD_READ
David Reissabafd792010-09-27 17:28:15 +0000309
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900310 def __readUByte(self):
311 result, = unpack('!B', self.trans.readAll(1))
312 return result
David Reissabafd792010-09-27 17:28:15 +0000313
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900314 def __readByte(self):
315 result, = unpack('!b', self.trans.readAll(1))
316 return result
David Reissabafd792010-09-27 17:28:15 +0000317
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900318 def __readVarint(self):
319 return readVarint(self.trans)
David Reissabafd792010-09-27 17:28:15 +0000320
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900321 def __readZigZag(self):
322 return fromZigZag(self.__readVarint())
David Reissabafd792010-09-27 17:28:15 +0000323
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900324 def __readSize(self):
325 result = self.__readVarint()
326 if result < 0:
327 raise TProtocolException("Length < 0")
328 return result
David Reissabafd792010-09-27 17:28:15 +0000329
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900330 def readMessageBegin(self):
331 assert self.state == CLEAR
332 proto_id = self.__readUByte()
333 if proto_id != self.PROTOCOL_ID:
334 raise TProtocolException(TProtocolException.BAD_VERSION,
335 'Bad protocol id in the message: %d' % proto_id)
336 ver_type = self.__readUByte()
337 type = (ver_type >> self.TYPE_SHIFT_AMOUNT) & self.TYPE_BITS
338 version = ver_type & self.VERSION_MASK
339 if version != self.VERSION:
340 raise TProtocolException(TProtocolException.BAD_VERSION,
341 'Bad version: %d (expect %d)' % (version, self.VERSION))
342 seqid = self.__readVarint()
James E. King IIIf15b4152019-01-31 13:01:56 -0500343 # the sequence is a compact "var int" which is treaded as unsigned,
344 # however the sequence is actually signed...
345 if seqid > 2147483647:
346 seqid = -2147483648 - (2147483648 - seqid)
Alexandre Detiste3494e1c2025-02-19 21:53:40 +0100347 name = self.__readBinary().decode('utf-8')
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900348 return (name, type, seqid)
David Reissabafd792010-09-27 17:28:15 +0000349
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900350 def readMessageEnd(self):
351 assert self.state == CLEAR
352 assert len(self.__structs) == 0
David Reissabafd792010-09-27 17:28:15 +0000353
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900354 def readStructBegin(self):
355 assert self.state in (CLEAR, CONTAINER_READ, VALUE_READ), self.state
356 self.__structs.append((self.state, self.__last_fid))
357 self.state = FIELD_READ
358 self.__last_fid = 0
David Reissabafd792010-09-27 17:28:15 +0000359
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900360 def readStructEnd(self):
361 assert self.state == FIELD_READ
362 self.state, self.__last_fid = self.__structs.pop()
David Reissabafd792010-09-27 17:28:15 +0000363
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900364 def readCollectionBegin(self):
365 assert self.state in (VALUE_READ, CONTAINER_READ), self.state
366 size_type = self.__readUByte()
367 size = size_type >> 4
368 type = self.__getTType(size_type)
369 if size == 15:
370 size = self.__readSize()
371 self._check_container_length(size)
372 self.__containers.append(self.state)
373 self.state = CONTAINER_READ
374 return type, size
375 readSetBegin = readCollectionBegin
376 readListBegin = readCollectionBegin
David Reissabafd792010-09-27 17:28:15 +0000377
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900378 def readMapBegin(self):
379 assert self.state in (VALUE_READ, CONTAINER_READ), self.state
380 size = self.__readSize()
381 self._check_container_length(size)
382 types = 0
383 if size > 0:
384 types = self.__readUByte()
385 vtype = self.__getTType(types)
386 ktype = self.__getTType(types >> 4)
387 self.__containers.append(self.state)
388 self.state = CONTAINER_READ
389 return (ktype, vtype, size)
David Reissabafd792010-09-27 17:28:15 +0000390
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900391 def readCollectionEnd(self):
392 assert self.state == CONTAINER_READ, self.state
393 self.state = self.__containers.pop()
394 readSetEnd = readCollectionEnd
395 readListEnd = readCollectionEnd
396 readMapEnd = readCollectionEnd
David Reissabafd792010-09-27 17:28:15 +0000397
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900398 def readBool(self):
399 if self.state == BOOL_READ:
400 return self.__bool_value == CompactType.TRUE
401 elif self.state == CONTAINER_READ:
402 return self.__readByte() == CompactType.TRUE
403 else:
404 raise AssertionError("Invalid state in compact protocol: %d" %
405 self.state)
David Reissabafd792010-09-27 17:28:15 +0000406
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900407 readByte = reader(__readByte)
408 __readI16 = __readZigZag
409 readI16 = reader(__readZigZag)
410 readI32 = reader(__readZigZag)
411 readI64 = reader(__readZigZag)
David Reissabafd792010-09-27 17:28:15 +0000412
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900413 @reader
414 def readDouble(self):
415 buff = self.trans.readAll(8)
416 val, = unpack('<d', buff)
417 return val
David Reissabafd792010-09-27 17:28:15 +0000418
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900419 def __readBinary(self):
420 size = self.__readSize()
421 self._check_string_length(size)
422 return self.trans.readAll(size)
423 readBinary = reader(__readBinary)
David Reissabafd792010-09-27 17:28:15 +0000424
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900425 def __getTType(self, byte):
426 return TTYPES[byte & 0x0f]
David Reissabafd792010-09-27 17:28:15 +0000427
428
James E. King IIIe44f6a92019-02-07 17:11:21 -0500429class TCompactProtocolFactory(TProtocolFactory):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900430 def __init__(self,
431 string_length_limit=None,
432 container_length_limit=None):
433 self.string_length_limit = string_length_limit
434 self.container_length_limit = container_length_limit
David Reissabafd792010-09-27 17:28:15 +0000435
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900436 def getProtocol(self, trans):
437 return TCompactProtocol(trans,
438 self.string_length_limit,
439 self.container_length_limit)
Nobuaki Sukegawa6525f6a2016-02-11 13:58:39 +0900440
441
442class TCompactProtocolAccelerated(TCompactProtocol):
443 """C-Accelerated version of TCompactProtocol.
444
445 This class does not override any of TCompactProtocol's methods,
446 but the generated code recognizes it directly and will call into
447 our C module to do the encoding, bypassing this object entirely.
448 We inherit from TCompactProtocol so that the normal TCompactProtocol
449 encoding can happen if the fastbinary module doesn't work for some
450 reason.
451 To disable this behavior, pass fallback=False constructor argument.
452
453 In order to take advantage of the C module, just use
454 TCompactProtocolAccelerated instead of TCompactProtocol.
455 """
456 pass
457
458 def __init__(self, *args, **kwargs):
459 fallback = kwargs.pop('fallback', True)
460 super(TCompactProtocolAccelerated, self).__init__(*args, **kwargs)
461 try:
462 from thrift.protocol import fastbinary
463 except ImportError:
464 if not fallback:
465 raise
466 else:
467 self._fast_decode = fastbinary.decode_compact
468 self._fast_encode = fastbinary.encode_compact
469
470
James E. King IIIe44f6a92019-02-07 17:11:21 -0500471class TCompactProtocolAcceleratedFactory(TProtocolFactory):
Nobuaki Sukegawa6525f6a2016-02-11 13:58:39 +0900472 def __init__(self,
473 string_length_limit=None,
474 container_length_limit=None,
475 fallback=True):
476 self.string_length_limit = string_length_limit
477 self.container_length_limit = container_length_limit
478 self._fallback = fallback
479
480 def getProtocol(self, trans):
481 return TCompactProtocolAccelerated(
482 trans,
483 string_length_limit=self.string_length_limit,
484 container_length_limit=self.container_length_limit,
485 fallback=self._fallback)