8615aa6e13eb38c0433bba15e95fab12a4473ceb
[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 char *buffer_ptr;
12
13 buffer_ptr= buffer;
14
15 for (x= 0, buffer_ptr= buffer;
16 x < length; x++)
17 {
18 if (!ptr->read_buffer_length)
19 {
20 if (length > 1)
21 {
22
23 size_t data_read;
24 data_read= recv(ptr->hosts[server_key].fd,
25 buffer_ptr,
26 length - x, 0);
27 if (data_read == -1)
28 return -1;
29 if (data_read == 0)
30 return x;
31
32 data_read+= x;
33
34 return data_read;
35 }
36 else
37 {
38 ptr->read_buffer_length= recv(ptr->hosts[server_key].fd,
39 ptr->read_buffer,
40 MEMCACHED_MAX_BUFFER, 0);
41 ptr->read_ptr= ptr->read_buffer;
42 }
43
44 if (ptr->read_buffer_length == -1)
45 return -1;
46 if (ptr->read_buffer_length == 0)
47 return x;
48 }
49 *buffer_ptr= *ptr->read_ptr;
50 buffer_ptr++;
51 ptr->read_ptr++;
52 ptr->read_buffer_length--;
53 }
54
55 return length;
56 }
57
58 ssize_t memcached_io_write(memcached_st *ptr, unsigned int server_key,
59 char *buffer, size_t length)
60 {
61 unsigned long long x;
62
63 for (x= 0; x < length; x++)
64 {
65 ptr->write_buffer[ptr->write_buffer_offset]= buffer[x];
66 ptr->write_buffer_offset++;
67 if (ptr->write_buffer_offset == MEMCACHED_MAX_BUFFER)
68 {
69 size_t sent_length;
70
71 if ((sent_length= send(ptr->hosts[server_key].fd, ptr->write_buffer,
72 MEMCACHED_MAX_BUFFER, 0)) == -1)
73 return -1;
74
75 assert(sent_length == MEMCACHED_MAX_BUFFER);
76 ptr->write_between_flush+= MEMCACHED_MAX_BUFFER;
77
78 ptr->write_buffer_offset= 0;
79 }
80 }
81
82 return length;
83 }
84
85 ssize_t memcached_io_flush(memcached_st *ptr, unsigned int server_key)
86 {
87 size_t sent_length;
88
89 if (ptr->write_buffer_offset == 0)
90 return 0;
91
92 if ((sent_length= send(ptr->hosts[server_key].fd, ptr->write_buffer,
93 ptr->write_buffer_offset, 0)) == -1)
94 return -1;
95
96 assert(sent_length == ptr->write_buffer_offset);
97
98 sent_length+= ptr->write_between_flush;
99
100 ptr->write_buffer_offset= 0;
101 ptr->write_between_flush= 0;
102
103 return sent_length;
104 }
105
106 /*
107 Eventually we will just kill off the server with the problem.
108 */
109 void memcached_io_reset(memcached_st *ptr, unsigned int server_key)
110 {
111 ptr->write_buffer_offset= 0;
112 memcached_quit(ptr);
113 }