69e47d4d78ad9bd5bdc3c507496928f324e3a87c
[m6w6/libmemcached] / libmemcached / callback.c
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 "common.h"
13 #include <sys/types.h>
14
15 /*
16 These functions provide data and function callback support
17 */
18
19 memcached_return_t memcached_callback_set(memcached_st *ptr,
20 const memcached_callback_t flag,
21 void *data)
22 {
23 switch (flag)
24 {
25 case MEMCACHED_CALLBACK_PREFIX_KEY:
26 {
27 char *key= (char *)data;
28
29 if (key)
30 {
31 size_t key_length= strlen(key);
32
33 if (memcached_key_test((const char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)
34 return memcached_set_error(ptr, MEMCACHED_BAD_KEY_PROVIDED, NULL);
35
36 if ((key_length > MEMCACHED_PREFIX_KEY_MAX_SIZE -1))
37 return memcached_set_error(ptr, MEMCACHED_KEY_TOO_BIG, NULL);
38
39 memcached_array_free(ptr->prefix_key);
40 ptr->prefix_key= memcached_strcpy(ptr, (const char *)data, strlen((const char*)data));
41
42 f (! ptr->prefix_key)
43 return memcached_set_error(ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, NULL);
44 }
45 else
46 {
47 memcached_array_free(ptr->prefix_key);
48 ptr->prefix_key= NULL;
49 }
50
51 break;
52 }
53 case MEMCACHED_CALLBACK_USER_DATA:
54 {
55 ptr->user_data= data;
56 break;
57 }
58 case MEMCACHED_CALLBACK_CLEANUP_FUNCTION:
59 {
60 memcached_cleanup_fn func= *(memcached_cleanup_fn *)&data;
61 ptr->on_cleanup= func;
62 break;
63 }
64 case MEMCACHED_CALLBACK_CLONE_FUNCTION:
65 {
66 memcached_clone_fn func= *(memcached_clone_fn *)&data;
67 ptr->on_clone= func;
68 break;
69 }
70 #ifdef MEMCACHED_ENABLE_DEPRECATED
71 case MEMCACHED_CALLBACK_MALLOC_FUNCTION:
72 {
73 memcached_malloc_function func= *(memcached_malloc_fn *)&data;
74 ptr->call_malloc= func;
75 break;
76 }
77 case MEMCACHED_CALLBACK_REALLOC_FUNCTION:
78 {
79 memcached_realloc_function func= *(memcached_realloc_fn *)&data;
80 ptr->call_realloc= func;
81 break;
82 }
83 case MEMCACHED_CALLBACK_FREE_FUNCTION:
84 {
85 memcached_free_function func= *(memcached_free_fn *)&data;
86 ptr->call_free= func;
87 break;
88 }
89 #endif
90 case MEMCACHED_CALLBACK_GET_FAILURE:
91 {
92 memcached_trigger_key_fn func= *(memcached_trigger_key_fn *)&data;
93 ptr->get_key_failure= func;
94 break;
95 }
96 case MEMCACHED_CALLBACK_DELETE_TRIGGER:
97 {
98 memcached_trigger_delete_key_fn func= *(memcached_trigger_delete_key_fn *)&data;
99 ptr->delete_trigger= func;
100 break;
101 }
102 case MEMCACHED_CALLBACK_MAX:
103 default:
104 return MEMCACHED_FAILURE;
105 }
106
107 return MEMCACHED_SUCCESS;
108 }
109
110 void *memcached_callback_get(memcached_st *ptr,
111 const memcached_callback_t flag,
112 memcached_return_t *error)
113 {
114 memcached_return_t local_error;
115
116 if (!error)
117 error = &local_error;
118
119 switch (flag)
120 {
121 case MEMCACHED_CALLBACK_PREFIX_KEY:
122 {
123 if (ptr->prefix_key)
124 {
125 *error= MEMCACHED_SUCCESS;
126 return (void *)memcached_array_string(ptr->prefix_key);
127 }
128 else
129 {
130 *error= MEMCACHED_FAILURE;
131 return NULL;
132 }
133 }
134 case MEMCACHED_CALLBACK_USER_DATA:
135 {
136 *error= ptr->user_data ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
137 return (void *)ptr->user_data;
138 }
139 case MEMCACHED_CALLBACK_CLEANUP_FUNCTION:
140 {
141 *error= ptr->on_cleanup ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
142 return *(void **)&ptr->on_cleanup;
143 }
144 case MEMCACHED_CALLBACK_CLONE_FUNCTION:
145 {
146 *error= ptr->on_clone ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
147 return *(void **)&ptr->on_clone;
148 }
149 #ifdef MEMCACHED_ENABLE_DEPRECATED
150 case MEMCACHED_CALLBACK_MALLOC_FUNCTION:
151 {
152 *error= ptr->call_malloc ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
153 return *(void **)&ptr->call_malloc;
154 }
155 case MEMCACHED_CALLBACK_REALLOC_FUNCTION:
156 {
157 *error= ptr->call_realloc ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
158 return *(void **)&ptr->call_realloc;
159 }
160 case MEMCACHED_CALLBACK_FREE_FUNCTION:
161 {
162 *error= ptr->call_free ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
163 return *(void **)&ptr->call_free;
164 }
165 #endif
166 case MEMCACHED_CALLBACK_GET_FAILURE:
167 {
168 *error= ptr->get_key_failure ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
169 return *(void **)&ptr->get_key_failure;
170 }
171 case MEMCACHED_CALLBACK_DELETE_TRIGGER:
172 {
173 *error= ptr->delete_trigger ? MEMCACHED_SUCCESS : MEMCACHED_FAILURE;
174 return *(void **)&ptr->delete_trigger;
175 }
176 case MEMCACHED_CALLBACK_MAX:
177 default:
178 WATCHPOINT_ASSERT(0);
179 *error= MEMCACHED_FAILURE;
180 return NULL;
181 }
182 }