X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fexist.cc;h=58408fd747d2e0795257e468c6c1982fbfeb5bee;hb=b5495838fb245aa1068a1198ed549b98a9c3e666;hp=b8d4b0d876a325255d6ec9d36a94098f75b087de;hpb=9cf7ea2836b3ec5cb8b01f2d8399cbe0ae06bf60;p=m6w6%2Flibmemcached diff --git a/libmemcached/exist.cc b/libmemcached/exist.cc index b8d4b0d8..58408fd7 100644 --- a/libmemcached/exist.cc +++ b/libmemcached/exist.cc @@ -38,34 +38,38 @@ static memcached_return_t ascii_exist(memcached_st *memc, memcached_server_write_instance_st instance, const char *key, size_t key_length) { - struct libmemcached_io_vector_st vector[]= + libmemcached_io_vector_st vector[]= { - { sizeof("add ") -1, "add " }, - { memcached_array_size(memc->_namespace), memcached_array_string(memc->_namespace) }, - { key_length, key }, - { sizeof(" 0") -1, " 0" }, - { sizeof(" 2678400") -1, " 2678400" }, - { sizeof(" 0") -1, " 0" }, - { 2, "\r\n" }, - { 2, "\r\n" } + { NULL, 0 }, + { memcached_literal_param("add ") }, + { memcached_array_string(memc->_namespace), memcached_array_size(memc->_namespace) }, + { key, key_length }, + { memcached_literal_param(" 0") }, + { memcached_literal_param(" 2678400") }, + { memcached_literal_param(" 0") }, + { memcached_literal_param("\r\n") }, + { memcached_literal_param("\r\n") } }; /* Send command header */ - memcached_return_t rc= memcached_vdo(instance, vector, 8, true); - if (rc == MEMCACHED_SUCCESS) + memcached_return_t rc; + if (memcached_fatal(rc= memcached_vdo(instance, vector, 9, true))) { - char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE]; - rc= memcached_response(instance, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, NULL); + return rc; + } - if (rc == MEMCACHED_NOTSTORED) - rc= MEMCACHED_SUCCESS; + char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE]; + rc= memcached_response(instance, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, NULL); - if (rc == MEMCACHED_STORED) - rc= MEMCACHED_NOTFOUND; + if (rc == MEMCACHED_NOTSTORED) + { + rc= MEMCACHED_SUCCESS; } - if (rc == MEMCACHED_WRITE_FAILURE) - memcached_io_reset(instance); + if (rc == MEMCACHED_STORED) + { + rc= MEMCACHED_NOTFOUND; + } return rc; } @@ -75,7 +79,8 @@ static memcached_return_t binary_exist(memcached_st *memc, memcached_server_writ protocol_binary_request_set request= {}; size_t send_length= sizeof(request.bytes); - request.message.header.request.magic= PROTOCOL_BINARY_REQ; + initialize_binary_request(instance, request.message.header); + request.message.header.request.opcode= PROTOCOL_BINARY_CMD_ADD; request.message.header.request.keylen= htons((uint16_t)(key_length + memcached_array_size(memc->_namespace))); request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES; @@ -87,28 +92,32 @@ static memcached_return_t binary_exist(memcached_st *memc, memcached_server_writ +memcached_array_size(memc->_namespace) +request.message.header.request.extlen)); - struct libmemcached_io_vector_st vector[]= + libmemcached_io_vector_st vector[]= { - { send_length, request.bytes }, - { memcached_array_size(memc->_namespace), memcached_array_string(memc->_namespace) }, - { key_length, key } + { NULL, 0 }, + { request.bytes, send_length }, + { memcached_array_string(memc->_namespace), memcached_array_size(memc->_namespace) }, + { key, key_length } }; /* write the header */ memcached_return_t rc; - if ((rc= memcached_vdo(instance, vector, 3, true)) != MEMCACHED_SUCCESS) + if (memcached_fatal(rc= memcached_vdo(instance, vector, 4, true))) { - memcached_io_reset(instance); - return (rc == MEMCACHED_SUCCESS) ? MEMCACHED_WRITE_FAILURE : rc; + return rc; } rc= memcached_response(instance, NULL, 0, NULL); if (rc == MEMCACHED_SUCCESS) + { rc= MEMCACHED_NOTFOUND; + } if (rc == MEMCACHED_DATA_EXISTS) + { rc= MEMCACHED_SUCCESS; + } return rc; } @@ -123,27 +132,32 @@ memcached_return_t memcached_exist_by_key(memcached_st *memc, const char *key, size_t key_length) { memcached_return_t rc; - if (memcached_failed(rc= initialize_query(memc))) + if (memcached_failed(rc= initialize_query(memc, true))) { return rc; } - if (memc->flags.use_udp) + if (memcached_is_udp(memc)) { - return MEMCACHED_NOT_SUPPORTED; + return memcached_set_error(*memc, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT); } - uint32_t server_key= memcached_generate_hash_with_redistribution(memc, group_key, group_key_length); - memcached_server_write_instance_st instance; - instance= memcached_server_instance_fetch(memc, server_key); + memcached_server_write_instance_st instance= memcached_server_instance_fetch(memc, server_key); - if (memc->flags.binary_protocol) + if (memcached_is_binary(memc)) { - return binary_exist(memc, instance, key, key_length); + rc= binary_exist(memc, instance, key, key_length); } else { - return ascii_exist(memc, instance, key, key_length); + rc= ascii_exist(memc, instance, key, key_length); } + + if (memcached_fatal(rc)) + { + memcached_io_reset(instance); + } + + return rc; }