Added behavior method around testing of keys.
author <brian@gir-2.local> <>
Fri, 15 Feb 2008 05:32:18 +0000 (11:02 +0530)
committer <brian@gir-2.local> <>
Fri, 15 Feb 2008 05:32:18 +0000 (11:02 +0530)
ChangeLog
docs/memcached_behavior.pod
include/memcached.h
lib/common.h
lib/memcached_auto.c
lib/memcached_behavior.c
lib/memcached_get.c
lib/memcached_storage.c
tests/function.c

index e6228373142009cdad6ca2b5482a56e26fb26987..35f91ed757748df92cc6511b54b799419109b88c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,3 @@
-0.17
-  * More error messages on command line tools.
-
 0.16
   * Work on the UDP protocol
   * Added get_by_key, set_by_key tests for C++ API
@@ -10,9 +7,9 @@
     clients with the same lists, will have same distribution. (Idea from
     Ross McFarland). MEMCACHED_BEHAVIOR_SORT_HOSTS was added to enable
     this support.
-  * Added MEMCACHED_BAD_KEY_PROVIDED error for auto, set, and get operations 
-    when the library is compiled with --enable-debug. This additional code
-    will test for bad keys.
+  * Added MEMCACHED_BAD_KEY_PROVIDED error for auto, set, and get operations.
+    MEMCACHED_BEHAVIOR_VERIFY_KEY was added to enable this feature.
+  * More error messages on command line tools.
   
 0.15 Tue Jan 29 14:55:44 PST 2008
   * More work on the C++ API.
index e71f1438ff1fa52df95e0bb984dbd8fda6082b14..50e215f874ca996356f4be4d86bb2ec0a58a9e76 100755 (executable)
@@ -88,6 +88,11 @@ action that gets data causes this buffer to be be sent to the remote
 connection. Quiting the connection or closing down the connection will also
 cause the buffered data to be pushed to the remote connection. 
 
+=item MEMCACHED_BEHAVIOR_VERIFY_KEY
+
+Enabling this will cause libmemcached(3) to test all keys to verify that they 
+are valid keys.
+
 =item MEMCACHED_BEHAVIOR_SORT_HOSTS
 
 Enabling this will cause hosts that are added to be placed in the host list in 
