redisClient *c = server.lua_client;
sds reply;
+ /* Require at least one argument */
+ if (argc == 0) {
+ luaPushError(lua,
+ "Please specify at least one argument for redis.call()");
+ return 1;
+ }
+
/* Build the arguments vector */
argv = zmalloc(sizeof(robj*)*argc);
for (j = 0; j < argc; j++) {
* reply as expected. */
if ((cmd->flags & REDIS_CMD_SORT_FOR_SCRIPT) &&
(reply[0] == '*' && reply[1] != '-')) {
- /* Skip this step if command is SORT but output was already sorted */
- if (cmd->proc != sortCommand || server.sort_dontsort)
luaSortArray(lua);
}
sdsfree(reply);
+ c->reply_bytes = 0;
cleanup:
/* Clean up. Command code may have changed argv/argc so we use the
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");
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);
lua_pop(lua,2);
return;
}
-
lua_pop(lua,1);
+
+ /* Status reply */
lua_pushstring(lua,"ok");
lua_gettable(lua,-2);
t = lua_type(lua,-1);
sdsfree(ok);
lua_pop(lua,1);
} else {
+ /* Multi bulk reply. */
void *replylen = addDeferredMultiBulkLength(c);
int j = 1, mbulklen = 0;