25f9aaf9efb7f44a5348a46fc2e12bc4d790762c
[awesomized/libmemcached] / lib / memcached_auto.c
1 #include "common.h"
2
3 static memcached_return memcached_auto(memcached_st *ptr,
4 char *verb,
5 char *key, size_t key_length,
6 unsigned int offset,
7 unsigned int *value)
8 {
9 size_t send_length, sent_length;
10 memcached_return rc;
11 char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
12 unsigned int server_key;
13
14 if (ptr->hosts == NULL || ptr->number_of_hosts == 0)
15 return MEMCACHED_NO_SERVERS;
16
17 server_key= memcached_generate_hash(ptr, key, key_length);
18
19 if ((rc= memcached_connect(ptr, server_key)) != MEMCACHED_SUCCESS)
20 return rc;
21
22 send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE,
23 "%s %.*s %u\r\n", verb,
24 (int)key_length, key,
25 offset);
26 if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
27 return MEMCACHED_WRITE_FAILURE;
28 sent_length= memcached_io_write(ptr, server_key, buffer, send_length, 1);
29
30 if (sent_length == -1 || sent_length != send_length)
31 return MEMCACHED_WRITE_FAILURE;
32
33 memset(buffer, 0, MEMCACHED_DEFAULT_COMMAND_SIZE);
34
35 rc= memcached_response(ptr, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, server_key);
36
37 /*
38 So why recheck responce? Because the protocol is brain dead :)
39 The number returned might end up equaling one of the string
40 values. Less chance of a mistake with memcmp() so we will
41 use it. We still called memcached_response() though since it
42 worked its magic for non-blocking IO.
43 */
44 if (!memcmp(buffer, "ERROR\r\n", MEMCACHED_DEFAULT_COMMAND_SIZE))
45 {
46 *value= 0;
47 rc= MEMCACHED_PROTOCOL_ERROR;
48 }
49 else if (!memcmp(buffer, "NOT_FOUND\r\n", MEMCACHED_DEFAULT_COMMAND_SIZE))
50 {
51 *value= 0;
52 rc= MEMCACHED_NOTFOUND;
53 }
54 else
55 {
56 *value= strtol(buffer, (char **)NULL, 10);
57 rc= MEMCACHED_SUCCESS;
58 }
59
60 return rc;
61 }
62
63 memcached_return memcached_increment(memcached_st *ptr,
64 char *key, size_t key_length,
65 unsigned int offset,
66 unsigned int *value)
67 {
68 memcached_return rc;
69
70 LIBMEMCACHED_MEMCACHED_INCREMENT_START();
71 rc= memcached_auto(ptr, "incr", key, key_length, offset, value);
72 LIBMEMCACHED_MEMCACHED_INCREMENT_END();
73
74 return rc;
75 }
76
77 memcached_return memcached_decrement(memcached_st *ptr,
78 char *key, size_t key_length,
79 unsigned int offset,
80 unsigned int *value)
81 {
82 memcached_return rc;
83
84 LIBMEMCACHED_MEMCACHED_DECREMENT_START();
85 rc= memcached_auto(ptr, "decr", key, key_length, offset, value);
86 LIBMEMCACHED_MEMCACHED_DECREMENT_END();
87
88 return rc;
89 }