]> git.proxmox.com Git - ceph.git/blob - ceph/src/jaegertracing/thrift/lib/lua/Thrift.lua
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / jaegertracing / thrift / lib / lua / Thrift.lua
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