This patch includes all of the callback work for setting clone() and cleanup()
author <brian@gir.local> <>
Fri, 18 Jan 2008 18:54:24 +0000 (13:54 -0500)
committer <brian@gir.local> <>
Fri, 18 Jan 2008 18:54:24 +0000 (13:54 -0500)
operations.

ChangeLog
docs/Makefile.am
docs/libmemcached.pod
docs/memcached_behavior.pod
include/memcached.h
lib/Makefile.am
lib/memcached_behavior.c
lib/memcached_callback.c [new file with mode: 0644]
support/libmemcached.spec.in
tests/function.c

index 7fddc017a8574d8126fc73260d2ad4daee10adcf..3434f8ddcba4ca5a723441c4563f615834868747 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,4 @@
+  * Added memcached_callback_get()/set()
   * First prototype of C++ interface
   * Updated docs for uint16_t changes in previous release
 
index f92f77f95caa37b7de07d509806eeda4f6eb1bb1..0234e8337792e43adaab49618be416811ad3b9c2 100644 (file)
@@ -14,6 +14,7 @@ EXTRA_DIST = libmemcached.pod\
        memcached_verbosity.pod\\r
        memstat.pod\\r
        memcached_behavior.pod\\r
+       memcached_callback.pod\\r
        memcached_server_st.pod\\r
        memcat.pod\\r
        memcached_create.pod\\r
@@ -38,6 +39,8 @@ man_MANS = libmemcached.3\
        memcached_append_by_key.3\\r
        memcached_behavior_get.3\\r
        memcached_behavior_set.3\\r
+       memcached_callback_get.3\\r
+       memcached_callback_set.3\\r
        memcached_cas.3\\r
        memcached_cas_by_key.3\\r
        memcached_clone.3\\r
@@ -205,6 +208,12 @@ memcached_behavior_get.3: memcached_behavior.pod
 memcached_behavior_set.3: memcached_behavior.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_behavior.pod > memcached_behavior_set.3\r
 \r
+memcached_callback_get.3: memcached_callback.pod\r
+       pod2man -c "libmemcached" -r "" -s 3 memcached_callback.pod > memcached_callback_get.3\r
+\r
+memcached_callback_set.3: memcached_callback.pod\r
+       pod2man -c "libmemcached" -r "" -s 3 memcached_callback.pod > memcached_callback_set.3\r
+\r
 memcached_stat.3: memcached_stats.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_stats.pod > memcached_stat.3\r
 \r
index cb5083d5af39934e9a58a8ea98fd6b0f77771750..c40072f67e03753c8e4bc643dabaeb8742d954fa 100755 (executable)
@@ -104,7 +104,7 @@ Brian Aker, E<lt>brian@tangent.orgE<gt>
 
 =head1 SEE ALSO
 
-memcached(1) libmemcached_examples(3) libmemcached(1) memcat(1) memcp(1) memflush(1) memrm(1) memslap(1) memstat(1) memcached_fetch(3) memcached_replace(3) memcached_server_list_free(3) libmemcached_examples(3) memcached_clone(3) memcached_free(3) memcached_server_add(3) memcached_server_push(3) memcached_add(3) memcached_get(3) memcached_server_count(3) memcached_servers_parse(3) memcached_create(3) memcached_increment(3) memcached_server_list(3) memcached_set(3) memcached_decrement(3) memcached_mget(3) memcached_server_list_append(3) memcached_strerror(3) memcached_delete(3) memcached_quit(3) memcached_server_list_count(3) memcached_verbosity(3) memcached_server_add_unix_socket(3) memcahed_result_create(3)  memcached_result_free(3)  memcached_result_key_value(3)  memcached_result_key_length(3)  memcached_result_value(3)  memcached_result_length(3)  memcached_result_flags(3)  memcached_result_cas(3) memcached_result_st(3) memcached_append(3) memcached_prepend(3) memcached_fetch_result(3) memerror(1) memcached_get_by_key(3) memcached_mget_by_key(3) memcached_delete_by_key(3) memcached_fetch_execute(3)
+memcached(1) libmemcached_examples(3) libmemcached(1) memcat(1) memcp(1) memflush(1) memrm(1) memslap(1) memstat(1) memcached_fetch(3) memcached_replace(3) memcached_server_list_free(3) libmemcached_examples(3) memcached_clone(3) memcached_free(3) memcached_server_add(3) memcached_server_push(3) memcached_add(3) memcached_get(3) memcached_server_count(3) memcached_servers_parse(3) memcached_create(3) memcached_increment(3) memcached_server_list(3) memcached_set(3) memcached_decrement(3) memcached_mget(3) memcached_server_list_append(3) memcached_strerror(3) memcached_delete(3) memcached_quit(3) memcached_server_list_count(3) memcached_verbosity(3) memcached_server_add_unix_socket(3) memcahed_result_create(3)  memcached_result_free(3)  memcached_result_key_value(3)  memcached_result_key_length(3)  memcached_result_value(3)  memcached_result_length(3)  memcached_result_flags(3)  memcached_result_cas(3) memcached_result_st(3) memcached_append(3) memcached_prepend(3) memcached_fetch_result(3) memerror(1) memcached_get_by_key(3) memcached_mget_by_key(3) memcached_delete_by_key(3) memcached_fetch_execute(3) memcached_callback_get(3) memcached_callback_set(3)
 
 =cut
 
