X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fmemcached_get.c;h=852e90dd3004b6920cc4bf75efa81ddd0525159c;hb=9e3be4445dfcaaec987e20af062d9ec05e015539;hp=8cc7ce30b04adee6eb7d62555ed9fd90b0c8ecd4;hpb=8fce86636639afaeac4ca0e869e8bcd833324a62;p=awesomized%2Flibmemcached diff --git a/libmemcached/memcached_get.c b/libmemcached/memcached_get.c index 8cc7ce30..852e90dd 100644 --- a/libmemcached/memcached_get.c +++ b/libmemcached/memcached_get.c @@ -38,7 +38,46 @@ char *memcached_get_by_key(memcached_st *ptr, *error= MEMCACHED_NOTFOUND; if (value == NULL) + { + if (ptr->get_key_failure && *error == MEMCACHED_NOTFOUND) + { + memcached_return rc; + + memcached_result_reset(&ptr->result); + rc= ptr->get_key_failure(ptr, key, key_length, &ptr->result); + + /* On all failure drop to returning NULL */ + if (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED) + { + uint8_t latch; /* We use latch to track the state of the original socket */ + + if (rc == MEMCACHED_BUFFERED) + { + latch= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS); + if (latch == 0) + memcached_behavior_set(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 1); + } + + rc= memcached_set(ptr, key, key_length, + memcached_result_value(&ptr->result), + memcached_result_length(&ptr->result), + 0, memcached_result_flags(&ptr->result)); + + if (rc == MEMCACHED_BUFFERED && latch == 0) + memcached_behavior_set(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 0); + + if (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED) + { + *error= rc; + *value_length= memcached_result_length(&ptr->result); + *flags= memcached_result_flags(&ptr->result); + return memcached_string_c_copy(&ptr->result.value); + } + } + } + return NULL; + } (void)memcached_fetch(ptr, NULL, NULL, &dummy_length, &dummy_flags,