Merge in version update (0.51)
[m6w6/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 == NULL)
94 {
95 error = &local_error;
96 }
97
98 switch (flag)
99 {
100 case MEMCACHED_CALLBACK_PREFIX_KEY:
101 {
102 if (ptr->_namespace)
103 {
104 *error= MEMCACHED_SUCCESS;
105 return (void *)memcached_array_string(ptr->_namespace);
106 }
107 else
108 {
109 *error= MEMCACHED_FAILURE;
110 return NULL;
111 }
112 }
113 case MEMCACHED_CALLBACK_USER_DATA:
114 {
115 *error= ptr->user_data ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
116 return (void *)ptr->user_data;
117 }
118 case MEMCACHED_CALLBACK_CLEANUP_FUNCTION:
119 {
120 *error= ptr->on_cleanup ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
121 return *(void **)&ptr->on_cleanup;
122 }
123 case MEMCACHED_CALLBACK_CLONE_FUNCTION:
124 {
125 *error= ptr->on_clone ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
126 return *(void **)&ptr->on_clone;
127 }
128 #ifdef MEMCACHED_ENABLE_DEPRECATED
129 case MEMCACHED_CALLBACK_MALLOC_FUNCTION:
130 {
131 *error= ptr->call_malloc ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
132 return *(void **)&ptr->call_malloc;
133 }
134 case MEMCACHED_CALLBACK_REALLOC_FUNCTION:
135 {
136 *error= ptr->call_realloc ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
137 return *(void **)&ptr->call_realloc;
138 }
139 case MEMCACHED_CALLBACK_FREE_FUNCTION:
140 {
141 *error= ptr->call_free ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
142 return *(void **)&ptr->call_free;
143 }
144 #endif
145 case MEMCACHED_CALLBACK_GET_FAILURE:
146 {
147 *error= ptr->get_key_failure ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
148 return *(void **)&ptr->get_key_failure;
149 }
150 case MEMCACHED_CALLBACK_DELETE_TRIGGER:
151 {
152 *error= ptr->delete_trigger ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
153 return *(void **)&ptr->delete_trigger;
154 }
155 case MEMCACHED_CALLBACK_MAX:
156 default:
157 assert_msg(0, "Invalid behavior passed to memcached_behavior_set()");
158 *error= MEMCACHED_FAILURE;
159 return NULL;
160 }
161 }