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