Adding support for trigger call on delete of a successful object.
author <brian@gir.tangent.org> <>
Sat, 22 Mar 2008 04:54:01 +0000 (21:54 -0700)
committer <brian@gir.tangent.org> <>
Sat, 22 Mar 2008 04:54:01 +0000 (21:54 -0700)
ChangeLog
docs/memcached_callback.pod
libmemcached/memcached.c
libmemcached/memcached.h
libmemcached/memcached_callback.c
libmemcached/memcached_constants.h
libmemcached/memcached_delete.c
libmemcached/memcached_types.h
tests/function.c

index 7c7828f61c45855d2c3517df1faafa17311f53d4..fd539d399eed0395a00358f674a7ab3dc5756b24 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,7 @@
   * Read through cached support.
   * Fixed for cas by key operation.
   * Fix for memcached_server_st list structures to have correct count.
+  * Added callback MEMCACHED_CALLBACK_DELETE_TRIGGER
 
 
 0.18 Sun Mar 16 21:57:55 PDT 2008
index 56ba4e29c6a4e3bbb1a4554f0986d92105d4b0f0..a9c0ac417b570af4f8ac5458035edf25dbdd3c42 100755 (executable)
@@ -53,28 +53,28 @@ This allows you to store a pointer to a specifc piece of data. This can be
 retrieved from inside of memcached_fetch_execute(). Cloning a memcached_st
 will copy the pointer to the clone.
 
-=item  MEMCACHED_CALLBACK_MALLOC_FUNCTION,
+=item  MEMCACHED_CALLBACK_MALLOC_FUNCTION
 
 This alllows yout to pass in a customized version of malloc that will be used instead of the builtin malloc(3) call.
 The prototype for this is:
 
 void *(*memcached_malloc_function)(memcached_st *ptr, const size_t size);
 
-=item  MEMCACHED_CALLBACK_REALLOC_FUNCTION,
+=item  MEMCACHED_CALLBACK_REALLOC_FUNCTION
 
 This alllows yout to pass in a customized version of realloc that will be used instead of the builtin realloc(3) call.
 The prototype for this is:
 
 void *(*memcached_realloc_function)(memcached_st *ptr, void *mem, const size_t size);
 
-=item  MEMCACHED_CALLBACK_FREE_FUNCTION,
+=item  MEMCACHED_CALLBACK_FREE_FUNCTION
 
 This alllows yout to pass in a customized version of realloc that will be used instead of the builtin free(3) call.
 The prototype for this is:
 
 typedef void (*memcached_free_function)(memcached_st *ptr, void *mem);
 
-=item  MEMCACHED_CALLBACK_GET_FAILURE,
+=item  MEMCACHED_CALLBACK_GET_FAILURE
 
 This function implements the read through cache behavior. On failure of retrieval this callback will be called. 
 You are responsible for populating the result object provided. This result object will then be stored in the server and
