Merge in build lp
[awesomized/libmemcached] / libmemcached / callback.cc
1 /* LibMemcached
2 * Copyright (C) 2006-2009 Brian Aker
3 * All rights reserved.
4 *
5 * Use and distribution licensed under the BSD license. See
6 * the COPYING file in the parent directory for full text.
7 *
8 * Summary: Change any of the possible callbacks.
9 *
10 */
11
12 #include <libmemcached/common.h>
13 #include <sys/types.h>
14
15 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
16
17 /*
18 These functions provide data and function callback support
19 */
20
21 memcached_return_t memcached_callback_set(memcached_st *ptr,
22 const memcached_callback_t flag,
23 const void *data)
24 {
25 switch (flag)
26 {
27 case MEMCACHED_CALLBACK_PREFIX_KEY:
28 {
29 return memcached_set_namespace(ptr, (char*)data, data ? strlen((char*)data) : 0);
30 }
31 case MEMCACHED_CALLBACK_USER_DATA:
32 {
33 ptr->user_data= const_cast<void *>(data);
34 break;
35 }
36 case MEMCACHED_CALLBACK_CLEANUP_FUNCTION:
37 {
38 memcached_cleanup_fn func= *(memcached_cleanup_fn *)&data;
39 ptr->on_cleanup= func;
40 break;
41 }
42 case MEMCACHED_CALLBACK_CLONE_FUNCTION:
43 {
44 memcached_clone_fn func= *(memcached_clone_fn *)&data;
45 ptr->on_clone= func;
46 break;
47 }
48 #ifdef MEMCACHED_ENABLE_DEPRECATED
49 case MEMCACHED_CALLBACK_MALLOC_FUNCTION:
50 {
51 memcached_malloc_function func= *(memcached_malloc_fn *)&data;
52 ptr->call_malloc= func;
53 break;
54 }
55 case MEMCACHED_CALLBACK_REALLOC_FUNCTION:
56 {
57 memcached_realloc_function func= *(memcached_realloc_fn *)&data;
58 ptr->call_realloc= func;
59 break;
60 }
61 case MEMCACHED_CALLBACK_FREE_FUNCTION:
62 {
63 memcached_free_function func= *(memcached_free_fn *)&data;
64 ptr->call_free= func;
65 break;
66 }
67 #endif
68 case MEMCACHED_CALLBACK_GET_FAILURE:
69 {
70 memcached_trigger_key_fn func= *(memcached_trigger_key_fn *)&data;
71 ptr->get_key_failure= func;
72 break;
73 }
74 case MEMCACHED_CALLBACK_DELETE_TRIGGER:
75 {
76 memcached_trigger_delete_key_fn func= *(memcached_trigger_delete_key_fn *)&data;
77 ptr->delete_trigger= func;
78 break;
79 }
80 case MEMCACHED_CALLBACK_MAX:
81 return MEMCACHED_FAILURE;
82 }
83
84 return MEMCACHED_SUCCESS;
85 }
86
87 void *memcached_callback_get(memcached_st *ptr,
88 const memcached_callback_t flag,
89 memcached_return_t *error)
90 {
91 memcached_return_t local_error;
92
93 if (!error)
94 error = &local_error;
95
96 switch (flag)
97 {
98 case MEMCACHED_CALLBACK_PREFIX_KEY:
99 {
100 if (ptr->_namespace)
101 {
102 *error= MEMCACHED_SUCCESS;
103 return (void *)memcached_array_string(ptr->_namespace);
104 }
105 else
106 {
107 *error= MEMCACHED_FAILURE;
108 return NULL;
109 }
110 }
111 case MEMCACHED_CALLBACK_USER_DATA:
112 {
113 *error= ptr->user_data ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
114 return (void *)ptr->user_data;
115 }
116 case MEMCACHED_CALLBACK_CLEANUP_FUNCTION:
117 {
118 *error= ptr->on_cleanup ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
119 return *(void **)&ptr->on_cleanup;
120 }
121 case MEMCACHED_CALLBACK_CLONE_FUNCTION:
122 {
123 *error= ptr->on_clone ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
124 return *(void **)&ptr->on_clone;
125 }
126 #ifdef MEMCACHED_ENABLE_DEPRECATED
127 case MEMCACHED_CALLBACK_MALLOC_FUNCTION:
128 {
129 *error= ptr->call_malloc ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
130 return *(void **)&ptr->call_malloc;
131 }
132 case MEMCACHED_CALLBACK_REALLOC_FUNCTION:
133 {
134 *error= ptr->call_realloc ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
135 return *(void **)&ptr->call_realloc;
136 }
137 case MEMCACHED_CALLBACK_FREE_FUNCTION:
138 {
139 *error= ptr->call_free ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
140 return *(void **)&ptr->call_free;
141 }
142 #endif
143 case MEMCACHED_CALLBACK_GET_FAILURE:
144 {
145 *error= ptr->get_key_failure ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
146 return *(void **)&ptr->get_key_failure;
147 }
148 case MEMCACHED_CALLBACK_DELETE_TRIGGER:
149 {
150 *error= ptr->delete_trigger ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
151 return *(void **)&ptr->delete_trigger;
152 }
153 case MEMCACHED_CALLBACK_MAX:
154 default:
155 WATCHPOINT_ASSERT(0);
156 *error= MEMCACHED_FAILURE;
157 return NULL;
158 }
159 }