]> git.proxmox.com Git - ceph.git/blame - ceph/src/jaegertracing/thrift/lib/lua/Thrift.lua
buildsys: switch source download to quincy
[ceph.git] / ceph / src / jaegertracing / thrift / lib / lua / Thrift.lua
CommitLineData
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
25package.cpath = package.cpath .. ';bin/?.so' -- TODO FIX
26function 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)
33end
34
35function terror(e)
36 if e and e.__tostring then
37 error(e:__tostring())
38 return
39 end
40 error(e)
41end
42
43function ttable_size(t)
44 local count = 0
45 for k, v in pairs(t) do
46 count = count + 1
47 end
48 return count
49end
50
51version = '0.13.0'
52
53TType = {
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
73TMessageType = {
74 CALL = 1,
75 REPLY = 2,
76 EXCEPTION = 3,
77 ONEWAY = 4
78}
79
80-- Recursive __index function to achieve inheritance
81function __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
93end
94
95-- Basic Thrift-Lua Object
96__TObject = {
97 __type = '__TObject',
98 __mt = {
99 __index = __tobj_index
100 }
101}
102function __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
112end
113
114-- Return a string representation of any lua variable
115function 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
130end
131
132-- Basic Exception
133TException = __TObject:new{
134 message,
135 errorCode,
136 __type = 'TException'
137}
138function 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
150end
151
152TApplicationException = 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
168function 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
192end
193
194function 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()
218end
219
220function 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()
234end
235
236-- Basic Client (used in generated lua code)
237__TClient = __TObject:new{
238 __type = '__TClient',
239 _seqid = 0
240}
241function __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)
259end
260
261function __TClient:close()
262 self.iprot.trans:close()
263 self.oprot.trans:close()
264end
265
266-- Basic Processor (used in generated lua code)
267__TProcessor = __TObject:new{
268 __type = '__TProcessor'
269}
270function __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)
281end