Merging bzr://gaz.tangent.org/libmemcached/build/ to Build branch
[m6w6/libmemcached] / libmemcached / callback.cc
index 9818af4f860e139c543ce84f311092c6533e83c8..36f4b309ed99f81d43b647a3dc91aafcfccbb537 100644 (file)
@@ -12,7 +12,9 @@
 #include <libmemcached/common.h>
 #include <sys/types.h>
 
+#ifndef __INTEL_COMPILER
 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
+#endif
 
 /*
   These functions provide data and function callback support
 
 memcached_return_t memcached_callback_set(memcached_st *ptr,
                                           const memcached_callback_t flag,
-                                          void *data)
+                                          const void *data)
 {
   switch (flag)
   {
   case MEMCACHED_CALLBACK_PREFIX_KEY:
     {
-      return memcached_set_prefix_key(ptr, (char*)data, data ? strlen((char*)data) : 0);
+      return memcached_set_namespace(ptr, (char*)data, data ? strlen((char*)data) : 0);
     }
+
   case MEMCACHED_CALLBACK_USER_DATA:
     {
-      ptr->user_data= data;
+      ptr->user_data= const_cast<void *>(data);
       break;
     }
+
   case MEMCACHED_CALLBACK_CLEANUP_FUNCTION:
     {
       memcached_cleanup_fn func= *(memcached_cleanup_fn *)&data;
       ptr->on_cleanup= func;
       break;
     }
+
   case MEMCACHED_CALLBACK_CLONE_FUNCTION:
     {
       memcached_clone_fn func= *(memcached_clone_fn *)&data;
       ptr->on_clone= func;
       break;
     }
-#ifdef MEMCACHED_ENABLE_DEPRECATED
-  case MEMCACHED_CALLBACK_MALLOC_FUNCTION:
-    {
-      memcached_malloc_function func= *(memcached_malloc_fn *)&data;
-      ptr->call_malloc= func;
-      break;
-    }
-  case MEMCACHED_CALLBACK_REALLOC_FUNCTION:
-    {
-      memcached_realloc_function func= *(memcached_realloc_fn *)&data;
-      ptr->call_realloc= func;
-      break;
-    }
-  case MEMCACHED_CALLBACK_FREE_FUNCTION:
-    {
-      memcached_free_function func= *(memcached_free_fn *)&data;
-      ptr->call_free= func;
-      break;
-    }
-#endif
+
   case MEMCACHED_CALLBACK_GET_FAILURE:
     {
       memcached_trigger_key_fn func= *(memcached_trigger_key_fn *)&data;
       ptr->get_key_failure= func;
       break;
     }
+
   case MEMCACHED_CALLBACK_DELETE_TRIGGER:
     {
+      if (data) // NULL would mean we are disabling.
+      {
+        if (memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS)) 
+        {
+          return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT, memcached_literal_param("Delete triggers cannot be used if buffering is enabled"));
+        }
+
+        if (memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_NOREPLY)) 
+        {
+          return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT, memcached_literal_param("Delete triggers cannot be used if MEMCACHED_BEHAVIOR_NOREPLY is set"));
+        }
+      }
+
       memcached_trigger_delete_key_fn func= *(memcached_trigger_delete_key_fn *)&data;
       ptr->delete_trigger= func;
       break;
     }
+
   case MEMCACHED_CALLBACK_MAX:
-  default:
-    return MEMCACHED_FAILURE;
+    return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT, memcached_literal_param("Invalid callback supplied"));
   }
 
   return MEMCACHED_SUCCESS;
@@ -90,71 +90,64 @@ void *memcached_callback_get(memcached_st *ptr,
                              memcached_return_t *error)
 {
   memcached_return_t local_error;
-
-  if (!error)
+  if (error == NULL)
+  {
     error = &local_error;
+  }
+
+  if (ptr == NULL)
+  {
+    *error= MEMCACHED_INVALID_ARGUMENTS;
+    return NULL;
+  }
 
   switch (flag)
   {
   case MEMCACHED_CALLBACK_PREFIX_KEY:
     {
-      if (ptr->prefix_key)
+      *error= MEMCACHED_SUCCESS;
+      if (ptr->_namespace)
       {
-        *error= MEMCACHED_SUCCESS;
-        return (void *)memcached_array_string(ptr->prefix_key);
-      }
-      else
-      {
-        *error= MEMCACHED_FAILURE;
-        return NULL;
+        return (void *)memcached_array_string(ptr->_namespace);
       }
+      return NULL;
     }
+
   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;
     }
-#ifdef MEMCACHED_ENABLE_DEPRECATED
-  case MEMCACHED_CALLBACK_MALLOC_FUNCTION:
-    {
-      *error= ptr->call_malloc ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
-      return *(void **)&ptr->call_malloc;
-    }
-  case MEMCACHED_CALLBACK_REALLOC_FUNCTION:
-    {
-      *error= ptr->call_realloc ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
-      return *(void **)&ptr->call_realloc;
-    }
-  case MEMCACHED_CALLBACK_FREE_FUNCTION:
-    {
-      *error= ptr->call_free ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
-      return *(void **)&ptr->call_free;
-    }
-#endif
+
   case MEMCACHED_CALLBACK_GET_FAILURE:
     {
       *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;
     }
+
   case MEMCACHED_CALLBACK_MAX:
-  default:
-    WATCHPOINT_ASSERT(0);
-    *error= MEMCACHED_FAILURE;
-    return NULL;
+    break;
   }
+
+  assert_msg(0, "Invalid behavior passed to memcached_behavior_set()");
+  *error= MEMCACHED_FAILURE;
+  return NULL;
 }