X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fmemcached_storage.c;h=2dbcb28071b624786a2f9e1c585f731ae90d7a30;hb=b4de8d3fd063b9017797dd9809ab3acb8a537606;hp=e10f85f0e0597b977663da098d90f64fd6af0c87;hpb=89608dc3370371a9fde46d6f60e9480fa576fc3a;p=m6w6%2Flibmemcached diff --git a/libmemcached/memcached_storage.c b/libmemcached/memcached_storage.c index e10f85f0..2dbcb280 100644 --- a/libmemcached/memcached_storage.c +++ b/libmemcached/memcached_storage.c @@ -16,10 +16,10 @@ typedef enum { PREPEND_OP, APPEND_OP, CAS_OP, -} memcached_storage_action; +} memcached_storage_action_t; /* Inline this */ -static const char *storage_op_string(memcached_storage_action verb) +static inline const char *storage_op_string(memcached_storage_action_t verb) { switch (verb) { @@ -42,63 +42,67 @@ static const char *storage_op_string(memcached_storage_action verb) /* NOTREACHED */ } -static memcached_return memcached_send_binary(memcached_st *ptr, - const char *master_key, - size_t master_key_length, - const char *key, - size_t key_length, - const char *value, - size_t value_length, - time_t expiration, - uint32_t flags, - uint64_t cas, - memcached_storage_action verb); - -static inline memcached_return memcached_send(memcached_st *ptr, - const char *master_key, size_t master_key_length, - const char *key, size_t key_length, - const char *value, size_t value_length, - time_t expiration, - uint32_t flags, - uint64_t cas, - memcached_storage_action verb) +static memcached_return_t memcached_send_binary(memcached_st *ptr, + const char *master_key, + size_t master_key_length, + const char *key, + size_t key_length, + const char *value, + size_t value_length, + time_t expiration, + uint32_t flags, + uint64_t cas, + memcached_storage_action_t verb); + +static inline memcached_return_t memcached_send(memcached_st *ptr, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, + time_t expiration, + uint32_t flags, + uint64_t cas, + memcached_storage_action_t verb) { char to_write; size_t write_length; ssize_t sent_length; - memcached_return rc; + memcached_return_t rc; char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE]; unsigned int server_key; WATCHPOINT_ASSERT(!(value == NULL && value_length > 0)); - rc= memcached_validate_key_length(key_length, ptr->flags & MEM_BINARY_PROTOCOL); + rc= memcached_validate_key_length(key_length, ptr->flags.binary_protocol); unlikely (rc != MEMCACHED_SUCCESS) return rc; - + unlikely (ptr->number_of_hosts == 0) return MEMCACHED_NO_SERVERS; - if ((ptr->flags & MEM_VERIFY_KEY) && (memcached_key_test((const char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)) + if (ptr->flags.verify_key && (memcached_key_test((const char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)) return MEMCACHED_BAD_KEY_PROVIDED; - if (ptr->flags & MEM_BINARY_PROTOCOL) + if (ptr->flags.binary_protocol) + { return memcached_send_binary(ptr, master_key, master_key_length, key, key_length, value, value_length, expiration, flags, cas, verb); + } server_key= memcached_generate_hash(ptr, master_key, master_key_length); if (cas) - write_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, - "%s %s%.*s %u %llu %zu %llu%s\r\n", - storage_op_string(verb), - ptr->prefix_key, - (int)key_length, key, flags, - (unsigned long long)expiration, value_length, - (unsigned long long)cas, - (ptr->flags & MEM_NOREPLY) ? " noreply" : ""); + { + write_length= (size_t) snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, + "%s %s%.*s %u %llu %zu %llu%s\r\n", + storage_op_string(verb), + ptr->prefix_key, + (int)key_length, key, flags, + (unsigned long long)expiration, value_length, + (unsigned long long)cas, + (ptr->flags.no_reply) ? " noreply" : ""); + } else { char *buffer_ptr= buffer; @@ -118,14 +122,14 @@ static inline memcached_return memcached_send(memcached_st *ptr, buffer_ptr++; write_length= (size_t)(buffer_ptr - buffer); - write_length+= snprintf(buffer_ptr, MEMCACHED_DEFAULT_COMMAND_SIZE, - "%u %llu %zu%s\r\n", - flags, - (unsigned long long)expiration, value_length, - (ptr->flags & MEM_NOREPLY) ? " noreply" : ""); + write_length+= (size_t) snprintf(buffer_ptr, MEMCACHED_DEFAULT_COMMAND_SIZE, + "%u %llu %zu%s\r\n", + flags, + (unsigned long long)expiration, value_length, + ptr->flags.no_reply ? " noreply" : ""); } - if (ptr->flags & MEM_USE_UDP && ptr->flags & MEM_BUFFER_REQUESTS) + if (ptr->flags.use_udp && ptr->flags.buffer_requests) { size_t cmd_size= write_length + value_length + 2; if (cmd_size > MAX_UDP_DATAGRAM_LENGTH - UDP_DATAGRAM_HEADER_LENGTH) @@ -152,10 +156,14 @@ static inline memcached_return memcached_send(memcached_st *ptr, goto error; } - if ((ptr->flags & MEM_BUFFER_REQUESTS) && verb == SET_OP) + if (ptr->flags.buffer_requests && verb == SET_OP) + { to_write= 0; + } else + { to_write= 1; + } if ((sent_length= memcached_io_write(&ptr->hosts[server_key], "\r\n", 2, to_write)) == -1) { @@ -163,7 +171,7 @@ static inline memcached_return memcached_send(memcached_st *ptr, goto error; } - if (ptr->flags & MEM_NOREPLY) + if (ptr->flags.no_reply) return (to_write == 0) ? MEMCACHED_BUFFERED : MEMCACHED_SUCCESS; if (to_write == 0) @@ -183,12 +191,12 @@ error: } -memcached_return memcached_set(memcached_st *ptr, const char *key, size_t key_length, - const char *value, size_t value_length, - time_t expiration, - uint32_t flags) +memcached_return_t memcached_set(memcached_st *ptr, const char *key, size_t key_length, + const char *value, size_t value_length, + time_t expiration, + uint32_t flags) { - memcached_return rc; + memcached_return_t rc; LIBMEMCACHED_MEMCACHED_SET_START(); rc= memcached_send(ptr, key, key_length, key, key_length, value, value_length, @@ -197,13 +205,13 @@ memcached_return memcached_set(memcached_st *ptr, const char *key, size_t key_le return rc; } -memcached_return memcached_add(memcached_st *ptr, - const char *key, size_t key_length, - const char *value, size_t value_length, - time_t expiration, - uint32_t flags) +memcached_return_t memcached_add(memcached_st *ptr, + const char *key, size_t key_length, + const char *value, size_t value_length, + time_t expiration, + uint32_t flags) { - memcached_return rc; + memcached_return_t rc; LIBMEMCACHED_MEMCACHED_ADD_START(); rc= memcached_send(ptr, key, key_length, key, key_length, value, value_length, @@ -212,13 +220,13 @@ memcached_return memcached_add(memcached_st *ptr, return rc; } -memcached_return memcached_replace(memcached_st *ptr, - const char *key, size_t key_length, - const char *value, size_t value_length, - time_t expiration, - uint32_t flags) +memcached_return_t memcached_replace(memcached_st *ptr, + const char *key, size_t key_length, + const char *value, size_t value_length, + time_t expiration, + uint32_t flags) { - memcached_return rc; + memcached_return_t rc; LIBMEMCACHED_MEMCACHED_REPLACE_START(); rc= memcached_send(ptr, key, key_length, key, key_length, value, value_length, @@ -227,55 +235,55 @@ memcached_return memcached_replace(memcached_st *ptr, return rc; } -memcached_return memcached_prepend(memcached_st *ptr, - const char *key, size_t key_length, - const char *value, size_t value_length, - time_t expiration, - uint32_t flags) +memcached_return_t memcached_prepend(memcached_st *ptr, + const char *key, size_t key_length, + const char *value, size_t value_length, + time_t expiration, + uint32_t flags) { - memcached_return rc; + memcached_return_t rc; rc= memcached_send(ptr, key, key_length, key, key_length, value, value_length, expiration, flags, 0, PREPEND_OP); return rc; } -memcached_return memcached_append(memcached_st *ptr, - const char *key, size_t key_length, - const char *value, size_t value_length, - time_t expiration, - uint32_t flags) +memcached_return_t memcached_append(memcached_st *ptr, + const char *key, size_t key_length, + const char *value, size_t value_length, + time_t expiration, + uint32_t flags) { - memcached_return rc; + memcached_return_t rc; rc= memcached_send(ptr, key, key_length, key, key_length, value, value_length, expiration, flags, 0, APPEND_OP); return rc; } -memcached_return memcached_cas(memcached_st *ptr, - const char *key, size_t key_length, - const char *value, size_t value_length, - time_t expiration, - uint32_t flags, - uint64_t cas) +memcached_return_t memcached_cas(memcached_st *ptr, + const char *key, size_t key_length, + const char *value, size_t value_length, + time_t expiration, + uint32_t flags, + uint64_t cas) { - memcached_return rc; + memcached_return_t rc; rc= memcached_send(ptr, key, key_length, key, key_length, value, value_length, expiration, flags, cas, CAS_OP); return rc; } -memcached_return memcached_set_by_key(memcached_st *ptr, - const char *master_key __attribute__((unused)), - size_t master_key_length __attribute__((unused)), - const char *key, size_t key_length, - const char *value, size_t value_length, - time_t expiration, - uint32_t flags) +memcached_return_t memcached_set_by_key(memcached_st *ptr, + const char *master_key __attribute__((unused)), + size_t master_key_length __attribute__((unused)), + const char *key, size_t key_length, + const char *value, size_t value_length, + time_t expiration, + uint32_t flags) { - memcached_return rc; + memcached_return_t rc; LIBMEMCACHED_MEMCACHED_SET_START(); rc= memcached_send(ptr, master_key, master_key_length, key, key_length, value, value_length, @@ -284,14 +292,14 @@ memcached_return memcached_set_by_key(memcached_st *ptr, return rc; } -memcached_return memcached_add_by_key(memcached_st *ptr, - const char *master_key, size_t master_key_length, - const char *key, size_t key_length, - const char *value, size_t value_length, - time_t expiration, - uint32_t flags) +memcached_return_t memcached_add_by_key(memcached_st *ptr, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, + time_t expiration, + uint32_t flags) { - memcached_return rc; + memcached_return_t rc; LIBMEMCACHED_MEMCACHED_ADD_START(); rc= memcached_send(ptr, master_key, master_key_length, key, key_length, value, value_length, @@ -300,14 +308,14 @@ memcached_return memcached_add_by_key(memcached_st *ptr, return rc; } -memcached_return memcached_replace_by_key(memcached_st *ptr, - const char *master_key, size_t master_key_length, - const char *key, size_t key_length, - const char *value, size_t value_length, - time_t expiration, - uint32_t flags) +memcached_return_t memcached_replace_by_key(memcached_st *ptr, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, + time_t expiration, + uint32_t flags) { - memcached_return rc; + memcached_return_t rc; LIBMEMCACHED_MEMCACHED_REPLACE_START(); rc= memcached_send(ptr, master_key, master_key_length, key, key_length, value, value_length, @@ -316,50 +324,50 @@ memcached_return memcached_replace_by_key(memcached_st *ptr, return rc; } -memcached_return memcached_prepend_by_key(memcached_st *ptr, - const char *master_key, size_t master_key_length, - const char *key, size_t key_length, - const char *value, size_t value_length, - time_t expiration, - uint32_t flags) +memcached_return_t memcached_prepend_by_key(memcached_st *ptr, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, + time_t expiration, + uint32_t flags) { - memcached_return rc; + memcached_return_t rc; rc= memcached_send(ptr, master_key, master_key_length, key, key_length, value, value_length, expiration, flags, 0, PREPEND_OP); return rc; } -memcached_return memcached_append_by_key(memcached_st *ptr, - const char *master_key, size_t master_key_length, - const char *key, size_t key_length, - const char *value, size_t value_length, - time_t expiration, - uint32_t flags) +memcached_return_t memcached_append_by_key(memcached_st *ptr, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, + time_t expiration, + uint32_t flags) { - memcached_return rc; + memcached_return_t rc; rc= memcached_send(ptr, master_key, master_key_length, key, key_length, value, value_length, expiration, flags, 0, APPEND_OP); return rc; } -memcached_return memcached_cas_by_key(memcached_st *ptr, - const char *master_key, size_t master_key_length, - const char *key, size_t key_length, - const char *value, size_t value_length, - time_t expiration, - uint32_t flags, - uint64_t cas) +memcached_return_t memcached_cas_by_key(memcached_st *ptr, + const char *master_key, size_t master_key_length, + const char *key, size_t key_length, + const char *value, size_t value_length, + time_t expiration, + uint32_t flags, + uint64_t cas) { - memcached_return rc; + memcached_return_t rc; rc= memcached_send(ptr, master_key, master_key_length, key, key_length, value, value_length, expiration, flags, cas, CAS_OP); return rc; } -static inline uint8_t get_com_code(memcached_storage_action verb, bool noreply) +static inline uint8_t get_com_code(memcached_storage_action_t verb, bool noreply) { /* 0 isn't a value we want, but GCC 4.2 seems to think ret can otherwise * be used uninitialized in this function. FAIL */ @@ -412,30 +420,30 @@ static inline uint8_t get_com_code(memcached_storage_action verb, bool noreply) break; } - return ret; + return ret; } -static memcached_return memcached_send_binary(memcached_st *ptr, - const char *master_key, - size_t master_key_length, - const char *key, - size_t key_length, - const char *value, - size_t value_length, - time_t expiration, - uint32_t flags, - uint64_t cas, - memcached_storage_action verb) +static memcached_return_t memcached_send_binary(memcached_st *ptr, + const char *master_key, + size_t master_key_length, + const char *key, + size_t key_length, + const char *value, + size_t value_length, + time_t expiration, + uint32_t flags, + uint64_t cas, + memcached_storage_action_t verb) { - char flush; + uint8_t flush; protocol_binary_request_set request= {.bytes= {0}}; size_t send_length= sizeof(request.bytes); uint32_t server_key= memcached_generate_hash(ptr, master_key, master_key_length); memcached_server_st *server= &ptr->hosts[server_key]; - bool noreply= server->root->flags & MEM_NOREPLY; + bool noreply= server->root->flags.no_reply; request.message.header.request.magic= PROTOCOL_BINARY_REQ; request.message.header.request.opcode= get_com_code(verb, noreply); @@ -449,28 +457,29 @@ static memcached_return memcached_send_binary(memcached_st *ptr, request.message.body.flags= htonl(flags); request.message.body.expiration= htonl((uint32_t)expiration); } - - request.message.header.request.bodylen= htonl(key_length + value_length + - request.message.header.request.extlen); - + + request.message.header.request.bodylen= htonl((uint32_t) (key_length + value_length + + request.message.header.request.extlen)); + if (cas) request.message.header.request.cas= htonll(cas); - - flush= ((server->root->flags & MEM_BUFFER_REQUESTS) && verb == SET_OP) ? 0 : 1; - if ((server->root->flags & MEM_USE_UDP) && !flush) + flush= (uint8_t) ((server->root->flags.buffer_requests && verb == SET_OP) ? 0 : 1); + + if (server->root->flags.use_udp && !flush) { size_t cmd_size= send_length + key_length + value_length; + if (cmd_size > MAX_UDP_DATAGRAM_LENGTH - UDP_DATAGRAM_HEADER_LENGTH) return MEMCACHED_WRITE_FAILURE; if (cmd_size + server->write_buffer_offset > MAX_UDP_DATAGRAM_LENGTH) memcached_io_write(server,NULL,0, 1); } - + /* write the header */ if ((memcached_do(server, (const char*)request.bytes, send_length, 0) != MEMCACHED_SUCCESS) || (memcached_io_write(server, key, key_length, 0) == -1) || - (memcached_io_write(server, value, value_length, flush) == -1)) + (memcached_io_write(server, value, value_length, (char) flush) == -1)) { memcached_io_reset(server); return MEMCACHED_WRITE_FAILURE; @@ -490,7 +499,7 @@ static memcached_return memcached_send_binary(memcached_st *ptr, if ((memcached_do(srv, (const char*)request.bytes, send_length, 0) != MEMCACHED_SUCCESS) || (memcached_io_write(srv, key, key_length, 0) == -1) || - (memcached_io_write(srv, value, value_length, flush) == -1)) + (memcached_io_write(srv, value, value_length, (char) flush) == -1)) memcached_io_reset(srv); else memcached_server_response_decrement(srv);