2 * Copyright (C) 2006-2010 Brian Aker
5 * Use and distribution licensed under the BSD license. See
6 * the COPYING file in the parent directory for full text.
12 #include <libmemcached/common.h>
14 memcached_return_t
memcached_vdo(memcached_server_write_instance_st instance
,
15 libmemcached_io_vector_st
*vector
,
17 const bool with_flush
)
19 memcached_return_t rc
;
21 WATCHPOINT_ASSERT(count
);
22 WATCHPOINT_ASSERT(vector
);
24 if (memcached_failed(rc
= memcached_connect(instance
)))
27 assert_msg(instance
->error_messages
, "memcached_connect() returned an error but the memcached_server_write_instance_st showed none.");
32 ** Since non buffering ops in UDP mode dont check to make sure they will fit
33 ** before they start writing, if there is any data in buffer, clear it out,
34 ** otherwise we might get a partial write.
36 if (memcached_is_udp(instance
->root
))
38 size_t write_length
= io_vector_total_size(vector
, 11) +UDP_DATAGRAM_HEADER_LENGTH
;
40 if (write_length
> MAX_UDP_DATAGRAM_LENGTH
- UDP_DATAGRAM_HEADER_LENGTH
)
42 return MEMCACHED_WRITE_FAILURE
;
45 return MEMCACHED_NOT_SUPPORTED
;
48 ssize_t sent_length
= memcached_io_writev(instance
, vector
, count
, with_flush
);
49 size_t command_length
= 0;
50 for (uint32_t x
= 0; x
< count
; ++x
, vector
++)
52 command_length
+= vector
->length
;
55 if (sent_length
== -1 or size_t(sent_length
) != command_length
)
57 rc
= MEMCACHED_WRITE_FAILURE
;
59 WATCHPOINT_ERRNO(errno
);
61 else if (memcached_is_replying(instance
->root
))
63 memcached_server_response_increment(instance
);