X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fresult.c;h=c6c754f3ea3aad568710f62a98e67946fd586f63;hb=b95b86ccfcaf1491760cf84723c48be9f13df49b;hp=bca92740069afc883259848effcdcd77cdf5dcab;hpb=addf09c6f6cf93f980f3de9cf649258c965b2934;p=awesomized%2Flibmemcached diff --git a/libmemcached/result.c b/libmemcached/result.c index bca92740..c6c754f3 100644 --- a/libmemcached/result.c +++ b/libmemcached/result.c @@ -17,29 +17,43 @@ */ #include "common.h" -memcached_result_st *memcached_result_create(memcached_st *memc, +static inline void _result_init(memcached_result_st *self, + const memcached_st *memc) +{ + self->item_flags= 0; + self->item_expiration= 0; + self->key_length= 0; + self->item_cas= 0; + self->root= memc; + self->item_key[0]= 0; +} + +memcached_result_st *memcached_result_create(const memcached_st *memc, memcached_result_st *ptr) { WATCHPOINT_ASSERT(memc); - WATCHPOINT_ASSERT(memc->options.is_initialized); /* Saving malloc calls :) */ if (ptr) { - memset(ptr, 0, sizeof(memcached_result_st)); + ptr->options.is_allocated= false; } else { - ptr= memc->call_calloc(memc, 1, sizeof(memcached_result_st)); + ptr= libmemcached_malloc(memc, sizeof(memcached_result_st)); if (ptr == NULL) return NULL; + ptr->options.is_allocated= true; } ptr->options.is_initialized= true; + _result_init(ptr, memc); + ptr->root= memc; + WATCHPOINT_SET(ptr->value.options.is_initialized= false); memcached_string_create(memc, &ptr->value, 0); WATCHPOINT_ASSERT_INITIALIZED(&ptr->value); WATCHPOINT_ASSERT(ptr->value.string == NULL); @@ -51,9 +65,9 @@ void memcached_result_reset(memcached_result_st *ptr) { ptr->key_length= 0; memcached_string_reset(&ptr->value); - ptr->flags= 0; - ptr->cas= 0; - ptr->expiration= 0; + ptr->item_flags= 0; + ptr->item_cas= 0; + ptr->item_expiration= 0; } void memcached_result_free(memcached_result_st *ptr) @@ -65,17 +79,67 @@ void memcached_result_free(memcached_result_st *ptr) if (memcached_is_allocated(ptr)) { - if (ptr->root != NULL) - { - ptr->root->call_free(ptr->root, ptr); - } - else - { - free(ptr); - } + WATCHPOINT_ASSERT(ptr->root); // Without a root, that means that result was not properly initialized. + libmemcached_free(ptr->root, ptr); } else { ptr->options.is_initialized= false; } } + +memcached_return_t memcached_result_set_value(memcached_result_st *ptr, + const char *value, + size_t length) +{ + memcached_return_t rc= memcached_string_append(&ptr->value, value, length); + + if (rc == MEMCACHED_MEMORY_ALLOCATION_FAILURE) + { + ((memcached_st *)ptr->root)->cached_errno= errno; + } + + return rc; +} + +const char *memcached_result_key_value(const memcached_result_st *self) +{ + return self->key_length ? self->item_key : NULL; +} + +size_t memcached_result_key_length(const memcached_result_st *self) +{ + return self->key_length; +} + +const char *memcached_result_value(const memcached_result_st *self) +{ + const memcached_string_st *sptr= &self->value; + return memcached_string_value(sptr); +} + +size_t memcached_result_length(const memcached_result_st *self) +{ + const memcached_string_st *sptr= &self->value; + return memcached_string_length(sptr); +} + +uint32_t memcached_result_flags(const memcached_result_st *self) +{ + return self->item_flags; +} + +uint64_t memcached_result_cas(const memcached_result_st *self) +{ + return self->item_cas; +} + +void memcached_result_set_flags(memcached_result_st *self, uint32_t flags) +{ + self->item_flags= flags; +} + +void memcached_result_set_expiration(memcached_result_st *self, time_t expiration) +{ + self->item_expiration= expiration; +}