Commit 82c6b825 authored by antirez's avatar antirez
Browse files

Now it is possible to return multi bulks of multi bulks from Lua, just...

Now it is possible to return multi bulks of multi bulks from Lua, just returning tables of tables. The new conversion of the Null bulk and multi bulk type is the Lua false type.
parent da386cdf
...@@ -68,7 +68,7 @@ char *redisProtocolToLuaType_Bulk(lua_State *lua, char *reply) { ...@@ -68,7 +68,7 @@ char *redisProtocolToLuaType_Bulk(lua_State *lua, char *reply) {
string2ll(reply+1,p-reply-1,&bulklen); string2ll(reply+1,p-reply-1,&bulklen);
if (bulklen == -1) { if (bulklen == -1) {
lua_pushnil(lua); lua_pushboolean(lua,0);
return p+2; return p+2;
} else { } else {
lua_pushlstring(lua,p+2,bulklen); lua_pushlstring(lua,p+2,bulklen);
...@@ -104,7 +104,7 @@ char *redisProtocolToLuaType_MultiBulk(lua_State *lua, char *reply) { ...@@ -104,7 +104,7 @@ char *redisProtocolToLuaType_MultiBulk(lua_State *lua, char *reply) {
string2ll(reply+1,p-reply-1,&mbulklen); string2ll(reply+1,p-reply-1,&mbulklen);
p += 2; p += 2;
if (mbulklen == -1) { if (mbulklen == -1) {
lua_pushnil(lua); lua_pushboolean(lua,0);
return p; return p;
} }
lua_newtable(lua); lua_newtable(lua);
...@@ -248,17 +248,17 @@ void hashScript(char *digest, char *script, size_t len) { ...@@ -248,17 +248,17 @@ void hashScript(char *digest, char *script, size_t len) {
} }
void luaReplyToRedisReply(redisClient *c, lua_State *lua) { void luaReplyToRedisReply(redisClient *c, lua_State *lua) {
int t = lua_type(lua,1); int t = lua_type(lua,-1);
switch(t) { switch(t) {
case LUA_TSTRING: case LUA_TSTRING:
addReplyBulkCBuffer(c,(char*)lua_tostring(lua,1),lua_strlen(lua,1)); addReplyBulkCBuffer(c,(char*)lua_tostring(lua,-1),lua_strlen(lua,-1));
break; break;
case LUA_TBOOLEAN: case LUA_TBOOLEAN:
addReply(c,lua_toboolean(lua,1) ? shared.cone : shared.czero); addReply(c,lua_toboolean(lua,-1) ? shared.cone : shared.nullbulk);
break; break;
case LUA_TNUMBER: case LUA_TNUMBER:
addReplyLongLong(c,(long long)lua_tonumber(lua,1)); addReplyLongLong(c,(long long)lua_tonumber(lua,-1));
break; break;
case LUA_TTABLE: case LUA_TTABLE:
/* We need to check if it is an array, an error, or a status reply. /* We need to check if it is an array, an error, or a status reply.
...@@ -294,17 +294,9 @@ void luaReplyToRedisReply(redisClient *c, lua_State *lua) { ...@@ -294,17 +294,9 @@ void luaReplyToRedisReply(redisClient *c, lua_State *lua) {
if (t == LUA_TNIL) { if (t == LUA_TNIL) {
lua_pop(lua,1); lua_pop(lua,1);
break; break;
} else if (t == LUA_TSTRING) {
size_t len;
char *s = (char*) lua_tolstring(lua,-1,&len);
addReplyBulkCBuffer(c,s,len);
mbulklen++;
} else if (t == LUA_TNUMBER) {
addReplyLongLong(c,(long long)lua_tonumber(lua,-1));
mbulklen++;
} }
lua_pop(lua,1); luaReplyToRedisReply(c, lua);
mbulklen++;
} }
setDeferredMultiBulkLength(c,replylen,mbulklen); setDeferredMultiBulkLength(c,replylen,mbulklen);
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment