First push (no docs) on range by key request by Dormondo.
author <brian@h220-215-226-164.catv02.itscom.jp> <>
Tue, 4 Dec 2007 22:11:04 +0000 (07:11 +0900)
committer <brian@h220-215-226-164.catv02.itscom.jp> <>
Tue, 4 Dec 2007 22:11:04 +0000 (07:11 +0900)
With this patch you can now group keys to particular sets of servers.

ChangeLog
include/memcached.h
lib/memcached_get.c
lib/memcached_storage.c

index cb53ed899e4c3ff1a1da7370ed10dd079afc3860..3875e7e1facb29ce8d7d7493819bf28752edbcbb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,8 @@
   * Change in value fetch, MEMCACHED_END is now returned when keys are no
     longer in the pipe.
   * Fixed bug where key could be out of range of characters
+  * Added _by_key() methods to allow partitioning of values to particular
+    servers.
 
 0.11 Mon Nov 26 01:05:52 PST 2007
   * Added option to memcache_behavior_set() so that poll() can be timed out.
index c4871027d3ad596d492697ae8ad76a67ba54bbab..2b448081733e4fae5e0ac21f1c458c18b3bf91aa 100644 (file)
@@ -299,6 +299,61 @@ char *memcached_stat_get_value(memcached_st *ptr, memcached_stat_st *stat,
 char ** memcached_stat_get_keys(memcached_st *ptr, memcached_stat_st *stat, 
                                 memcached_return *error);
 
+char *memcached_get_by_key(memcached_st *ptr, 
+                           char *master_key, size_t master_key_length, 
+                           char *key, size_t key_length, 
+                           size_t *value_length, 
+                           uint16_t *flags,
+                           memcached_return *error);
+
+memcached_return memcached_mget_by_key(memcached_st *ptr, 
+                                       char *master_key, size_t master_key_length,
+                                       char **keys, size_t *key_length, 
+                                       unsigned int number_of_keys);
+
+memcached_return memcached_set_by_key(memcached_st *ptr, 
+                                      char *master_key, size_t master_key_length, 
+                                      char *key, size_t key_length, 
+                                      char *value, size_t value_length, 
+                                      time_t expiration,
+                                      uint16_t flags);
+
+memcached_return memcached_add_by_key(memcached_st *ptr, 
+                                      char *master_key, size_t master_key_length,
+                                      char *key, size_t key_length,
+                                      char *value, size_t value_length, 
+                                      time_t expiration,
+                                      uint16_t flags);
+
+memcached_return memcached_replace_by_key(memcached_st *ptr, 
+                                          char *master_key, size_t master_key_length,
+                                          char *key, size_t key_length,
+                                          char *value, size_t value_length, 
+                                          time_t expiration,
+                                          uint16_t flags);
+
+memcached_return memcached_prepend_by_key(memcached_st *ptr, 
+                                          char *master_key, size_t master_key_length,
+                                          char *key, size_t key_length,
+                                          char *value, size_t value_length, 
+                                          time_t expiration,
+                                          uint16_t flags);
+
+memcached_return memcached_append_by_key(memcached_st *ptr, 
+                                         char *master_key, size_t master_key_length,
+                                         char *key, size_t key_length,
+                                         char *value, size_t value_length, 
+                                         time_t expiration,
+                                         uint16_t flags);
+
+memcached_return memcached_cas_by_key(memcached_st *ptr, 
+                                      char *master_key, size_t master_key_length,
+                                      char *key, size_t key_length,
+                                      char *value, size_t value_length, 
+                                      time_t expiration,
+                                      uint16_t flags,
+                                      uint64_t cas);
+
 /* Result Struct */
 void memcached_result_free(memcached_result_st *result);
 memcached_result_st *memcached_result_create(memcached_st *ptr, 
index 598767f83c45f928bdf9b2d0de0edb4727fc4b81..087e4960f33355e3bf49ae93d2d85f6839c7355f 100644 (file)
@@ -8,11 +8,25 @@ char *memcached_get(memcached_st *ptr, char *key, size_t key_length,
                     size_t *value_length, 
                     uint16_t *flags,
                     memcached_return *error)
+{
+  return memcached_get_by_key(ptr, NULL, 0, key, key_length, value_length, 
+                              flags, error);
+}
+
+char *memcached_get_by_key(memcached_st *ptr, 
+                           char *master_key, size_t master_key_length, 
+                           char *key, size_t key_length, 
+                           size_t *value_length, 
+                           uint16_t *flags,
+                           memcached_return *error)
 {
   char *value;
 
   /* Request the key */
-  *error= memcached_mget(ptr, &key, &key_length, 1);
+  *error= memcached_mget_by_key(ptr, 
+                                master_key, 
+                                master_key_length, 
+                                &key, &key_length, 1);
 
   value= memcached_fetch(ptr, NULL, NULL, 
                          value_length, flags, error);
@@ -32,11 +46,20 @@ char *memcached_get(memcached_st *ptr, char *key, size_t key_length,
 memcached_return memcached_mget(memcached_st *ptr, 
                                 char **keys, size_t *key_length, 
                                 unsigned int number_of_keys)
+{
+  return memcached_mget_by_key(ptr, NULL, 0, keys, key_length, number_of_keys);
+}
+
+memcached_return memcached_mget_by_key(memcached_st *ptr, 
+                                       char *master_key, size_t master_key_length,
+                                       char **keys, size_t *key_length, 
+                                       unsigned int number_of_keys)
 {
   unsigned int x;
   memcached_return rc= MEMCACHED_NOTFOUND;
   char *get_command= "get ";
-  uint8_t get_command_length= 4
+  uint8_t get_command_length= 4;
+  unsigned int master_server_key= 0;
 
   LIBMEMCACHED_MEMCACHED_MGET_START();
   ptr->cursor_server= 0;
@@ -55,6 +78,9 @@ memcached_return memcached_mget(memcached_st *ptr,
 
   memcached_finish(ptr);
 
+  if (master_key && master_key_length)
+    master_server_key= memcached_generate_hash(ptr, master_key, master_key_length);
+
   /* 
     If a server fails we warn about errors and start all over with sending keys
     to the server.
@@ -63,7 +89,10 @@ memcached_return memcached_mget(memcached_st *ptr,
   {
     unsigned int server_key;
 
-    server_key= memcached_generate_hash(ptr, keys[x], key_length[x]);
+    if (master_server_key)
+      server_key= master_server_key;
+    else
+      server_key= memcached_generate_hash(ptr, keys[x], key_length[x]);
 
     if (ptr->hosts[server_key].cursor_active == 0)
     {
index ba8835cb40ee223fac8c95e7d35bda6fb52e437e..43a18a98336a7474f027e5a493e792c8390fec97 100644 (file)
@@ -42,6 +42,7 @@ char *storage_op_string(memcached_storage_action verb)
 }
 
 static inline memcached_return memcached_send(memcached_st *ptr, 
+                                              char *master_key, size_t master_key_length, 
                                               char *key, size_t key_length, 
                                               char *value, size_t value_length, 
                                               time_t expiration,
@@ -65,7 +66,7 @@ static inline memcached_return memcached_send(memcached_st *ptr,
   if (ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
 
-  server_key= memcached_generate_hash(ptr, key, key_length);
+  server_key= memcached_generate_hash(ptr, master_key, master_key_length);
 
   if (cas)
     write_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, 
@@ -133,8 +134,9 @@ memcached_return memcached_set(memcached_st *ptr, char *key, size_t key_length,
 {
   memcached_return rc;
   LIBMEMCACHED_MEMCACHED_SET_START();
-  rc= memcached_send(ptr, key, key_length, value, value_length,
-                         expiration, flags, 0, SET_OP);
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, SET_OP);
   LIBMEMCACHED_MEMCACHED_SET_END();
   return rc;
 }
@@ -147,8 +149,9 @@ memcached_return memcached_add(memcached_st *ptr,
 {
   memcached_return rc;
   LIBMEMCACHED_MEMCACHED_ADD_START();
-  rc= memcached_send(ptr, key, key_length, value, value_length,
-                         expiration, flags, 0, ADD_OP);
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, ADD_OP);
   LIBMEMCACHED_MEMCACHED_ADD_END();
   return rc;
 }
@@ -161,8 +164,9 @@ memcached_return memcached_replace(memcached_st *ptr,
 {
   memcached_return rc;
   LIBMEMCACHED_MEMCACHED_REPLACE_START();
-  rc= memcached_send(ptr, key, key_length, value, value_length,
-                         expiration, flags, 0, REPLACE_OP);
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, REPLACE_OP);
   LIBMEMCACHED_MEMCACHED_REPLACE_END();
   return rc;
 }
@@ -174,7 +178,8 @@ memcached_return memcached_prepend(memcached_st *ptr,
                                    uint16_t flags)
 {
   memcached_return rc;
-  rc= memcached_send(ptr, key, key_length, value, value_length,
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
                      expiration, flags, 0, PREPEND_OP);
   return rc;
 }
@@ -186,7 +191,8 @@ memcached_return memcached_append(memcached_st *ptr,
                                   uint16_t flags)
 {
   memcached_return rc;
-  rc= memcached_send(ptr, key, key_length, value, value_length,
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
                      expiration, flags, 0, APPEND_OP);
   return rc;
 }
@@ -199,7 +205,99 @@ memcached_return memcached_cas(memcached_st *ptr,
                                uint64_t cas)
 {
   memcached_return rc;
-  rc= memcached_send(ptr, key, key_length, value, value_length,
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, cas, APPEND_OP);
+  return rc;
+}
+
+memcached_return memcached_set_by_key(memcached_st *ptr, 
+                                      char *master_key, size_t master_key_length, 
+                                      char *key, size_t key_length, 
+                                      char *value, size_t value_length, 
+                                      time_t expiration,
+                                      uint16_t flags)
+{
+  memcached_return rc;
+  LIBMEMCACHED_MEMCACHED_SET_START();
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, SET_OP);
+  LIBMEMCACHED_MEMCACHED_SET_END();
+  return rc;
+}
+
+memcached_return memcached_add_by_key(memcached_st *ptr, 
+                                      char *master_key, size_t master_key_length,
+                                      char *key, size_t key_length,
+                                      char *value, size_t value_length, 
+                                      time_t expiration,
+                                      uint16_t flags)
+{
+  memcached_return rc;
+  LIBMEMCACHED_MEMCACHED_ADD_START();
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, ADD_OP);
+  LIBMEMCACHED_MEMCACHED_ADD_END();
+  return rc;
+}
+
+memcached_return memcached_replace_by_key(memcached_st *ptr, 
+                                          char *master_key, size_t master_key_length,
+                                          char *key, size_t key_length,
+                                          char *value, size_t value_length, 
+                                          time_t expiration,
+                                          uint16_t flags)
+{
+  memcached_return rc;
+  LIBMEMCACHED_MEMCACHED_REPLACE_START();
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, REPLACE_OP);
+  LIBMEMCACHED_MEMCACHED_REPLACE_END();
+  return rc;
+}
+
+memcached_return memcached_prepend_by_key(memcached_st *ptr, 
+                                          char *master_key, size_t master_key_length,
+                                          char *key, size_t key_length,
+                                          char *value, size_t value_length, 
+                                          time_t expiration,
+                                          uint16_t flags)
+{
+  memcached_return rc;
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, PREPEND_OP);
+  return rc;
+}
+
+memcached_return memcached_append_by_key(memcached_st *ptr, 
+                                         char *master_key, size_t master_key_length,
+                                         char *key, size_t key_length,
+                                         char *value, size_t value_length, 
+                                         time_t expiration,
+                                         uint16_t flags)
+{
+  memcached_return rc;
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
+                     expiration, flags, 0, APPEND_OP);
+  return rc;
+}
+
+memcached_return memcached_cas_by_key(memcached_st *ptr, 
+                                      char *master_key, size_t master_key_length,
+                                      char *key, size_t key_length,
+                                      char *value, size_t value_length, 
+                                      time_t expiration,
+                                      uint16_t flags,
+                                      uint64_t cas)
+{
+  memcached_return rc;
+  rc= memcached_send(ptr, key, key_length, 
+                     key, key_length, value, value_length,
                      expiration, flags, cas, APPEND_OP);
   return rc;
 }