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>
41 #include <libmemcached/assert.hpp>
43 memcached_server_list_st
44 memcached_server_list_append_with_weight(memcached_server_list_st ptr
,
45 const char *hostname
, in_port_t port
,
47 memcached_return_t
*error
)
50 memcached_server_list_st new_host_list
;
52 memcached_return_t unused
;
58 hostname
= "localhost";
61 if (hostname
[0] == '/')
67 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 /* @todo Check return type */
85 if (not __server_create_with(NULL
, &new_host_list
[count
-1], hostname
, port
, weight
, port
? MEMCACHED_CONNECTION_TCP
: MEMCACHED_CONNECTION_UNIX_SOCKET
))
87 *error
= memcached_set_errno(*ptr
, MEMCACHED_MEMORY_ALLOCATION_FAILURE
, MEMCACHED_AT
);
92 // Handset allocated since
93 new_host_list
->options
.is_allocated
= true;
96 /* Backwards compatibility hack */
97 memcached_servers_set_count(new_host_list
, count
);
99 *error
= MEMCACHED_SUCCESS
;
100 return new_host_list
;
103 memcached_server_list_st
104 memcached_server_list_append(memcached_server_list_st ptr
,
105 const char *hostname
, in_port_t port
,
106 memcached_return_t
*error
)
108 return memcached_server_list_append_with_weight(ptr
, hostname
, port
, 0, error
);
111 uint32_t memcached_server_list_count(const memcached_server_list_st self
)
113 return (self
== NULL
)
115 : self
->number_of_hosts
;
118 memcached_server_st
*memcached_server_list(const memcached_st
*self
)
120 return self
->servers
;
123 void memcached_server_list_set(memcached_st
*self
, memcached_server_st
*list
)
128 void memcached_server_list_free(memcached_server_list_st self
)
133 for (uint32_t x
= 0; x
< memcached_server_list_count(self
); x
++)
135 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");
136 __server_free(&self
[x
]);
139 libmemcached_free(self
->root
, self
);