X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Ferror.cc;h=16608ff9eeb8b473cc9581e539c9fc553c6bae24;hb=ea7a5dd332779c77eaef6d14eac58372cb3439e1;hp=aaf0015dfdc2d7b1dd3b9da1f8c1e73e05924736;hpb=f0b9c972a973d997db6660680938dd5acb2baa46;p=awesomized%2Flibmemcached diff --git a/libmemcached/error.cc b/libmemcached/error.cc index aaf0015d..16608ff9 100644 --- a/libmemcached/error.cc +++ b/libmemcached/error.cc @@ -36,6 +36,7 @@ */ #include +#include #define MAX_ERROR_LENGTH 2048 struct memcached_error_t @@ -75,6 +76,11 @@ static void _set(memcached_st& memc, memcached_string_t *str, memcached_return_t rc= MEMCACHED_ERRNO; } + if (rc == MEMCACHED_ERRNO and local_errno == ENOTCONN) + { + 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; @@ -84,16 +90,29 @@ static void _set(memcached_st& memc, memcached_string_t *str, memcached_return_t 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; @@ -102,18 +121,21 @@ static void _set(memcached_st& memc, memcached_string_t *str, memcached_return_t 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; @@ -124,6 +146,7 @@ memcached_return_t memcached_set_error(memcached_st& memc, memcached_return_t rc 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; @@ -153,6 +176,7 @@ memcached_return_t memcached_set_error(memcached_server_st& self, memcached_retu 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; @@ -171,6 +195,7 @@ memcached_return_t memcached_set_error(memcached_server_st& self, memcached_retu 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; @@ -332,6 +357,19 @@ const char *memcached_last_error_message(memcached_st *memc) return memc->error_messages->message; } + +bool memcached_has_current_error(memcached_st &memc) +{ + if (memc.error_messages + and memc.error_messages->query_id == memc.query_id + and memcached_failed(memc.error_messages->rc)) + { + return true; + } + + return false; +} + memcached_return_t memcached_last_error(memcached_st *memc) { if (not memc)