vinted-memcached 1.8.0
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.
- checksums.yaml +7 -0
- data/BENCHMARKS +142 -0
- data/CHANGELOG +176 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +45 -0
- data/LICENSE +184 -0
- data/Manifest +209 -0
- data/README.rdoc +124 -0
- data/Rakefile +134 -0
- data/TODO +1 -0
- data/ext/extconf-make.rb +25 -0
- data/ext/extconf.rb +78 -0
- 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 +911 -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 +2108 -0
- data/ext/libmemcached-0.32/clients/Makefile.am +80 -0
- data/ext/libmemcached-0.32/clients/Makefile.in +773 -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/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 +9636 -0
- data/ext/libmemcached-0.32/config/missing +376 -0
- data/ext/libmemcached-0.32/config.h.in +254 -0
- data/ext/libmemcached-0.32/configure +23843 -0
- data/ext/libmemcached-0.32/configure.ac +120 -0
- data/ext/libmemcached-0.32/libmemcached/Makefile.am +111 -0
- data/ext/libmemcached-0.32/libmemcached/Makefile.in +1069 -0
- data/ext/libmemcached-0.32/libmemcached/byteorder.c +31 -0
- data/ext/libmemcached-0.32/libmemcached/common.h +189 -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 +30 -0
- data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.h +82 -0
- data/ext/libmemcached-0.32/libmemcached/md5.c +354 -0
- data/ext/libmemcached-0.32/libmemcached/memcached/README.txt +7 -0
- data/ext/libmemcached-0.32/libmemcached/memcached/protocol_binary.h +385 -0
- data/ext/libmemcached-0.32/libmemcached/memcached.c +153 -0
- data/ext/libmemcached-0.32/libmemcached/memcached.h +305 -0
- data/ext/libmemcached-0.32/libmemcached/memcached.hpp +799 -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 +290 -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 +371 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_constants.h +146 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_delete.c +0 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_do.c +72 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_dump.c +79 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_exist.c +114 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_exist.h +20 -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 +23 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_get.c +494 -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 +594 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_io.h +72 -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 +529 -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 +437 -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_touch.c +60 -0
- data/ext/libmemcached-0.32/libmemcached/memcached_touch.h +31 -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 +604 -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 +7831 -0
- data/ext/libmemcached-0.32/m4/ltoptions.m4 +369 -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 +98 -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 +487 -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 +113 -0
- data/ext/libmemcached-0.32/tests/Makefile.in +762 -0
- data/ext/libmemcached-0.32/tests/atomsmasher.c +245 -0
- data/ext/libmemcached-0.32/tests/function.c +4904 -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/ext/rlibmemcached.i +258 -0
- data/ext/rlibmemcached_wrap.c +13917 -0
- data/lib/memcached/auth.rb +16 -0
- data/lib/memcached/behaviors.rb +78 -0
- data/lib/memcached/exceptions.rb +84 -0
- data/lib/memcached/experimental.rb +48 -0
- data/lib/memcached/marshal_codec.rb +10 -0
- data/lib/memcached/memcached.rb +732 -0
- data/lib/memcached/rails.rb +250 -0
- data/lib/memcached.rb +33 -0
- data/memcached.gemspec +0 -0
- data/test/profile/benchmark.rb +280 -0
- data/test/profile/c_profiler.rb +14 -0
- data/test/profile/exercise.rb +185 -0
- data/test/profile/rb_profiler.rb +21 -0
- data/test/profile/valgrind.rb +10 -0
- data/test/setup.rb +30 -0
- data/test/teardown.rb +0 -0
- data/test/test_helper.rb +18 -0
- data/test/unit/binding_test.rb +8 -0
- data/test/unit/memcached_experimental_test.rb +272 -0
- data/test/unit/memcached_test.rb +1487 -0
- data/test/unit/rails_test.rb +330 -0
- metadata +336 -0
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
#include "common.h"
|
|
2
|
+
#include "memcached_io.h"
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
What happens if no servers exist?
|
|
6
|
+
*/
|
|
7
|
+
char *memcached_get(memcached_st *ptr, const char *key,
|
|
8
|
+
size_t key_length,
|
|
9
|
+
size_t *value_length,
|
|
10
|
+
uint32_t *flags,
|
|
11
|
+
memcached_return *error)
|
|
12
|
+
{
|
|
13
|
+
return memcached_get_by_key(ptr, NULL, 0, key, key_length,
|
|
14
|
+
GET_LEN_ARG_UNSPECIFIED, value_length,
|
|
15
|
+
flags, error);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
char *memcached_get_len(memcached_st *ptr,
|
|
19
|
+
const char *key, size_t key_length,
|
|
20
|
+
uint32_t user_spec_len,
|
|
21
|
+
size_t *value_length,
|
|
22
|
+
uint32_t *flags,
|
|
23
|
+
memcached_return *error)
|
|
24
|
+
{
|
|
25
|
+
return memcached_get_by_key(ptr, NULL, 0, key, key_length,
|
|
26
|
+
user_spec_len, value_length,
|
|
27
|
+
flags, error);
|
|
28
|
+
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
char *memcached_get_by_key(memcached_st *ptr,
|
|
32
|
+
const char *master_key,
|
|
33
|
+
size_t master_key_length,
|
|
34
|
+
const char *key, size_t key_length,
|
|
35
|
+
uint32_t user_spec_len,
|
|
36
|
+
size_t *value_length,
|
|
37
|
+
uint32_t *flags,
|
|
38
|
+
memcached_return *error)
|
|
39
|
+
{
|
|
40
|
+
char *value;
|
|
41
|
+
size_t dummy_length;
|
|
42
|
+
uint32_t dummy_flags;
|
|
43
|
+
memcached_return dummy_error;
|
|
44
|
+
|
|
45
|
+
unlikely (ptr->flags & MEM_USE_UDP)
|
|
46
|
+
{
|
|
47
|
+
*error= MEMCACHED_NOT_SUPPORTED;
|
|
48
|
+
return NULL;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* Request the key */
|
|
52
|
+
*error= memcached_mget_by_key(ptr,
|
|
53
|
+
master_key,
|
|
54
|
+
master_key_length,
|
|
55
|
+
(const char **)&key, &key_length, 1,
|
|
56
|
+
user_spec_len);
|
|
57
|
+
|
|
58
|
+
value= memcached_fetch(ptr, NULL, NULL,
|
|
59
|
+
value_length, flags, error);
|
|
60
|
+
/* This is for historical reasons */
|
|
61
|
+
if (*error == MEMCACHED_END)
|
|
62
|
+
*error= MEMCACHED_NOTFOUND;
|
|
63
|
+
|
|
64
|
+
(void)memcached_fetch(ptr, NULL, NULL,
|
|
65
|
+
&dummy_length, &dummy_flags,
|
|
66
|
+
&dummy_error);
|
|
67
|
+
WATCHPOINT_ASSERT(dummy_length == 0);
|
|
68
|
+
|
|
69
|
+
if (value == NULL)
|
|
70
|
+
{
|
|
71
|
+
if (ptr->get_key_failure && *error == MEMCACHED_NOTFOUND)
|
|
72
|
+
{
|
|
73
|
+
memcached_return rc;
|
|
74
|
+
|
|
75
|
+
memcached_result_reset(&ptr->result);
|
|
76
|
+
rc= ptr->get_key_failure(ptr, key, key_length, &ptr->result);
|
|
77
|
+
|
|
78
|
+
/* On all failure drop to returning NULL */
|
|
79
|
+
if (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED)
|
|
80
|
+
{
|
|
81
|
+
if (rc == MEMCACHED_BUFFERED)
|
|
82
|
+
{
|
|
83
|
+
uint64_t latch; /* We use latch to track the state of the original socket */
|
|
84
|
+
latch= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS);
|
|
85
|
+
if (latch == 0)
|
|
86
|
+
memcached_behavior_set(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 1);
|
|
87
|
+
|
|
88
|
+
rc= memcached_set(ptr, key, key_length,
|
|
89
|
+
memcached_result_value(&ptr->result),
|
|
90
|
+
memcached_result_length(&ptr->result),
|
|
91
|
+
0, memcached_result_flags(&ptr->result));
|
|
92
|
+
|
|
93
|
+
if (rc == MEMCACHED_BUFFERED && latch == 0)
|
|
94
|
+
memcached_behavior_set(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 0);
|
|
95
|
+
}
|
|
96
|
+
else
|
|
97
|
+
{
|
|
98
|
+
rc= memcached_set(ptr, key, key_length,
|
|
99
|
+
memcached_result_value(&ptr->result),
|
|
100
|
+
memcached_result_length(&ptr->result),
|
|
101
|
+
0, memcached_result_flags(&ptr->result));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED)
|
|
105
|
+
{
|
|
106
|
+
*error= rc;
|
|
107
|
+
*value_length= memcached_result_length(&ptr->result);
|
|
108
|
+
*flags= memcached_result_flags(&ptr->result);
|
|
109
|
+
return memcached_string_c_copy(&ptr->result.value);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return value;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
memcached_return memcached_mget(memcached_st *ptr,
|
|
120
|
+
const char **keys, size_t *key_length,
|
|
121
|
+
size_t number_of_keys)
|
|
122
|
+
{
|
|
123
|
+
return memcached_mget_by_key(ptr, NULL, 0, keys, key_length, number_of_keys,
|
|
124
|
+
GET_LEN_ARG_UNSPECIFIED);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
memcached_return memcached_mget_len(memcached_st *ptr,
|
|
128
|
+
const char **keys, size_t *key_length,
|
|
129
|
+
size_t number_of_keys, uint32_t user_spec_len)
|
|
130
|
+
{
|
|
131
|
+
return memcached_mget_by_key(ptr, NULL, 0, keys, key_length, number_of_keys,
|
|
132
|
+
user_spec_len);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
static memcached_return binary_mget_by_key(memcached_st *ptr,
|
|
136
|
+
unsigned int master_server_key,
|
|
137
|
+
bool is_master_key_set,
|
|
138
|
+
const char **keys, size_t *key_length,
|
|
139
|
+
size_t number_of_keys);
|
|
140
|
+
|
|
141
|
+
static bool user_specified_length_is_valid(uint32_t user_spec_len)
|
|
142
|
+
{
|
|
143
|
+
assert_on_compile(GET_LEN_ARG_UNSPECIFIED == -1U);
|
|
144
|
+
return (user_spec_len > 0 && user_spec_len < GET_LEN_ARG_UNSPECIFIED);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
memcached_return memcached_mget_by_key(memcached_st *ptr,
|
|
148
|
+
const char *master_key,
|
|
149
|
+
size_t master_key_length,
|
|
150
|
+
const char **keys,
|
|
151
|
+
size_t *key_length,
|
|
152
|
+
size_t number_of_keys,
|
|
153
|
+
uint32_t user_spec_len)
|
|
154
|
+
{
|
|
155
|
+
unsigned int x;
|
|
156
|
+
const char *get_command;
|
|
157
|
+
uint8_t get_command_length;
|
|
158
|
+
memcached_return rc= MEMCACHED_NOTFOUND;
|
|
159
|
+
unsigned int master_server_key= (unsigned int)-1; /* 0 is a valid server id! */
|
|
160
|
+
bool is_master_key_set= false;
|
|
161
|
+
bool use_cas = (ptr->flags & MEM_SUPPORT_CAS);
|
|
162
|
+
bool length_specified = (user_spec_len != GET_LEN_ARG_UNSPECIFIED);
|
|
163
|
+
|
|
164
|
+
unlikely (ptr->flags & MEM_USE_UDP)
|
|
165
|
+
return MEMCACHED_NOT_SUPPORTED;
|
|
166
|
+
|
|
167
|
+
LIBMEMCACHED_MEMCACHED_MGET_START();
|
|
168
|
+
ptr->cursor_server= 0;
|
|
169
|
+
|
|
170
|
+
if (number_of_keys == 0)
|
|
171
|
+
return MEMCACHED_NOTFOUND;
|
|
172
|
+
|
|
173
|
+
if (ptr->number_of_hosts == 0)
|
|
174
|
+
return MEMCACHED_NO_SERVERS;
|
|
175
|
+
|
|
176
|
+
if ((ptr->flags & MEM_VERIFY_KEY) && (memcached_key_test(keys, key_length, number_of_keys) == MEMCACHED_BAD_KEY_PROVIDED))
|
|
177
|
+
return MEMCACHED_BAD_KEY_PROVIDED;
|
|
178
|
+
|
|
179
|
+
if (master_key && master_key_length)
|
|
180
|
+
{
|
|
181
|
+
if ((ptr->flags & MEM_VERIFY_KEY) && (memcached_key_test((const char **)&master_key, &master_key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
|
|
182
|
+
return MEMCACHED_BAD_KEY_PROVIDED;
|
|
183
|
+
master_server_key= memcached_generate_hash(ptr, master_key, master_key_length);
|
|
184
|
+
is_master_key_set= true;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (length_specified) {
|
|
188
|
+
if (ptr->flags & MEM_BINARY_PROTOCOL)
|
|
189
|
+
return MEMCACHED_NOT_SUPPORTED;
|
|
190
|
+
|
|
191
|
+
if (!user_specified_length_is_valid(user_spec_len))
|
|
192
|
+
return MEMCACHED_FAILURE;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/*
|
|
196
|
+
Here is where we pay for the non-block API. We need to remove any data sitting
|
|
197
|
+
in the queue before we start our get.
|
|
198
|
+
|
|
199
|
+
It might be optimum to bounce the connection if count > some number.
|
|
200
|
+
*/
|
|
201
|
+
for (x= 0; x < ptr->number_of_hosts; x++)
|
|
202
|
+
{
|
|
203
|
+
if (memcached_server_response_count(&ptr->hosts[x]))
|
|
204
|
+
{
|
|
205
|
+
char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
|
|
206
|
+
|
|
207
|
+
if (ptr->flags & MEM_NO_BLOCK)
|
|
208
|
+
(void)memcached_io_write(&ptr->hosts[x], NULL, 0, 1);
|
|
209
|
+
|
|
210
|
+
while(memcached_server_response_count(&ptr->hosts[x]))
|
|
211
|
+
(void)memcached_response(&ptr->hosts[x], buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, &ptr->result);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (ptr->flags & MEM_BINARY_PROTOCOL)
|
|
216
|
+
return binary_mget_by_key(ptr, master_server_key, is_master_key_set, keys,
|
|
217
|
+
key_length, number_of_keys);
|
|
218
|
+
|
|
219
|
+
if (length_specified) {
|
|
220
|
+
if (use_cas)
|
|
221
|
+
{
|
|
222
|
+
get_command= "gets_len ";
|
|
223
|
+
get_command_length= 9;
|
|
224
|
+
} else {
|
|
225
|
+
get_command= "get_len ";
|
|
226
|
+
get_command_length= 8;
|
|
227
|
+
}
|
|
228
|
+
} else {
|
|
229
|
+
if (use_cas)
|
|
230
|
+
{
|
|
231
|
+
get_command= "gets ";
|
|
232
|
+
get_command_length= 5;
|
|
233
|
+
} else {
|
|
234
|
+
get_command= "get ";
|
|
235
|
+
get_command_length= 4;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/*
|
|
240
|
+
If a server fails we warn about errors and start all over with sending keys
|
|
241
|
+
to the server.
|
|
242
|
+
*/
|
|
243
|
+
for (x= 0; x < number_of_keys; x++)
|
|
244
|
+
{
|
|
245
|
+
unsigned int server_key;
|
|
246
|
+
|
|
247
|
+
if (is_master_key_set)
|
|
248
|
+
server_key= master_server_key;
|
|
249
|
+
else
|
|
250
|
+
server_key= memcached_generate_hash(ptr, keys[x], key_length[x]);
|
|
251
|
+
|
|
252
|
+
if (memcached_server_response_count(&ptr->hosts[server_key]) == 0)
|
|
253
|
+
{
|
|
254
|
+
rc= memcached_connect(&ptr->hosts[server_key]);
|
|
255
|
+
|
|
256
|
+
if (rc != MEMCACHED_SUCCESS)
|
|
257
|
+
continue;
|
|
258
|
+
|
|
259
|
+
if ((memcached_io_write(&ptr->hosts[server_key], get_command, get_command_length, 0)) == -1)
|
|
260
|
+
{
|
|
261
|
+
rc= MEMCACHED_SOME_ERRORS;
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (length_specified) {
|
|
266
|
+
char len[GET_LEN_BUFSZ];
|
|
267
|
+
if (snprintf(len, GET_LEN_BUFSZ, "%d ", user_spec_len) < 0 ||
|
|
268
|
+
(memcached_io_write(&ptr->hosts[server_key], len, strlen(len), 0) == -1))
|
|
269
|
+
{
|
|
270
|
+
rc= MEMCACHED_SOME_ERRORS;
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
WATCHPOINT_ASSERT(ptr->hosts[server_key].cursor_active == 0);
|
|
276
|
+
memcached_server_response_increment(&ptr->hosts[server_key]);
|
|
277
|
+
WATCHPOINT_ASSERT(ptr->hosts[server_key].cursor_active == 1);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/* Only called when we have a prefix key */
|
|
281
|
+
if (ptr->prefix_key[0] != 0)
|
|
282
|
+
{
|
|
283
|
+
if ((memcached_io_write(&ptr->hosts[server_key], ptr->prefix_key, ptr->prefix_key_length, 0)) == -1)
|
|
284
|
+
{
|
|
285
|
+
memcached_server_response_reset(&ptr->hosts[server_key]);
|
|
286
|
+
rc= MEMCACHED_SOME_ERRORS;
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if ((memcached_io_write(&ptr->hosts[server_key], keys[x], key_length[x], 0)) == -1)
|
|
292
|
+
{
|
|
293
|
+
memcached_server_response_reset(&ptr->hosts[server_key]);
|
|
294
|
+
rc= MEMCACHED_SOME_ERRORS;
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
if ((memcached_io_write(&ptr->hosts[server_key], " ", 1, 0)) == -1)
|
|
299
|
+
{
|
|
300
|
+
memcached_server_response_reset(&ptr->hosts[server_key]);
|
|
301
|
+
rc= MEMCACHED_SOME_ERRORS;
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
ptr->last_server_key = server_key;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/*
|
|
309
|
+
Should we muddle on if some servers are dead?
|
|
310
|
+
*/
|
|
311
|
+
for (x= 0; x < ptr->number_of_hosts; x++)
|
|
312
|
+
{
|
|
313
|
+
if (memcached_server_response_count(&ptr->hosts[x]))
|
|
314
|
+
{
|
|
315
|
+
/* We need to do something about non-connnected hosts in the future */
|
|
316
|
+
if ((memcached_io_write(&ptr->hosts[x], "\r\n", 2, 1)) == -1)
|
|
317
|
+
{
|
|
318
|
+
rc= MEMCACHED_SOME_ERRORS;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
LIBMEMCACHED_MEMCACHED_MGET_END();
|
|
324
|
+
return rc;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
char *memcached_get_from_last(memcached_st *ptr,
|
|
329
|
+
const char *key,
|
|
330
|
+
size_t key_length,
|
|
331
|
+
size_t *value_length,
|
|
332
|
+
uint32_t *flags,
|
|
333
|
+
memcached_return *error)
|
|
334
|
+
{
|
|
335
|
+
memcached_return rc = MEMCACHED_NOTFOUND;
|
|
336
|
+
char *value = NULL;
|
|
337
|
+
|
|
338
|
+
if (memcached_server_response_count(&ptr->hosts[ptr->last_server_key]) == 0) {
|
|
339
|
+
*error = memcached_connect(&ptr->hosts[ptr->last_server_key]);
|
|
340
|
+
|
|
341
|
+
if (*error != MEMCACHED_SUCCESS) {
|
|
342
|
+
return value;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if ((memcached_io_write(&ptr->hosts[ptr->last_server_key], "get ", 4, 0)) == -1) {
|
|
346
|
+
*error = MEMCACHED_SOME_ERRORS;
|
|
347
|
+
return value;
|
|
348
|
+
}
|
|
349
|
+
WATCHPOINT_ASSERT(ptr->hosts[ptr->last_server_key].cursor_active == 0);
|
|
350
|
+
memcached_server_response_increment(&ptr->hosts[ptr->last_server_key]);
|
|
351
|
+
WATCHPOINT_ASSERT(ptr->hosts[ptr->last_server_key].cursor_active == 1);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/* Only called when we have a prefix key */
|
|
355
|
+
if (ptr->prefix_key[0] != 0) {
|
|
356
|
+
if ((memcached_io_write(&ptr->hosts[ptr->last_server_key], ptr->prefix_key, ptr->prefix_key_length, 0)) == -1) {
|
|
357
|
+
memcached_server_response_reset(&ptr->hosts[ptr->last_server_key]);
|
|
358
|
+
*error = MEMCACHED_SOME_ERRORS;
|
|
359
|
+
return value;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
if ((memcached_io_write(&ptr->hosts[ptr->last_server_key], key, key_length, 0)) == -1) {
|
|
364
|
+
memcached_server_response_reset(&ptr->hosts[ptr->last_server_key]);
|
|
365
|
+
*error = MEMCACHED_SOME_ERRORS;
|
|
366
|
+
return value;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
if ((memcached_io_write(&ptr->hosts[ptr->last_server_key], "\r\n", 2, 1)) == -1) {
|
|
370
|
+
memcached_server_response_reset(&ptr->hosts[ptr->last_server_key]);
|
|
371
|
+
*error = MEMCACHED_SOME_ERRORS;
|
|
372
|
+
return value;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
value = memcached_fetch(ptr, NULL, NULL, value_length, flags, error);
|
|
376
|
+
|
|
377
|
+
/* This is for historical reasons */
|
|
378
|
+
if (*error == MEMCACHED_END)
|
|
379
|
+
*error = MEMCACHED_NOTFOUND;
|
|
380
|
+
|
|
381
|
+
if (value != NULL) {
|
|
382
|
+
size_t dummy_length;
|
|
383
|
+
uint32_t dummy_flags;
|
|
384
|
+
memcached_return dummy_error;
|
|
385
|
+
|
|
386
|
+
(void)memcached_fetch(ptr, NULL, NULL,
|
|
387
|
+
&dummy_length, &dummy_flags,
|
|
388
|
+
&dummy_error);
|
|
389
|
+
WATCHPOINT_ASSERT(dummy_length == 0);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
return value;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
static memcached_return binary_mget_by_key(memcached_st *ptr,
|
|
396
|
+
unsigned int master_server_key,
|
|
397
|
+
bool is_master_key_set,
|
|
398
|
+
const char **keys, size_t *key_length,
|
|
399
|
+
size_t number_of_keys)
|
|
400
|
+
{
|
|
401
|
+
memcached_return rc= MEMCACHED_NOTFOUND;
|
|
402
|
+
uint32_t x;
|
|
403
|
+
|
|
404
|
+
int flush= number_of_keys == 1;
|
|
405
|
+
|
|
406
|
+
/*
|
|
407
|
+
If a server fails we warn about errors and start all over with sending keys
|
|
408
|
+
to the server.
|
|
409
|
+
*/
|
|
410
|
+
for (x= 0; x < number_of_keys; x++)
|
|
411
|
+
{
|
|
412
|
+
unsigned int server_key;
|
|
413
|
+
|
|
414
|
+
if (is_master_key_set)
|
|
415
|
+
server_key= master_server_key;
|
|
416
|
+
else
|
|
417
|
+
server_key= memcached_generate_hash(ptr, keys[x], key_length[x]);
|
|
418
|
+
|
|
419
|
+
if (memcached_server_response_count(&ptr->hosts[server_key]) == 0)
|
|
420
|
+
{
|
|
421
|
+
rc= memcached_connect(&ptr->hosts[server_key]);
|
|
422
|
+
if (rc != MEMCACHED_SUCCESS)
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
protocol_binary_request_getk request= {.bytes= {0}};
|
|
427
|
+
request.message.header.request.magic= PROTOCOL_BINARY_REQ;
|
|
428
|
+
if (number_of_keys == 1)
|
|
429
|
+
request.message.header.request.opcode= PROTOCOL_BINARY_CMD_GETK;
|
|
430
|
+
else
|
|
431
|
+
request.message.header.request.opcode= PROTOCOL_BINARY_CMD_GETKQ;
|
|
432
|
+
|
|
433
|
+
memcached_return vk;
|
|
434
|
+
vk= memcached_validate_key_length(ptr->prefix_key_length + key_length[x],
|
|
435
|
+
ptr->flags & MEM_BINARY_PROTOCOL);
|
|
436
|
+
unlikely (vk != MEMCACHED_SUCCESS)
|
|
437
|
+
{
|
|
438
|
+
if (x > 0)
|
|
439
|
+
memcached_io_reset(&ptr->hosts[server_key]);
|
|
440
|
+
return vk;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
request.message.header.request.keylen= htons((uint16_t)(ptr->prefix_key_length + key_length[x]));
|
|
444
|
+
request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES;
|
|
445
|
+
request.message.header.request.bodylen= htonl((uint32_t) (ptr->prefix_key_length + key_length[x]));
|
|
446
|
+
|
|
447
|
+
if ((memcached_io_write(&ptr->hosts[server_key], request.bytes,
|
|
448
|
+
sizeof(request.bytes), 0) == -1) ||
|
|
449
|
+
(memcached_io_write(&ptr->hosts[server_key], ptr->prefix_key,
|
|
450
|
+
ptr->prefix_key_length, 0) == -1) ||
|
|
451
|
+
(memcached_io_write(&ptr->hosts[server_key], keys[x],
|
|
452
|
+
key_length[x], (char) flush) == -1))
|
|
453
|
+
{
|
|
454
|
+
memcached_server_response_reset(&ptr->hosts[server_key]);
|
|
455
|
+
rc= MEMCACHED_SOME_ERRORS;
|
|
456
|
+
continue;
|
|
457
|
+
}
|
|
458
|
+
memcached_server_response_increment(&ptr->hosts[server_key]);
|
|
459
|
+
if ((x > 0 && x == ptr->io_key_prefetch) &&
|
|
460
|
+
memcached_flush_buffers(ptr) != MEMCACHED_SUCCESS)
|
|
461
|
+
rc= MEMCACHED_SOME_ERRORS;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/*
|
|
465
|
+
* Send a noop command to flush the buffers
|
|
466
|
+
*/
|
|
467
|
+
protocol_binary_request_noop request= {.bytes= {0}};
|
|
468
|
+
request.message.header.request.magic= PROTOCOL_BINARY_REQ;
|
|
469
|
+
request.message.header.request.opcode= PROTOCOL_BINARY_CMD_NOOP;
|
|
470
|
+
request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES;
|
|
471
|
+
|
|
472
|
+
for (x= 0; x < ptr->number_of_hosts; x++) {
|
|
473
|
+
if (memcached_server_response_count(&ptr->hosts[x]))
|
|
474
|
+
{
|
|
475
|
+
if (memcached_io_write(&ptr->hosts[x], NULL, 0, 1) == -1)
|
|
476
|
+
{
|
|
477
|
+
memcached_server_response_reset(&ptr->hosts[x]);
|
|
478
|
+
memcached_io_reset(&ptr->hosts[x]);
|
|
479
|
+
rc= MEMCACHED_SOME_ERRORS;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
if (memcached_io_write(&ptr->hosts[x], request.bytes,
|
|
483
|
+
sizeof(request.bytes), 1) == -1)
|
|
484
|
+
{
|
|
485
|
+
memcached_server_response_reset(&ptr->hosts[x]);
|
|
486
|
+
memcached_io_reset(&ptr->hosts[x]);
|
|
487
|
+
rc= MEMCACHED_SOME_ERRORS;
|
|
488
|
+
}
|
|
489
|
+
memcached_server_response_increment(&ptr->hosts[x]);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
return rc;
|
|
494
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Summary: Get functions for libmemcached
|
|
3
|
+
*
|
|
4
|
+
* Copy: See Copyright for the status of this software.
|
|
5
|
+
*
|
|
6
|
+
* Author: Brian Aker
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
#ifndef __MEMCACHED_GET_H__
|
|
10
|
+
#define __MEMCACHED_GET_H__
|
|
11
|
+
|
|
12
|
+
#ifdef __cplusplus
|
|
13
|
+
extern "C" {
|
|
14
|
+
#endif
|
|
15
|
+
|
|
16
|
+
#define GET_LEN_ARG_UNSPECIFIED -1U
|
|
17
|
+
#define GET_LEN_BUFSZ 32
|
|
18
|
+
|
|
19
|
+
/* Public defines */
|
|
20
|
+
LIBMEMCACHED_API
|
|
21
|
+
char *memcached_get(memcached_st *ptr,
|
|
22
|
+
const char *key, size_t key_length,
|
|
23
|
+
size_t *value_length,
|
|
24
|
+
uint32_t *flags,
|
|
25
|
+
memcached_return *error);
|
|
26
|
+
|
|
27
|
+
LIBMEMCACHED_API
|
|
28
|
+
char *memcached_get_len(memcached_st *ptr,
|
|
29
|
+
const char *key, size_t key_length,
|
|
30
|
+
uint32_t user_spec_len,
|
|
31
|
+
size_t *value_length,
|
|
32
|
+
uint32_t *flags,
|
|
33
|
+
memcached_return *error);
|
|
34
|
+
|
|
35
|
+
LIBMEMCACHED_API
|
|
36
|
+
memcached_return memcached_mget(memcached_st *ptr,
|
|
37
|
+
const char **keys, size_t *key_length,
|
|
38
|
+
size_t number_of_keys);
|
|
39
|
+
|
|
40
|
+
LIBMEMCACHED_API
|
|
41
|
+
memcached_return memcached_mget_len(memcached_st *ptr,
|
|
42
|
+
const char **keys, size_t *key_length,
|
|
43
|
+
size_t number_of_keys, uint32_t user_spec_len);
|
|
44
|
+
|
|
45
|
+
LIBMEMCACHED_API
|
|
46
|
+
char *memcached_get_by_key(memcached_st *ptr,
|
|
47
|
+
const char *master_key,
|
|
48
|
+
size_t master_key_length,
|
|
49
|
+
const char *key, size_t key_length,
|
|
50
|
+
uint32_t user_spec_len,
|
|
51
|
+
size_t *value_length,
|
|
52
|
+
uint32_t *flags,
|
|
53
|
+
memcached_return *error);
|
|
54
|
+
|
|
55
|
+
LIBMEMCACHED_API
|
|
56
|
+
memcached_return memcached_mget_by_key(memcached_st *ptr,
|
|
57
|
+
const char *master_key, size_t
|
|
58
|
+
master_key_length,
|
|
59
|
+
const char **keys,
|
|
60
|
+
size_t *key_length,
|
|
61
|
+
size_t number_of_keys,
|
|
62
|
+
uint32_t user_spec_len);
|
|
63
|
+
|
|
64
|
+
LIBMEMCACHED_API
|
|
65
|
+
char *memcached_fetch(memcached_st *ptr,
|
|
66
|
+
char *key, size_t *key_length,
|
|
67
|
+
size_t *value_length, uint32_t *flags,
|
|
68
|
+
memcached_return *error);
|
|
69
|
+
|
|
70
|
+
LIBMEMCACHED_API
|
|
71
|
+
memcached_result_st *memcached_fetch_result(memcached_st *ptr,
|
|
72
|
+
memcached_result_st *result,
|
|
73
|
+
memcached_return *error);
|
|
74
|
+
|
|
75
|
+
LIBMEMCACHED_API
|
|
76
|
+
char *memcached_get_from_last(memcached_st *ptr,
|
|
77
|
+
const char *key,
|
|
78
|
+
size_t key_length,
|
|
79
|
+
size_t *value_length,
|
|
80
|
+
uint32_t *flags,
|
|
81
|
+
memcached_return *error);
|
|
82
|
+
|
|
83
|
+
#ifdef __cplusplus
|
|
84
|
+
}
|
|
85
|
+
#endif
|
|
86
|
+
|
|
87
|
+
#endif /* __MEMCACHED_GET_H__ */
|