Adding new memcached_clone() function
author <brian@gir> <>
Sun, 28 Oct 2007 00:47:43 +0000 (17:47 -0700)
committer <brian@gir> <>
Sun, 28 Oct 2007 00:47:43 +0000 (17:47 -0700)
docs/Makefile.am
docs/libmemcached.pod
docs/memcached_create.pod
include/memcached.h
lib/memcached.c
support/libmemcached.spec
tests/test.c

index 01d028f9039a3a7fafb49bf14cd7b1480857f0dc..9a7e907501dbc3be9c6cf97709a8d861425fd0ce 100644 (file)
@@ -33,6 +33,7 @@ man_MANS = libmemcached.3\
        memcached_add.3\\r
        memcached_behavior_get.3\\r
        memcached_behavior_set.3\\r
+       memcached_clone.3\\r
        memcached_create.3\\r
        memcached_decrement.3\\r
        memcached_delete.3\\r
@@ -71,6 +72,9 @@ memcached_create.3: memcached_create.pod
 memcached_free.3: memcached_create.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_create.pod > memcached_free.3\r
 \r
+memcached_clone.3: memcached_create.pod\r
+       pod2man -c "libmemcached" -r "" -s 3 memcached_create.pod > memcached_clone.3\r
+\r
 memcached_set.3: memcached_set.pod\r
        pod2man -c "libmemcached" -r "" -s 3 memcached_set.pod > memcached_set.3\r
 \r
index 5f2b1e30c072b6011c37a2bab6585f01456820cc..cd6ad95e9c7888f06e7fcfe92ae7f5c021dee0d7 100755 (executable)
@@ -54,7 +54,7 @@ Brian Aker, E<lt>brian@tangent.orgE<gt>
 
 =head1 SEE ALSO
 
-memcached(1) libmemcached_examples(3) libmemcached(1) memcat(1) memcp(1) memflush(1) memrm(1) memslap(1) memstat(1) memcached_fetch(3) memcached_replace(3) memcached_server_list_free(3) libmemcached_examples(3) memcached_free(3) memcached_server_add(3) memcached_server_push(3) memcached_add(3) memcached_get(3) memcached_server_count(3) memcached_servers_parse(3) memcached_create(3) memcached_increment(3) memcached_server_list(3) memcached_set(3) memcached_decrement(3) memcached_mget(3) memcached_server_list_append(3) memcached_strerror(3) memcached_delete(3) memcached_quit(3) memcached_server_list_count(3) memcached_verbosity(3)
+memcached(1) libmemcached_examples(3) libmemcached(1) memcat(1) memcp(1) memflush(1) memrm(1) memslap(1) memstat(1) memcached_fetch(3) memcached_replace(3) memcached_server_list_free(3) libmemcached_examples(3) memcached_clone(3) memcached_free(3) memcached_server_add(3) memcached_server_push(3) memcached_add(3) memcached_get(3) memcached_server_count(3) memcached_servers_parse(3) memcached_create(3) memcached_increment(3) memcached_server_list(3) memcached_set(3) memcached_decrement(3) memcached_mget(3) memcached_server_list_append(3) memcached_strerror(3) memcached_delete(3) memcached_quit(3) memcached_server_list_count(3) memcached_verbosity(3)
 
 =cut
 
index cbe6fc1ee91c6accde864424b66133bfb294d384..f76e9c7ef83c0be6d54275f923f307853b7313be 100755 (executable)
@@ -14,6 +14,8 @@ C Client Library for memcached (libmemcached, -lmemcached)
 
   void memcached_free (memcached_st *ptr);
 
+  memcached_st *memcached_clone(memcached_st *clone, memcached_st *source);
+
 =head1 DESCRIPTION
 
 memcached_create() is used to create a C<memcached_st> structure that will then
@@ -21,6 +23,11 @@ be used by other libmemcached(3) functions to communicate with the server. You
 should either pass a statically declared C<memcached_st> to memcached_create() or
 a NULL. If a NULL passed in then a structure is allocated for you.
 
+memcached_clone() is similar to memcached_create(3) but it copies the
+defaults and list of servers from the source C<memcached_st>. If you pass a null as
+the argument for the source to clone, it is the same as a call to memcached_create().
+If the clone argument is NULL a C<memcached_st> will be allocated for you. 
+
 To clean up memory associated with a C<memcached_st> structure you should pass
 it to memcached_free() when you are finished using it. memcached_free() is
 the only way to make sure all memory is deallocated when you finish using
