Updated for the creation of memcached_server_by_key().
[awesomized/libmemcached] / libmemcached / memcached_server.c
1 /*
2 This is a partial implementation for fetching/creating memcached_server_st objects.
3 */
4 #include "common.h"
5
6 memcached_server_st *memcached_server_create(memcached_st *memc, memcached_server_st *ptr)
7 {
8 if (ptr == NULL)
9 {
10 ptr= (memcached_server_st *)malloc(sizeof(memcached_server_st));
11
12 if (!ptr)
13 return NULL; /* MEMCACHED_MEMORY_ALLOCATION_FAILURE */
14
15 memset(ptr, 0, sizeof(memcached_server_st));
16 ptr->is_allocated= MEMCACHED_ALLOCATED;
17 }
18 else
19 {
20 memset(ptr, 0, sizeof(memcached_server_st));
21 }
22
23 ptr->root= memc;
24
25 return ptr;
26 }
27
28 void memcached_server_free(memcached_server_st *ptr)
29 {
30 if (ptr->is_allocated == MEMCACHED_ALLOCATED)
31 {
32 if (ptr->root && ptr->root->call_free)
33 ptr->root->call_free(ptr->root, ptr);
34 else
35 free(ptr);
36 }
37 else
38 ptr->is_allocated= MEMCACHED_USED;
39 }
40
41 /*
42 If we do not have a valid object to clone from, we toss an error.
43 */
44 memcached_server_st *memcached_server_clone(memcached_server_st *clone, memcached_server_st *ptr)
45 {
46 memcached_server_st *new_clone;
47
48 /* We just do a normal create if ptr is missing */
49 if (ptr == NULL)
50 return NULL;
51
52 if (clone && clone->is_allocated == MEMCACHED_USED)
53 {
54 WATCHPOINT_ASSERT(0);
55 return NULL;
56 }
57
58 new_clone= memcached_server_create(ptr->root, clone);
59
60 if (new_clone == NULL)
61 return NULL;
62
63 new_clone->root= ptr->root;
64
65 host_reset(new_clone->root, new_clone,
66 ptr->hostname, ptr->port,
67 ptr->type);
68
69 return new_clone;
70 }
71
72 memcached_return memcached_server_cursor(memcached_st *ptr,
73 memcached_server_function *callback,
74 void *context,
75 unsigned int number_of_callbacks)
76 {
77 unsigned int y;
78
79 for (y= 0; y < ptr->number_of_hosts; y++)
80 {
81 unsigned int x;
82
83 for (x= 0; x < number_of_callbacks; x++)
84 {
85 unsigned int iferror;
86
87 iferror= (*callback[x])(ptr, &ptr->hosts[y], context);
88
89 if (iferror)
90 continue;
91 }
92 }
93
94 return MEMCACHED_SUCCESS;
95 }
96
97 memcached_server_st *memcached_server_by_key(memcached_st *ptr, const char *key, size_t key_length, memcached_return *error)
98 {
99 uint32_t server_key;
100
101 unlikely (key_length == 0)
102 {
103 *error= MEMCACHED_NO_KEY_PROVIDED;
104 return NULL;
105 }
106
107 unlikely (ptr->number_of_hosts == 0)
108 {
109 *error= MEMCACHED_NO_SERVERS;
110 return NULL;
111 }
112
113 if ((ptr->flags & MEM_VERIFY_KEY) && (memcachd_key_test((char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
114 {
115 *error= MEMCACHED_BAD_KEY_PROVIDED;
116 return NULL;
117 }
118
119 server_key= memcached_generate_hash(ptr, key, key_length);
120
121 return memcached_server_clone(NULL, &ptr->hosts[server_key]);
122
123 }