Fixing failure of socket issue.
[m6w6/libmemcached] / lib / memcached_storage.c
1 /*
2 Memcached library
3
4 memcached_set()
5 memcached_replace()
6 memcached_add()
7
8 */
9
10 #include "common.h"
11 #include "memcached_io.h"
12
13 typedef enum {
14 SET_OP,
15 REPLACE_OP,
16 ADD_OP,
17 PREPEND_OP,
18 APPEND_OP,
19 CAS_OP,
20 } memcached_storage_action;
21
22 /* Inline this */
23 char *storage_op_string(memcached_storage_action verb)
24 {
25 switch (verb)
26 {
27 case SET_OP:
28 return "set";
29 case REPLACE_OP:
30 return "replace";
31 case ADD_OP:
32 return "add";
33 case PREPEND_OP:
34 return "prepend";
35 case APPEND_OP:
36 return "append";
37 case CAS_OP:
38 return "cas";
39 };
40
41 return SET_OP;
42 }
43
44 static inline memcached_return memcached_send(memcached_st *ptr,
45 char *key, size_t key_length,
46 char *value, size_t value_length,
47 time_t expiration,
48 uint16_t flags,
49 uint64_t cas,
50 memcached_storage_action verb)
51 {
52 char to_write;
53 size_t write_length;
54 ssize_t sent_length;
55 memcached_return rc;
56 char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
57 unsigned int server_key;
58
59 WATCHPOINT_ASSERT(!(value == NULL && value_length > 0));
60 WATCHPOINT_ASSERT(!(value && value_length == 0));
61
62 if (key_length == 0)
63 return MEMCACHED_NO_KEY_PROVIDED;
64
65 if (ptr->number_of_hosts == 0)
66 return MEMCACHED_NO_SERVERS;
67
68 server_key= memcached_generate_hash(ptr, key, key_length);
69
70 if (cas)
71 write_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE,
72 "%s %.*s %u %llu %zu %llu\r\n", storage_op_string(verb),
73 (int)key_length, key, flags,
74 (unsigned long long)expiration, value_length,
75 (unsigned long long)cas);
76 else
77 write_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE,
78 "%s %.*s %u %llu %zu\r\n", storage_op_string(verb),
79 (int)key_length, key, flags,
80 (unsigned long long)expiration, value_length);
81
82 if (write_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
83 {
84 rc= MEMCACHED_WRITE_FAILURE;
85 goto error;
86 }
87
88 rc= memcached_do(ptr, server_key, buffer, write_length, 0);
89 if (rc != MEMCACHED_SUCCESS)
90 goto error;
91
92 if ((sent_length= memcached_io_write(ptr, server_key, value, value_length, 0)) == -1)
93 {
94 rc= MEMCACHED_WRITE_FAILURE;
95 goto error;
96 }
97
98 if ((ptr->flags & MEM_NO_BLOCK) && verb == SET_OP)
99 to_write= 0;
100 else
101 to_write= 1;
102
103 if ((sent_length= memcached_io_write(ptr, server_key, "\r\n", 2, to_write)) == -1)
104 {
105 rc= MEMCACHED_WRITE_FAILURE;
106 goto error;
107 }
108
109 if (to_write == 0)
110 {
111 rc= MEMCACHED_SUCCESS;
112 memcached_server_response_increment(ptr, server_key);
113 }
114 else
115 {
116 rc= memcached_response(ptr, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, server_key);
117 }
118 if (rc == MEMCACHED_STORED)
119 return MEMCACHED_SUCCESS;
120 else
121 return rc;
122
123 error:
124 memcached_io_reset(ptr, server_key);
125
126 return rc;
127 }
128
129 memcached_return memcached_set(memcached_st *ptr, char *key, size_t key_length,
130 char *value, size_t value_length,
131 time_t expiration,
132 uint16_t flags)
133 {
134 memcached_return rc;
135 LIBMEMCACHED_MEMCACHED_SET_START();
136 rc= memcached_send(ptr, key, key_length, value, value_length,
137 expiration, flags, 0, SET_OP);
138 LIBMEMCACHED_MEMCACHED_SET_END();
139 return rc;
140 }
141
142 memcached_return memcached_add(memcached_st *ptr,
143 char *key, size_t key_length,
144 char *value, size_t value_length,
145 time_t expiration,
146 uint16_t flags)
147 {
148 memcached_return rc;
149 LIBMEMCACHED_MEMCACHED_ADD_START();
150 rc= memcached_send(ptr, key, key_length, value, value_length,
151 expiration, flags, 0, ADD_OP);
152 LIBMEMCACHED_MEMCACHED_ADD_END();
153 return rc;
154 }
155
156 memcached_return memcached_replace(memcached_st *ptr,
157 char *key, size_t key_length,
158 char *value, size_t value_length,
159 time_t expiration,
160 uint16_t flags)
161 {
162 memcached_return rc;
163 LIBMEMCACHED_MEMCACHED_REPLACE_START();
164 rc= memcached_send(ptr, key, key_length, value, value_length,
165 expiration, flags, 0, REPLACE_OP);
166 LIBMEMCACHED_MEMCACHED_REPLACE_END();
167 return rc;
168 }
169
170 memcached_return memcached_prepend(memcached_st *ptr,
171 char *key, size_t key_length,
172 char *value, size_t value_length,
173 time_t expiration,
174 uint16_t flags)
175 {
176 memcached_return rc;
177 rc= memcached_send(ptr, key, key_length, value, value_length,
178 expiration, flags, 0, PREPEND_OP);
179 return rc;
180 }
181
182 memcached_return memcached_append(memcached_st *ptr,
183 char *key, size_t key_length,
184 char *value, size_t value_length,
185 time_t expiration,
186 uint16_t flags)
187 {
188 memcached_return rc;
189 rc= memcached_send(ptr, key, key_length, value, value_length,
190 expiration, flags, 0, APPEND_OP);
191 return rc;
192 }
193
194 memcached_return memcached_cas(memcached_st *ptr,
195 char *key, size_t key_length,
196 char *value, size_t value_length,
197 time_t expiration,
198 uint16_t flags,
199 uint64_t cas)
200 {
201 memcached_return rc;
202 rc= memcached_send(ptr, key, key_length, value, value_length,
203 expiration, flags, cas, APPEND_OP);
204 return rc;
205 }