Skip to content

Commit eb684d3

Browse files
thomasbrugginkJens-G
authored andcommitted
THRIFT-4386 Add Lua 5.3/5.4 support
Clint: lua Patch: Thomas Bruggink This closes #3012
1 parent f54bdbd commit eb684d3

20 files changed

+410
-59
lines changed

build/docker/ubuntu-jammy/Dockerfile

+2-2
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,8 @@ RUN apt-get install -y --no-install-recommends \
206206

207207
RUN apt-get install -y --no-install-recommends \
208208
`# Lua dependencies` \
209-
lua5.2 \
210-
lua5.2-dev
209+
lua5.4 \
210+
liblua5.4-dev
211211
# https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212
212212
# lua5.3 does not install alternatives!
213213
# need to update our luasocket code, lua doesn't have luaL_openlib any more

compiler/cpp/src/thrift/generate/t_lua_generator.cc

+13
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,9 @@ string t_lua_generator::render_const_value(t_type* type, t_const_value* value) {
273273
out << value->get_double();
274274
}
275275
break;
276+
case t_base_type::TYPE_UUID:
277+
out << "TUUIDfromString(" << value->get_string() << ")";
278+
break;
276279
default:
277280
throw "compiler error: no const of base type " + t_base_type::t_base_name(tbase);
278281
}
@@ -727,6 +730,8 @@ void t_lua_generator::generate_process_function(ostream& out,
727730
if (!tfunction->is_oneway()) {
728731
out << indent() << "local result = " << resultname
729732
<< ":new{}" << '\n';
733+
} else {
734+
out << indent() << "oprot.trans:flushOneway()" << '\n';
730735
}
731736

732737
out << indent() << "local status, res = pcall(self.handler." << fn_name
@@ -845,6 +850,9 @@ void t_lua_generator::generate_deserialize_field(ostream& out,
845850
case t_base_type::TYPE_DOUBLE:
846851
out << "readDouble()";
847852
break;
853+
case t_base_type::TYPE_UUID:
854+
out << "readUuid()";
855+
break;
848856
default:
849857
throw "compiler error: no PHP name for base type " + t_base_type::t_base_name(tbase);
850858
}
@@ -1000,6 +1008,9 @@ void t_lua_generator::generate_serialize_field(ostream& out, t_field* tfield, st
10001008
case t_base_type::TYPE_DOUBLE:
10011009
out << "writeDouble(" << name << ")";
10021010
break;
1011+
case t_base_type::TYPE_UUID:
1012+
out << "writeUuid(" << name << ")";
1013+
break;
10031014
default:
10041015
throw "compiler error: no PHP name for base type " + t_base_type::t_base_name(tbase);
10051016
}
@@ -1151,6 +1162,8 @@ string t_lua_generator::type_to_enum(t_type* type) {
11511162
return "TType.I64";
11521163
case t_base_type::TYPE_DOUBLE:
11531164
return "TType.DOUBLE";
1165+
case t_base_type::TYPE_UUID:
1166+
return "TType.UUID";
11541167
default:
11551168
throw "compiler error: unhandled type";
11561169
}

lib/lua/TBinaryProtocol.lua

+33-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
--
1919

2020
require 'TProtocol'
21-
require 'libluabpack'
22-
require 'libluabitwise'
21+
local libluabpack = require 'libluabpack'
22+
local libluabitwise = require 'libluabitwise'
2323

2424
TBinaryProtocol = __TObject.new(TProtocolBase, {
2525
__type = 'TBinaryProtocol',
@@ -111,6 +111,11 @@ function TBinaryProtocol:writeI32(i32)
111111
self.trans:write(buff)
112112
end
113113

114+
function TBinaryProtocol:writeUI32(i32)
115+
local buff = libluabpack.bpack('I', i32)
116+
self.trans:write(buff)
117+
end
118+
114119
function TBinaryProtocol:writeI64(i64)
115120
local buff = libluabpack.bpack('l', i64)
116121
self.trans:write(buff)
@@ -127,6 +132,13 @@ function TBinaryProtocol:writeString(str)
127132
self.trans:write(str)
128133
end
129134

135+
function TBinaryProtocol:writeUuid(uuid)
136+
self:writeUI32(uuid.two)
137+
self:writeUI32(uuid.three)
138+
self:writeUI32(uuid.zero)
139+
self:writeUI32(uuid.one)
140+
end
141+
130142
function TBinaryProtocol:readMessageBegin()
131143
local sz, ttype, name, seqid = self:readI32()
132144
if sz < 0 then
@@ -226,6 +238,12 @@ function TBinaryProtocol:readI32()
226238
return val
227239
end
228240

241+
function TBinaryProtocol:readUI32()
242+
local buff = self.trans:readAll(4)
243+
local val = libluabpack.bunpack('I', buff)
244+
return val
245+
end
246+
229247
function TBinaryProtocol:readI64()
230248
local buff = self.trans:readAll(8)
231249
local val = libluabpack.bunpack('l', buff)
@@ -244,6 +262,19 @@ function TBinaryProtocol:readString()
244262
return str
245263
end
246264

265+
function TBinaryProtocol:readUuid()
266+
local a = self:readUI32()
267+
local b = self:readUI32()
268+
local c = self:readUI32()
269+
local d = self:readUI32()
270+
return TUUID:new {
271+
zero = c,
272+
one = d,
273+
two = a,
274+
three = b
275+
}
276+
end
277+
247278
TBinaryProtocolFactory = TProtocolFactory:new{
248279
__type = 'TBinaryProtocolFactory',
249280
strictRead = false

lib/lua/TCompactProtocol.lua

+50-16
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
--
1919

2020
require 'TProtocol'
21-
require 'libluabpack'
22-
require 'libluabitwise'
23-
require 'liblualongnumber'
21+
local libluabpack = require 'libluabpack'
22+
local libluabitwise = require 'libluabitwise'
23+
local liblualongnumber = require 'liblualongnumber'
2424

2525
TCompactProtocol = __TObject.new(TProtocolBase, {
2626
__type = 'TCompactProtocol',
@@ -61,7 +61,8 @@ TCompactType = {
6161
COMPACT_LIST = 0x09,
6262
COMPACT_SET = 0x0A,
6363
COMPACT_MAP = 0x0B,
64-
COMPACT_STRUCT = 0x0C
64+
COMPACT_STRUCT = 0x0C,
65+
COMPACT_UUID = 0x0D,
6566
}
6667

6768
TTypeToCompactType = {}
@@ -77,21 +78,23 @@ TTypeToCompactType[TType.LIST] = TCompactType.COMPACT_LIST
7778
TTypeToCompactType[TType.SET] = TCompactType.COMPACT_SET
7879
TTypeToCompactType[TType.MAP] = TCompactType.COMPACT_MAP
7980
TTypeToCompactType[TType.STRUCT] = TCompactType.COMPACT_STRUCT
81+
TTypeToCompactType[TType.UUID] = TCompactType.COMPACT_UUID
8082

8183
CompactTypeToTType = {}
82-
CompactTypeToTType[TType.STOP] = TType.STOP
83-
CompactTypeToTType[TCompactType.COMPACT_BOOLEAN_TRUE] = TType.BOOL
84+
CompactTypeToTType[TType.STOP] = TType.STOP
85+
CompactTypeToTType[TCompactType.COMPACT_BOOLEAN_TRUE] = TType.BOOL
8486
CompactTypeToTType[TCompactType.COMPACT_BOOLEAN_FALSE] = TType.BOOL
85-
CompactTypeToTType[TCompactType.COMPACT_BYTE] = TType.BYTE
86-
CompactTypeToTType[TCompactType.COMPACT_I16] = TType.I16
87-
CompactTypeToTType[TCompactType.COMPACT_I32] = TType.I32
88-
CompactTypeToTType[TCompactType.COMPACT_I64] = TType.I64
89-
CompactTypeToTType[TCompactType.COMPACT_DOUBLE] = TType.DOUBLE
90-
CompactTypeToTType[TCompactType.COMPACT_BINARY] = TType.STRING
91-
CompactTypeToTType[TCompactType.COMPACT_LIST] = TType.LIST
92-
CompactTypeToTType[TCompactType.COMPACT_SET] = TType.SET
93-
CompactTypeToTType[TCompactType.COMPACT_MAP] = TType.MAP
94-
CompactTypeToTType[TCompactType.COMPACT_STRUCT] = TType.STRUCT
87+
CompactTypeToTType[TCompactType.COMPACT_BYTE] = TType.BYTE
88+
CompactTypeToTType[TCompactType.COMPACT_I16] = TType.I16
89+
CompactTypeToTType[TCompactType.COMPACT_I32] = TType.I32
90+
CompactTypeToTType[TCompactType.COMPACT_I64] = TType.I64
91+
CompactTypeToTType[TCompactType.COMPACT_DOUBLE] = TType.DOUBLE
92+
CompactTypeToTType[TCompactType.COMPACT_BINARY] = TType.STRING
93+
CompactTypeToTType[TCompactType.COMPACT_LIST] = TType.LIST
94+
CompactTypeToTType[TCompactType.COMPACT_SET] = TType.SET
95+
CompactTypeToTType[TCompactType.COMPACT_MAP] = TType.MAP
96+
CompactTypeToTType[TCompactType.COMPACT_STRUCT] = TType.STRUCT
97+
CompactTypeToTType[TCompactType.COMPACT_UUID] = TType.UUID
9598

9699
function TCompactProtocol:resetLastField()
97100
self.lastField = {}
@@ -197,6 +200,11 @@ function TCompactProtocol:writeI32(i32)
197200
self:writeVarint32(libluabpack.i32ToZigzag(i32))
198201
end
199202

203+
function TCompactProtocol:writeUI32(i32)
204+
local buff = libluabpack.bpack('I', i32)
205+
self.trans:write(buff)
206+
end
207+
200208
function TCompactProtocol:writeI64(i64)
201209
self:writeVarint64(libluabpack.i64ToZigzag(i64))
202210
end
@@ -211,6 +219,13 @@ function TCompactProtocol:writeString(str)
211219
self:writeBinary(str)
212220
end
213221

222+
function TCompactProtocol:writeUuid(uuid)
223+
self:writeUI32(uuid.two)
224+
self:writeUI32(uuid.three)
225+
self:writeUI32(uuid.zero)
226+
self:writeUI32(uuid.one)
227+
end
228+
214229
function TCompactProtocol:writeBinary(str)
215230
-- Should be utf-8
216231
self:writeVarint32(string.len(str))
@@ -385,6 +400,12 @@ function TCompactProtocol:readI32()
385400
return value
386401
end
387402

403+
function TCompactProtocol:readUI32()
404+
local buff = self.trans:readAll(4)
405+
local val = libluabpack.bunpack('I', buff)
406+
return val
407+
end
408+
388409
function TCompactProtocol:readI64()
389410
local value = self:readVarint64()
390411
return value
@@ -400,6 +421,19 @@ function TCompactProtocol:readString()
400421
return self:readBinary()
401422
end
402423

424+
function TCompactProtocol:readUuid()
425+
local a = self:readUI32()
426+
local b = self:readUI32()
427+
local c = self:readUI32()
428+
local d = self:readUI32()
429+
return TUUID:new {
430+
zero = c,
431+
one = d,
432+
two = a,
433+
three = b
434+
}
435+
end
436+
403437
function TCompactProtocol:readBinary()
404438
local size = self:readVarint32()
405439
if size <= 0 then

lib/lua/TFramedTransport.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
--
1919

2020
require 'TTransport'
21-
require 'libluabpack'
21+
local libluabpack = require 'libluabpack'
2222

2323
TFramedTransport = TTransportBase:new{
2424
__type = 'TFramedTransport',

lib/lua/THttpTransport.lua

+11-2
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,21 @@ function THttpTransport:writeHttpHeader(content_len)
160160
end
161161
end
162162

163+
function THttpTransport:flushOneway()
164+
self.wBuf = ''
165+
self:writeHttpHeader(0)
166+
self.trans:flush()
167+
end
168+
163169
function THttpTransport:flush()
164170
-- If the write fails we still want wBuf to be clear
165171
local tmp = self.wBuf
166172
self.wBuf = ''
167-
self:writeHttpHeader(string.len(tmp))
168-
self.trans:write(tmp)
173+
local dataLen = string.len(tmp)
174+
self:writeHttpHeader(dataLen)
175+
if dataLen > 0 then
176+
self.trans:write(tmp)
177+
end
169178
self.trans:flush()
170179
end
171180

lib/lua/TJsonProtocol.lua

+15-4
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@
1818
--
1919

2020
require 'TProtocol'
21-
require 'libluabpack'
22-
require 'libluabitwise'
21+
local libluabpack = require 'libluabpack'
22+
local libluabitwise = require 'libluabitwise'
23+
local liblualongnumber = require 'liblualongnumber'
2324

2425
TJSONProtocol = __TObject.new(TProtocolBase, {
2526
__type = 'TJSONProtocol',
@@ -42,6 +43,7 @@ TTypeToString[TType.STRUCT] = "rec"
4243
TTypeToString[TType.LIST] = "lst"
4344
TTypeToString[TType.SET] = "set"
4445
TTypeToString[TType.MAP] = "map"
46+
TTypeToString[TType.UUID] = "uid"
4547

4648
StringToTType = {
4749
tf = TType.BOOL,
@@ -54,7 +56,8 @@ StringToTType = {
5456
rec = TType.STRUCT,
5557
map = TType.MAP,
5658
set = TType.SET,
57-
lst = TType.LIST
59+
lst = TType.LIST,
60+
uid = TType.UUID,
5861
}
5962

6063
JSONNode = {
@@ -402,13 +405,17 @@ function TJSONProtocol:writeI64(i64)
402405
end
403406

404407
function TJSONProtocol:writeDouble(dub)
405-
self:writeJSONDouble(string.format("%.16f", dub))
408+
self:writeJSONDouble(string.format("%.20f", dub))
406409
end
407410

408411
function TJSONProtocol:writeString(str)
409412
self:writeJSONString(str)
410413
end
411414

415+
function TJSONProtocol:writeUuid(uuid)
416+
self:writeJSONString(uuid:getString())
417+
end
418+
412419
function TJSONProtocol:writeBinary(str)
413420
-- Should be utf-8
414421
self:writeJSONBase64(str)
@@ -706,6 +713,10 @@ function TJSONProtocol:readString()
706713
return self:readJSONString()
707714
end
708715

716+
function TJSONProtocol:readUuid()
717+
return TUUIDfromString(self:readJSONString())
718+
end
719+
709720
function TJSONProtocol:readBinary()
710721
return self:readJSONBase64()
711722
end

lib/lua/TProtocol.lua

+4
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ function TProtocolBase:writeI32(i32) end
8686
function TProtocolBase:writeI64(i64) end
8787
function TProtocolBase:writeDouble(dub) end
8888
function TProtocolBase:writeString(str) end
89+
function TProtocolBase:writeUuid(uuid) end
8990
function TProtocolBase:readMessageBegin() end
9091
function TProtocolBase:readMessageEnd() end
9192
function TProtocolBase:readStructBegin() end
@@ -105,6 +106,7 @@ function TProtocolBase:readI32() end
105106
function TProtocolBase:readI64() end
106107
function TProtocolBase:readDouble() end
107108
function TProtocolBase:readString() end
109+
function TProtocolBase:readUuid() end
108110

109111
function TProtocolBase:skip(ttype)
110112
if ttype == TType.BOOL then
@@ -151,6 +153,8 @@ function TProtocolBase:skip(ttype)
151153
self:skip(ettype)
152154
end
153155
self:readListEnd()
156+
elseif ttype == TType.UUID then
157+
self:readUuid()
154158
else
155159
terror(TProtocolException:new{
156160
message = 'Invalid data'

lib/lua/TSocket.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
--
1818

1919
require 'TTransport'
20-
require 'libluasocket'
20+
local luasocket = require 'libluasocket'
2121

2222
-- TSocketBase
2323
TSocketBase = TTransportBase:new{

lib/lua/TTransport.lua

+2
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ function TTransportBase:readAll(len)
7676
return buf
7777
end
7878
function TTransportBase:write(buf) end
79+
-- flushOneway is a NOOP for most transport types.
80+
function TTransportBase:flushOneway() end
7981
function TTransportBase:flush() end
8082

8183
TServerTransportBase = __TObject:new{

0 commit comments

Comments
 (0)