]> git.saurik.com Git - redis.git/blobdiff - src/networking.c
added diskstore.c, currently just a stub
[redis.git] / src / networking.c
index 7d14ac53f18bfc8c60ef457ff3b4c6383e3d59da..26ee46f63cfbbfa1566321ac3ccd60a38289179c 100644 (file)
@@ -180,6 +180,9 @@ void addReply(redisClient *c, robj *obj) {
         if (_addReplyToBuffer(c,obj->ptr,sdslen(obj->ptr)) != REDIS_OK)
             _addReplyObjectToList(c,obj);
     } else {
         if (_addReplyToBuffer(c,obj->ptr,sdslen(obj->ptr)) != REDIS_OK)
             _addReplyObjectToList(c,obj);
     } else {
+        /* FIXME: convert the long into string and use _addReplyToBuffer()
+         * instead of calling getDecodedObject. As this place in the
+         * code is too performance critical. */
         obj = getDecodedObject(obj);
         if (_addReplyToBuffer(c,obj->ptr,sdslen(obj->ptr)) != REDIS_OK)
             _addReplyObjectToList(c,obj);
         obj = getDecodedObject(obj);
         if (_addReplyToBuffer(c,obj->ptr,sdslen(obj->ptr)) != REDIS_OK)
             _addReplyObjectToList(c,obj);
@@ -277,6 +280,7 @@ void setDeferredMultiBulkLength(redisClient *c, void *node, long length) {
     }
 }
 
     }
 }
 
+/* Add a duble as a bulk reply */
 void addReplyDouble(redisClient *c, double d) {
     char dbuf[128], sbuf[128];
     int dlen, slen;
 void addReplyDouble(redisClient *c, double d) {
     char dbuf[128], sbuf[128];
     int dlen, slen;
@@ -285,6 +289,8 @@ void addReplyDouble(redisClient *c, double d) {
     addReplyString(c,sbuf,slen);
 }
 
     addReplyString(c,sbuf,slen);
 }
 
+/* Add a long long as integer reply or bulk len / multi bulk count.
+ * Basically this is used to output <prefix><long long><crlf>. */
 void _addReplyLongLong(redisClient *c, long long ll, char prefix) {
     char buf[128];
     int len;
 void _addReplyLongLong(redisClient *c, long long ll, char prefix) {
     char buf[128];
     int len;
@@ -303,6 +309,7 @@ void addReplyMultiBulkLen(redisClient *c, long length) {
     _addReplyLongLong(c,length,'*');
 }
 
     _addReplyLongLong(c,length,'*');
 }
 
+/* Create the length prefix of a bulk reply, example: $2234 */
 void addReplyBulkLen(redisClient *c, robj *obj) {
     size_t len;
 
 void addReplyBulkLen(redisClient *c, robj *obj) {
     size_t len;
 
@@ -324,23 +331,38 @@ void addReplyBulkLen(redisClient *c, robj *obj) {
     _addReplyLongLong(c,len,'$');
 }
 
     _addReplyLongLong(c,len,'$');
 }
 
+/* Add a Redis Object as a bulk reply */
 void addReplyBulk(redisClient *c, robj *obj) {
     addReplyBulkLen(c,obj);
     addReply(c,obj);
     addReply(c,shared.crlf);
 }
 
 void addReplyBulk(redisClient *c, robj *obj) {
     addReplyBulkLen(c,obj);
     addReply(c,obj);
     addReply(c,shared.crlf);
 }
 
-/* In the CONFIG command we need to add vanilla C string as bulk replies */
+/* Add a C buffer as bulk reply */
+void addReplyBulkCBuffer(redisClient *c, void *p, size_t len) {
+    _addReplyLongLong(c,len,'$');
+    addReplyString(c,p,len);
+    addReply(c,shared.crlf);
+}
+
+/* Add a C nul term string as bulk reply */
 void addReplyBulkCString(redisClient *c, char *s) {
     if (s == NULL) {
         addReply(c,shared.nullbulk);
     } else {
 void addReplyBulkCString(redisClient *c, char *s) {
     if (s == NULL) {
         addReply(c,shared.nullbulk);
     } else {
-        robj *o = createStringObject(s,strlen(s));
-        addReplyBulk(c,o);
-        decrRefCount(o);
+        addReplyBulkCBuffer(c,s,strlen(s));
     }
 }
 
     }
 }
 
+/* Add a long long as a bulk reply */
+void addReplyBulkLongLong(redisClient *c, long long ll) {
+    char buf[64];
+    int len;
+
+    len = ll2string(buf,64,ll);
+    addReplyBulkCBuffer(c,buf,len);
+}
+
 static void acceptCommonHandler(int fd) {
     redisClient *c;
     if ((c = createClient(fd)) == NULL) {
 static void acceptCommonHandler(int fd) {
     redisClient *c;
     if ((c = createClient(fd)) == NULL) {
@@ -782,7 +804,7 @@ int processMultibulkBuffer(redisClient *c) {
                 bulklen = strtol(c->querybuf+pos+1,&eptr,10);
                 tolerr = (eptr[0] != '\r');
                 if (tolerr || bulklen == LONG_MIN || bulklen == LONG_MAX ||
                 bulklen = strtol(c->querybuf+pos+1,&eptr,10);
                 tolerr = (eptr[0] != '\r');
                 if (tolerr || bulklen == LONG_MIN || bulklen == LONG_MAX ||
-                    bulklen < 0 || bulklen > 1024*1024*1024)
+                    bulklen < 0 || bulklen > 512*1024*1024)
                 {
                     addReplyError(c,"Protocol error: invalid bulk length");
                     setProtocolError(c,pos);
                 {
                     addReplyError(c,"Protocol error: invalid bulk length");
                     setProtocolError(c,pos);