Cleanup values for future use of memcached_server_free()
[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 memcached_return rc;
31 WATCHPOINT_ASSERT(ptr->is_allocated != MEMCACHED_NOT_ALLOCATED);
32
33 rc= memcached_io_close(ptr);
34 WATCHPOINT_ASSERT(rc == MEMCACHED_SUCCESS);
35
36 if (ptr->address_info)
37 {
38 freeaddrinfo(ptr->address_info);
39 ptr->address_info= NULL;
40 }
41
42 if (ptr->is_allocated == MEMCACHED_ALLOCATED)
43 {
44 if (ptr->root && ptr->root->call_free)
45 ptr->root->call_free(ptr->root, ptr);
46 else
47 free(ptr);
48 }
49 else
50 ptr->is_allocated= MEMCACHED_USED;
51 }
52
53 /*
54 If we do not have a valid object to clone from, we toss an error.
55 */
56 memcached_server_st *memcached_server_clone(memcached_server_st *clone, memcached_server_st *ptr)
57 {
58 memcached_server_st *new_clone;
59
60 /* We just do a normal create if ptr is missing */
61 if (ptr == NULL)
62 return NULL;
63
64 if (clone && clone->is_allocated == MEMCACHED_USED)
65 {
66 WATCHPOINT_ASSERT(0);
67 return NULL;
68 }
69
70 new_clone= memcached_server_create(ptr->root, clone);
71
72 if (new_clone == NULL)
73 return NULL;
74
75 new_clone->root= ptr->root;
76
77 host_reset(new_clone->root, new_clone,
78 ptr->hostname, ptr->port,
79 ptr->type);
80
81 return new_clone;
82 }
83
84 memcached_return memcached_server_cursor(memcached_st *ptr,
85 memcached_server_function *callback,
86 void *context,
87 unsigned int number_of_callbacks)
88 {
89 unsigned int y;
90
91 for (y= 0; y < ptr->number_of_hosts; y++)
92 {
93 unsigned int x;
94
95 for (x= 0; x < number_of_callbacks; x++)
96 {
97 unsigned int iferror;
98
99 iferror= (*callback[x])(ptr, &ptr->hosts[y], context);
100
101 if (iferror)
102 continue;
103 }
104 }
105
106 return MEMCACHED_SUCCESS;
107 }
108
109 memcached_server_st *memcached_server_by_key(memcached_st *ptr, const char *key, size_t key_length, memcached_return *error)
110 {
111 uint32_t server_key;
112
113 unlikely (key_length == 0)
114 {
115 *error= MEMCACHED_NO_KEY_PROVIDED;
116 return NULL;
117 }
118
119 unlikely (ptr->number_of_hosts == 0)
120 {
121 *error= MEMCACHED_NO_SERVERS;
122 return NULL;
123 }
124
125 if ((ptr->flags & MEM_VERIFY_KEY) && (memcachd_key_test((char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
126 {
127 *error= MEMCACHED_BAD_KEY_PROVIDED;
128 return NULL;
129 }
130
131 server_key= memcached_generate_hash(ptr, key, key_length);
132
133 return memcached_server_clone(NULL, &ptr->hosts[server_key]);
134
135 }