X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fauto.cc;h=df4ceb2fd2f1025f5415e05e3a05675a821570ee;hb=983523c4536f12781533124cb8a00a4291b8cf79;hp=174f2623001dd47df60b82383ac7f755b2e2ddf7;hpb=51351e672a6a1626e09d5a9d41e3229df44fc3c8;p=m6w6%2Flibmemcached diff --git a/libmemcached/auto.cc b/libmemcached/auto.cc index 174f2623..df4ceb2f 100644 --- a/libmemcached/auto.cc +++ b/libmemcached/auto.cc @@ -37,12 +37,36 @@ #include +static void auto_response(memcached_server_write_instance_st instance, const bool reply, memcached_return_t& rc, uint64_t* value) +{ + // If the message was successfully sent, then get the response, otherwise + // fail. + if (memcached_success(rc)) + { + if (reply == false) + { + *value= UINT64_MAX; + return; + } + + rc= memcached_response(instance, &instance->root->result); + } + + if (memcached_success(rc)) + { + *value= instance->root->result.numeric_value; + } + else + { + *value= UINT64_MAX; + } +} + static memcached_return_t text_incr_decr(memcached_server_write_instance_st instance, const bool is_incr, const char *key, size_t key_length, const uint64_t offset, - const bool reply, - uint64_t& numeric_value) + const bool reply) { char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE]; @@ -53,8 +77,9 @@ static memcached_return_t text_incr_decr(memcached_server_write_instance_st inst memcached_literal_param("snprintf(MEMCACHED_DEFAULT_COMMAND_SIZE)")); } - struct libmemcached_io_vector_st vector[]= + libmemcached_io_vector_st vector[]= { + { NULL, 0 }, { memcached_literal_param("incr ") }, { memcached_array_string(instance->root->_namespace), memcached_array_size(instance->root->_namespace) }, { key, key_length }, @@ -65,25 +90,10 @@ static memcached_return_t text_incr_decr(memcached_server_write_instance_st inst if (is_incr == false) { - vector[0].buffer= "decr "; - } - - memcached_return_t rc= memcached_vdo(instance, vector, 6, true); - - if (reply == false) - { - return MEMCACHED_SUCCESS; - } - - if (memcached_failed(rc)) - { - numeric_value= UINT64_MAX; - return rc; + vector[1].buffer= "decr "; } - rc= memcached_response(instance, buffer, sizeof(buffer), NULL, numeric_value); - - return memcached_set_error(*instance, rc, MEMCACHED_AT); + return memcached_vdo(instance, vector, 7, true); } static memcached_return_t binary_incr_decr(memcached_server_write_instance_st instance, @@ -92,8 +102,7 @@ static memcached_return_t binary_incr_decr(memcached_server_write_instance_st in const uint64_t offset, const uint64_t initial, const uint32_t expiration, - const bool reply, - uint64_t *value) + const bool reply) { if (reply == false) { @@ -119,101 +128,90 @@ static memcached_return_t binary_incr_decr(memcached_server_write_instance_st in request.message.body.initial= memcached_htonll(initial); request.message.body.expiration= htonl((uint32_t) expiration); - struct libmemcached_io_vector_st vector[]= + libmemcached_io_vector_st vector[]= { + { NULL, 0 }, { request.bytes, sizeof(request.bytes) }, { memcached_array_string(instance->root->_namespace), memcached_array_size(instance->root->_namespace) }, { key, key_length } }; - memcached_return_t rc; - if (memcached_failed(rc= memcached_vdo(instance, vector, 3, true))) - { - memcached_io_reset(instance); - return MEMCACHED_WRITE_FAILURE; - } - - if (reply == false) - { - return MEMCACHED_SUCCESS; - } - - return memcached_response(instance, (char*)value, sizeof(*value), NULL); + return memcached_vdo(instance, vector, 4, true); } -memcached_return_t memcached_increment(memcached_st *ptr, +memcached_return_t memcached_increment(memcached_st *memc, const char *key, size_t key_length, uint32_t offset, uint64_t *value) { - return memcached_increment_by_key(ptr, key, key_length, key, key_length, offset, value); + return memcached_increment_by_key(memc, key, key_length, key, key_length, offset, value); } -memcached_return_t memcached_decrement(memcached_st *ptr, - const char *key, size_t key_length, - uint32_t offset, - uint64_t *value) +static memcached_return_t increment_decrement_by_key(const protocol_binary_command command, + memcached_st *memc, + const char *group_key, size_t group_key_length, + const char *key, size_t key_length, + uint64_t offset, + uint64_t *value) { - return memcached_decrement_by_key(ptr, key, key_length, key, key_length, offset, value); -} - -memcached_return_t memcached_increment_by_key(memcached_st *ptr, - const char *group_key, size_t group_key_length, - const char *key, size_t key_length, - uint64_t offset, - uint64_t *value) -{ - memcached_return_t rc; uint64_t local_value; if (value == NULL) { value= &local_value; } - if (memcached_failed(rc= initialize_query(ptr))) + memcached_return_t rc; + if (memcached_failed(rc= initialize_query(memc, true))) { return rc; } - if (memcached_failed(rc= memcached_validate_key_length(key_length, ptr->flags.binary_protocol))) + if (memcached_is_encrypted(memc)) { - return rc; + return memcached_set_error(*memc, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT, + memcached_literal_param("Operation not allowed while encyrption is enabled")); } - if (memcached_failed(rc= memcached_key_test(*ptr, (const char **)&key, &key_length, 1))) + if (memcached_failed(rc= memcached_key_test(*memc, (const char **)&key, &key_length, 1))) { - return memcached_set_error(*ptr, rc, MEMCACHED_AT); + return memcached_last_error(memc); } - uint32_t server_key= memcached_generate_hash_with_redistribution(ptr, group_key, group_key_length); - memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, server_key); + uint32_t server_key= memcached_generate_hash_with_redistribution(memc, group_key, group_key_length); + memcached_server_write_instance_st instance= memcached_server_instance_fetch(memc, server_key); bool reply= memcached_is_replying(instance->root); - LIBMEMCACHED_MEMCACHED_INCREMENT_START(); - if (memcached_is_binary(ptr)) + if (memcached_is_binary(memc)) { - rc= binary_incr_decr(instance, PROTOCOL_BINARY_CMD_INCREMENT, + rc= binary_incr_decr(instance, command, key, key_length, uint64_t(offset), 0, MEMCACHED_EXPIRATION_NOT_ADD, - reply, - value); + reply); } else { - rc= text_incr_decr(instance, true, key, key_length, offset, reply, *value); + rc= text_incr_decr(instance, + command == PROTOCOL_BINARY_CMD_INCREMENT ? true : false, + key, key_length, + offset, reply); } - LIBMEMCACHED_MEMCACHED_INCREMENT_END(); + auto_response(instance, reply, rc, value); return rc; } -memcached_return_t memcached_decrement_by_key(memcached_st *ptr, - const char *group_key, size_t group_key_length, - const char *key, size_t key_length, - uint64_t offset, - uint64_t *value) +static memcached_return_t increment_decrement_with_initial_by_key(const protocol_binary_command command, + memcached_st *memc, + const char *group_key, + size_t group_key_length, + const char *key, + size_t key_length, + uint64_t offset, + uint64_t initial, + time_t expiration, + uint64_t *value) { uint64_t local_value; if (value == NULL) @@ -222,42 +220,91 @@ memcached_return_t memcached_decrement_by_key(memcached_st *ptr, } memcached_return_t rc; - if (memcached_failed(rc= initialize_query(ptr))) + if (memcached_failed(rc= initialize_query(memc, true))) { return rc; } - if (memcached_failed(rc= memcached_key_test(*ptr, (const char **)&key, &key_length, 1))) + if (memcached_is_encrypted(memc)) { - return memcached_set_error(*ptr, rc, MEMCACHED_AT); + return memcached_set_error(*memc, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT, + memcached_literal_param("Operation not allowed while encyrption is enabled")); } + if (memcached_failed(rc= memcached_key_test(*memc, (const char **)&key, &key_length, 1))) + { + return memcached_last_error(memc); + } - uint32_t server_key= memcached_generate_hash_with_redistribution(ptr, group_key, group_key_length); - memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, server_key); + uint32_t server_key= memcached_generate_hash_with_redistribution(memc, group_key, group_key_length); + memcached_server_write_instance_st instance= memcached_server_instance_fetch(memc, server_key); bool reply= memcached_is_replying(instance->root); - LIBMEMCACHED_MEMCACHED_DECREMENT_START(); - if (memcached_is_binary(ptr)) + if (memcached_is_binary(memc)) { - rc= binary_incr_decr(instance, PROTOCOL_BINARY_CMD_DECREMENT, + rc= binary_incr_decr(instance, command, key, key_length, - offset, 0, MEMCACHED_EXPIRATION_NOT_ADD, - reply, - value); + offset, initial, uint32_t(expiration), + reply); + } else { - rc= text_incr_decr(instance, false, key, key_length, offset, reply, *value); + rc= memcached_set_error(*memc, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT, + memcached_literal_param("memcached_increment_with_initial_by_key() is not supported via the ASCII protocol")); } + auto_response(instance, reply, rc, value); + + return rc; +} + +memcached_return_t memcached_decrement(memcached_st *memc, + const char *key, size_t key_length, + uint32_t offset, + uint64_t *value) +{ + return memcached_decrement_by_key(memc, key, key_length, key, key_length, offset, value); +} + + +memcached_return_t memcached_increment_by_key(memcached_st *memc, + const char *group_key, size_t group_key_length, + const char *key, size_t key_length, + uint64_t offset, + uint64_t *value) +{ + LIBMEMCACHED_MEMCACHED_INCREMENT_START(); + memcached_return_t rc= increment_decrement_by_key(PROTOCOL_BINARY_CMD_INCREMENT, + memc, + group_key, group_key_length, + key, key_length, + offset, value); + + LIBMEMCACHED_MEMCACHED_INCREMENT_END(); + + return rc; +} + +memcached_return_t memcached_decrement_by_key(memcached_st *memc, + const char *group_key, size_t group_key_length, + const char *key, size_t key_length, + uint64_t offset, + uint64_t *value) +{ + LIBMEMCACHED_MEMCACHED_DECREMENT_START(); + memcached_return_t rc= increment_decrement_by_key(PROTOCOL_BINARY_CMD_DECREMENT, + memc, + group_key, group_key_length, + key, key_length, + offset, value); LIBMEMCACHED_MEMCACHED_DECREMENT_END(); return rc; } -memcached_return_t memcached_increment_with_initial(memcached_st *ptr, +memcached_return_t memcached_increment_with_initial(memcached_st *memc, const char *key, size_t key_length, uint64_t offset, @@ -265,63 +312,33 @@ memcached_return_t memcached_increment_with_initial(memcached_st *ptr, time_t expiration, uint64_t *value) { - return memcached_increment_with_initial_by_key(ptr, key, key_length, + return memcached_increment_with_initial_by_key(memc, key, key_length, key, key_length, offset, initial, expiration, value); } -memcached_return_t memcached_increment_with_initial_by_key(memcached_st *ptr, - const char *group_key, - size_t group_key_length, - const char *key, - size_t key_length, - uint64_t offset, - uint64_t initial, - time_t expiration, - uint64_t *value) +memcached_return_t memcached_increment_with_initial_by_key(memcached_st *memc, + const char *group_key, + size_t group_key_length, + const char *key, + size_t key_length, + uint64_t offset, + uint64_t initial, + time_t expiration, + uint64_t *value) { - uint64_t local_value; - if (value == NULL) - { - value= &local_value; - } - - memcached_return_t rc; - if (memcached_failed(rc= initialize_query(ptr))) - { - return rc; - } - - if (memcached_failed(rc= memcached_key_test(*ptr, (const char **)&key, &key_length, 1))) - { - return memcached_set_error(*ptr, rc, MEMCACHED_AT); - } - - uint32_t server_key= memcached_generate_hash_with_redistribution(ptr, group_key, group_key_length); - memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, server_key); - - bool reply= memcached_is_replying(instance->root); - LIBMEMCACHED_MEMCACHED_INCREMENT_WITH_INITIAL_START(); - if (memcached_is_binary(ptr)) - { - rc= binary_incr_decr(instance, PROTOCOL_BINARY_CMD_INCREMENT, - key, key_length, - offset, initial, uint32_t(expiration), - reply, - value); - } - else - { - rc= MEMCACHED_PROTOCOL_ERROR; - } - + memcached_return_t rc= increment_decrement_with_initial_by_key(PROTOCOL_BINARY_CMD_INCREMENT, + memc, + group_key, group_key_length, + key, key_length, + offset, initial, expiration, value); LIBMEMCACHED_MEMCACHED_INCREMENT_WITH_INITIAL_END(); return rc; } -memcached_return_t memcached_decrement_with_initial(memcached_st *ptr, +memcached_return_t memcached_decrement_with_initial(memcached_st *memc, const char *key, size_t key_length, uint64_t offset, @@ -329,12 +346,12 @@ memcached_return_t memcached_decrement_with_initial(memcached_st *ptr, time_t expiration, uint64_t *value) { - return memcached_decrement_with_initial_by_key(ptr, key, key_length, + return memcached_decrement_with_initial_by_key(memc, key, key_length, key, key_length, offset, initial, expiration, value); } -memcached_return_t memcached_decrement_with_initial_by_key(memcached_st *ptr, +memcached_return_t memcached_decrement_with_initial_by_key(memcached_st *memc, const char *group_key, size_t group_key_length, const char *key, @@ -344,42 +361,12 @@ memcached_return_t memcached_decrement_with_initial_by_key(memcached_st *ptr, time_t expiration, uint64_t *value) { - uint64_t local_value; - if (value == NULL) - { - value= &local_value; - } - - memcached_return_t rc; - if (memcached_failed(rc= initialize_query(ptr))) - { - return rc; - } - - if (memcached_failed(rc= memcached_key_test(*ptr, (const char **)&key, &key_length, 1))) - { - return memcached_set_error(*ptr, rc, MEMCACHED_AT); - } - - uint32_t server_key= memcached_generate_hash_with_redistribution(ptr, group_key, group_key_length); - memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, server_key); - - bool reply= memcached_is_replying(instance->root); - - LIBMEMCACHED_MEMCACHED_INCREMENT_WITH_INITIAL_START(); - if (memcached_is_binary(ptr)) - { - rc= binary_incr_decr(instance, PROTOCOL_BINARY_CMD_DECREMENT, - key, key_length, - offset, initial, uint32_t(expiration), - reply, - value); - } - else - { - rc= MEMCACHED_PROTOCOL_ERROR; - } + memcached_return_t rc= increment_decrement_with_initial_by_key(PROTOCOL_BINARY_CMD_DECREMENT, + memc, + group_key, group_key_length, + key, key_length, + offset, initial, expiration, value); LIBMEMCACHED_MEMCACHED_INCREMENT_WITH_INITIAL_END();