blob: 00941d8d5363db382e69a9baaa947b6a21f711fb [file] [log] [blame]
Mark Slee89e2bb82007-03-01 00:20:36 +00001#
David Reissea2cba82009-03-30 21:35:00 +00002# 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#
Mark Slee89e2bb82007-03-01 00:20:36 +000019
David Reissc548b3d2010-03-09 05:19:18 +000020import sys
21
Bryan Duxbury69720412012-01-03 17:32:30 +000022
Nobuaki Sukegawab9c859a2015-12-21 01:10:25 +090023class TType(object):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090024 STOP = 0
25 VOID = 1
26 BOOL = 2
27 BYTE = 3
28 I08 = 3
29 DOUBLE = 4
30 I16 = 6
31 I32 = 8
32 I64 = 10
33 STRING = 11
34 UTF7 = 11
35 STRUCT = 12
36 MAP = 13
37 SET = 14
38 LIST = 15
39 UTF8 = 16
40 UTF16 = 17
Mark Sleee74306a2007-02-21 05:38:12 +000041
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090042 _VALUES_TO_NAMES = (
43 'STOP',
44 'VOID',
45 'BOOL',
46 'BYTE',
47 'DOUBLE',
48 None,
49 'I16',
50 None,
51 'I32',
52 None,
53 'I64',
54 'STRING',
55 'STRUCT',
56 'MAP',
57 'SET',
58 'LIST',
59 'UTF8',
60 'UTF16',
61 )
Bryan Duxbury69720412012-01-03 17:32:30 +000062
Roger Meierf4eec7a2011-09-11 18:16:21 +000063
Nobuaki Sukegawab9c859a2015-12-21 01:10:25 +090064class TMessageType(object):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090065 CALL = 1
66 REPLY = 2
67 EXCEPTION = 3
68 ONEWAY = 4
Mark Sleee74306a2007-02-21 05:38:12 +000069
Mark Sleec9676562006-09-05 17:34:52 +000070
Nobuaki Sukegawab9c859a2015-12-21 01:10:25 +090071class TProcessor(object):
James E. King, IIIe7611d02017-10-23 16:44:45 -040072 """Base class for processor, which works on two streams."""
Mark Sleec9676562006-09-05 17:34:52 +000073
James E. King, IIIe7611d02017-10-23 16:44:45 -040074 def process(self, iprot, oprot):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090075 pass
Mark Slee92195ae2007-02-21 05:16:30 +000076
Mark Slee92195ae2007-02-21 05:16:30 +000077
Bryan Duxbury69720412012-01-03 17:32:30 +000078class TException(Exception):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090079 """Base class for all thrift exceptions."""
Mark Slee92195ae2007-02-21 05:16:30 +000080
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090081 # BaseException.message is deprecated in Python v[2.6,3.0)
82 if (2, 6, 0) <= sys.version_info < (3, 0):
83 def _get_message(self):
84 return self._message
Bryan Duxbury69720412012-01-03 17:32:30 +000085
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090086 def _set_message(self, message):
87 self._message = message
88 message = property(_get_message, _set_message)
David Reissc548b3d2010-03-09 05:19:18 +000089
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090090 def __init__(self, message=None):
91 Exception.__init__(self, message)
92 self.message = message
Mark Slee92195ae2007-02-21 05:16:30 +000093
Mark Slee92195ae2007-02-21 05:16:30 +000094
Bryan Duxbury69720412012-01-03 17:32:30 +000095class TApplicationException(TException):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090096 """Application level thrift exceptions."""
Mark Slee92195ae2007-02-21 05:16:30 +000097
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090098 UNKNOWN = 0
99 UNKNOWN_METHOD = 1
100 INVALID_MESSAGE_TYPE = 2
101 WRONG_METHOD_NAME = 3
102 BAD_SEQUENCE_ID = 4
103 MISSING_RESULT = 5
104 INTERNAL_ERROR = 6
105 PROTOCOL_ERROR = 7
106 INVALID_TRANSFORM = 8
107 INVALID_PROTOCOL = 9
108 UNSUPPORTED_CLIENT_TYPE = 10
Mark Slee92195ae2007-02-21 05:16:30 +0000109
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900110 def __init__(self, type=UNKNOWN, message=None):
111 TException.__init__(self, message)
112 self.type = type
Mark Slee92195ae2007-02-21 05:16:30 +0000113
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900114 def __str__(self):
115 if self.message:
116 return self.message
117 elif self.type == self.UNKNOWN_METHOD:
118 return 'Unknown method'
119 elif self.type == self.INVALID_MESSAGE_TYPE:
120 return 'Invalid message type'
121 elif self.type == self.WRONG_METHOD_NAME:
122 return 'Wrong method name'
123 elif self.type == self.BAD_SEQUENCE_ID:
124 return 'Bad sequence ID'
125 elif self.type == self.MISSING_RESULT:
126 return 'Missing result'
127 elif self.type == self.INTERNAL_ERROR:
128 return 'Internal error'
129 elif self.type == self.PROTOCOL_ERROR:
130 return 'Protocol error'
131 elif self.type == self.INVALID_TRANSFORM:
132 return 'Invalid transform'
133 elif self.type == self.INVALID_PROTOCOL:
134 return 'Invalid protocol'
135 elif self.type == self.UNSUPPORTED_CLIENT_TYPE:
136 return 'Unsupported client type'
Mark Slee92195ae2007-02-21 05:16:30 +0000137 else:
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900138 return 'Default (unknown) TApplicationException'
Mark Slee92195ae2007-02-21 05:16:30 +0000139
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900140 def read(self, iprot):
141 iprot.readStructBegin()
142 while True:
143 (fname, ftype, fid) = iprot.readFieldBegin()
144 if ftype == TType.STOP:
145 break
146 if fid == 1:
147 if ftype == TType.STRING:
148 self.message = iprot.readString()
149 else:
150 iprot.skip(ftype)
151 elif fid == 2:
152 if ftype == TType.I32:
153 self.type = iprot.readI32()
154 else:
155 iprot.skip(ftype)
156 else:
157 iprot.skip(ftype)
158 iprot.readFieldEnd()
159 iprot.readStructEnd()
160
161 def write(self, oprot):
162 oprot.writeStructBegin('TApplicationException')
163 if self.message is not None:
164 oprot.writeFieldBegin('message', TType.STRING, 1)
165 oprot.writeString(self.message)
166 oprot.writeFieldEnd()
167 if self.type is not None:
168 oprot.writeFieldBegin('type', TType.I32, 2)
169 oprot.writeI32(self.type)
170 oprot.writeFieldEnd()
171 oprot.writeFieldStop()
172 oprot.writeStructEnd()
Nobuaki Sukegawae841b3d2015-11-17 11:01:17 +0900173
174
175class TFrozenDict(dict):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900176 """A dictionary that is "frozen" like a frozenset"""
Nobuaki Sukegawae841b3d2015-11-17 11:01:17 +0900177
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900178 def __init__(self, *args, **kwargs):
179 super(TFrozenDict, self).__init__(*args, **kwargs)
180 # Sort the items so they will be in a consistent order.
181 # XOR in the hash of the class so we don't collide with
182 # the hash of a list of tuples.
183 self.__hashval = hash(TFrozenDict) ^ hash(tuple(sorted(self.items())))
Nobuaki Sukegawae841b3d2015-11-17 11:01:17 +0900184
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900185 def __setitem__(self, *args):
186 raise TypeError("Can't modify frozen TFreezableDict")
Nobuaki Sukegawae841b3d2015-11-17 11:01:17 +0900187
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900188 def __delitem__(self, *args):
189 raise TypeError("Can't modify frozen TFreezableDict")
Nobuaki Sukegawae841b3d2015-11-17 11:01:17 +0900190
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900191 def __hash__(self):
192 return self.__hashval