memcached 0.19.5 → 0.19.6
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.tar.gz.sig +0 -0
- data/CHANGELOG +2 -0
- data/Manifest +1 -0
- data/Rakefile +1 -1
- data/ext/extconf.rb +14 -4
- data/ext/libmemcached-2.patch +116 -0
- data/ext/rlibmemcached.i +12 -0
- data/ext/rlibmemcached_wrap.c +59 -0
- data/lib/memcached/memcached.rb +20 -8
- data/lib/memcached/rails.rb +12 -4
- data/memcached.gemspec +3 -3
- data/test/profile/valgrind.rb +2 -0
- data/test/unit/memcached_test.rb +10 -0
- metadata +4 -3
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG
CHANGED
data/Manifest
CHANGED
data/Rakefile
CHANGED
@@ -23,7 +23,7 @@ task :exceptions do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
task :valgrind do
|
26
|
-
exec("valgrind --tool=memcheck --leak-check=
|
26
|
+
exec("valgrind --tool=memcheck --leak-check=full --show-reachable=no --num-callers=15 --track-fds=yes --workaround-gcc296-bugs=yes --max-stackframe=7304328 --dsymutil=yes --track-origins=yes ruby #{File.dirname(__FILE__)}/test/profile/valgrind.rb")
|
27
27
|
end
|
28
28
|
|
29
29
|
task :profile do
|
data/ext/extconf.rb
CHANGED
@@ -5,7 +5,11 @@ HERE = File.expand_path(File.dirname(__FILE__))
|
|
5
5
|
BUNDLE = Dir.glob("libmemcached-*.tar.gz").first
|
6
6
|
BUNDLE_PATH = BUNDLE.sub(".tar.gz", "")
|
7
7
|
|
8
|
+
SOLARIS_32 = RbConfig::CONFIG['target'] == "i386-pc-solaris2.10"
|
9
|
+
|
8
10
|
$CFLAGS = "#{RbConfig::CONFIG['CFLAGS']} #{$CFLAGS}".gsub("$(cflags)", "").gsub("-fno-common", "")
|
11
|
+
$CFLAGS << " -std=gnu99" if SOLARIS_32
|
12
|
+
$EXTRA_CONF = " --disable-64bit" if SOLARIS_32
|
9
13
|
$LDFLAGS = "#{RbConfig::CONFIG['LDFLAGS']} #{$LDFLAGS}".gsub("$(ldflags)", "").gsub("-fno-common", "")
|
10
14
|
$CXXFLAGS = " -std=gnu++98 #{$CFLAGS}"
|
11
15
|
$CPPFLAGS = $ARCH_FLAG = $DLDFLAGS = ""
|
@@ -25,12 +29,14 @@ def check_libmemcached
|
|
25
29
|
$CFLAGS = "#{$includes} #{$libraries} #{$CFLAGS}"
|
26
30
|
$LDFLAGS = "#{$libraries} #{$LDFLAGS}"
|
27
31
|
$LIBPATH = ["#{HERE}/lib"]
|
28
|
-
$DEFLIBPATH = []
|
32
|
+
$DEFLIBPATH = [] unless SOLARIS_32
|
29
33
|
|
30
34
|
Dir.chdir(HERE) do
|
31
35
|
if File.exist?("lib")
|
32
36
|
puts "Libmemcached already built; run 'rake clean' first if you need to rebuild."
|
33
37
|
else
|
38
|
+
tar = SOLARIS_32 ? 'gtar' : 'tar'
|
39
|
+
patch = SOLARIS_32 ? 'gpatch' : 'patch'
|
34
40
|
|
35
41
|
# have_sasl check may fail on OSX, skip it
|
36
42
|
# unless RUBY_PLATFORM =~ /darwin/ or have_library('sasl2')
|
@@ -38,15 +44,19 @@ def check_libmemcached
|
|
38
44
|
# end
|
39
45
|
|
40
46
|
puts "Building libmemcached."
|
41
|
-
puts(cmd = "tar xzf #{BUNDLE} 2>&1")
|
47
|
+
puts(cmd = "#{tar} xzf #{BUNDLE} 2>&1")
|
42
48
|
raise "'#{cmd}' failed" unless system(cmd)
|
43
49
|
|
44
50
|
puts "Patching libmemcached source."
|
45
|
-
puts(cmd = "patch -p1 -Z < libmemcached.patch")
|
51
|
+
puts(cmd = "#{patch} -p1 -Z < libmemcached.patch")
|
46
52
|
raise "'#{cmd}' failed" unless system(cmd)
|
47
53
|
|
48
54
|
puts "Patching libmemcached with SASL support."
|
49
|
-
puts(cmd = "patch -p1 -Z < sasl.patch")
|
55
|
+
puts(cmd = "#{patch} -p1 -Z < sasl.patch")
|
56
|
+
raise "'#{cmd}' failed" unless system(cmd)
|
57
|
+
|
58
|
+
puts "Patching libmemcached for get_from_last support."
|
59
|
+
puts(cmd = "#{patch} -p1 -Z < libmemcached-2.patch")
|
50
60
|
raise "'#{cmd}' failed" unless system(cmd)
|
51
61
|
|
52
62
|
puts "Touching aclocal.m4 in libmemcached."
|
@@ -0,0 +1,116 @@
|
|
1
|
+
diff --git a/libmemcached-0.32/libmemcached/memcached.h libmemcached/libmemcached/memcached.h
|
2
|
+
--- a/libmemcached-0.32/libmemcached/memcached.h
|
3
|
+
+++ b/libmemcached/libmemcached/memcached.h
|
4
|
+
@@ -119,6 +119,7 @@
|
5
|
+
#ifdef LIBMEMCACHED_WITH_SASL_SUPPORT
|
6
|
+
const sasl_callback_t *sasl_callbacks;
|
7
|
+
#endif
|
8
|
+
+ int last_server_key;
|
9
|
+
};
|
10
|
+
|
11
|
+
LIBMEMCACHED_API
|
12
|
+
diff --git a/libmemcached-0.32/libmemcached/memcached_get.c libmemcached/libmemcached/memcached_get.c
|
13
|
+
--- a/libmemcached-0.32/libmemcached/memcached_get.c
|
14
|
+
+++ b/libmemcached/libmemcached/memcached_get.c
|
15
|
+
@@ -235,6 +235,8 @@
|
16
|
+
rc= MEMCACHED_SOME_ERRORS;
|
17
|
+
continue;
|
18
|
+
}
|
19
|
+
+
|
20
|
+
+ ptr->last_server_key = server_key;
|
21
|
+
}
|
22
|
+
|
23
|
+
/*
|
24
|
+
@@ -256,6 +258,74 @@
|
25
|
+
return rc;
|
26
|
+
}
|
27
|
+
|
28
|
+
+
|
29
|
+
+char *memcached_get_from_last(memcached_st *ptr,
|
30
|
+
+ const char *key,
|
31
|
+
+ size_t key_length,
|
32
|
+
+ size_t *value_length,
|
33
|
+
+ uint32_t *flags,
|
34
|
+
+ memcached_return *error)
|
35
|
+
+{
|
36
|
+
+ memcached_return rc = MEMCACHED_NOTFOUND;
|
37
|
+
+ char *value = NULL;
|
38
|
+
+
|
39
|
+
+ if (memcached_server_response_count(&ptr->hosts[ptr->last_server_key]) == 0) {
|
40
|
+
+ *error = memcached_connect(&ptr->hosts[ptr->last_server_key]);
|
41
|
+
+
|
42
|
+
+ if (*error != MEMCACHED_SUCCESS) {
|
43
|
+
+ return value;
|
44
|
+
+ }
|
45
|
+
+
|
46
|
+
+ if ((memcached_io_write(&ptr->hosts[ptr->last_server_key], "get ", 4, 0)) == -1) {
|
47
|
+
+ *error = MEMCACHED_SOME_ERRORS;
|
48
|
+
+ return value;
|
49
|
+
+ }
|
50
|
+
+ WATCHPOINT_ASSERT(ptr->hosts[ptr->last_server_key].cursor_active == 0);
|
51
|
+
+ memcached_server_response_increment(&ptr->hosts[ptr->last_server_key]);
|
52
|
+
+ WATCHPOINT_ASSERT(ptr->hosts[ptr->last_server_key].cursor_active == 1);
|
53
|
+
+ }
|
54
|
+
+
|
55
|
+
+ /* Only called when we have a prefix key */
|
56
|
+
+ if (ptr->prefix_key[0] != 0) {
|
57
|
+
+ if ((memcached_io_write(&ptr->hosts[ptr->last_server_key], ptr->prefix_key, ptr->prefix_key_length, 0)) == -1) {
|
58
|
+
+ memcached_server_response_reset(&ptr->hosts[ptr->last_server_key]);
|
59
|
+
+ *error = MEMCACHED_SOME_ERRORS;
|
60
|
+
+ return value;
|
61
|
+
+ }
|
62
|
+
+ }
|
63
|
+
+
|
64
|
+
+ if ((memcached_io_write(&ptr->hosts[ptr->last_server_key], key, key_length, 0)) == -1) {
|
65
|
+
+ memcached_server_response_reset(&ptr->hosts[ptr->last_server_key]);
|
66
|
+
+ *error = MEMCACHED_SOME_ERRORS;
|
67
|
+
+ return value;
|
68
|
+
+ }
|
69
|
+
+
|
70
|
+
+ if ((memcached_io_write(&ptr->hosts[ptr->last_server_key], "\r\n", 2, 1)) == -1) {
|
71
|
+
+ memcached_server_response_reset(&ptr->hosts[ptr->last_server_key]);
|
72
|
+
+ *error = MEMCACHED_SOME_ERRORS;
|
73
|
+
+ return value;
|
74
|
+
+ }
|
75
|
+
+
|
76
|
+
+ value = memcached_fetch(ptr, NULL, NULL, value_length, flags, error);
|
77
|
+
+
|
78
|
+
+ /* This is for historical reasons */
|
79
|
+
+ if (*error == MEMCACHED_END)
|
80
|
+
+ *error = MEMCACHED_NOTFOUND;
|
81
|
+
+
|
82
|
+
+ if (value != NULL) {
|
83
|
+
+ size_t dummy_length;
|
84
|
+
+ uint32_t dummy_flags;
|
85
|
+
+ memcached_return dummy_error;
|
86
|
+
+
|
87
|
+
+ (void)memcached_fetch(ptr, NULL, NULL,
|
88
|
+
+ &dummy_length, &dummy_flags,
|
89
|
+
+ &dummy_error);
|
90
|
+
+ WATCHPOINT_ASSERT(dummy_length == 0);
|
91
|
+
+ }
|
92
|
+
+
|
93
|
+
+ return value;
|
94
|
+
+}
|
95
|
+
+
|
96
|
+
static memcached_return simple_binary_mget(memcached_st *ptr,
|
97
|
+
unsigned int master_server_key,
|
98
|
+
bool is_master_key_set,
|
99
|
+
diff --git a/libmemcached-0.32/libmemcached/memcached_get.h libmemcached/libmemcached/memcached_get.h
|
100
|
+
--- a/libmemcached-0.32/libmemcached/memcached_get.h
|
101
|
+
+++ b/libmemcached/libmemcached/memcached_get.h
|
102
|
+
@@ -53,7 +53,13 @@
|
103
|
+
memcached_result_st *result,
|
104
|
+
memcached_return *error);
|
105
|
+
|
106
|
+
-
|
107
|
+
+LIBMEMCACHED_API
|
108
|
+
+char *memcached_get_from_last(memcached_st *ptr,
|
109
|
+
+ const char *key,
|
110
|
+
+ size_t key_length,
|
111
|
+
+ size_t *value_length,
|
112
|
+
+ uint32_t *flags,
|
113
|
+
+ memcached_return *error);
|
114
|
+
|
115
|
+
#ifdef __cplusplus
|
116
|
+
}
|
data/ext/rlibmemcached.i
CHANGED
@@ -163,6 +163,18 @@ VALUE memcached_get_rvalue(memcached_st *ptr, const char *key, size_t key_length
|
|
163
163
|
};
|
164
164
|
%}
|
165
165
|
|
166
|
+
VALUE memcached_get_from_last_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error);
|
167
|
+
%{
|
168
|
+
VALUE memcached_get_from_last_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error) {
|
169
|
+
VALUE ret;
|
170
|
+
size_t value_length;
|
171
|
+
char *value = memcached_get_from_last(ptr, key, key_length, &value_length, flags, error);
|
172
|
+
ret = rb_str_new(value, value_length);
|
173
|
+
free(value);
|
174
|
+
return ret;
|
175
|
+
};
|
176
|
+
%}
|
177
|
+
|
166
178
|
// Multi get
|
167
179
|
VALUE memcached_fetch_rvalue(memcached_st *ptr, char *key, size_t *key_length, uint32_t *flags, memcached_return *error);
|
168
180
|
%{
|
data/ext/rlibmemcached_wrap.c
CHANGED
@@ -2228,6 +2228,15 @@ VALUE memcached_get_rvalue(memcached_st *ptr, const char *key, size_t key_length
|
|
2228
2228
|
return ret;
|
2229
2229
|
};
|
2230
2230
|
|
2231
|
+
VALUE memcached_get_from_last_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error) {
|
2232
|
+
VALUE ret;
|
2233
|
+
size_t value_length;
|
2234
|
+
char *value = memcached_get_from_last(ptr, key, key_length, &value_length, flags, error);
|
2235
|
+
ret = rb_str_new(value, value_length);
|
2236
|
+
free(value);
|
2237
|
+
return ret;
|
2238
|
+
};
|
2239
|
+
|
2231
2240
|
|
2232
2241
|
VALUE memcached_fetch_rvalue(memcached_st *ptr, char *key, size_t *key_length, uint32_t *flags, memcached_return *error) {
|
2233
2242
|
size_t value_length;
|
@@ -12211,6 +12220,55 @@ fail:
|
|
12211
12220
|
return Qnil;
|
12212
12221
|
}
|
12213
12222
|
|
12223
|
+
SWIGINTERN VALUE
|
12224
|
+
_wrap_memcached_get_from_last_rvalue(int argc, VALUE *argv, VALUE self) {
|
12225
|
+
memcached_st *arg1 = (memcached_st *) 0 ;
|
12226
|
+
char *arg2 = (char *) 0 ;
|
12227
|
+
size_t arg3 ;
|
12228
|
+
uint32_t *arg4 = (uint32_t *) 0 ;
|
12229
|
+
memcached_return *arg5 = (memcached_return *) 0 ;
|
12230
|
+
void *argp1 = 0 ;
|
12231
|
+
int res1 = 0 ;
|
12232
|
+
uint32_t temp4 ;
|
12233
|
+
int res4 = SWIG_TMPOBJ ;
|
12234
|
+
memcached_return temp5 ;
|
12235
|
+
int res5 = SWIG_TMPOBJ ;
|
12236
|
+
VALUE result;
|
12237
|
+
VALUE vresult = Qnil;
|
12238
|
+
|
12239
|
+
arg4 = &temp4;
|
12240
|
+
arg5 = &temp5;
|
12241
|
+
if ((argc < 2) || (argc > 2)) {
|
12242
|
+
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)",argc); SWIG_fail;
|
12243
|
+
}
|
12244
|
+
res1 = SWIG_ConvertPtr(argv[0], &argp1,SWIGTYPE_p_memcached_st, 0 | 0 );
|
12245
|
+
if (!SWIG_IsOK(res1)) {
|
12246
|
+
SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "memcached_st *","memcached_get_from_last_rvalue", 1, argv[0] ));
|
12247
|
+
}
|
12248
|
+
arg1 = (memcached_st *)(argp1);
|
12249
|
+
{
|
12250
|
+
arg2 = StringValuePtr(argv[1]);
|
12251
|
+
arg3 = (size_t) RSTRING_LEN(argv[1]);
|
12252
|
+
}
|
12253
|
+
result = (VALUE)memcached_get_from_last_rvalue(arg1,(char const *)arg2,arg3,arg4,arg5);
|
12254
|
+
vresult = result;
|
12255
|
+
if (SWIG_IsTmpObj(res4)) {
|
12256
|
+
vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_From_unsigned_SS_int((*arg4)));
|
12257
|
+
} else {
|
12258
|
+
int new_flags = SWIG_IsNewObj(res4) ? (SWIG_POINTER_OWN | 0 ) : 0 ;
|
12259
|
+
vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj((void*)(arg4), SWIGTYPE_p_uint32_t, new_flags));
|
12260
|
+
}
|
12261
|
+
if (SWIG_IsTmpObj(res5)) {
|
12262
|
+
vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_From_unsigned_SS_short((*arg5)));
|
12263
|
+
} else {
|
12264
|
+
int new_flags = SWIG_IsNewObj(res5) ? (SWIG_POINTER_OWN | 0 ) : 0 ;
|
12265
|
+
vresult = SWIG_Ruby_AppendOutput(vresult, SWIG_NewPointerObj((void*)(arg5), SWIGTYPE_p_memcached_return, new_flags));
|
12266
|
+
}
|
12267
|
+
return vresult;
|
12268
|
+
fail:
|
12269
|
+
return Qnil;
|
12270
|
+
}
|
12271
|
+
|
12214
12272
|
|
12215
12273
|
SWIGINTERN VALUE
|
12216
12274
|
_wrap_memcached_fetch_rvalue(int argc, VALUE *argv, VALUE self) {
|
@@ -13276,6 +13334,7 @@ SWIGEXPORT void Init_rlibmemcached(void) {
|
|
13276
13334
|
rb_define_module_function(mRlibmemcached, "memcached_get_sasl_callbacks", _wrap_memcached_get_sasl_callbacks, -1);
|
13277
13335
|
rb_define_module_function(mRlibmemcached, "memcached_sasl_authenticate_connection", _wrap_memcached_sasl_authenticate_connection, -1);
|
13278
13336
|
rb_define_module_function(mRlibmemcached, "memcached_get_rvalue", _wrap_memcached_get_rvalue, -1);
|
13337
|
+
rb_define_module_function(mRlibmemcached, "memcached_get_from_last_rvalue", _wrap_memcached_get_from_last_rvalue, -1);
|
13279
13338
|
rb_define_module_function(mRlibmemcached, "memcached_fetch_rvalue", _wrap_memcached_fetch_rvalue, -1);
|
13280
13339
|
rb_define_module_function(mRlibmemcached, "memcached_stat_get_rvalue", _wrap_memcached_stat_get_rvalue, -1);
|
13281
13340
|
rb_define_module_function(mRlibmemcached, "memcached_select_server_at", _wrap_memcached_select_server_at, -1);
|
data/lib/memcached/memcached.rb
CHANGED
@@ -502,9 +502,11 @@ Please note that when <tt>:no_block => true</tt>, update methods do not raise on
|
|
502
502
|
keys.each do
|
503
503
|
value, key, flags, ret = Lib.memcached_fetch_rvalue(@struct)
|
504
504
|
break if ret == Lib::MEMCACHED_END
|
505
|
-
|
506
|
-
|
507
|
-
|
505
|
+
if ret != Lib::MEMCACHED_NOTFOUND
|
506
|
+
check_return_code(ret, key)
|
507
|
+
# Assign the value
|
508
|
+
hash[key] = (marshal ? Marshal.load(value) : value)
|
509
|
+
end
|
508
510
|
end
|
509
511
|
hash
|
510
512
|
else
|
@@ -520,6 +522,14 @@ Please note that when <tt>:no_block => true</tt>, update methods do not raise on
|
|
520
522
|
retry
|
521
523
|
end
|
522
524
|
|
525
|
+
# Gets a key's value from the previous server. Only useful with random distribution.
|
526
|
+
def get_from_last(key, marshal=true)
|
527
|
+
raise ArgumentError, "get_from_last() is not useful unless :random distribution is enabled." unless options[:distribution] == :random
|
528
|
+
value, flags, ret = Lib.memcached_get_from_last_rvalue(@struct, key)
|
529
|
+
check_return_code(ret, key)
|
530
|
+
marshal ? Marshal.load(value) : value
|
531
|
+
end
|
532
|
+
|
523
533
|
### Information methods
|
524
534
|
|
525
535
|
# Return the server used by a particular key.
|
@@ -586,12 +596,14 @@ Please note that when <tt>:no_block => true</tt>, update methods do not raise on
|
|
586
596
|
message = "Key #{inspect_keys(key, (detect_failure if ret == Lib::MEMCACHED_SERVER_MARKED_DEAD)).inspect}"
|
587
597
|
if key.is_a?(String)
|
588
598
|
if ret == Lib::MEMCACHED_ERRNO
|
589
|
-
server = Lib.memcached_server_by_key(@struct, key)
|
590
|
-
|
591
|
-
|
599
|
+
if (server = Lib.memcached_server_by_key(@struct, key)).is_a?(Array)
|
600
|
+
errno = server.first.cached_errno
|
601
|
+
message = "Errno #{errno}: #{ERRNO_HASH[errno].inspect}. #{message}"
|
602
|
+
end
|
592
603
|
elsif ret == Lib::MEMCACHED_SERVER_ERROR
|
593
|
-
server = Lib.memcached_server_by_key(@struct, key)
|
594
|
-
|
604
|
+
if (server = Lib.memcached_server_by_key(@struct, key)).is_a?(Array)
|
605
|
+
message = "\"#{server.first.cached_server_error}\". #{message}."
|
606
|
+
end
|
595
607
|
end
|
596
608
|
end
|
597
609
|
raise EXCEPTIONS[ret], message
|
data/lib/memcached/rails.rb
CHANGED
@@ -7,7 +7,10 @@ class Memcached
|
|
7
7
|
# A legacy compatibility wrapper for the Memcached class. It has basic compatibility with the <b>memcache-client</b> API.
|
8
8
|
class Rails < ::Memcached
|
9
9
|
|
10
|
-
DEFAULTS
|
10
|
+
DEFAULTS = {
|
11
|
+
:logger => nil,
|
12
|
+
:string_return_types => false
|
13
|
+
}
|
11
14
|
|
12
15
|
attr_reader :logger
|
13
16
|
|
@@ -46,7 +49,9 @@ class Memcached
|
|
46
49
|
# Wraps Memcached#cas so that it doesn't raise. Doesn't set anything if no value is present.
|
47
50
|
def cas(key, ttl=@default_ttl, raw=false, &block)
|
48
51
|
super(key, ttl, !raw, &block)
|
52
|
+
true
|
49
53
|
rescue NotFound
|
54
|
+
false
|
50
55
|
end
|
51
56
|
|
52
57
|
alias :compare_and_swap :cas
|
@@ -59,21 +64,24 @@ class Memcached
|
|
59
64
|
# Wraps Memcached#set.
|
60
65
|
def set(key, value, ttl=@default_ttl, raw=false)
|
61
66
|
super(key, value, ttl, !raw)
|
67
|
+
true
|
68
|
+
rescue NotStored
|
69
|
+
false
|
62
70
|
end
|
63
71
|
|
64
72
|
# Alternative to #set. Accepts a key, value, and an optional options hash supporting the
|
65
73
|
# options :raw and :ttl.
|
66
74
|
def write(key, value, options = {})
|
67
75
|
set(key, value, options[:ttl] || @default_ttl, options[:raw])
|
68
|
-
true
|
69
76
|
end
|
70
77
|
|
71
78
|
# Wraps Memcached#add so that it doesn't raise.
|
72
79
|
def add(key, value, ttl=@default_ttl, raw=false)
|
73
80
|
super(key, value, ttl, !raw)
|
74
|
-
|
81
|
+
# This causes me physical pain.
|
82
|
+
opts[:string_return_types] ? "STORED\r\n" : true
|
75
83
|
rescue NotStored
|
76
|
-
false
|
84
|
+
opts[:string_return_types] ? "NOT STORED\r\n" : false
|
77
85
|
end
|
78
86
|
|
79
87
|
# Wraps Memcached#delete so that it doesn't raise.
|
data/memcached.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{memcached}
|
5
|
-
s.version = "0.19.
|
5
|
+
s.version = "0.19.6"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Evan Weaver"]
|
9
9
|
s.cert_chain = ["/Users/eweaver/p/configuration/gem_certificates/evan_weaver-original-public_cert.pem"]
|
10
|
-
s.date = %q{2010-
|
10
|
+
s.date = %q{2010-06-13}
|
11
11
|
s.description = %q{An interface to the libmemcached C client.}
|
12
12
|
s.email = %q{}
|
13
13
|
s.extensions = ["ext/extconf.rb"]
|
14
14
|
s.extra_rdoc_files = ["BENCHMARKS", "CHANGELOG", "LICENSE", "README", "TODO", "lib/memcached.rb", "lib/memcached/behaviors.rb", "lib/memcached/exceptions.rb", "lib/memcached/memcached.rb", "lib/memcached/rails.rb"]
|
15
|
-
s.files = ["BENCHMARKS", "CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "TODO", "ext/extconf.rb", "ext/libmemcached-0.32.tar.gz", "ext/libmemcached.patch", "ext/rlibmemcached.i", "ext/rlibmemcached_wrap.c", "ext/sasl.patch", "lib/memcached.rb", "lib/memcached/auth.rb", "lib/memcached/behaviors.rb", "lib/memcached/exceptions.rb", "lib/memcached/integer.rb", "lib/memcached/memcached.rb", "lib/memcached/rails.rb", "test/profile/benchmark.rb", "test/profile/profile.rb", "test/profile/valgrind.rb", "test/setup.rb", "test/teardown.rb", "test/test_helper.rb", "test/unit/binding_test.rb", "test/unit/memcached_test.rb", "test/unit/rails_test.rb", "memcached.gemspec"]
|
15
|
+
s.files = ["BENCHMARKS", "CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "TODO", "ext/extconf.rb", "ext/libmemcached-0.32.tar.gz", "ext/libmemcached-2.patch", "ext/libmemcached.patch", "ext/rlibmemcached.i", "ext/rlibmemcached_wrap.c", "ext/sasl.patch", "lib/memcached.rb", "lib/memcached/auth.rb", "lib/memcached/behaviors.rb", "lib/memcached/exceptions.rb", "lib/memcached/integer.rb", "lib/memcached/memcached.rb", "lib/memcached/rails.rb", "test/profile/benchmark.rb", "test/profile/profile.rb", "test/profile/valgrind.rb", "test/setup.rb", "test/teardown.rb", "test/test_helper.rb", "test/unit/binding_test.rb", "test/unit/memcached_test.rb", "test/unit/rails_test.rb", "memcached.gemspec"]
|
16
16
|
s.homepage = %q{http://blog.evanweaver.com/files/doc/fauna/memcached/}
|
17
17
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Memcached", "--main", "README"]
|
18
18
|
s.require_paths = ["lib", "ext"]
|
data/test/profile/valgrind.rb
CHANGED
@@ -5,6 +5,8 @@ $LOAD_PATH << "#{File.dirname(__FILE__)}/../../lib/"
|
|
5
5
|
require 'memcached'
|
6
6
|
require 'rubygems'
|
7
7
|
|
8
|
+
GC.copy_on_write_friendly = true if GC.respond_to?("copy_on_write_friendly=")
|
9
|
+
|
8
10
|
class Worker
|
9
11
|
def initialize(method_name, iterations)
|
10
12
|
@method = method_name || 'mixed'
|
data/test/unit/memcached_test.rb
CHANGED
@@ -255,6 +255,16 @@ class MemcachedTest < Test::Unit::TestCase
|
|
255
255
|
assert_equal nil, result
|
256
256
|
end
|
257
257
|
|
258
|
+
def test_get_from_last
|
259
|
+
cache = Memcached.new(@servers, :distribution => :random)
|
260
|
+
10.times do |n|
|
261
|
+
cache.set key, n
|
262
|
+
end
|
263
|
+
10.times do
|
264
|
+
assert_equal cache.get(key), cache.get_from_last(key)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
258
268
|
def test_get_missing
|
259
269
|
@cache.delete key rescue nil
|
260
270
|
assert_raise(Memcached::NotFound) do
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 19
|
8
|
-
-
|
9
|
-
version: 0.19.
|
8
|
+
- 6
|
9
|
+
version: 0.19.6
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Evan Weaver
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
yZ0=
|
36
36
|
-----END CERTIFICATE-----
|
37
37
|
|
38
|
-
date: 2010-
|
38
|
+
date: 2010-06-13 00:00:00 -07:00
|
39
39
|
default_executable:
|
40
40
|
dependencies: []
|
41
41
|
|
@@ -66,6 +66,7 @@ files:
|
|
66
66
|
- TODO
|
67
67
|
- ext/extconf.rb
|
68
68
|
- ext/libmemcached-0.32.tar.gz
|
69
|
+
- ext/libmemcached-2.patch
|
69
70
|
- ext/libmemcached.patch
|
70
71
|
- ext/rlibmemcached.i
|
71
72
|
- ext/rlibmemcached_wrap.c
|
metadata.gz.sig
CHANGED
Binary file
|