*/
#include <libmemcached/common.h>
+#include <cassert>
#define MAX_ERROR_LENGTH 2048
struct memcached_error_t
// For memory allocation we use our error since it is a bit more specific
if (local_errno == ENOMEM and rc == MEMCACHED_ERRNO)
{
- local_errno= ENOMEM;
rc= MEMCACHED_MEMORY_ALLOCATION_FAILURE;
}
rc= MEMCACHED_ERRNO;
}
+ if (rc == MEMCACHED_ERRNO and local_errno == ENOTCONN)
+ {
+ rc= MEMCACHED_CONNECTION_FAILURE;
+ }
+
+ if (local_errno == EINVAL)
+ {
+ rc= MEMCACHED_INVALID_ARGUMENTS;
+ }
+
+ if (local_errno == ECONNREFUSED)
+ {
+ rc= MEMCACHED_CONNECTION_FAILURE;
+ }
+
memcached_error_t *error= (struct memcached_error_t *)libmemcached_malloc(&memc, sizeof(struct memcached_error_t));
if (not error) // Bad business if this happens
return;
error->rc= rc;
error->local_errno= local_errno;
- if (str)
+ if (str and str->size and local_errno)
+ {
+ error->size= (int)snprintf(error->message, MAX_ERROR_LENGTH, "%s(%s), %.*s -> %s",
+ memcached_strerror(&memc, rc),
+ strerror(local_errno),
+ memcached_string_printf(*str), at);
+ }
+ else if (local_errno)
+ {
+ error->size= (int)snprintf(error->message, MAX_ERROR_LENGTH, "%s(%s) -> %s",
+ memcached_strerror(&memc, rc),
+ strerror(local_errno), at);
+ }
+ else if (str and str->size)
{
- size_t length= str->size > (size_t)MAX_ERROR_LENGTH ? MAX_ERROR_LENGTH : str->size;
- error->size= length;
- memcpy(error->message, str->c_str, error->size);
- error->message[error->size]= 0;
+ error->size= (int)snprintf(error->message, MAX_ERROR_LENGTH, "%s, %.*s -> %s",
+ memcached_strerror(&memc, rc),
+ int(str->size), str->c_str, at);
}
else
{
- error->size= 0;
+ error->size= (int)snprintf(error->message, MAX_ERROR_LENGTH, "%s -> %s",
+ memcached_strerror(&memc, rc), at);
}
error->next= memc.error_messages;
memcached_return_t memcached_set_error(memcached_st& memc, memcached_return_t rc, const char *at, const char *str, size_t length)
{
+ assert(rc != MEMCACHED_ERRNO);
memcached_string_t tmp= { str, length };
return memcached_set_error(memc, rc, at, tmp);
}
memcached_return_t memcached_set_error(memcached_server_st& self, memcached_return_t rc, const char *at, const char *str, size_t length)
{
+ assert(rc != MEMCACHED_ERRNO);
memcached_string_t tmp= { str, length };
return memcached_set_error(self, rc, at, tmp);
}
memcached_return_t memcached_set_error(memcached_st& memc, memcached_return_t rc, const char *at, memcached_string_t& str)
{
+ assert(rc != MEMCACHED_ERRNO);
if (memcached_success(rc))
return MEMCACHED_SUCCESS;
memcached_return_t memcached_set_error(memcached_server_st& self, memcached_return_t rc, const char *at, memcached_string_t& str)
{
+ assert(rc != MEMCACHED_ERRNO);
if (memcached_success(rc))
return MEMCACHED_SUCCESS;
memcached_return_t memcached_set_error(memcached_server_st& self, memcached_return_t rc, const char *at)
{
+ assert(rc != MEMCACHED_ERRNO);
if (memcached_success(rc))
return MEMCACHED_SUCCESS;
memcached_return_t memcached_set_error(memcached_st& self, memcached_return_t rc, const char *at)
{
+ assert(rc != MEMCACHED_ERRNO);
if (memcached_success(rc))
return MEMCACHED_SUCCESS;