Add master-key versions of incr and decr commands
authorAdam Thomason <ad@mthomason.net>
Sat, 7 Nov 2009 01:07:34 +0000 (17:07 -0800)
committerAdam Thomason <ad@mthomason.net>
Sat, 7 Nov 2009 01:07:34 +0000 (17:07 -0800)
docs/memcached_auto.pod
libmemcached/memcached.h
libmemcached/memcached_auto.c
tests/function.c

index f877405ed21fdd7be1d53bf6deff1ec747ac663d..7f4e44d9be8c6952d47d81c1f6380c6a74ef3972 100644 (file)
@@ -42,6 +42,42 @@ C Client Library for memcached (libmemcached, -lmemcached)
                                       time_t expiration,
                                       uint64_t *value);
 
+  memcached_return
+    memcached_increment_by_key (memcached_st *ptr, 
+                                const char *master_key, size_t master_key_length,
+                                const char *key, size_t key_length,
+                                unsigned int offset,
+                                uint64_t *value);
+
+  memcached_return
+    memcached_decrement_by_key (memcached_st *ptr, 
+                                const char *master_key, size_t master_key_length,
+                                const char *key, size_t key_length,
+                                unsigned int offset,
+                                uint64_t *value);
+
+  memcached_return
+    memcached_increment_by_key_with_initial (memcached_st *ptr,
+                                             const char *master_key,
+                                             size_t master_key_length,
+                                             const char *key,
+                                             size_t key_length,
+                                             uint64_t offset,
+                                             uint64_t initial,
+                                             time_t expiration,
+                                             uint64_t *value);
+
+  memcached_return
+    memcached_decrement_by_key_with_initial (memcached_st *ptr,
+                                             const char *master_key,
+                                             size_t master_key_length,
+                                             const char *key,
+                                             size_t key_length,
+                                             uint64_t offset,
+                                             uint64_t initial,
+                                             time_t expiration,
+                                             uint64_t *value);
+
 =head1 DESCRIPTION
 
 memcached(1) servers have the ability to increment and decrement keys
@@ -74,6 +110,11 @@ key with a initial value to expire with the provided expiration time. The
 flags will be set to zero.The value is then returned via the unsigned int
 value pointer you pass to it.
 
+memcached_increment_by_key(), memcached_decrement_by_key(),
+memcached_increment_by_key_with_initial(), and
+memcached_decrement_by_key_with_initial() are master key equivalents of the
+above.
+
 =head1 RETURN
 
 A value of type C<memcached_return> is returned.
index 225b20990d1f2d6a4bec4de5cb1e8781b3fc8908..9541cdfb0a4ae221d45f4d460384ce522bcb7b1f 100644 (file)
@@ -144,6 +144,21 @@ memcached_return memcached_decrement(memcached_st *ptr,
                                      const char *key, size_t key_length,
                                      uint32_t offset,
                                      uint64_t *value);