index bd8c85a72334d56bc9688f3e66f83779f9543d32..04d6e06016226fd7564a5e09d1244e6d6fd951dc 100755 (executable)
@@ -77,7 +77,8 @@ Modify the timeout value that is used by poll(). The default value is -1. An sig
 
 This allows you to store a pointer to a specifc piece of data. This can be
 retrieved from inside of memcached_fetch_exectue(). Cloning a memcached_st
-will copy the pointer to the clone.
+will copy the pointer to the clone. This was deprecated in 0.14 in favor
+of memcached_callback_set(3). This will be removed in 0.15.
 
 =item MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
 
index 605c4a4cbcb6a8655de0747fe377b2c001e44074..05cb74a81d081aed67b895a919f0ff44786359c7 100644 (file)
 extern "C" {
 #endif
 
-typedef struct memcached_st memcached_st;
-typedef struct memcached_stat_st memcached_stat_st;
-typedef struct memcached_result_st memcached_result_st;
-typedef struct memcached_string_st memcached_string_st;
-typedef struct memcached_server_st memcached_server_st;
-
 /* These are Private and should not be used by applications */
 #define MEMCACHED_VERSION_STRING_LENGTH 12
 
@@ -73,6 +67,15 @@ typedef enum {
   MEMCACHED_MAXIMUM_RETURN, /* Always add new error code before */
 } memcached_return;
 
+typedef struct memcached_st memcached_st;
+typedef struct memcached_stat_st memcached_stat_st;
+typedef struct memcached_result_st memcached_result_st;
+typedef struct memcached_string_st memcached_string_st;
+typedef struct memcached_server_st memcached_server_st;
+typedef memcached_return (*clone_func)(memcached_st *parent, memcached_st *clone);
+typedef memcached_return (*cleanup_func)(memcached_st *ptr);
+
+
 typedef enum {
   MEMCACHED_DISTRIBUTION_MODULA,
   MEMCACHED_DISTRIBUTION_CONSISTENT,
@@ -93,6 +96,12 @@ typedef enum {
   MEMCACHED_BEHAVIOR_USER_DATA,
 } memcached_behavior;
 
+typedef enum {
+  MEMCACHED_CALLBACK_USER_DATA,
+  MEMCACHED_CALLBACK_CLEANUP_FUNCTION,
+  MEMCACHED_CALLBACK_CLONE_FUNCTION,
+} memcached_callback;
+
 typedef enum {
   MEMCACHED_HASH_DEFAULT= 0,
   MEMCACHED_HASH_MD5,
@@ -202,6 +211,8 @@ struct memcached_st {
   memcached_server_distribution distribution;
   void *user_data;
   unsigned int wheel[MEMCACHED_WHEEL_SIZE];
+  clone_func on_clone;
+  cleanup_func on_cleanup;
 #ifdef NOT_USED /* Future Use */
   uint8_t replicas;
   memcached_return warning;
@@ -383,6 +394,13 @@ memcached_return memcached_fetch_execute(memcached_st *ptr,
                                              unsigned int number_of_callbacks
                                              );
 
+memcached_return memcached_callback_set(memcached_st *ptr, 
+                                        memcached_callback flag, 
+                                        void *data);
+void *memcached_callback_get(memcached_st *ptr, 
+                             memcached_callback flag,
+                             memcached_return *error);
+
 /* Result Struct */
 void memcached_result_free(memcached_result_st *result);
 memcached_result_st *memcached_result_create(memcached_st *ptr, 
index 7012db66e1f68934272c69578f130994cd9d84d9..707da9bbe6abef73e4022b7171fa21d1e17c5259 100644 (file)
@@ -31,6 +31,7 @@ libmemcached_la_SOURCES = crc.c \
                          memcached.c \
                          memcached_auto.c \
                          memcached_behavior.c \
+                         memcached_callback.c \
                          memcached_connect.c \
                          memcached_delete.c \
                          memcached_do.c \
index 55b9da670d75a184be9430faaf2a4d31876d0795..f7a89604fe0d3408fa0dd58661107d877b13f94b 100644 (file)
@@ -108,7 +108,8 @@ unsigned long long memcached_behavior_get(memcached_st *ptr,
     temp_flag= MEM_USE_KETAMA;
     break;
   case MEMCACHED_BEHAVIOR_USER_DATA:
-    return (unsigned long long)ptr->user_data;
+    return 0;
+    //return (unsigned long long)ptr->user_data;
   case MEMCACHED_BEHAVIOR_POLL_TIMEOUT:
     {
       return (unsigned long long)ptr->poll_timeout;
diff --git a/lib/memcached_callback.c b/lib/memcached_callback.c
new file mode 100644 (file)
index 0000000..7149e27
--- /dev/null
@@ -0,0 +1,66 @@
+#include "common.h" 
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/tcp.h>
+
+/* 
+  These functions provide data and function callback support
+*/
+
+memcached_return memcached_callback_set(memcached_st *ptr, 
+                                        memcached_callback flag, 
+                                        void *data)
+{
+  switch (flag)
+  {
+  case MEMCACHED_CALLBACK_USER_DATA:
+    {
+      ptr->user_data= data;
+      break;
+    }
+  case MEMCACHED_CALLBACK_CLEANUP_FUNCTION:
+    {
+      cleanup_func func= (cleanup_func)data;
+      ptr->on_cleanup= func;
+      break;
+    }
+  case MEMCACHED_CALLBACK_CLONE_FUNCTION:
+    {
+      clone_func func= (clone_func)data;
+      ptr->on_clone= func;
+      break;
+    }
+  default:
+    return MEMCACHED_FAILURE;
+  }
+
+  return MEMCACHED_SUCCESS;
+}
+
+void *memcached_callback_get(memcached_st *ptr, 
+                             memcached_callback flag,
+                             memcached_return *error)
+{
+  switch (flag)
+  {
+  case MEMCACHED_CALLBACK_USER_DATA:
+    {
+      *error= ptr->user_data ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
+      return (void *)ptr->user_data;
+    }
+  case MEMCACHED_CALLBACK_CLEANUP_FUNCTION:
+    {
+      *error= ptr->on_cleanup ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
+      return (void *)ptr->on_cleanup;
+    }
+  case MEMCACHED_CALLBACK_CLONE_FUNCTION:
+    {
+      *error= ptr->on_clone ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
+      return (void *)ptr->on_clone;
+    }
+  default:
+      WATCHPOINT_ASSERT(0);
+      *error= MEMCACHED_FAILURE;
+      return NULL;
+  }
+}
index 8e71d7da4c1efc0817831fe0c2ace8416a009135..88f3d477970da46d83da3e46a933a937da21da71 100644 (file)
@@ -74,6 +74,8 @@ memerror - Creates human readable messages from libmemecached error codes.
 %{_mandir}/man3/memcached_behavior_set.3.gz
 %{_mandir}/man3/memcached_cas.3.gz
 %{_mandir}/man3/memcached_cas_by_key.3.gz
+%{_mandir}/man3/memcached_callback_get.3.gz
+%{_mandir}/man3/memcached_callback_set.3.gz
 %{_mandir}/man3/memcached_clone.3.gz
 %{_mandir}/man3/memcached_create.3.gz
 %{_mandir}/man3/memcached_decrement.3.gz
index 732f3b045b979bbfb44bd7e97ea93a77dc790779..6ca61d7d5addb443a35899af8f99e8a49f9e2f0b 100644 (file)
@@ -949,6 +949,55 @@ uint8_t add_host_test(memcached_st *memc)
   return 0;
 }
 
+memcached_return clone_test_callback(memcached_st *parent, memcached_st *clone)
+{
+  return MEMCACHED_SUCCESS;
+}
+
+memcached_return cleanup_test_callback(memcached_st *ptr)
+{
+  return MEMCACHED_SUCCESS;
+}
+
+uint8_t callback_test(memcached_st *memc)
+{
+  /* Test User Data */
+  {
+    int x= 5;
+    int *test_ptr;
+    memcached_return rc;
+
+    rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_USER_DATA, &x);
+    assert(rc == MEMCACHED_SUCCESS);
+    test_ptr= (int *)memcached_callback_get(memc, MEMCACHED_CALLBACK_USER_DATA, &rc);
+    assert(*test_ptr == x);
+  }
+
+  /* Test Clone Callback */
+  {
+    clone_func temp_function;
+    memcached_return rc;
+
+    rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, clone_test_callback);
+    assert(rc == MEMCACHED_SUCCESS);
+    temp_function= (clone_func)memcached_callback_get(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, &rc);
+    assert(temp_function == clone_test_callback);
+  }
+
+  /* Test Cleanup Callback */
+  {
+    cleanup_func temp_function;
+    memcached_return rc;
+
+    rc= memcached_callback_set(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, cleanup_test_callback);
+    assert(rc == MEMCACHED_SUCCESS);
+    temp_function= (cleanup_func)memcached_callback_get(memc, MEMCACHED_CALLBACK_CLONE_FUNCTION, &rc);
+    assert(temp_function == cleanup_test_callback);
+  }
+
+  return 0;
+}
+
 /* We don't test the behavior itself, we test the switches */
 uint8_t behavior_test(memcached_st *memc)
 {
@@ -2084,6 +2133,7 @@ test_st tests[] ={
   {"add_host_test", 0, add_host_test },
   {"get_stats_keys", 0, get_stats_keys },
   {"behavior_test", 0, get_stats_keys },
+  {"callback_test", 0, get_stats_keys },
   {0, 0, 0}
 };