Added buffered IO to write calls
[awesomized/libmemcached] / lib / memcached_io.c
1 /*
2 Basic socket buffered IO
3 */
4
5 #include <memcached.h>
6
7 ssize_t memcached_io_read(memcached_st *ptr, char *buf, size_t length)
8 {
9 return -1;
10 }
11
12 ssize_t memcached_io_write(memcached_st *ptr, unsigned int server_key,
13 char *buffer, size_t length)
14 {
15 unsigned long long x;
16
17 for (x= 0; x < length; x++)
18 {
19 ptr->write_buffer[ptr->write_buffer_offset]= buffer[x];
20 ptr->write_buffer_offset++;
21 if (ptr->write_buffer_offset == MEMCACHED_MAX_BUFFER)
22 {
23 size_t sent_length;
24
25 if ((sent_length= send(ptr->hosts[server_key].fd, ptr->write_buffer,
26 MEMCACHED_MAX_BUFFER, 0)) == -1)
27 return -1;
28
29 assert(sent_length == MEMCACHED_MAX_BUFFER);
30 ptr->write_between_flush+= MEMCACHED_MAX_BUFFER;
31
32 ptr->write_buffer_offset= 0;
33 }
34 }
35
36 return length;
37 }
38
39 ssize_t memcached_io_flush(memcached_st *ptr, unsigned int server_key)
40 {
41 size_t sent_length;
42
43 if (ptr->write_buffer_offset == 0)
44 return 0;
45
46 if ((sent_length= send(ptr->hosts[server_key].fd, ptr->write_buffer,
47 ptr->write_buffer_offset, 0)) == -1)
48 return -1;
49
50 assert(sent_length == ptr->write_buffer_offset);
51
52 sent_length+= ptr->write_between_flush;
53
54 ptr->write_buffer_offset= 0;
55 ptr->write_between_flush= 0;
56
57 return sent_length;
58 }
59
60 /*
61 Eventually we will just kill off the server with the problem.
62 */
63 void memcached_io_reset(memcached_st *ptr, unsigned int server_key)
64 {
65 ptr->write_buffer_offset= 0;
66 memcached_quit(ptr);
67 }