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
)
49 memcached_server_list_st new_host_list
;
51 memcached_return_t unused
;
57 hostname
= "localhost";
60 if (hostname
[0] == '/')
66 port
= MEMCACHED_DEFAULT_PORT
;
70 /* Increment count for hosts */
74 count
+= memcached_server_list_count(ptr
);
77 new_host_list
= (memcached_server_write_instance_st
)realloc(ptr
, sizeof(memcached_server_st
) * count
);
78 if (not new_host_list
)
80 *error
= memcached_set_error(*ptr
, MEMCACHED_MEMORY_ALLOCATION_FAILURE
, MEMCACHED_AT
);
84 memcached_string_t _hostname
= { memcached_string_make_from_cstr(hostname
) };
85 /* @todo Check return type */
86 if (not __server_create_with(NULL
, &new_host_list
[count
-1], _hostname
, port
, weight
, port
? MEMCACHED_CONNECTION_TCP
: MEMCACHED_CONNECTION_UNIX_SOCKET
))
88 *error
= memcached_set_errno(*ptr
, MEMCACHED_MEMORY_ALLOCATION_FAILURE
, MEMCACHED_AT
);
93 // Handset allocated since
94 new_host_list
->options
.is_allocated
= true;
97 /* Backwards compatibility hack */
98 memcached_servers_set_count(new_host_list
, count
);
100 *error
= MEMCACHED_SUCCESS
;
101 return new_host_list
;
104 memcached_server_list_st
105 memcached_server_list_append(memcached_server_list_st ptr
,
106 const char *hostname
, in_port_t port
,
107 memcached_return_t
*error
)
109 return memcached_server_list_append_with_weight(ptr
, hostname
, port
, 0, error
);
112 uint32_t memcached_server_list_count(const memcached_server_list_st self
)
114 return (self
== NULL
)
116 : self
->number_of_hosts
;
119 memcached_server_st
*memcached_server_list(const memcached_st
*self
)
123 return self
->servers
;
129 void memcached_server_list_set(memcached_st
*self
, memcached_server_st
*list
)
134 void memcached_server_list_free(memcached_server_list_st self
)
139 for (uint32_t x
= 0; x
< memcached_server_list_count(self
); x
++)
141 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");
142 __server_free(&self
[x
]);
145 libmemcached_free(self
->root
, self
);