|  | -- | 
|  | -- 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 achieve 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 |