]> git.saurik.com Git - redis.git/commitdiff
Correctly glue the reply buffer. For now returned as it is to Lua, but will be conver...
authorantirez <antirez@gmail.com>
Sun, 1 May 2011 01:12:53 +0000 (03:12 +0200)
committerantirez <antirez@gmail.com>
Wed, 25 May 2011 10:32:44 +0000 (12:32 +0200)
src/networking.c
src/redis.h
src/scripting.c

index b26c20595decfad39d3f88938d74ebcee3b32b85..5f0d1b25945fec10b634ee23803df031d6adc383 100644 (file)
@@ -65,6 +65,7 @@ redisClient *createClient(int fd) {
 /* Set the event loop to listen for write events on the client's socket.
  * Typically gets called every time a reply is built. */
 int _installWriteEvent(redisClient *c) {
+    if (c->flags & REDIS_LUA_CLIENT) return REDIS_OK;
     if (c->fd <= 0) return REDIS_ERR;
     if (c->bufpos == 0 && listLength(c->reply) == 0 &&
         (c->replstate == REDIS_REPL_NONE ||
index 0071c0aa406852353fee5982278079d0cab95a61..d9609991710684655a974e96ef194cfcaded65c7 100644 (file)
 #define REDIS_CLOSE_AFTER_REPLY 128 /* Close after writing entire reply. */
 #define REDIS_UNBLOCKED 256 /* This client was unblocked and is stored in
                                server.unblocked_clients */
+#define REDIS_LUA_CLIENT 512 /* This is a non connected client used by Lua */
 
 /* Client request types */
 #define REDIS_REQ_INLINE 1
index 9b957c92df3e4c6c60f4bd38c33c84fc9e5d8caa..bde532ca6f65834a4106d8e7a3a777e88679bb89 100644 (file)
@@ -14,7 +14,7 @@ int luaRedisCommand(lua_State *lua) {
 
     argv = zmalloc(sizeof(robj*)*argc);
     for (j = 0; j < argc; j++)
-        argv[j] = createStringObject(lua_tostring(lua,j+1),lua_strlen(lua,j+1));
+        argv[j] = createStringObject((char*)lua_tostring(lua,j+1),lua_strlen(lua,j+1));
 
     /* Command lookup */
     cmd = lookupCommand(argv[0]->ptr);
@@ -34,7 +34,7 @@ int luaRedisCommand(lua_State *lua) {
      * output buffers. */
     reply = sdsempty();
     if (c->bufpos) {
-        reply = sdscatlen(reply,c->bufpos,c->buf);
+        reply = sdscatlen(reply,c->buf,c->bufpos);
         c->bufpos = 0;
     }
     while(listLength(c->reply)) {
@@ -43,7 +43,8 @@ int luaRedisCommand(lua_State *lua) {
         sdscatlen(reply,o->ptr,sdslen(o->ptr));
         listDelNode(c->reply,listFirst(c->reply));
     }
-    lua_pushnumber(lua,1);
+    lua_pushlstring(lua,reply,sdslen(reply));
+    sdsfree(reply);
 
     /* Clean up. Command code may have changed argv/argc so we use the
      * argv/argc of the client instead of the local variables. */
@@ -65,6 +66,7 @@ void scriptingInit(void) {
     /* Create the (non connected) client that we use to execute Redis commands
      * inside the Lua interpreter */
     server.lua_client = createClient(-1);
+    server.lua_client->flags |= REDIS_LUA_CLIENT;
 
     server.lua = lua;
 }
@@ -134,8 +136,10 @@ void evalCommand(redisClient *c) {
             addReplyErrorFormat(c,"Error compiling script (new function): %s\n",
                 lua_tostring(lua,-1));
             lua_pop(lua,1);
+            sdsfree(funcdef);
             return;
         }
+        sdsfree(funcdef);
         if (lua_pcall(lua,0,0,0)) {
             addReplyErrorFormat(c,"Error running script (new function): %s\n",
                 lua_tostring(lua,-1));