From a1feda2388d556e6bc0c2f831e0b2f90f5f71abd Mon Sep 17 00:00:00 2001 From: antirez Date: Mon, 26 Nov 2018 16:44:00 +0100 Subject: [PATCH] RESP3: Scripting RESP3 mode set/map protocol -> Lua conversion. --- src/scripting.c | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/src/scripting.c b/src/scripting.c index 7aedc9de..9b8d5fd3 100644 --- a/src/scripting.c +++ b/src/scripting.c @@ -42,7 +42,7 @@ char *redisProtocolToLuaType_Int(lua_State *lua, char *reply); char *redisProtocolToLuaType_Bulk(lua_State *lua, char *reply); char *redisProtocolToLuaType_Status(lua_State *lua, char *reply); char *redisProtocolToLuaType_Error(lua_State *lua, char *reply); -char *redisProtocolToLuaType_MultiBulk(lua_State *lua, char *reply); +char *redisProtocolToLuaType_MultiBulk(lua_State *lua, char *reply, int atype); int redis_math_random (lua_State *L); int redis_math_randomseed (lua_State *L); void ldbInit(void); @@ -132,7 +132,9 @@ char *redisProtocolToLuaType(lua_State *lua, char* reply) { case '$': p = redisProtocolToLuaType_Bulk(lua,reply); break; case '+': p = redisProtocolToLuaType_Status(lua,reply); break; case '-': p = redisProtocolToLuaType_Error(lua,reply); break; - case '*': p = redisProtocolToLuaType_MultiBulk(lua,reply); break; + case '*': p = redisProtocolToLuaType_MultiBulk(lua,reply,*p); break; + case '%': p = redisProtocolToLuaType_MultiBulk(lua,reply,*p); break; + case '~': p = redisProtocolToLuaType_MultiBulk(lua,reply,*p); break; } return p; } @@ -180,22 +182,38 @@ char *redisProtocolToLuaType_Error(lua_State *lua, char *reply) { return p+2; } -char *redisProtocolToLuaType_MultiBulk(lua_State *lua, char *reply) { +char *redisProtocolToLuaType_MultiBulk(lua_State *lua, char *reply, int atype) { char *p = strchr(reply+1,'\r'); long long mbulklen; int j = 0; string2ll(reply+1,p-reply-1,&mbulklen); - p += 2; - if (mbulklen == -1) { - lua_pushboolean(lua,0); - return p; - } - lua_newtable(lua); - for (j = 0; j < mbulklen; j++) { - lua_pushnumber(lua,j+1); - p = redisProtocolToLuaType(lua,p); - lua_settable(lua,-3); + if (server.lua_caller->resp == 2 || atype == '*') { + p += 2; + if (mbulklen == -1) { + lua_pushboolean(lua,0); + return p; + } + lua_newtable(lua); + for (j = 0; j < mbulklen; j++) { + lua_pushnumber(lua,j+1); + p = redisProtocolToLuaType(lua,p); + lua_settable(lua,-3); + } + } else if (server.lua_caller->resp == 3) { + /* Here we handle only Set and Map replies in RESP3 mode, since arrays + * follow the above RESP2 code path. */ + p += 2; + lua_newtable(lua); + for (j = 0; j < mbulklen; j++) { + p = redisProtocolToLuaType(lua,p); + if (atype == '%') { + p = redisProtocolToLuaType(lua,p); + } else { + lua_pushboolean(lua,1); + } + lua_settable(lua,-3); + } } return p; }