@@ -31,6 +38,9 @@ the structure.
 memcached_create() returns a pointer to the memcached_st that was created
 (or initialized). On an allocation failure, it returns NULL.
 
+memcached_clone() returns a pointer to the memcached_st that was created
+(or initialized). On an allocation failure, it returns NULL.
+
 =head1 HOME
 
 To find out more information please check:
index 1131de2baff3c4d47469ca4e5c2f5dd025f2c177..2cdc34d03118373542f749aba81d56e46f53d954 100644 (file)
@@ -140,6 +140,7 @@ struct memcached_st {
 /* Public API */
 memcached_st *memcached_create(memcached_st *ptr);
 void memcached_free(memcached_st *ptr);
+memcached_st *memcached_clone(memcached_st *clone, memcached_st *ptr);
 
 memcached_return memcached_delete(memcached_st *ptr, char *key, size_t key_length,
                                   time_t expiration);
index 0bab79580661fc79781e7286d54389e224a8e3b3..157dc89f24580af2707d9edbf8ffda26d7d98d84 100644 (file)
@@ -37,3 +37,32 @@ void memcached_free(memcached_st *ptr)
   else
     memset(ptr, 0, sizeof(memcached_st));
 }
+
+memcached_st *memcached_clone(memcached_st *clone, memcached_st *ptr)
+{
+  memcached_return rc;
+  memcached_st *new_clone;
+
+  if (ptr == NULL)
+    return memcached_create(clone);
+  
+  new_clone= memcached_create(clone);
+
+
+  rc= memcached_server_push(new_clone, ptr->hosts);
+
+  if (rc != MEMCACHED_SUCCESS)
+  {
+    memcached_free(new_clone);
+
+    return NULL;
+  }
+
+
+  new_clone->flags= ptr->flags;
+  new_clone->number_of_hosts= ptr->number_of_hosts;
+  new_clone->send_size= ptr->send_size;
+  new_clone->recv_size= ptr->recv_size;
+
+  return new_clone;
+}
index f5880308661a50694643af65e9a0cdf4a9116b26..46cf9b5ac3a88ce832a341997248ddb1e06d91bf 100644 (file)
@@ -63,6 +63,7 @@ memslap - Generate testing loads on a memcached cluster
 %{_mandir}/man3/memcached_add.3.gz
 %{_mandir}/man3/memcached_behavior_get.3.gz
 %{_mandir}/man3/memcached_behavior_set.3.gz
+%{_mandir}/man3/memcached_clone.3.gz
 %{_mandir}/man3/memcached_create.3.gz
 %{_mandir}/man3/memcached_decrement.3.gz
 %{_mandir}/man3/memcached_delete.3.gz
index 85adaf1cb3006dc28edffaf0597b558a33958800..ac319bc0a87f63ec88fc1d9b8b57a470b550e929 100644 (file)
@@ -37,6 +37,43 @@ void allocation_test(memcached_st *not_used)
   memcached_free(memc);
 }
 
+void clone_test(memcached_st *memc)
+{
+  /* All null? */
+  {
+    memcached_st *clone;
+    clone= memcached_clone(NULL, NULL);
+    assert(clone);
+    memcached_free(clone);
+  }
+
+  /* Can we init from null? */
+  {
+    memcached_st *clone;
+    clone= memcached_clone(NULL, memc);
+    assert(clone);
+    memcached_free(clone);
+  }
+
+  /* Can we init from struct? */
+  {
+    memcached_st declared_clone;
+    memcached_st *clone;
+    clone= memcached_clone(&declared_clone, NULL);
+    assert(clone);
+    memcached_free(clone);
+  }
+
+  /* Can we init from struct? */
+  {
+    memcached_st declared_clone;
+    memcached_st *clone;
+    clone= memcached_clone(&declared_clone, memc);
+    assert(clone);
+    memcached_free(clone);
+  }
+}
+
 void connection_test(memcached_st *memc)
 {
   memcached_return rc;
@@ -832,6 +869,7 @@ int main(int argc, char *argv[])
     {"flush", 0, flush_test },
     {"init", 0, init_test },
     {"allocation", 0, allocation_test },
+    {"clone_test", 0, clone_test },
     {"error", 0, error_test },
     {"set", 0, set_test },
     {"set2", 0, set_test2 },