void scriptCommand(rliteClient *c) { if (c->argc == 2 && !strcasecmp(c->argv[1],"flush")) { scriptingReset(); c->reply = createStatusObject(RLITE_STR_OK); } else if (c->argc >= 2 && !strcasecmp(c->argv[1],"exists")) { int j; c->reply = createArrayObject(c->argc - 2); for (j = 2; j < c->argc; j++) { c->reply->element[j - 2] = createLongLongObject(getScript(c, c->argv[j], NULL, NULL) == RL_OK ? 1 : 0); } } else if (c->argc == 3 && !strcasecmp(c->argv[1],"load")) { char sha[41]; sha1hex(sha,c->argv[2],c->argvlen[2]); setScript(c, c->argv[2], c->argvlen[2]); c->reply = createStringObject(sha,40); } else if (c->argc == 2 && !strcasecmp(c->argv[1],"kill")) { if (lua_caller == NULL) { c->reply = createCStringObject("NOTBUSY No scripts in execution right now.\r\n"); } else if (lua_write_dirty) { c->reply = createCStringObject("UNKILLABLE Sorry the script already executed write commands against the dataset. You can either wait the script termination or kill the server in a hard way using the SHUTDOWN NOSAVE command.\r\n"); } else { lua_kill = 1; c->reply = createStatusObject(RLITE_STR_OK); } } else { c->reply = createErrorObject("ERR Unknown SCRIPT subcommand or wrong # of args."); } }
void scriptCommand(redisClient *c) { if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"flush")) { scriptingReset(); addReply(c,shared.ok); replicationScriptCacheFlush(); server.dirty++; /* Propagating this command is a good idea. */ } else if (c->argc >= 2 && !strcasecmp(c->argv[1]->ptr,"exists")) { int j; addReplyMultiBulkLen(c, c->argc-2); for (j = 2; j < c->argc; j++) { if (dictFind(server.lua_scripts,c->argv[j]->ptr)) addReply(c,shared.cone); else addReply(c,shared.czero); } } else if (c->argc == 3 && !strcasecmp(c->argv[1]->ptr,"load")) { char funcname[43]; sds sha; funcname[0] = 'f'; funcname[1] = '_'; sha1hex(funcname+2,c->argv[2]->ptr,sdslen(c->argv[2]->ptr)); sha = sdsnewlen(funcname+2,40); if (dictFind(server.lua_scripts,sha) == NULL) { if (luaCreateFunction(c,server.lua,funcname,c->argv[2]) == REDIS_ERR) { sdsfree(sha); return; } } addReplyBulkCBuffer(c,funcname+2,40); sdsfree(sha); forceCommandPropagation(c,REDIS_PROPAGATE_REPL|REDIS_PROPAGATE_AOF); } else if (c->argc == 2 && !strcasecmp(c->argv[1]->ptr,"kill")) { if (server.lua_caller == NULL) { addReplySds(c,sdsnew("-NOTBUSY No scripts in execution right now.\r\n")); } else if (server.lua_write_dirty) { addReplySds(c,sdsnew("-UNKILLABLE Sorry the script already executed write commands against the dataset. You can either wait the script termination or kill the server in a hard way using the SHUTDOWN NOSAVE command.\r\n")); } else { server.lua_kill = 1; addReply(c,shared.ok); } } else { addReplyError(c, "Unknown SCRIPT subcommand or wrong # of args."); } }