memcached 1.2.6 → 1.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +2 -0
- data/Manifest +206 -12
- data/Rakefile +32 -1
- data/ext/extconf.rb +10 -35
- data/ext/libmemcached-0.32/AUTHORS +7 -0
- data/ext/libmemcached-0.32/COPYING +32 -0
- data/ext/libmemcached-0.32/ChangeLog +303 -0
- data/ext/libmemcached-0.32/INSTALL +302 -0
- data/ext/libmemcached-0.32/Makefile.am +36 -0
- data/ext/libmemcached-0.32/Makefile.in +828 -0
- data/ext/libmemcached-0.32/NEWS +1 -0
- data/ext/libmemcached-0.32/README +33 -0
- data/ext/libmemcached-0.32/THANKS +14 -0
- data/ext/libmemcached-0.32/TODO +11 -0
- data/ext/libmemcached-0.32/aclocal.m4 +1852 -0
- data/ext/libmemcached-0.32/clients/Makefile.am +73 -0
- data/ext/libmemcached-0.32/clients/Makefile.in +770 -0
- data/ext/libmemcached-0.32/clients/client_options.h +32 -0
- data/ext/libmemcached-0.32/clients/execute.c +64 -0
- data/ext/libmemcached-0.32/clients/execute.h +5 -0
- data/ext/libmemcached-0.32/clients/generator.c +74 -0
- data/ext/libmemcached-0.32/clients/generator.h +20 -0
- data/ext/libmemcached-0.32/clients/memcat.c +178 -0
- data/ext/libmemcached-0.32/clients/memcp.c +251 -0
- data/ext/libmemcached-0.32/clients/memdump.c +170 -0
- data/ext/libmemcached-0.32/clients/memerror.c +80 -0
- data/ext/libmemcached-0.32/clients/memflush.c +143 -0
- data/ext/libmemcached-0.32/clients/memrm.c +160 -0
- data/ext/libmemcached-0.32/clients/memslap.c +441 -0
- data/ext/libmemcached-0.32/clients/memstat.c +326 -0
- data/ext/libmemcached-0.32/clients/utilities.c +207 -0
- data/ext/libmemcached-0.32/clients/utilities.h +41 -0
- data/ext/libmemcached-0.32/config.h.in +252 -0
- data/ext/libmemcached-0.32/config/compile +143 -0
- data/ext/libmemcached-0.32/config/config.guess +1561 -0
- data/ext/libmemcached-0.32/config/config.rpath +666 -0
- data/ext/libmemcached-0.32/config/config.sub +1686 -0
- data/ext/libmemcached-0.32/config/depcomp +630 -0
- data/ext/libmemcached-0.32/config/install-sh +520 -0
- data/ext/libmemcached-0.32/config/ltmain.sh +8406 -0
- data/ext/libmemcached-0.32/config/missing +376 -0
- data/ext/libmemcached-0.32/configure +23048 -0
- data/ext/libmemcached-0.32/configure.ac +122 -0
- data/ext/libmemcached-0.32/docs/Makefile.am +415 -0
- data/ext/libmemcached-0.32/docs/Makefile.in +918 -0
- data/ext/libmemcached-0.32/docs/libmemcached.pod +123 -0
- data/ext/libmemcached-0.32/docs/libmemcached_examples.pod +115 -0
- data/ext/libmemcached-0.32/docs/libmemcachedutil.pod +40 -0
- data/ext/libmemcached-0.32/docs/memcached_analyze.pod +52 -0
- data/ext/libmemcached-0.32/docs/memcached_auto.pod +97 -0
- data/ext/libmemcached-0.32/docs/memcached_behavior.pod +224 -0
- data/ext/libmemcached-0.32/docs/memcached_callback.pod +123 -0
- data/ext/libmemcached-0.32/docs/memcached_create.pod +61 -0
- data/ext/libmemcached-0.32/docs/memcached_delete.pod +54 -0
- data/ext/libmemcached-0.32/docs/memcached_dump.pod +53 -0
- data/ext/libmemcached-0.32/docs/memcached_flush.pod +46 -0
- data/ext/libmemcached-0.32/docs/memcached_flush_buffers.pod +42 -0
- data/ext/libmemcached-0.32/docs/memcached_generate_hash_value.pod +57 -0
- data/ext/libmemcached-0.32/docs/memcached_get.pod +161 -0
- data/ext/libmemcached-0.32/docs/memcached_memory_allocators.pod +73 -0
- data/ext/libmemcached-0.32/docs/memcached_pool.pod +77 -0
- data/ext/libmemcached-0.32/docs/memcached_quit.pod +47 -0
- data/ext/libmemcached-0.32/docs/memcached_sasl.pod +63 -0
- data/ext/libmemcached-0.32/docs/memcached_server_st.pod +75 -0
- data/ext/libmemcached-0.32/docs/memcached_servers.pod +102 -0
- data/ext/libmemcached-0.32/docs/memcached_set.pod +187 -0
- data/ext/libmemcached-0.32/docs/memcached_stats.pod +82 -0
- data/ext/libmemcached-0.32/docs/memcached_strerror.pod +46 -0
- data/ext/libmemcached-0.32/docs/memcached_user_data.pod +49 -0
- data/ext/libmemcached-0.32/docs/memcached_verbosity.pod +41 -0
- data/ext/libmemcached-0.32/docs/memcached_version.pod +56 -0
- data/ext/libmemcached-0.32/docs/memcat.pod +37 -0
- data/ext/libmemcached-0.32/docs/memcp.pod +40 -0
- data/ext/libmemcached-0.32/docs/memdump.pod +31 -0
- data/ext/libmemcached-0.32/docs/memerror.pod +30 -0
- data/ext/libmemcached-0.32/docs/memflush.pod +35 -0
- data/ext/libmemcached-0.32/docs/memrm.pod +34 -0
- data/ext/libmemcached-0.32/docs/memslap.pod +33 -0
- data/ext/libmemcached-0.32/docs/memstat.pod +35 -0
- data/ext/libmemcached-0.32/libmemcached/Makefile.am +107 -0
- data/ext/libmemcached-0.32/libmemcached/Makefile.in +1050 -0
- data/ext/libmemcached-0.32/libmemcached/byteorder.c +31 -0
- data/ext/libmemcached-0.32/libmemcached/common.h +183 -0
- data/ext/libmemcached-0.32/libmemcached/crc.c +86 -0
- data/ext/libmemcached-0.32/libmemcached/hsieh_hash.c +68 -0
- data/ext/libmemcached-0.32/libmemcached/jenkins_hash.c +213 -0
- data/ext/libmemcached-0.32/libmemcached/libmemcached.ver +1 -0
- data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.d +28 -0
- data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.h +78 -0
- data/ext/libmemcached-0.32/libmemcached/md5.c +354 -0
- data/ext/libmemcached-0.32/libmemcached/memcached.c +152 -0
- data/ext/libmemcached-0.32/libmemcached/memcached.h +302 -0
- data/ext/libmemcached-0.32/libmemcached/memcached.hpp +799 -0
- data/ext/libmemcached-0.32/libmemcached/memcached/README.txt +7 -0
- data/ext/libmemcached-0.32/libmemcached/memcached/protocol_binary.h +366 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_allocators.c +72 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_analyze.c +100 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_auto.c +207 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_behavior.c +285 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_callback.c +175 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_configure.h.in +23 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_connect.c +361 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_constants.h +145 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_delete.c +0 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_do.c +34 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_dump.c +79 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_fetch.c +102 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_flush.c +89 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_flush_buffers.c +22 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_get.c +495 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_get.h +87 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_hash.c +252 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_hosts.c +510 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_internal.h +31 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_io.c +547 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_io.h +59 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_key.c +28 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_parse.c +74 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_pool.h +38 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_purge.c +76 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_quit.c +75 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_response.c +528 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_result.c +57 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_result.h +59 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_sasl.c +225 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_sasl.h +44 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_server.c +159 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_server.h +93 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_stats.c +454 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_storage.c +514 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_storage.h +107 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_strerror.c +92 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_string.c +138 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_string.h +53 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_types.h +44 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_util.h +15 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_verbosity.c +36 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_version.c +112 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_watchpoint.h +38 -0
- data/ext/libmemcached-0.32/libmemcached/murmur_hash.c +76 -0
- data/ext/libmemcached-0.32/libmemcached/visibility.h +51 -0
- data/ext/libmemcached-0.32/libmemcachedutil/Makefile.am +11 -0
- data/ext/libmemcached-0.32/libmemcachedutil/Makefile.in +602 -0
- data/ext/libmemcached-0.32/libmemcachedutil/libmemcachedutil.ver +1 -0
- data/ext/libmemcached-0.32/libmemcachedutil/memcached_pool.c +170 -0
- data/ext/libmemcached-0.32/m4/ac_cxx_compile_stdcxx_0x.m4 +103 -0
- data/ext/libmemcached-0.32/m4/ac_cxx_header_stdcxx_98.m4 +67 -0
- data/ext/libmemcached-0.32/m4/acx_pthread.m4 +276 -0
- data/ext/libmemcached-0.32/m4/byteorder.m4 +40 -0
- data/ext/libmemcached-0.32/m4/deprecated.m4 +17 -0
- data/ext/libmemcached-0.32/m4/enable_utillib.m4 +16 -0
- data/ext/libmemcached-0.32/m4/extensions.m4 +94 -0
- data/ext/libmemcached-0.32/m4/hsieh.m4 +18 -0
- data/ext/libmemcached-0.32/m4/lib-prefix.m4 +221 -0
- data/ext/libmemcached-0.32/m4/libtool.m4 +7360 -0
- data/ext/libmemcached-0.32/m4/ltoptions.m4 +368 -0
- data/ext/libmemcached-0.32/m4/ltsugar.m4 +123 -0
- data/ext/libmemcached-0.32/m4/ltversion.m4 +23 -0
- data/ext/libmemcached-0.32/m4/lt~obsolete.m4 +92 -0
- data/ext/libmemcached-0.32/m4/memcached.m4 +30 -0
- data/ext/libmemcached-0.32/m4/pandora_64bit.m4 +55 -0
- data/ext/libmemcached-0.32/m4/pandora_canonical.m4 +151 -0
- data/ext/libmemcached-0.32/m4/pandora_check_compiler_version.m4 +37 -0
- data/ext/libmemcached-0.32/m4/pandora_check_cxx_standard.m4 +16 -0
- data/ext/libmemcached-0.32/m4/pandora_enable_dtrace.m4 +41 -0
- data/ext/libmemcached-0.32/m4/pandora_ensure_gcc_version.m4 +36 -0
- data/ext/libmemcached-0.32/m4/pandora_have_better_malloc.m4 +54 -0
- data/ext/libmemcached-0.32/m4/pandora_have_sasl.m4 +133 -0
- data/ext/libmemcached-0.32/m4/pandora_header_assert.m4 +23 -0
- data/ext/libmemcached-0.32/m4/pandora_libtool.m4 +15 -0
- data/ext/libmemcached-0.32/m4/pandora_optimize.m4 +79 -0
- data/ext/libmemcached-0.32/m4/pandora_shared_ptr.m4 +56 -0
- data/ext/libmemcached-0.32/m4/pandora_vc_build.m4 +32 -0
- data/ext/libmemcached-0.32/m4/pandora_warnings.m4 +262 -0
- data/ext/libmemcached-0.32/m4/pod2man.m4 +7 -0
- data/ext/libmemcached-0.32/m4/protocol_binary.m4 +23 -0
- data/ext/libmemcached-0.32/m4/setsockopt.m4 +57 -0
- data/ext/libmemcached-0.32/m4/visibility.m4 +52 -0
- data/ext/libmemcached-0.32/support/Makefile.am +4 -0
- data/ext/libmemcached-0.32/support/Makefile.in +485 -0
- data/ext/libmemcached-0.32/support/libmemcached-fc.spec.in +105 -0
- data/ext/libmemcached-0.32/support/libmemcached.pc.in +10 -0
- data/ext/libmemcached-0.32/support/libmemcached.spec +105 -0
- data/ext/libmemcached-0.32/support/libmemcached.spec.in +105 -0
- data/ext/libmemcached-0.32/support/set_benchmark.sh +5 -0
- data/ext/libmemcached-0.32/tests/Makefile.am +105 -0
- data/ext/libmemcached-0.32/tests/Makefile.in +748 -0
- data/ext/libmemcached-0.32/tests/atomsmasher.c +245 -0
- data/ext/libmemcached-0.32/tests/function.c +4781 -0
- data/ext/libmemcached-0.32/tests/ketama_test_cases.h +108 -0
- data/ext/libmemcached-0.32/tests/output.cmp +7 -0
- data/ext/libmemcached-0.32/tests/output.res +7 -0
- data/ext/libmemcached-0.32/tests/output2.res +46 -0
- data/ext/libmemcached-0.32/tests/plus.cpp +293 -0
- data/ext/libmemcached-0.32/tests/r/memcat.res +19 -0
- data/ext/libmemcached-0.32/tests/r/memcp.res +27 -0
- data/ext/libmemcached-0.32/tests/r/memrm.res +19 -0
- data/ext/libmemcached-0.32/tests/r/memslap.res +33 -0
- data/ext/libmemcached-0.32/tests/r/memstat.res +33 -0
- data/ext/libmemcached-0.32/tests/server.c +118 -0
- data/ext/libmemcached-0.32/tests/server.h +25 -0
- data/ext/libmemcached-0.32/tests/start.c +16 -0
- data/ext/libmemcached-0.32/tests/t/memcat.test +4 -0
- data/ext/libmemcached-0.32/tests/t/memcp.test +3 -0
- data/ext/libmemcached-0.32/tests/t/memrm.test +3 -0
- data/ext/libmemcached-0.32/tests/t/memslap.test +5 -0
- data/ext/libmemcached-0.32/tests/t/memstat.test +3 -0
- data/ext/libmemcached-0.32/tests/test.c +137 -0
- data/ext/libmemcached-0.32/tests/test.h +46 -0
- data/ext/libmemcached-0.32/tests/udp.c +76 -0
- data/memcached.gemspec +4 -4
- data/test/unit/memcached_test.rb +30 -0
- metadata +213 -16
- data/ext/libmemcached-0.32.tar.gz +0 -0
- data/ext/libmemcached-1.patch +0 -270
- data/ext/libmemcached-10.patch +0 -12
- data/ext/libmemcached-2.patch +0 -116
- data/ext/libmemcached-3.patch +0 -8
- data/ext/libmemcached-4.patch +0 -40
- data/ext/libmemcached-5.patch +0 -832
- data/ext/libmemcached-6.patch +0 -20
- data/ext/libmemcached-7.patch +0 -2989
- data/ext/libmemcached-8.patch +0 -137
- data/ext/libmemcached-9.patch +0 -13
- data/ext/sasl.patch +0 -29283
@@ -0,0 +1,207 @@
|
|
1
|
+
#include "common.h"
|
2
|
+
|
3
|
+
static memcached_return memcached_auto(memcached_st *ptr,
|
4
|
+
const char *verb,
|
5
|
+
const char *key, size_t key_length,
|
6
|
+
unsigned int offset,
|
7
|
+
uint64_t *value)
|
8
|
+
{
|
9
|
+
size_t send_length;
|
10
|
+
memcached_return rc;
|
11
|
+
char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
|
12
|
+
unsigned int server_key;
|
13
|
+
bool no_reply= (ptr->flags & MEM_NOREPLY);
|
14
|
+
|
15
|
+
unlikely (ptr->hosts == NULL || ptr->number_of_hosts == 0)
|
16
|
+
return MEMCACHED_NO_SERVERS;
|
17
|
+
|
18
|
+
if ((ptr->flags & MEM_VERIFY_KEY) && (memcached_key_test((const char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
|
19
|
+
return MEMCACHED_BAD_KEY_PROVIDED;
|
20
|
+
|
21
|
+
server_key= memcached_generate_hash(ptr, key, key_length);
|
22
|
+
|
23
|
+
send_length= (size_t)snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE,
|
24
|
+
"%s %s%.*s %u%s\r\n", verb,
|
25
|
+
ptr->prefix_key,
|
26
|
+
(int)key_length, key,
|
27
|
+
offset, no_reply ? " noreply" : "");
|
28
|
+
unlikely (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
|
29
|
+
return MEMCACHED_WRITE_FAILURE;
|
30
|
+
|
31
|
+
rc= memcached_do(&ptr->hosts[server_key], buffer, send_length, 1);
|
32
|
+
if (no_reply || rc != MEMCACHED_SUCCESS)
|
33
|
+
return rc;
|
34
|
+
|
35
|
+
rc= memcached_response(&ptr->hosts[server_key], buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, NULL);
|
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 strncmp() 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 (!strncmp(buffer, "ERROR\r\n", 7))
|
45
|
+
{
|
46
|
+
*value= 0;
|
47
|
+
rc= MEMCACHED_PROTOCOL_ERROR;
|
48
|
+
}
|
49
|
+
else if (!strncmp(buffer, "NOT_FOUND\r\n", 11))
|
50
|
+
{
|
51
|
+
*value= 0;
|
52
|
+
rc= MEMCACHED_NOTFOUND;
|
53
|
+
}
|
54
|
+
else
|
55
|
+
{
|
56
|
+
*value= strtoull(buffer, (char **)NULL, 10);
|
57
|
+
rc= MEMCACHED_SUCCESS;
|
58
|
+
}
|
59
|
+
|
60
|
+
return rc;
|
61
|
+
}
|
62
|
+
|
63
|
+
static memcached_return binary_incr_decr(memcached_st *ptr, uint8_t cmd,
|
64
|
+
const char *key, size_t key_length,
|
65
|
+
uint64_t offset, uint64_t initial,
|
66
|
+
uint32_t expiration,
|
67
|
+
uint64_t *value)
|
68
|
+
{
|
69
|
+
unsigned int server_key;
|
70
|
+
bool no_reply= (ptr->flags & MEM_NOREPLY);
|
71
|
+
|
72
|
+
unlikely (ptr->hosts == NULL || ptr->number_of_hosts == 0)
|
73
|
+
return MEMCACHED_NO_SERVERS;
|
74
|
+
|
75
|
+
server_key= memcached_generate_hash(ptr, key, key_length);
|
76
|
+
|
77
|
+
if (no_reply)
|
78
|
+
{
|
79
|
+
if(cmd == PROTOCOL_BINARY_CMD_DECREMENT)
|
80
|
+
cmd= PROTOCOL_BINARY_CMD_DECREMENTQ;
|
81
|
+
if(cmd == PROTOCOL_BINARY_CMD_INCREMENT)
|
82
|
+
cmd= PROTOCOL_BINARY_CMD_INCREMENTQ;
|
83
|
+
}
|
84
|
+
protocol_binary_request_incr request= {.bytes= {0}};
|
85
|
+
|
86
|
+
uint16_t key_with_prefix_length = ptr->prefix_key_length + key_length;
|
87
|
+
char *key_with_prefix = alloca(key_with_prefix_length + 1);
|
88
|
+
strcpy(key_with_prefix, ptr->prefix_key);
|
89
|
+
strcat(key_with_prefix, key);
|
90
|
+
|
91
|
+
|
92
|
+
request.message.header.request.magic= PROTOCOL_BINARY_REQ;
|
93
|
+
request.message.header.request.opcode= cmd;
|
94
|
+
request.message.header.request.keylen= htons((uint16_t) key_with_prefix_length);
|
95
|
+
request.message.header.request.extlen= 20;
|
96
|
+
request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES;
|
97
|
+
request.message.header.request.bodylen= htonl((uint32_t) (key_with_prefix_length + request.message.header.request.extlen));
|
98
|
+
request.message.body.delta= htonll(offset);
|
99
|
+
request.message.body.initial= htonll(initial);
|
100
|
+
request.message.body.expiration= htonl((uint32_t) expiration);
|
101
|
+
|
102
|
+
if ((memcached_do(&ptr->hosts[server_key], request.bytes,
|
103
|
+
sizeof(request.bytes), 0)!=MEMCACHED_SUCCESS) ||
|
104
|
+
(memcached_io_write(&ptr->hosts[server_key], key_with_prefix, key_with_prefix_length, 1) == -1))
|
105
|
+
{
|
106
|
+
memcached_io_reset(&ptr->hosts[server_key]);
|
107
|
+
return MEMCACHED_WRITE_FAILURE;
|
108
|
+
}
|
109
|
+
|
110
|
+
if (no_reply)
|
111
|
+
return MEMCACHED_SUCCESS;
|
112
|
+
return memcached_response(&ptr->hosts[server_key], (char*)value, sizeof(*value), NULL);
|
113
|
+
}
|
114
|
+
|
115
|
+
memcached_return memcached_increment(memcached_st *ptr,
|
116
|
+
const char *key, size_t key_length,
|
117
|
+
uint32_t offset,
|
118
|
+
uint64_t *value)
|
119
|
+
{
|
120
|
+
memcached_return rc= memcached_validate_key_length(key_length, ptr->flags & MEM_BINARY_PROTOCOL);
|
121
|
+
unlikely (rc != MEMCACHED_SUCCESS)
|
122
|
+
return rc;
|
123
|
+
|
124
|
+
LIBMEMCACHED_MEMCACHED_INCREMENT_START();
|
125
|
+
if (ptr->flags & MEM_BINARY_PROTOCOL)
|
126
|
+
rc= binary_incr_decr(ptr, PROTOCOL_BINARY_CMD_INCREMENT, key, key_length,
|
127
|
+
(uint64_t)offset, 0, MEMCACHED_EXPIRATION_NOT_ADD,
|
128
|
+
value);
|
129
|
+
else
|
130
|
+
rc= memcached_auto(ptr, "incr", key, key_length, offset, value);
|
131
|
+
|
132
|
+
LIBMEMCACHED_MEMCACHED_INCREMENT_END();
|
133
|
+
|
134
|
+
return rc;
|
135
|
+
}
|
136
|
+
|
137
|
+
memcached_return memcached_decrement(memcached_st *ptr,
|
138
|
+
const char *key, size_t key_length,
|
139
|
+
uint32_t offset,
|
140
|
+
uint64_t *value)
|
141
|
+
{
|
142
|
+
memcached_return rc= memcached_validate_key_length(key_length, ptr->flags & MEM_BINARY_PROTOCOL);
|
143
|
+
unlikely (rc != MEMCACHED_SUCCESS)
|
144
|
+
return rc;
|
145
|
+
|
146
|
+
LIBMEMCACHED_MEMCACHED_DECREMENT_START();
|
147
|
+
if (ptr->flags & MEM_BINARY_PROTOCOL)
|
148
|
+
rc= binary_incr_decr(ptr, PROTOCOL_BINARY_CMD_DECREMENT, key, key_length,
|
149
|
+
(uint64_t)offset, 0, MEMCACHED_EXPIRATION_NOT_ADD,
|
150
|
+
value);
|
151
|
+
else
|
152
|
+
rc= memcached_auto(ptr, "decr", key, key_length, offset, value);
|
153
|
+
|
154
|
+
LIBMEMCACHED_MEMCACHED_DECREMENT_END();
|
155
|
+
|
156
|
+
return rc;
|
157
|
+
}
|
158
|
+
|
159
|
+
memcached_return memcached_increment_with_initial(memcached_st *ptr,
|
160
|
+
const char *key,
|
161
|
+
size_t key_length,
|
162
|
+
uint64_t offset,
|
163
|
+
uint64_t initial,
|
164
|
+
time_t expiration,
|
165
|
+
uint64_t *value)
|
166
|
+
{
|
167
|
+
memcached_return rc= memcached_validate_key_length(key_length, ptr->flags & MEM_BINARY_PROTOCOL);
|
168
|
+
unlikely (rc != MEMCACHED_SUCCESS)
|
169
|
+
return rc;
|
170
|
+
|
171
|
+
LIBMEMCACHED_MEMCACHED_INCREMENT_WITH_INITIAL_START();
|
172
|
+
if (ptr->flags & MEM_BINARY_PROTOCOL)
|
173
|
+
rc= binary_incr_decr(ptr, PROTOCOL_BINARY_CMD_INCREMENT, key,
|
174
|
+
key_length, offset, initial, (uint32_t)expiration,
|
175
|
+
value);
|
176
|
+
else
|
177
|
+
rc= MEMCACHED_PROTOCOL_ERROR;
|
178
|
+
|
179
|
+
LIBMEMCACHED_MEMCACHED_INCREMENT_WITH_INITIAL_END();
|
180
|
+
|
181
|
+
return rc;
|
182
|
+
}
|
183
|
+
|
184
|
+
memcached_return memcached_decrement_with_initial(memcached_st *ptr,
|
185
|
+
const char *key,
|
186
|
+
size_t key_length,
|
187
|
+
uint64_t offset,
|
188
|
+
uint64_t initial,
|
189
|
+
time_t expiration,
|
190
|
+
uint64_t *value)
|
191
|
+
{
|
192
|
+
memcached_return rc= memcached_validate_key_length(key_length, ptr->flags & MEM_BINARY_PROTOCOL);
|
193
|
+
unlikely (rc != MEMCACHED_SUCCESS)
|
194
|
+
return rc;
|
195
|
+
|
196
|
+
LIBMEMCACHED_MEMCACHED_DECREMENT_WITH_INITIAL_START();
|
197
|
+
if (ptr->flags & MEM_BINARY_PROTOCOL)
|
198
|
+
rc= binary_incr_decr(ptr, PROTOCOL_BINARY_CMD_DECREMENT, key,
|
199
|
+
key_length, offset, initial, (uint32_t)expiration,
|
200
|
+
value);
|
201
|
+
else
|
202
|
+
rc= MEMCACHED_PROTOCOL_ERROR;
|
203
|
+
|
204
|
+
LIBMEMCACHED_MEMCACHED_DECREMENT_WITH_INITIAL_END();
|
205
|
+
|
206
|
+
return rc;
|
207
|
+
}
|
@@ -0,0 +1,285 @@
|
|
1
|
+
#include "common.h"
|
2
|
+
#include <time.h>
|
3
|
+
#include <sys/types.h>
|
4
|
+
#include <sys/socket.h>
|
5
|
+
#include <netinet/tcp.h>
|
6
|
+
|
7
|
+
/*
|
8
|
+
This function is used to modify the behavior of running client.
|
9
|
+
|
10
|
+
We quit all connections so we can reset the sockets.
|
11
|
+
*/
|
12
|
+
|
13
|
+
static void set_behavior_flag(memcached_st *ptr, memcached_flags temp_flag, uint64_t data)
|
14
|
+
{
|
15
|
+
if (data)
|
16
|
+
ptr->flags|= temp_flag;
|
17
|
+
else
|
18
|
+
ptr->flags&= ~temp_flag;
|
19
|
+
}
|
20
|
+
|
21
|
+
memcached_return memcached_behavior_set(memcached_st *ptr,
|
22
|
+
memcached_behavior flag,
|
23
|
+
uint64_t data)
|
24
|
+
{
|
25
|
+
switch (flag)
|
26
|
+
{
|
27
|
+
case MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK:
|
28
|
+
ptr->io_msg_watermark= (uint32_t) data;
|
29
|
+
break;
|
30
|
+
case MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK:
|
31
|
+
ptr->io_bytes_watermark= (uint32_t)data;
|
32
|
+
break;
|
33
|
+
case MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH:
|
34
|
+
ptr->io_key_prefetch = (uint32_t)data;
|
35
|
+
break;
|
36
|
+
case MEMCACHED_BEHAVIOR_SND_TIMEOUT:
|
37
|
+
ptr->snd_timeout= (int32_t)data;
|
38
|
+
break;
|
39
|
+
case MEMCACHED_BEHAVIOR_RCV_TIMEOUT:
|
40
|
+
ptr->rcv_timeout= (int32_t)data;
|
41
|
+
break;
|
42
|
+
case MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT:
|
43
|
+
ptr->server_failure_limit= (uint32_t)data;
|
44
|
+
break;
|
45
|
+
case MEMCACHED_BEHAVIOR_BINARY_PROTOCOL:
|
46
|
+
if (data)
|
47
|
+
set_behavior_flag(ptr, MEM_VERIFY_KEY, 0);
|
48
|
+
set_behavior_flag(ptr, MEM_BINARY_PROTOCOL, data);
|
49
|
+
break;
|
50
|
+
case MEMCACHED_BEHAVIOR_SUPPORT_CAS:
|
51
|
+
set_behavior_flag(ptr, MEM_SUPPORT_CAS, data);
|
52
|
+
break;
|
53
|
+
case MEMCACHED_BEHAVIOR_NO_BLOCK:
|
54
|
+
set_behavior_flag(ptr, MEM_NO_BLOCK, data);
|
55
|
+
memcached_quit(ptr);
|
56
|
+
break;
|
57
|
+
case MEMCACHED_BEHAVIOR_BUFFER_REQUESTS:
|
58
|
+
set_behavior_flag(ptr, MEM_BUFFER_REQUESTS, data);
|
59
|
+
memcached_quit(ptr);
|
60
|
+
break;
|
61
|
+
case MEMCACHED_BEHAVIOR_USE_UDP:
|
62
|
+
if (ptr->number_of_hosts)
|
63
|
+
return MEMCACHED_FAILURE;
|
64
|
+
set_behavior_flag(ptr, MEM_USE_UDP, data);
|
65
|
+
if (data)
|
66
|
+
set_behavior_flag(ptr,MEM_NOREPLY,data);
|
67
|
+
break;
|
68
|
+
case MEMCACHED_BEHAVIOR_TCP_NODELAY:
|
69
|
+
set_behavior_flag(ptr, MEM_TCP_NODELAY, data);
|
70
|
+
memcached_quit(ptr);
|
71
|
+
break;
|
72
|
+
case MEMCACHED_BEHAVIOR_DISTRIBUTION:
|
73
|
+
{
|
74
|
+
ptr->distribution= (memcached_server_distribution)(data);
|
75
|
+
if (ptr->distribution == MEMCACHED_DISTRIBUTION_RANDOM)
|
76
|
+
{
|
77
|
+
srandom((uint32_t) time(NULL));
|
78
|
+
}
|
79
|
+
run_distribution(ptr);
|
80
|
+
break;
|
81
|
+
}
|
82
|
+
case MEMCACHED_BEHAVIOR_KETAMA:
|
83
|
+
{
|
84
|
+
if (data)
|
85
|
+
{
|
86
|
+
ptr->hash= MEMCACHED_HASH_MD5;
|
87
|
+
ptr->distribution= MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA;
|
88
|
+
}
|
89
|
+
else
|
90
|
+
{
|
91
|
+
ptr->hash= 0;
|
92
|
+
ptr->distribution= 0;
|
93
|
+
}
|
94
|
+
run_distribution(ptr);
|
95
|
+
break;
|
96
|
+
}
|
97
|
+
case MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED:
|
98
|
+
{
|
99
|
+
ptr->hash= MEMCACHED_HASH_MD5;
|
100
|
+
ptr->distribution= MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA;
|
101
|
+
set_behavior_flag(ptr, MEM_KETAMA_WEIGHTED, data);
|
102
|
+
run_distribution(ptr);
|
103
|
+
break;
|
104
|
+
}
|
105
|
+
case MEMCACHED_BEHAVIOR_HASH:
|
106
|
+
#ifndef HAVE_HSIEH_HASH
|
107
|
+
if ((memcached_hash)(data) == MEMCACHED_HASH_HSIEH)
|
108
|
+
return MEMCACHED_FAILURE;
|
109
|
+
#endif
|
110
|
+
ptr->hash= (memcached_hash)(data);
|
111
|
+
break;
|
112
|
+
case MEMCACHED_BEHAVIOR_KETAMA_HASH:
|
113
|
+
ptr->hash_continuum= (memcached_hash)(data);
|
114
|
+
run_distribution(ptr);
|
115
|
+
break;
|
116
|
+
case MEMCACHED_BEHAVIOR_CACHE_LOOKUPS:
|
117
|
+
set_behavior_flag(ptr, MEM_USE_CACHE_LOOKUPS, data);
|
118
|
+
memcached_quit(ptr);
|
119
|
+
break;
|
120
|
+
case MEMCACHED_BEHAVIOR_VERIFY_KEY:
|
121
|
+
if (ptr->flags & MEM_BINARY_PROTOCOL)
|
122
|
+
break;
|
123
|
+
set_behavior_flag(ptr, MEM_VERIFY_KEY, data);
|
124
|
+
break;
|
125
|
+
case MEMCACHED_BEHAVIOR_SORT_HOSTS:
|
126
|
+
{
|
127
|
+
set_behavior_flag(ptr, MEM_USE_SORT_HOSTS, data);
|
128
|
+
run_distribution(ptr);
|
129
|
+
|
130
|
+
break;
|
131
|
+
}
|
132
|
+
case MEMCACHED_BEHAVIOR_POLL_TIMEOUT:
|
133
|
+
ptr->poll_timeout= (int32_t)data;
|
134
|
+
break;
|
135
|
+
case MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT:
|
136
|
+
ptr->connect_timeout= (int32_t)data;
|
137
|
+
break;
|
138
|
+
case MEMCACHED_BEHAVIOR_RETRY_TIMEOUT:
|
139
|
+
ptr->retry_timeout= (int32_t)data;
|
140
|
+
break;
|
141
|
+
case MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE:
|
142
|
+
ptr->send_size= (int32_t)data;
|
143
|
+
memcached_quit(ptr);
|
144
|
+
break;
|
145
|
+
case MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE:
|
146
|
+
ptr->recv_size= (int32_t)data;
|
147
|
+
memcached_quit(ptr);
|
148
|
+
break;
|
149
|
+
case MEMCACHED_BEHAVIOR_USER_DATA:
|
150
|
+
return MEMCACHED_FAILURE;
|
151
|
+
case MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY:
|
152
|
+
set_behavior_flag(ptr, MEM_HASH_WITH_PREFIX_KEY, data);
|
153
|
+
break;
|
154
|
+
case MEMCACHED_BEHAVIOR_NOREPLY:
|
155
|
+
set_behavior_flag(ptr, MEM_NOREPLY, data);
|
156
|
+
break;
|
157
|
+
case MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS:
|
158
|
+
set_behavior_flag(ptr, MEM_AUTO_EJECT_HOSTS, data);
|
159
|
+
break;
|
160
|
+
default:
|
161
|
+
/* Shouldn't get here */
|
162
|
+
WATCHPOINT_ASSERT(flag);
|
163
|
+
break;
|
164
|
+
}
|
165
|
+
|
166
|
+
return MEMCACHED_SUCCESS;
|
167
|
+
}
|
168
|
+
|
169
|
+
uint64_t memcached_behavior_get(memcached_st *ptr,
|
170
|
+
memcached_behavior flag)
|
171
|
+
{
|
172
|
+
memcached_flags temp_flag= MEM_NO_BLOCK;
|
173
|
+
|
174
|
+
switch (flag)
|
175
|
+
{
|
176
|
+
case MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK:
|
177
|
+
return ptr->io_msg_watermark;
|
178
|
+
case MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK:
|
179
|
+
return ptr->io_bytes_watermark;
|
180
|
+
case MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH:
|
181
|
+
return ptr->io_key_prefetch;
|
182
|
+
case MEMCACHED_BEHAVIOR_BINARY_PROTOCOL:
|
183
|
+
temp_flag= MEM_BINARY_PROTOCOL;
|
184
|
+
break;
|
185
|
+
case MEMCACHED_BEHAVIOR_SUPPORT_CAS:
|
186
|
+
temp_flag= MEM_SUPPORT_CAS;
|
187
|
+
break;
|
188
|
+
case MEMCACHED_BEHAVIOR_CACHE_LOOKUPS:
|
189
|
+
temp_flag= MEM_USE_CACHE_LOOKUPS;
|
190
|
+
break;
|
191
|
+
case MEMCACHED_BEHAVIOR_NO_BLOCK:
|
192
|
+
temp_flag= MEM_NO_BLOCK;
|
193
|
+
break;
|
194
|
+
case MEMCACHED_BEHAVIOR_BUFFER_REQUESTS:
|
195
|
+
temp_flag= MEM_BUFFER_REQUESTS;
|
196
|
+
break;
|
197
|
+
case MEMCACHED_BEHAVIOR_USE_UDP:
|
198
|
+
temp_flag= MEM_USE_UDP;
|
199
|
+
break;
|
200
|
+
case MEMCACHED_BEHAVIOR_TCP_NODELAY:
|
201
|
+
temp_flag= MEM_TCP_NODELAY;
|
202
|
+
break;
|
203
|
+
case MEMCACHED_BEHAVIOR_VERIFY_KEY:
|
204
|
+
temp_flag= MEM_VERIFY_KEY;
|
205
|
+
break;
|
206
|
+
case MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED:
|
207
|
+
temp_flag= MEM_KETAMA_WEIGHTED;
|
208
|
+
break;
|
209
|
+
case MEMCACHED_BEHAVIOR_DISTRIBUTION:
|
210
|
+
return ptr->distribution;
|
211
|
+
case MEMCACHED_BEHAVIOR_KETAMA:
|
212
|
+
return (ptr->distribution == MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA) ? (uint64_t) 1 : 0;
|
213
|
+
case MEMCACHED_BEHAVIOR_HASH:
|
214
|
+
return ptr->hash;
|
215
|
+
case MEMCACHED_BEHAVIOR_KETAMA_HASH:
|
216
|
+
return ptr->hash_continuum;
|
217
|
+
case MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT:
|
218
|
+
return ptr->server_failure_limit;
|
219
|
+
case MEMCACHED_BEHAVIOR_SORT_HOSTS:
|
220
|
+
temp_flag= MEM_USE_SORT_HOSTS;
|
221
|
+
break;
|
222
|
+
case MEMCACHED_BEHAVIOR_POLL_TIMEOUT:
|
223
|
+
return (uint64_t)ptr->poll_timeout;
|
224
|
+
case MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT:
|
225
|
+
return (uint64_t)ptr->connect_timeout;
|
226
|
+
case MEMCACHED_BEHAVIOR_RETRY_TIMEOUT:
|
227
|
+
return (uint64_t)ptr->retry_timeout;
|
228
|
+
case MEMCACHED_BEHAVIOR_SND_TIMEOUT:
|
229
|
+
return (uint64_t)ptr->snd_timeout;
|
230
|
+
case MEMCACHED_BEHAVIOR_RCV_TIMEOUT:
|
231
|
+
return (uint64_t)ptr->rcv_timeout;
|
232
|
+
case MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE:
|
233
|
+
{
|
234
|
+
int sock_size;
|
235
|
+
socklen_t sock_length= sizeof(int);
|
236
|
+
|
237
|
+
/* REFACTOR */
|
238
|
+
/* We just try the first host, and if it is down we return zero */
|
239
|
+
if ((memcached_connect(&ptr->hosts[0])) != MEMCACHED_SUCCESS)
|
240
|
+
return 0;
|
241
|
+
|
242
|
+
if (getsockopt(ptr->hosts[0].fd, SOL_SOCKET,
|
243
|
+
SO_SNDBUF, &sock_size, &sock_length))
|
244
|
+
return 0; /* Zero means error */
|
245
|
+
|
246
|
+
return (uint64_t) sock_size;
|
247
|
+
}
|
248
|
+
case MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE:
|
249
|
+
{
|
250
|
+
int sock_size;
|
251
|
+
socklen_t sock_length= sizeof(int);
|
252
|
+
|
253
|
+
/* REFACTOR */
|
254
|
+
/* We just try the first host, and if it is down we return zero */
|
255
|
+
if ((memcached_connect(&ptr->hosts[0])) != MEMCACHED_SUCCESS)
|
256
|
+
return 0;
|
257
|
+
|
258
|
+
if (getsockopt(ptr->hosts[0].fd, SOL_SOCKET,
|
259
|
+
SO_RCVBUF, &sock_size, &sock_length))
|
260
|
+
return 0; /* Zero means error */
|
261
|
+
|
262
|
+
return (uint64_t) sock_size;
|
263
|
+
}
|
264
|
+
case MEMCACHED_BEHAVIOR_USER_DATA:
|
265
|
+
return MEMCACHED_FAILURE;
|
266
|
+
case MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY:
|
267
|
+
temp_flag= MEM_HASH_WITH_PREFIX_KEY;
|
268
|
+
break;
|
269
|
+
case MEMCACHED_BEHAVIOR_NOREPLY:
|
270
|
+
temp_flag= MEM_NOREPLY;
|
271
|
+
break;
|
272
|
+
case MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS:
|
273
|
+
temp_flag= MEM_AUTO_EJECT_HOSTS;
|
274
|
+
break;
|
275
|
+
default:
|
276
|
+
WATCHPOINT_ASSERT(flag);
|
277
|
+
break;
|
278
|
+
}
|
279
|
+
|
280
|
+
WATCHPOINT_ASSERT(temp_flag); /* Programming mistake if it gets this far */
|
281
|
+
if (ptr->flags & temp_flag)
|
282
|
+
return 1;
|
283
|
+
else
|
284
|
+
return 0;
|
285
|
+
}
|