]>
Commit | Line | Data |
---|---|---|
f67539c2 TL |
1 | -- |
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 | ||
20 | ---- namespace thrift | |
21 | --thrift = {} | |
22 | --setmetatable(thrift, {__index = _G}) --> perf hit for accessing global methods | |
23 | --setfenv(1, thrift) | |
24 | ||
25 | package.cpath = package.cpath .. ';bin/?.so' -- TODO FIX | |
26 | function ttype(obj) | |
27 | if type(obj) == 'table' and | |
28 | obj.__type and | |
29 | type(obj.__type) == 'string' then | |
30 | return obj.__type | |
31 | end | |
32 | return type(obj) | |
33 | end | |
34 | ||
35 | function terror(e) | |
36 | if e and e.__tostring then | |
37 | error(e:__tostring()) | |
38 | return | |
39 | end | |
40 | error(e) | |
41 | end | |
42 | ||
43 | function ttable_size(t) | |
44 | local count = 0 | |
45 | for k, v in pairs(t) do | |
46 | count = count + 1 | |
47 | end | |
48 | return count | |
49 | end | |
50 | ||
51 | version = '0.13.0' | |
52 | ||
53 | TType = { | |
54 | STOP = 0, | |
55 | VOID = 1, | |
56 | BOOL = 2, | |
57 | BYTE = 3, | |
58 | I08 = 3, | |
59 | DOUBLE = 4, | |
60 | I16 = 6, | |
61 | I32 = 8, | |
62 | I64 = 10, | |
63 | STRING = 11, | |
64 | UTF7 = 11, | |
65 | STRUCT = 12, | |
66 | MAP = 13, | |
67 | SET = 14, | |
68 | LIST = 15, | |
69 | UTF8 = 16, | |
70 | UTF16 = 17 | |
71 | } | |
72 | ||
73 | TMessageType = { | |
74 | CALL = 1, | |
75 | REPLY = 2, | |
76 | EXCEPTION = 3, | |
77 | ONEWAY = 4 | |
78 | } | |
79 | ||
80 | -- Recursive __index function to achieve inheritance | |
81 | function __tobj_index(self, key) | |
82 | local v = rawget(self, key) | |
83 | if v ~= nil then | |
84 | return v | |
85 | end | |
86 | ||
87 | local p = rawget(self, '__parent') | |
88 | if p then | |
89 | return __tobj_index(p, key) | |
90 | end | |
91 | ||
92 | return nil | |
93 | end | |
94 | ||
95 | -- Basic Thrift-Lua Object | |
96 | __TObject = { | |
97 | __type = '__TObject', | |
98 | __mt = { | |
99 | __index = __tobj_index | |
100 | } | |
101 | } | |
102 | function __TObject:new(init_obj) | |
103 | local obj = {} | |
104 | if ttype(obj) == 'table' then | |
105 | obj = init_obj | |
106 | end | |
107 | ||
108 | -- Use the __parent key and the __index function to achieve inheritance | |
109 | obj.__parent = self | |
110 | setmetatable(obj, __TObject.__mt) | |
111 | return obj | |
112 | end | |
113 | ||
114 | -- Return a string representation of any lua variable | |
115 | function thrift_print_r(t) | |
116 | local ret = '' | |
117 | local ltype = type(t) | |
118 | if (ltype == 'table') then | |
119 | ret = ret .. '{ ' | |
120 | for key,value in pairs(t) do | |
121 | ret = ret .. tostring(key) .. '=' .. thrift_print_r(value) .. ' ' | |
122 | end | |
123 | ret = ret .. '}' | |
124 | elseif ltype == 'string' then | |
125 | ret = ret .. "'" .. tostring(t) .. "'" | |
126 | else | |
127 | ret = ret .. tostring(t) | |
128 | end | |
129 | return ret | |
130 | end | |
131 | ||
132 | -- Basic Exception | |
133 | TException = __TObject:new{ | |
134 | message, | |
135 | errorCode, | |
136 | __type = 'TException' | |
137 | } | |
138 | function TException:__tostring() | |
139 | if self.message then | |
140 | return string.format('%s: %s', self.__type, self.message) | |
141 | else | |
142 | local message | |
143 | if self.errorCode and self.__errorCodeToString then | |
144 | message = string.format('%d: %s', self.errorCode, self:__errorCodeToString()) | |
145 | else | |
146 | message = thrift_print_r(self) | |
147 | end | |
148 | return string.format('%s:%s', self.__type, message) | |
149 | end | |
150 | end | |
151 | ||
152 | TApplicationException = TException:new{ | |
153 | UNKNOWN = 0, | |
154 | UNKNOWN_METHOD = 1, | |
155 | INVALID_MESSAGE_TYPE = 2, | |
156 | WRONG_METHOD_NAME = 3, | |
157 | BAD_SEQUENCE_ID = 4, | |
158 | MISSING_RESULT = 5, | |
159 | INTERNAL_ERROR = 6, | |
160 | PROTOCOL_ERROR = 7, | |
161 | INVALID_TRANSFORM = 8, | |
162 | INVALID_PROTOCOL = 9, | |
163 | UNSUPPORTED_CLIENT_TYPE = 10, | |
164 | errorCode = 0, | |
165 | __type = 'TApplicationException' | |
166 | } | |
167 | ||
168 | function TApplicationException:__errorCodeToString() | |
169 | if self.errorCode == self.UNKNOWN_METHOD then | |
170 | return 'Unknown method' | |
171 | elseif self.errorCode == self.INVALID_MESSAGE_TYPE then | |
172 | return 'Invalid message type' | |
173 | elseif self.errorCode == self.WRONG_METHOD_NAME then | |
174 | return 'Wrong method name' | |
175 | elseif self.errorCode == self.BAD_SEQUENCE_ID then | |
176 | return 'Bad sequence ID' | |
177 | elseif self.errorCode == self.MISSING_RESULT then | |
178 | return 'Missing result' | |
179 | elseif self.errorCode == self.INTERNAL_ERROR then | |
180 | return 'Internal error' | |
181 | elseif self.errorCode == self.PROTOCOL_ERROR then | |
182 | return 'Protocol error' | |
183 | elseif self.errorCode == self.INVALID_TRANSFORM then | |
184 | return 'Invalid transform' | |
185 | elseif self.errorCode == self.INVALID_PROTOCOL then | |
186 | return 'Invalid protocol' | |
187 | elseif self.errorCode == self.UNSUPPORTED_CLIENT_TYPE then | |
188 | return 'Unsupported client type' | |
189 | else | |
190 | return 'Default (unknown)' | |
191 | end | |
192 | end | |
193 | ||
194 | function TException:read(iprot) | |
195 | iprot:readStructBegin() | |
196 | while true do | |
197 | local fname, ftype, fid = iprot:readFieldBegin() | |
198 | if ftype == TType.STOP then | |
199 | break | |
200 | elseif fid == 1 then | |
201 | if ftype == TType.STRING then | |
202 | self.message = iprot:readString() | |
203 | else | |
204 | iprot:skip(ftype) | |
205 | end | |
206 | elseif fid == 2 then | |
207 | if ftype == TType.I32 then | |
208 | self.errorCode = iprot:readI32() | |
209 | else | |
210 | iprot:skip(ftype) | |
211 | end | |
212 | else | |
213 | iprot:skip(ftype) | |
214 | end | |
215 | iprot:readFieldEnd() | |
216 | end | |
217 | iprot:readStructEnd() | |
218 | end | |
219 | ||
220 | function TException:write(oprot) | |
221 | oprot:writeStructBegin('TApplicationException') | |
222 | if self.message then | |
223 | oprot:writeFieldBegin('message', TType.STRING, 1) | |
224 | oprot:writeString(self.message) | |
225 | oprot:writeFieldEnd() | |
226 | end | |
227 | if self.errorCode then | |
228 | oprot:writeFieldBegin('type', TType.I32, 2) | |
229 | oprot:writeI32(self.errorCode) | |
230 | oprot:writeFieldEnd() | |
231 | end | |
232 | oprot:writeFieldStop() | |
233 | oprot:writeStructEnd() | |
234 | end | |
235 | ||
236 | -- Basic Client (used in generated lua code) | |
237 | __TClient = __TObject:new{ | |
238 | __type = '__TClient', | |
239 | _seqid = 0 | |
240 | } | |
241 | function __TClient:new(obj) | |
242 | if ttype(obj) ~= 'table' then | |
243 | error('TClient must be initialized with a table') | |
244 | end | |
245 | ||
246 | -- Set iprot & oprot | |
247 | if obj.protocol then | |
248 | obj.iprot = obj.protocol | |
249 | obj.oprot = obj.protocol | |
250 | obj.protocol = nil | |
251 | elseif not obj.iprot then | |
252 | error('You must provide ' .. ttype(self) .. ' with an iprot') | |
253 | end | |
254 | if not obj.oprot then | |
255 | obj.oprot = obj.iprot | |
256 | end | |
257 | ||
258 | return __TObject.new(self, obj) | |
259 | end | |
260 | ||
261 | function __TClient:close() | |
262 | self.iprot.trans:close() | |
263 | self.oprot.trans:close() | |
264 | end | |
265 | ||
266 | -- Basic Processor (used in generated lua code) | |
267 | __TProcessor = __TObject:new{ | |
268 | __type = '__TProcessor' | |
269 | } | |
270 | function __TProcessor:new(obj) | |
271 | if ttype(obj) ~= 'table' then | |
272 | error('TProcessor must be initialized with a table') | |
273 | end | |
274 | ||
275 | -- Ensure a handler is provided | |
276 | if not obj.handler then | |
277 | error('You must provide ' .. ttype(self) .. ' with a handler') | |
278 | end | |
279 | ||
280 | return __TObject.new(self, obj) | |
281 | end |