Updated with Twitter's memcached_server_error() function.
authorBrian Aker <brian@gir.tangent.org>
Wed, 15 Jul 2009 10:09:06 +0000 (03:09 -0700)
committerBrian Aker <brian@gir.tangent.org>
Wed, 15 Jul 2009 10:09:06 +0000 (03:09 -0700)
1  2 
ChangeLog
docs/memcached_server_st.pod
libmemcached/memcached_response.c
libmemcached/memcached_server.c
libmemcached/memcached_server.h

diff --cc ChangeLog
index aefae4f1220297304eaa2b2a983e13e74098087a,a972319da5ac2e425337c349758243155a8cc3f1..950364b99b05eeeafa7044245a5a9f2bf7859127
+++ b/ChangeLog
@@@ -1,10 -1,3 +1,11 @@@
++  * Added Twitter's memcached_server_error() functions.
 +  * Fix for OSX compiles in development builds.
 +  * Updated C++ interface.
 +
 +0.31 Fri Jul 10 09:02:50 PDT 2009
 +  * Added support or HA via replication.
 +  * malloc() removed for server key usage.
 +  * Update build system.
    * Added support for memcached_set_memory_allocators().
    * Fixed bug in configure.ac for have_htoll.
  
index 0e6e7067f5507df7e609a51d52439ed6f16ec58c,0e6e7067f5507df7e609a51d52439ed6f16ec58c..08ff77851079778657eb8420e575d04c8e0f975c
@@@ -23,6 -23,6 +23,10 @@@ C Client Library for memcached (libmemc
  
    memcached_server_st *memcached_servers_parse (const char *server_strings);
  
++  const char *memcached_server_error(memcached_server_st *ptr);
++
++  void memcached_server_error_reset(memcached_server_st *ptr);
++
  =head1 DESCRIPTION
  
  libmemcached(3) operates on a list of hosts which are stored in
@@@ -44,6 -44,6 +48,12 @@@ command line applications, and parse i
  The example is "localhost, foo:555, foo, bar". All hosts except foo:555 will
  be set to the default port, while that host will have a port of 555.
  
++memcached_server_error() can be used to look at the text of the last error 
++message sent by the server to to the client. Use memcached_server_error_reset() 
++to reset the message (this does not currently free up the memory associated
++with the message).
++
++
  =head1 RETURN
  
  Varies, see particular functions.
index 1ea0c725ea12ca94ad0446ff2d894e1554fd9960,6cb39df62eed4daeff53722d74cf559f5abc6423..ba0691b504a39590c67184d830e2c1753222cec4
@@@ -237,8 -237,17 +237,34 @@@ static memcached_return textual_read_on
          memcached_server_response_increment(ptr);
          return MEMCACHED_STAT;
        }
--      else if (buffer[1] == 'E')
-         return MEMCACHED_SERVER_ERROR;
++      else if (buffer[1] == 'E') /* SERVER_ERROR */ 
+       {
 -        /* SERVER_ERROR */ 
++          char *rel_ptr;
+         char *startptr= buffer + 13, *endptr= startptr;
++
+         while (*endptr != '\r' && *endptr != '\n') endptr++;
 -        if (ptr->cached_server_error) ptr->root->call_free(ptr->root, ptr->cached_server_error);
 -        ptr->cached_server_error= ptr->root->call_malloc(ptr->root, endptr - startptr + 1);
++
++          /* 
++            Yes, we could make this "efficent" but to do that we would need
++            to maintain more state for the size of the buffer. Why waste
++            memory in the struct, which is important, for something that
++            rarely should happen?
++          */
++        rel_ptr= (char *)ptr->root->call_realloc(ptr->root, ptr->cached_server_error, endptr - startptr + 1);
++
++          if (rel_ptr == NULL)
++          {
++            /* If we happened to have some memory, we just null it since we don't know the size */
++            if (ptr->cached_server_error)
++              ptr->cached_server_error[0]= 0;
++            return MEMCACHED_SERVER_ERROR;
++          }
++        ptr->cached_server_error= rel_ptr;
++
+         memcpy(ptr->cached_server_error, startptr, endptr - startptr);
+         ptr->cached_server_error[endptr - startptr]= 0;
+         return MEMCACHED_SERVER_ERROR;
+       }
        else if (buffer[1] == 'T')
          return MEMCACHED_STORED;
        else
index 11e5988a6f7b57f7161a4753da0e3bc70e224b57,2359611e0f73d2b490904017fea54aab7a14456c..7b9c2117bff972b893f17eca23e1d0ae05b4aaf9
@@@ -53,11 -53,17 +53,11 @@@ void memcached_server_free(memcached_se
  {
    memcached_quit_server(ptr, 0);
  
 -  {
+   if (ptr->cached_server_error)
 -    ptr->cached_server_error= NULL;
 -  }
+     free(ptr->cached_server_error);
    if (ptr->address_info)
--  {
      freeaddrinfo(ptr->address_info);
--    ptr->address_info= NULL;
--  }
  
    if (ptr->is_allocated)
      ptr->root->call_free(ptr->root, ptr);
@@@ -70,6 -76,8 +70,8 @@@
  */
  memcached_server_st *memcached_server_clone(memcached_server_st *clone, memcached_server_st *ptr)
  {
 -  memcached_server_st *rv = NULL;
++  memcached_server_st *rv= NULL;
    /* We just do a normal create if ptr is missing */
    if (ptr == NULL)
      return NULL;
@@@ -131,3 -147,3 +141,16 @@@ memcached_server_st *memcached_server_b
    return memcached_server_clone(NULL, &ptr->hosts[server_key]);
  
  }
++
++const char *memcached_server_error(memcached_server_st *ptr)
++{
++  if (ptr)
++    return ptr->cached_server_error;
++  else 
++    return NULL;
++}
++
++void memcached_server_error_reset(memcached_server_st *ptr)
++{
++  ptr->cached_server_error[0]= 0;
++}
index 8076877e0ef84074d2e551c724a7aef4520b1e93,cffc5e8077e6de3d77213d2e2a9e09ad657b7792..ec1014a61b1aa85f955305e676dcca3c35acae88
@@@ -29,6 -30,6 +29,7 @@@ struct memcached_server_st 
    uint8_t minor_version;
    memcached_connection type;
    char *read_ptr;
++  char *cached_server_error;
    size_t read_buffer_length;
    size_t read_data_length;
    size_t write_buffer_offset;
@@@ -57,13 -56,9 +58,19 @@@ LIBMEMCACHED_AP
  memcached_server_st *memcached_server_by_key(memcached_st *ptr,  const char *key, 
                                               size_t key_length, memcached_return *error);
  
++LIBMEMCACHED_API
++const char *memcached_server_error(memcached_server_st *ptr);
++
++LIBMEMCACHED_API
++void memcached_server_error_reset(memcached_server_st *ptr);
++
  /* These should not currently be used by end users */
 +/* TODO: Is the above comment valid? If so, how can we unit test these if they
 + * aren't exported. If not, we should remove the comment */
 +LIBMEMCACHED_API
  memcached_server_st *memcached_server_create(memcached_st *memc, memcached_server_st *ptr);
  
 +LIBMEMCACHED_API
  memcached_server_st *memcached_server_create_with(memcached_st *memc, memcached_server_st *host, 
                                                    const char *hostname, unsigned int port, 
                                                    uint32_t weight, memcached_connection type);