Optimization for read(), we now optimize on buffer size.
[m6w6/libmemcached] / lib / memcached_io.c
index 7067237ffd6f72ecc47317f7fdb74d90a056c585..8615aa6e13eb38c0433bba15e95fab12a4473ceb 100644 (file)
@@ -4,9 +4,55 @@
 
 #include <memcached.h>
 
-ssize_t memcached_io_read(memcached_st *ptr, char *buf, size_t length)
+ssize_t memcached_io_read(memcached_st *ptr, unsigned  int server_key,
+                          char *buffer, size_t length)
 {
-  return -1;
+  size_t x;
+  char *buffer_ptr;
+
+  buffer_ptr= buffer;
+
+  for (x= 0, buffer_ptr= buffer; 
+       x < length; x++)
+  {
+    if (!ptr->read_buffer_length)
+    {
+      if (length > 1)
+      {
+
+        size_t data_read;
+        data_read= recv(ptr->hosts[server_key].fd, 
+                        buffer_ptr, 
+                        length - x, 0);
+        if (data_read == -1)
+          return -1;
+        if (data_read == 0)
+          return x;
+
+        data_read+= x;
+
+        return data_read;
+      }
+      else
+      {
+        ptr->read_buffer_length= recv(ptr->hosts[server_key].fd, 
+                                      ptr->read_buffer, 
+                                      MEMCACHED_MAX_BUFFER, 0);
+        ptr->read_ptr= ptr->read_buffer;
+      }
+
+      if (ptr->read_buffer_length == -1)
+        return -1;
+      if (ptr->read_buffer_length == 0)
+        return x;
+    }
+    *buffer_ptr= *ptr->read_ptr;
+    buffer_ptr++;
+    ptr->read_ptr++;
+    ptr->read_buffer_length--;
+  }
+
+  return length;
 }
 
 ssize_t memcached_io_write(memcached_st *ptr, unsigned int server_key,