+
+LIBMEMCACHED_API
+memcached_return memcached_increment_by_key(memcached_st *ptr, 
+                                            const char *master_key, size_t master_key_length,
+                                            const char *key, size_t key_length,
+                                            uint32_t offset,
+                                            uint64_t *value);
+
+LIBMEMCACHED_API
+memcached_return memcached_decrement_by_key(memcached_st *ptr, 
+                                            const char *master_key, size_t master_key_length,
+                                            const char *key, size_t key_length,
+                                            uint32_t offset,
+                                            uint64_t *value);
+
 LIBMEMCACHED_API
 memcached_return memcached_increment_with_initial(memcached_st *ptr,
                                                   const char *key,
@@ -161,6 +176,26 @@ memcached_return memcached_decrement_with_initial(memcached_st *ptr,
                                                   time_t expiration,
                                                   uint64_t *value);
 LIBMEMCACHED_API
+memcached_return memcached_increment_by_key_with_initial(memcached_st *ptr,
+                                                         const char *master_key,
+                                                         size_t master_key_length,
+                                                         const char *key,
+                                                         size_t key_length,
+                                                         uint64_t offset,
+                                                         uint64_t initial,
+                                                         time_t expiration,
+                                                         uint64_t *value);
+LIBMEMCACHED_API
+memcached_return memcached_decrement_by_key_with_initial(memcached_st *ptr,
+                                                         const char *master_key,
+                                                         size_t master_key_length,
+                                                         const char *key,
+                                                         size_t key_length,
+                                                         uint64_t offset,
+                                                         uint64_t initial,
+                                                         time_t expiration,
+                                                         uint64_t *value);
+LIBMEMCACHED_API
 void memcached_stat_free(memcached_st *, memcached_stat_st *);
 LIBMEMCACHED_API
 memcached_stat_st *memcached_stat(memcached_st *ptr, char *args, memcached_return *error);
index 084d7a381c37deb2d30c0d6371f7ced08b9604f0..9fce267502f94d6501c6ae47e1d42dc53468c7db 100644 (file)
@@ -1,7 +1,8 @@
 #include "common.h"
 
-static memcached_return memcached_auto(memcached_st *ptr, 
+static memcached_return memcached_auto(memcached_st *ptr,
                                        const char *verb,
+                                       const char *master_key, size_t master_key_length,
                                        const char *key, size_t key_length,
                                        unsigned int offset,
                                        uint64_t *value)
@@ -18,9 +19,9 @@ static memcached_return memcached_auto(memcached_st *ptr,
   if ((ptr->flags & MEM_VERIFY_KEY) && (memcached_key_test((const char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
     return MEMCACHED_BAD_KEY_PROVIDED;
 
-  server_key= memcached_generate_hash(ptr, key, key_length);
+  server_key= memcached_generate_hash(ptr, master_key, master_key_length);
 
-  send_length= (size_t)snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, 
+  send_length= (size_t)snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE,
                                 "%s %s%.*s %u%s\r\n", verb,
                                 ptr->prefix_key,
                                 (int)key_length, key,
@@ -34,10 +35,10 @@ static memcached_return memcached_auto(memcached_st *ptr,
 
   rc= memcached_response(&ptr->hosts[server_key], buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, NULL);
 
-  /* 
+  /*
     So why recheck responce? Because the protocol is brain dead :)
-    The number returned might end up equaling one of the string 
-    values. Less chance of a mistake with strncmp() so we will 
+    The number returned might end up equaling one of the string
+    values. Less chance of a mistake with strncmp() so we will
     use it. We still called memcached_response() though since it
     worked its magic for non-blocking IO.
   */
@@ -61,10 +62,11 @@ static memcached_return memcached_auto(memcached_st *ptr,
 }
 
 static memcached_return binary_incr_decr(memcached_st *ptr, uint8_t cmd,
+                                         const char *master_key, size_t master_key_length,
                                          const char *key, size_t key_length,
                                          uint64_t offset, uint64_t initial,
                                          uint32_t expiration,
-                                         uint64_t *value) 
+                                         uint64_t *value)
 {
   unsigned int server_key;
   bool no_reply= (ptr->flags & MEM_NOREPLY);
@@ -72,7 +74,7 @@ static memcached_return binary_incr_decr(memcached_st *ptr, uint8_t cmd,
   unlikely (ptr->hosts == NULL || 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 (no_reply)
   {
@@ -95,7 +97,7 @@ static memcached_return binary_incr_decr(memcached_st *ptr, uint8_t cmd,
 
   if ((memcached_do(&ptr->hosts[server_key], request.bytes,
                     sizeof(request.bytes), 0)!=MEMCACHED_SUCCESS) ||
-      (memcached_io_write(&ptr->hosts[server_key], key, key_length, 1) == -1)) 
+      (memcached_io_write(&ptr->hosts[server_key], key, key_length, 1) == -1))
   {
     memcached_io_reset(&ptr->hosts[server_key]);
     return MEMCACHED_WRITE_FAILURE;
@@ -106,45 +108,65 @@ static memcached_return binary_incr_decr(memcached_st *ptr, uint8_t cmd,
   return memcached_response(&ptr->hosts[server_key], (char*)value, sizeof(*value), NULL);
 }
 
-memcached_return memcached_increment(memcached_st *ptr, 
+memcached_return memcached_increment(memcached_st *ptr,
                                      const char *key, size_t key_length,
                                      uint32_t offset,
                                      uint64_t *value)
+{
+  return memcached_increment_by_key(ptr, key, key_length, key, key_length, offset, value);
+}
+
+memcached_return memcached_decrement(memcached_st *ptr,
+                                     const char *key, size_t key_length,
+                                     uint32_t offset,
+                                     uint64_t *value)
+{
+  return memcached_decrement_by_key(ptr, key, key_length, key, key_length, offset, value);
+}
+
+memcached_return memcached_increment_by_key(memcached_st *ptr,
+                                            const char *master_key, size_t master_key_length,
+                                            const char *key, size_t key_length,
+                                            uint32_t offset,
+                                            uint64_t *value)
 {
   memcached_return rc= memcached_validate_key_length(key_length, ptr->flags & MEM_BINARY_PROTOCOL);
   unlikely (rc != MEMCACHED_SUCCESS)
     return rc;
 
   LIBMEMCACHED_MEMCACHED_INCREMENT_START();
-  if (ptr->flags & MEM_BINARY_PROTOCOL) 
-    rc= binary_incr_decr(ptr, PROTOCOL_BINARY_CMD_INCREMENT, key, key_length,
+  if (ptr->flags & MEM_BINARY_PROTOCOL)
+    rc= binary_incr_decr(ptr, PROTOCOL_BINARY_CMD_INCREMENT,
+                         master_key, master_key_length, key, key_length,
                          (uint64_t)offset, 0, MEMCACHED_EXPIRATION_NOT_ADD,
                          value);
-  else 
-     rc= memcached_auto(ptr, "incr", key, key_length, offset, value);
-  
+  else
+     rc= memcached_auto(ptr, "incr", master_key, master_key_length, key, key_length, offset, value);
+
   LIBMEMCACHED_MEMCACHED_INCREMENT_END();
 
   return rc;
 }
 
-memcached_return memcached_decrement(memcached_st *ptr, 
-                                     const char *key, size_t key_length,
-                                     uint32_t offset,
-                                     uint64_t *value)
+memcached_return memcached_decrement_by_key(memcached_st *ptr,
+                                            const char *master_key, size_t master_key_length,
+                                            const char *key, size_t key_length,
+                                            uint32_t offset,
+                                            uint64_t *value)
 {
   memcached_return rc= memcached_validate_key_length(key_length, ptr->flags & MEM_BINARY_PROTOCOL);
   unlikely (rc != MEMCACHED_SUCCESS)
     return rc;
 
   LIBMEMCACHED_MEMCACHED_DECREMENT_START();
-  if (ptr->flags & MEM_BINARY_PROTOCOL) 
-    rc= binary_incr_decr(ptr, PROTOCOL_BINARY_CMD_DECREMENT, key, key_length,
+  if (ptr->flags & MEM_BINARY_PROTOCOL)
+    rc= binary_incr_decr(ptr, PROTOCOL_BINARY_CMD_DECREMENT,
+                         master_key, master_key_length, key, key_length,
                          (uint64_t)offset, 0, MEMCACHED_EXPIRATION_NOT_ADD,
                          value);
-  else 
-    rc= memcached_auto(ptr, "decr", key, key_length, offset, value);      
-  
+  else
+    rc= memcached_auto(ptr, "decr", master_key, master_key_length, key, key_length, offset, value);
+
   LIBMEMCACHED_MEMCACHED_DECREMENT_END();
 
   return rc;
@@ -157,6 +179,21 @@ memcached_return memcached_increment_with_initial(memcached_st *ptr,
                                                   uint64_t initial,
                                                   time_t expiration,
                                                   uint64_t *value)
+{
+  return memcached_increment_by_key_with_initial(ptr, key, key_length,
+                                                 key, key_length,
+                                                 offset, initial, expiration, value);
+}
+
+memcached_return memcached_increment_by_key_with_initial(memcached_st *ptr,
+                                                         const char *master_key,
+                                                         size_t master_key_length,
+                                                         const char *key,
+                                                         size_t key_length,
+                                                         uint64_t offset,
+                                                         uint64_t initial,
+                                                         time_t expiration,
+                                                         uint64_t *value)
 {
   memcached_return rc= memcached_validate_key_length(key_length, ptr->flags & MEM_BINARY_PROTOCOL);
   unlikely (rc != MEMCACHED_SUCCESS)
@@ -164,8 +201,9 @@ memcached_return memcached_increment_with_initial(memcached_st *ptr,
 
   LIBMEMCACHED_MEMCACHED_INCREMENT_WITH_INITIAL_START();
   if (ptr->flags & MEM_BINARY_PROTOCOL)
-    rc= binary_incr_decr(ptr, PROTOCOL_BINARY_CMD_INCREMENT, key,
-                         key_length, offset, initial, (uint32_t)expiration, 
+    rc= binary_incr_decr(ptr, PROTOCOL_BINARY_CMD_INCREMENT,
+                         master_key, master_key_length, key, key_length,
+                         offset, initial, (uint32_t)expiration,
                          value);
   else
     rc= MEMCACHED_PROTOCOL_ERROR;
@@ -182,20 +220,37 @@ memcached_return memcached_decrement_with_initial(memcached_st *ptr,
                                                   uint64_t initial,
                                                   time_t expiration,
                                                   uint64_t *value)
+{
+  return memcached_decrement_by_key_with_initial(ptr, key, key_length,
+                                                 key, key_length,
+                                                 offset, initial, expiration, value);
+}
+
+memcached_return memcached_decrement_by_key_with_initial(memcached_st *ptr,
+                                                         const char *master_key,
+                                                         size_t master_key_length,
+                                                         const char *key,
+                                                         size_t key_length,
+                                                         uint64_t offset,
+                                                         uint64_t initial,
+                                                         time_t expiration,
+                                                         uint64_t *value)
 {
   memcached_return rc= memcached_validate_key_length(key_length, ptr->flags & MEM_BINARY_PROTOCOL);
   unlikely (rc != MEMCACHED_SUCCESS)
     return rc;
 
-  LIBMEMCACHED_MEMCACHED_DECREMENT_WITH_INITIAL_START();
+  LIBMEMCACHED_MEMCACHED_INCREMENT_WITH_INITIAL_START();
   if (ptr->flags & MEM_BINARY_PROTOCOL)
-    rc= binary_incr_decr(ptr, PROTOCOL_BINARY_CMD_DECREMENT, key,
-                         key_length, offset, initial, (uint32_t)expiration,
+    rc= binary_incr_decr(ptr, PROTOCOL_BINARY_CMD_DECREMENT,
+                         master_key, master_key_length, key, key_length,
+                         offset, initial, (uint32_t)expiration,
                          value);
   else
     rc= MEMCACHED_PROTOCOL_ERROR;
 
-  LIBMEMCACHED_MEMCACHED_DECREMENT_WITH_INITIAL_END();
+  LIBMEMCACHED_MEMCACHED_INCREMENT_WITH_INITIAL_END();
 
   return rc;
 }
+
index 744e94ec6932a0dadfd9d185ba32eee73c96adaf..8ccf503d9ef8d6cc087ee05d503790880df4c548 100644 (file)
@@ -1152,6 +1152,12 @@ static test_return_t  increment_test(memcached_st *memc)
   assert(rc == MEMCACHED_SUCCESS);
   assert(new_number == 2);
 
+  rc= memcached_increment_by_key(memc, key, strlen(key),
+                                 key, strlen(key),
+                                 1, &new_number);
+  assert(rc == MEMCACHED_SUCCESS);
+  assert(new_number == 3);
+
   return TEST_SUCCESS;
 }
 
@@ -1199,6 +1205,12 @@ static test_return_t  decrement_test(memcached_st *memc)
   assert(rc == MEMCACHED_SUCCESS);
   assert(new_number == 1);
 
+  rc= memcached_decrement_by_key(memc, key, strlen(key),
+                                 key, strlen(key),
+                                 1, &new_number);
+  assert(rc == MEMCACHED_SUCCESS);
+  assert(new_number == 0);
+
   return TEST_SUCCESS;
 }