]> git.saurik.com Git - redis.git/blobdiff - src/scripting.c
Scripting: redis.NIL to return nil bulk replies.
[redis.git] / src / scripting.c
index 35b654f7739c490b806cbe5896d30766cbb98ad9..fd1733f6553a283b756114764d4d426669c342e5 100644 (file)
@@ -516,6 +516,14 @@ void scriptingInit(void) {
     lua_pushcfunction(lua, luaRedisSha1hexCommand);
     lua_settable(lua, -3);
 
+    /* redis.NIL */
+    lua_pushstring(lua, "NIL");
+    lua_newtable(lua);
+    lua_pushstring(lua, "nilbulk");
+    lua_pushboolean(lua, 1);
+    lua_settable(lua, -3);
+    lua_settable(lua, -3);
+
     /* Finally set the table as 'redis' global var. */
     lua_setglobal(lua,"redis");
 
@@ -610,9 +618,30 @@ void luaReplyToRedisReply(redisClient *c, lua_State *lua) {
         addReplyLongLong(c,(long long)lua_tonumber(lua,-1));
         break;
     case LUA_TTABLE:
-        /* We need to check if it is an array, an error, or a status reply.
-         * Error are returned as a single element table with 'err' field.
-         * Status replies are returned as single elment table with 'ok' field */
+        /* The table can be an array or it may be in a special format that
+         * Lua uses to return special Redis protocol data types.
+         *
+         * 1) Errors are retuned as a single element table with 'err' field.
+         * 2) Status reply are returned as a single element table with 'ok'
+         *    field.
+         * 3) A Redis nil bulk reply is returned as a single element table
+         *    with 'nilbulk' field set to true.
+         *
+         * All the rest is considered just an array and is translated into
+         * a Redis multi bulk reply. */
+
+        /* Nil bulk reply */
+        lua_pushstring(lua,"nilbulk");
+        lua_gettable(lua,-2);
+        t = lua_type(lua,-1);
+        if (t == LUA_TBOOLEAN) {
+            addReply(c,shared.nullbulk);
+            lua_pop(lua,2);
+            return;
+        }
+        lua_pop(lua,1);
+
+        /* Error reply */
         lua_pushstring(lua,"err");
         lua_gettable(lua,-2);
         t = lua_type(lua,-1);
@@ -624,8 +653,9 @@ void luaReplyToRedisReply(redisClient *c, lua_State *lua) {
             lua_pop(lua,2);
             return;
         }
-
         lua_pop(lua,1);
+
+        /* Status reply */
         lua_pushstring(lua,"ok");
         lua_gettable(lua,-2);
         t = lua_type(lua,-1);
@@ -636,6 +666,7 @@ void luaReplyToRedisReply(redisClient *c, lua_State *lua) {
             sdsfree(ok);
             lua_pop(lua,1);
         } else {
+            /* Multi bulk reply. */
             void *replylen = addDeferredMultiBulkLength(c);
             int j = 1, mbulklen = 0;