thrift/lib/lua/Thrift.lua
Jens Geyer e02559fd46 bump version
This closes #1899
2019-10-17 20:31:24 +02:00

282 lines
6.6 KiB
Lua

--
-- 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
function ttable_size(t)
local count = 0
for k, v in pairs(t) do
count = count + 1
end
return count
end
version = '0.14.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