All commands exported by Redis to Lua scripts are now inside the redis table. Implemented redis.log() function.

This commit is contained in:
antirez 2011-05-16 18:32:03 +02:00
parent 7229d60d03
commit 288f811fea
2 changed files with 65 additions and 1 deletions

View File

@ -963,6 +963,7 @@ struct redisCommand *lookupCommandByCString(char *s);
void call(redisClient *c, struct redisCommand *cmd); void call(redisClient *c, struct redisCommand *cmd);
int prepareForShutdown(); int prepareForShutdown();
void redisLog(int level, const char *fmt, ...); void redisLog(int level, const char *fmt, ...);
void redisLogRaw(int level, const char *msg);
void usage(); void usage();
void updateDictResizePolicy(void); void updateDictResizePolicy(void);
int htNeedsResize(dict *dict); int htNeedsResize(dict *dict);

View File

@ -200,6 +200,41 @@ int luaRedisCommand(lua_State *lua) {
return 1; return 1;
} }
int luaLogCommand(lua_State *lua) {
int j, argc = lua_gettop(lua);
int level;
sds log;
if (argc < 2) {
luaPushError(lua, "redis.log() requires two arguments or more.");
return 1;
} else if (!lua_isnumber(lua,-argc)) {
luaPushError(lua, "First argument must be a number.");
return 1;
}
level = lua_tonumber(lua,-argc);
if (level < REDIS_DEBUG && level > REDIS_WARNING) {
luaPushError(lua, "Invalid debug level.");
return 1;
}
/* Glue together all the arguments */
log = sdsempty();
for (j = 1; j < argc; j++) {
size_t len;
char *s;
s = (char*)lua_tolstring(lua,(-argc)+j,&len);
if (s) {
if (j != 1) log = sdscatlen(log," ",1);
log = sdscatlen(log,s,len);
}
}
redisLogRaw(level,log);
sdsfree(log);
return 0;
}
void luaMaskCountHook(lua_State *lua, lua_Debug *ar) { void luaMaskCountHook(lua_State *lua, lua_Debug *ar) {
long long elapsed; long long elapsed;
REDIS_NOTUSED(ar); REDIS_NOTUSED(ar);
@ -216,8 +251,36 @@ void scriptingInit(void) {
lua_State *lua = lua_open(); lua_State *lua = lua_open();
luaL_openlibs(lua); luaL_openlibs(lua);
/* Register the 'r' command */ /* Register the redis commands table and fields */
lua_newtable(lua);
/* redis.call */
lua_pushstring(lua,"call");
lua_pushcfunction(lua,luaRedisCommand); lua_pushcfunction(lua,luaRedisCommand);
lua_settable(lua,-3);
/* redis.log and log levels. */
lua_pushstring(lua,"log");
lua_pushcfunction(lua,luaLogCommand);
lua_settable(lua,-3);
lua_pushstring(lua,"LOG_DEBUG");
lua_pushnumber(lua,REDIS_DEBUG);
lua_settable(lua,-3);
lua_pushstring(lua,"LOG_VERBOSE");
lua_pushnumber(lua,REDIS_VERBOSE);
lua_settable(lua,-3);
lua_pushstring(lua,"LOG_NOTICE");
lua_pushnumber(lua,REDIS_NOTICE);
lua_settable(lua,-3);
lua_pushstring(lua,"LOG_WARNING");
lua_pushnumber(lua,REDIS_WARNING);
lua_settable(lua,-3);
/* Finally set the table as 'redis' global var. */
lua_setglobal(lua,"redis"); lua_setglobal(lua,"redis");
/* Create the (non connected) client that we use to execute Redis commands /* Create the (non connected) client that we use to execute Redis commands