#include "common.h"
-memcached_return memcached_do(memcached_server_st *ptr, char *command,
- size_t command_length, uint8_t with_flush)
+memcached_return_t memcached_do(memcached_server_st *ptr, const void *command,
+ size_t command_length, uint8_t with_flush)
{
- memcached_return rc;
+ memcached_return_t rc;
ssize_t sent_length;
WATCHPOINT_ASSERT(command_length);
WATCHPOINT_ASSERT(command);
if ((rc= memcached_connect(ptr)) != MEMCACHED_SUCCESS)
+ {
+ WATCHPOINT_ERROR(rc);
return rc;
+ }
- sent_length= memcached_io_write(ptr, command, command_length, with_flush);
+ /*
+ ** Since non buffering ops in UDP mode dont check to make sure they will fit
+ ** before they start writing, if there is any data in buffer, clear it out,
+ ** otherwise we might get a partial write.
+ **/
+ if (ptr->type == MEMCACHED_CONNECTION_UDP && with_flush && ptr->write_buffer_offset > UDP_DATAGRAM_HEADER_LENGTH)
+ memcached_io_write(ptr, NULL, 0, 1);
- if (sent_length == -1 || sent_length != command_length)
+ sent_length= memcached_io_write(ptr, command, command_length, (char) with_flush);
+
+ if (sent_length == -1 || (size_t)sent_length != command_length)
rc= MEMCACHED_WRITE_FAILURE;
- else
+ else if ((ptr->root->flags.no_reply) == 0)
memcached_server_response_increment(ptr);
return rc;