@@ -86,6 +86,15 @@ cause the object to be buffered and not sent immediatly (if this is the default
 The prototype for this is:
 memcached_return (*memcached_trigger_key)(memcached_st *ptr, char *key, size_t key_length, memcached_result_st *result);
 
+=item  MEMCACHED_CALLBACK_DELETE_TRIGGER
+
+This function implements a trigger upon successful deletion of a key. The memcached_st structure will need to be cloned
+in order to make use of it.
+
+The prototype for this is:
+typedef memcached_return (*memcached_trigger_delete_key)(memcached_st *ptr, char *key, size_t key_length);
+
+
 =back
 
 =head1 RETURN
index 2c8cef75b61c5926bde3ec40128b7cc6595769c1..33a80bab29693982e49ae0210b3fc08f18694095 100644 (file)
@@ -103,6 +103,7 @@ memcached_st *memcached_clone(memcached_st *clone, memcached_st *ptr)
   new_clone->call_malloc= ptr->call_malloc;
   new_clone->call_realloc= ptr->call_realloc;
   new_clone->get_key_failure= ptr->get_key_failure;
+  new_clone->delete_trigger= ptr->delete_trigger;
 
   if (ptr->on_clone)
     ptr->on_clone(ptr, new_clone);
index 2df0b7ae063a3a09be8401eccb07811c1b8c023c..b84d4373df5e312e1891747899c986a23eb8a7ab 100644 (file)
@@ -83,6 +83,7 @@ struct memcached_st {
   memcached_malloc_function call_malloc;
   memcached_realloc_function call_realloc;
   memcached_trigger_key get_key_failure;
+  memcached_trigger_delete_key delete_trigger;
 #ifdef NOT_USED /* Future Use */
   uint8_t replicas;
   memcached_return warning;
index ad21c10d500422289f9ac427b8bfb4b88268f622..6db2db82d3dbe1e86329f33157ecdca339370bb6 100644 (file)
@@ -54,6 +54,12 @@ memcached_return memcached_callback_set(memcached_st *ptr,
       ptr->get_key_failure= func;
       break;
     }
+  case MEMCACHED_CALLBACK_DELETE_TRIGGER:
+    {
+      memcached_trigger_delete_key func= (memcached_trigger_delete_key)data;
+      ptr->delete_trigger= func;
+      break;
+    }
   default:
     return MEMCACHED_FAILURE;
   }
@@ -106,6 +112,11 @@ void *memcached_callback_get(memcached_st *ptr,
       *error= ptr->get_key_failure ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
       return (void *)ptr->get_key_failure;
     }
+  case MEMCACHED_CALLBACK_DELETE_TRIGGER:
+    {
+      *error= ptr->delete_trigger ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
+      return (void *)ptr->delete_trigger;
+    }
   default:
       WATCHPOINT_ASSERT(0);
       *error= MEMCACHED_FAILURE;
index 6f3909b6be029726cb00b20dcbfefafa86a94001..254e91161b8a37bf40f186b016a8470a771f36fb 100644 (file)
@@ -91,6 +91,7 @@ typedef enum {
   MEMCACHED_CALLBACK_REALLOC_FUNCTION,
   MEMCACHED_CALLBACK_FREE_FUNCTION,
   MEMCACHED_CALLBACK_GET_FAILURE,
+  MEMCACHED_CALLBACK_DELETE_TRIGGER,
 } memcached_callback;
 
 typedef enum {
index 60e3bed4406e3ce89c1b6c64868559af8f77b7b8..37a28add0c18dcff7e8143ce3ca14962f1f2e787 100644 (file)
@@ -59,6 +59,9 @@ memcached_return memcached_delete_by_key(memcached_st *ptr,
       rc= MEMCACHED_SUCCESS;
   }
 
+  if (rc == MEMCACHED_SUCCESS && ptr->delete_trigger)
+    ptr->delete_trigger(ptr, key, key_length);
+
 error:
   LIBMEMCACHED_MEMCACHED_DELETE_END();
   return rc;
index 6db4ba451c920b7c8d2822381b4a606d78c1783f..de0709ba0edfd43193bc9bb339468a6466591afb 100644 (file)
@@ -28,6 +28,8 @@ typedef memcached_return (*memcached_server_function)(memcached_st *ptr, memcach
 typedef memcached_return (*memcached_trigger_key)(memcached_st *ptr,  
                                                   char *key, size_t key_length, 
                                                   memcached_result_st *result);
+typedef memcached_return (*memcached_trigger_delete_key)(memcached_st *ptr,  
+                                                         char *key, size_t key_length);
 
 #ifdef __cplusplus
 }
index 9e10552c26f16c4b287757e5827dd37ec2e0ea8e..38de6679daf5e56f2df810c41db23b6a433326ee 100644 (file)
@@ -584,6 +584,26 @@ uint8_t read_through(memcached_st *memc)
   return 0;
 }
 
+memcached_return delete_trigger(memcached_st *ptr,  char *key, size_t key_length)
+{
+  assert(key);
+
+  return MEMCACHED_SUCCESS;
+}
+
+uint8_t delete_through(memcached_st *memc)
+{
+  memcached_trigger_delete_key callback;
+  memcached_return rc;
+
+  callback= delete_trigger;
+
+  rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_DELETE_TRIGGER, callback);
+  assert(rc == MEMCACHED_SUCCESS);
+
+  return 0;
+}
+
 uint8_t get_test(memcached_st *memc)
 {
   memcached_return rc;
@@ -2531,6 +2551,7 @@ test_st tests[] ={
   {"bad_key", 1, bad_key_test },
   {"memcached_server_cursor", 1, memcached_server_cursor_test },
   {"read_through", 1, read_through },
+  {"delete_through", 1, delete_through },
   {0, 0, 0}
 };