-- -- Licensed to the Apache Software Foundation (ASF) under one -- or more contributor license agreements. See the NOTICE file -- distributed with this work for additional information -- regarding copyright ownership. The ASF licenses this file -- to you under the Apache License, Version 2.0 (the -- "License"); you may not use this file except in compliance -- with the License. You may obtain a copy of the License at -- -- http://www.apache.org/licenses/LICENSE-2.0 -- -- Unless required by applicable law or agreed to in writing, -- software distributed under the License is distributed on an -- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -- KIND, either express or implied. See the License for the -- specific language governing permissions and limitations -- under the License. -- ---- namespace thrift --thrift = {} --setmetatable(thrift, {__index = _G}) --> perf hit for accessing global methods --setfenv(1, thrift) package.cpath = package.cpath .. ';bin/?.so' -- TODO FIX function ttype(obj) if type(obj) == 'table' and obj.__type and type(obj.__type) == 'string' then return obj.__type end return type(obj) end function terror(e) if e and e.__tostring then error(e:__tostring()) return end error(e) end version = 1.0 TType = { STOP = 0, VOID = 1, BOOL = 2, BYTE = 3, I08 = 3, DOUBLE = 4, I16 = 6, I32 = 8, I64 = 10, STRING = 11, UTF7 = 11, STRUCT = 12, MAP = 13, SET = 14, LIST = 15, UTF8 = 16, UTF16 = 17 } TMessageType = { CALL = 1, REPLY = 2, EXCEPTION = 3, ONEWAY = 4 } -- Recursive __index function to achive inheritance function __tobj_index(self, key) local v = rawget(self, key) if v ~= nil then return v end local p = rawget(self, '__parent') if p then return __tobj_index(p, key) end return nil end -- Basic Thrift-Lua Object __TObject = { __type = '__TObject', __mt = { __index = __tobj_index } } function __TObject:new(init_obj) local obj = {} if ttype(obj) == 'table' then obj = init_obj end -- Use the __parent key and the __index function to achieve inheritance obj.__parent = self setmetatable(obj, __TObject.__mt) return obj end -- Return a string representation of any lua variable function thrift_print_r(t) local ret = '' local ltype = type(t) if (ltype == 'table') then ret = ret .. '{ ' for key,value in pairs(t) do ret = ret .. tostring(key) .. '=' .. thrift_print_r(value) .. ' ' end ret = ret .. '}' elseif ltype == 'string' then ret = ret .. "'" .. tostring(t) .. "'" else ret = ret .. tostring(t) end return ret end -- Basic Exception TException = __TObject:new{ message, errorCode, __type = 'TException' } function TException:__tostring() if self.message then return string.format('%s: %s', self.__type, self.message) else local message if self.errorCode and self.__errorCodeToString then message = string.format('%d: %s', self.errorCode, self:__errorCodeToString()) else message = thrift_print_r(self) end return string.format('%s:%s', self.__type, message) end end TApplicationException = TException:new{ UNKNOWN = 0, UNKNOWN_METHOD = 1, INVALID_MESSAGE_TYPE = 2, WRONG_METHOD_NAME = 3, BAD_SEQUENCE_ID = 4, MISSING_RESULT = 5, INTERNAL_ERROR = 6, PROTOCOL_ERROR = 7, INVALID_TRANSFORM = 8, INVALID_PROTOCOL = 9, UNSUPPORTED_CLIENT_TYPE = 10, errorCode = 0, __type = 'TApplicationException' } function TApplicationException:__errorCodeToString() if self.errorCode == self.UNKNOWN_METHOD then return 'Unknown method' elseif self.errorCode == self.INVALID_MESSAGE_TYPE then return 'Invalid message type' elseif self.errorCode == self.WRONG_METHOD_NAME then return 'Wrong method name' elseif self.errorCode == self.BAD_SEQUENCE_ID then return 'Bad sequence ID' elseif self.errorCode == self.MISSING_RESULT then return 'Missing result' elseif self.errorCode == self.INTERNAL_ERROR then return 'Internal error' elseif self.errorCode == self.PROTOCOL_ERROR then return 'Protocol error' elseif self.errorCode == self.INVALID_TRANSFORM then return 'Invalid transform' elseif self.errorCode == self.INVALID_PROTOCOL then return 'Invalid protocol' elseif self.errorCode == self.UNSUPPORTED_CLIENT_TYPE then return 'Unsupported client type' else return 'Default (unknown)' end end function TException:read(iprot) iprot:readStructBegin() while true do local fname, ftype, fid = iprot:readFieldBegin() if ftype == TType.STOP then break elseif fid == 1 then if ftype == TType.STRING then self.message = iprot:readString() else iprot:skip(ftype) end elseif fid == 2 then if ftype == TType.I32 then self.errorCode = iprot:readI32() else iprot:skip(ftype) end else iprot:skip(ftype) end iprot:readFieldEnd() end iprot:readStructEnd() end function TException:write(oprot) oprot:writeStructBegin('TApplicationException') if self.message then oprot:writeFieldBegin('message', TType.STRING, 1) oprot:writeString(self.message) oprot:writeFieldEnd() end if self.errorCode then oprot:writeFieldBegin('type', TType.I32, 2) oprot:writeI32(self.errorCode) oprot:writeFieldEnd() end oprot:writeFieldStop() oprot:writeStructEnd() end -- Basic Client (used in generated lua code) __TClient = __TObject:new{ __type = '__TClient', _seqid = 0 } function __TClient:new(obj) if ttype(obj) ~= 'table' then error('TClient must be initialized with a table') end -- Set iprot & oprot if obj.protocol then obj.iprot = obj.protocol obj.oprot = obj.protocol obj.protocol = nil elseif not obj.iprot then error('You must provide ' .. ttype(self) .. ' with an iprot') end if not obj.oprot then obj.oprot = obj.iprot end return __TObject.new(self, obj) end function __TClient:close() self.iprot.trans:close() self.oprot.trans:close() end -- Basic Processor (used in generated lua code) __TProcessor = __TObject:new{ __type = '__TProcessor' } function __TProcessor:new(obj) if ttype(obj) ~= 'table' then error('TProcessor must be initialized with a table') end -- Ensure a handler is provided if not obj.handler then error('You must provide ' .. ttype(self) .. ' with a handler') end return __TObject.new(self, obj) end