Adding buffered IO to reads
[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, unsigned int server_key,
8 char *buffer, size_t length)
9 {
10 size_t x;
11
12 for (x= 0; x < length; x++)
13 {
14 if (!ptr->read_buffer_length)
15 {
16 ptr->read_buffer_length= recv(ptr->hosts[server_key].fd,
17 ptr->read_buffer,
18 MEMCACHED_MAX_BUFFER, 0);
19 ptr->read_ptr= ptr->read_buffer;
20
21 if (ptr->read_buffer_length == -1)
22 return -1;
23 if (ptr->read_buffer_length == 0)
24 return x;
25 }
26 buffer[x]= *ptr->read_ptr;
27 ptr->read_ptr++;
28 ptr->read_buffer_length--;
29 }
30
31 return length;
32 }
33
34 ssize_t memcached_io_write(memcached_st *ptr, unsigned int server_key,
35 char *buffer, size_t length)
36 {
37 unsigned long long x;
38
39 for (x= 0; x < length; x++)
40 {
41 ptr->write_buffer[ptr->write_buffer_offset]= buffer[x];
42 ptr->write_buffer_offset++;
43 if (ptr->write_buffer_offset == MEMCACHED_MAX_BUFFER)
44 {
45 size_t sent_length;
46
47 if ((sent_length= send(ptr->hosts[server_key].fd, ptr->write_buffer,
48 MEMCACHED_MAX_BUFFER, 0)) == -1)
49 return -1;
50
51 assert(sent_length == MEMCACHED_MAX_BUFFER);
52 ptr->write_between_flush+= MEMCACHED_MAX_BUFFER;
53
54 ptr->write_buffer_offset= 0;
55 }
56 }
57
58 return length;
59 }
60
61 ssize_t memcached_io_flush(memcached_st *ptr, unsigned int server_key)
62 {
63 size_t sent_length;
64
65 if (ptr->write_buffer_offset == 0)
66 return 0;
67
68 if ((sent_length= send(ptr->hosts[server_key].fd, ptr->write_buffer,
69 ptr->write_buffer_offset, 0)) == -1)
70 return -1;
71
72 assert(sent_length == ptr->write_buffer_offset);
73
74 sent_length+= ptr->write_between_flush;
75
76 ptr->write_buffer_offset= 0;
77 ptr->write_between_flush= 0;
78
79 return sent_length;
80 }
81
82 /*
83 Eventually we will just kill off the server with the problem.
84 */
85 void memcached_io_reset(memcached_st *ptr, unsigned int server_key)
86 {
87 ptr->write_buffer_offset= 0;
88 memcached_quit(ptr);
89 }