index 92000fe8ae11eb74bc12a647dc48bfce557c86bc..e0f829aa7b526de3140b47107e162f6800d25bab 100644 (file)
@@ -101,6 +101,7 @@ typedef enum {
   MEMCACHED_BEHAVIOR_BUFFER_REQUESTS,
   MEMCACHED_BEHAVIOR_USER_DATA,
   MEMCACHED_BEHAVIOR_SORT_HOSTS,
+  MEMCACHED_BEHAVIOR_VERIFY_KEY,
 } memcached_behavior;
 
 typedef enum {
index ff54fe5738179c1a066ded2f826e4360698bee73..9e4cb5e17fb4346b98134f7ca8fa6354fdf8e5f0 100644 (file)
@@ -66,6 +66,7 @@ typedef enum {
   MEM_SUPPORT_CAS= (1 << 7),
   MEM_BUFFER_REQUESTS= (1 << 8),
   MEM_USE_SORT_HOSTS= (1 << 9),
+  MEM_VERIFY_KEY= (1 << 10),
 } memcached_flags;
 
 /* Hashing algo */
@@ -111,13 +112,7 @@ memcached_return value_fetch(memcached_server_st *ptr,
                              memcached_result_st *result);
 void server_list_free(memcached_st *ptr, memcached_server_st *servers);
 
-memcached_return key_proof(char **keys, size_t *key_length, 
-                           unsigned int number_of_keys);
-
-#ifdef HAVE_DEBUG
-#define key_test(A,B,C) key_proof(A,B,C)
-#else
-#define key_test(A,B,C) MEMCACHED_SUCCESS
-#endif
+memcached_return memcachd_key_test(char **keys, size_t *key_length, 
+                                   unsigned int number_of_keys);
 
 #endif /* __COMMON_H__ */
index 36780dc5409f3dee8dc5151cf1c8dc1ed96cd06a..0d0fc91797141d32a50b934613a921d970773a7a 100644 (file)
@@ -17,7 +17,7 @@ static memcached_return memcached_auto(memcached_st *ptr,
   if (ptr->hosts == NULL || ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
 
-  if (key_test(&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)
+  if ((ptr->flags & MEM_VERIFY_KEY) && (memcachd_key_test(&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
     return MEMCACHED_BAD_KEY_PROVIDED;
 
   server_key= memcached_generate_hash(ptr, key, key_length);
index 1458c1a9a9372272c19850b17198a8f6ce2ce6a6..42eacba995a8763060ea1be1028a41b5c35362a4 100644 (file)
@@ -11,7 +11,7 @@
 
 void set_behavior_flag(memcached_st *ptr, memcached_flags temp_flag, void *data)
 {
-  unsigned int *truefalse= (unsigned int *)data;
+  unsigned int truefalse= *(unsigned int *)data;
 
   memcached_quit(ptr);
   if (truefalse)
@@ -46,6 +46,9 @@ memcached_return memcached_behavior_set(memcached_st *ptr,
   case MEMCACHED_BEHAVIOR_CACHE_LOOKUPS:
     set_behavior_flag(ptr, MEM_USE_CACHE_LOOKUPS, data);
     break;
+  case MEMCACHED_BEHAVIOR_VERIFY_KEY:
+    set_behavior_flag(ptr, MEM_VERIFY_KEY, data);
+    break;
   case MEMCACHED_BEHAVIOR_KETAMA:
     set_behavior_flag(ptr, MEM_USE_KETAMA, data);
     break;
@@ -103,6 +106,9 @@ unsigned long long memcached_behavior_get(memcached_st *ptr,
   case MEMCACHED_BEHAVIOR_TCP_NODELAY:
     temp_flag= MEM_TCP_NODELAY;
     break;
+  case MEMCACHED_BEHAVIOR_VERIFY_KEY:
+    temp_flag= MEM_VERIFY_KEY;
+    break;
   case MEMCACHED_BEHAVIOR_DISTRIBUTION:
     return ptr->distribution;
   case MEMCACHED_BEHAVIOR_HASH:
@@ -115,7 +121,6 @@ unsigned long long memcached_behavior_get(memcached_st *ptr,
     break;
   case MEMCACHED_BEHAVIOR_USER_DATA:
     return 0;
-    //return (unsigned long long)ptr->user_data;
   case MEMCACHED_BEHAVIOR_POLL_TIMEOUT:
     {
       return (unsigned long long)ptr->poll_timeout;
index cfbb13f43dfb40419a9db32bcd7c6217fa195cd7..8cc7ce30b04adee6eb7d62555ed9fd90b0c8ecd4 100644 (file)
@@ -75,7 +75,7 @@ memcached_return memcached_mget_by_key(memcached_st *ptr,
   if (ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
 
-  if (key_test(keys, key_length, number_of_keys) == MEMCACHED_BAD_KEY_PROVIDED)
+  if ((ptr->flags & MEM_VERIFY_KEY) && (memcachd_key_test(keys, key_length, number_of_keys) == MEMCACHED_BAD_KEY_PROVIDED))
     return MEMCACHED_BAD_KEY_PROVIDED;
 
   if (ptr->flags & MEM_SUPPORT_CAS)
index 30585095fa9b8588b5e4cc3026217111702cd7c3..443389e029a583f03418a73f35695a39bef77f4c 100644 (file)
@@ -66,7 +66,7 @@ static inline memcached_return memcached_send(memcached_st *ptr,
   if (ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
 
-  if (key_test(&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)
+  if ((ptr->flags & MEM_VERIFY_KEY) && (memcachd_key_test(&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
     return MEMCACHED_BAD_KEY_PROVIDED;
 
   server_key= memcached_generate_hash(ptr, master_key, master_key_length);
index b971134e2c8c33afc2e70f896b758d85f10c3025..7c61db786eaf584ddeffe022833187ceccdc2080 100644 (file)
@@ -463,19 +463,34 @@ uint8_t flush_test(memcached_st *memc)
 
 uint8_t bad_key_test(memcached_st *memc)
 {
-#ifdef HAVE_DEBUG
   memcached_return rc;
   char *key= "foo bad";
   char *string;
   size_t string_length;
   uint32_t flags;
+  memcached_st *clone;
+  unsigned int set= 1;
 
-  string= memcached_get(memc, key, strlen(key),
+  clone= memcached_clone(NULL, memc);
+  assert(clone);
+
+  (void)memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, &set);
+
+  string= memcached_get(clone, key, strlen(key),
                         &string_length, &flags, &rc);
   assert(rc == MEMCACHED_BAD_KEY_PROVIDED);
   assert(string_length ==  0);
   assert(!string);
-#endif
+
+  set= 0;
+  (void)memcached_behavior_set(clone, MEMCACHED_BEHAVIOR_VERIFY_KEY, &set);
+  string= memcached_get(clone, key, strlen(key),
+                        &string_length, &flags, &rc);
+  assert(rc == MEMCACHED_NOTFOUND);
+  assert(string_length ==  0);
+  assert(!string);
+
+  memcached_free(clone);
 
   return 0;
 }