1 /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
5 * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6 * Copyright (C) 2006-2010 Brian Aker All rights reserved.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are
12 * * Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
15 * * Redistributions in binary form must reproduce the above
16 * copyright notice, this list of conditions and the following disclaimer
17 * in the documentation and/or other materials provided with the
20 * * The names of its contributors may not be used to endorse or
21 * promote products derived from this software without specific prior
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40 #include <libmemcached/common.h>
42 memcached_server_list_st
43 memcached_server_list_append_with_weight(memcached_server_list_st ptr
,
44 const char *hostname
, in_port_t port
,
46 memcached_return_t
*error
)
48 memcached_return_t unused
;
56 hostname
= "localhost";
59 if (hostname
[0] == '/')
65 port
= MEMCACHED_DEFAULT_PORT
;
69 /* Increment count for hosts */
73 count
+= memcached_server_list_count(ptr
);
76 memcached_server_list_st new_host_list
= (memcached_server_st
*)realloc(ptr
, sizeof(memcached_server_st
) * count
);
77 if (new_host_list
== NULL
)
80 *error
= memcached_set_error(*ptr
, MEMCACHED_MEMORY_ALLOCATION_FAILURE
, MEMCACHED_AT
);
85 memcached_string_t _hostname
= { memcached_string_make_from_cstr(hostname
) };
86 /* @todo Check return type */
87 if (__server_create_with(NULL
, &new_host_list
[count
-1], _hostname
, port
, weight
, port
? MEMCACHED_CONNECTION_TCP
: MEMCACHED_CONNECTION_UNIX_SOCKET
) == NULL
)
90 *error
= memcached_set_errno(*ptr
, MEMCACHED_MEMORY_ALLOCATION_FAILURE
, MEMCACHED_AT
);
97 // Handset allocated since
98 new_host_list
->options
.is_allocated
= true;
101 /* Backwards compatibility hack */
102 memcached_servers_set_count(new_host_list
, count
);
104 *error
= MEMCACHED_SUCCESS
;
105 return new_host_list
;
108 memcached_server_list_st
109 memcached_server_list_append(memcached_server_list_st ptr
,
110 const char *hostname
, in_port_t port
,
111 memcached_return_t
*error
)
113 return memcached_server_list_append_with_weight(ptr
, hostname
, port
, 0, error
);
116 uint32_t memcached_server_list_count(const memcached_server_list_st self
)
118 return (self
== NULL
)
120 : self
->number_of_hosts
;
123 uint32_t memcached_instance_list_count(const memcached_st
* self
)
125 return (self
== NULL
)
127 : self
->number_of_hosts
;
130 void memcached_instance_set(memcached_st
* memc
, org::libmemcached::Instance
* list
, const uint32_t host_list_size
)
134 memc
->number_of_hosts
= host_list_size
;
137 void memcached_server_list_free(memcached_server_list_st self
)
141 for (uint32_t x
= 0; x
< memcached_server_list_count(self
); x
++)
143 assert_msg(not memcached_is_allocated(&self
[x
]), "You have called memcached_server_list_free(), but you did not pass it a valid memcached_server_list_st");
144 __server_free(&self
[x
]);
147 libmemcached_free(self
->root
, self
);
151 void memcached_instance_list_free(org::libmemcached::Instance
* self
, uint32_t instance_count
)
155 for (uint32_t x
= 0; x
< instance_count
; x
++)
157 assert_msg(memcached_is_allocated(&self
[x
]) == false, "You have called memcached_server_list_free(), but you did not pass it a valid memcached_server_list_st");
158 __instance_free(&self
[x
]);
161 libmemcached_free(self
->root
, self
);