vinted-memcached 1.8.4 → 1.8.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.
- checksums.yaml +4 -4
- data/.github/workflows/build_release_pipeline.yaml +53 -0
- data/.gitignore +33 -0
- data/BENCHMARKS +130 -126
- data/CHANGELOG +1 -6
- data/Gemfile +8 -1
- data/Gemfile.lock +25 -38
- data/README.md +144 -0
- data/Rakefile +21 -93
- data/ext/rlibmemcached/extconf.rb +76 -0
- data/ext/{rlibmemcached.i → rlibmemcached/rlibmemcached.i} +48 -69
- data/ext/{rlibmemcached_wrap.c → rlibmemcached/rlibmemcached_wrap.c} +146 -320
- data/lib/memcached/exceptions.rb +1 -12
- data/lib/memcached/experimental.rb +1 -33
- data/lib/memcached/memcached.rb +41 -34
- data/lib/memcached/version.rb +1 -1
- data/lib/memcached.rb +9 -4
- data/memcached.gemspec +0 -0
- data/memcached.pem +21 -0
- data/vendor/libmemcached-0.32/config/config.guess +1815 -0
- data/vendor/libmemcached-0.32/config/config.sub +2354 -0
- data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_connect.c +23 -13
- data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_io.c +18 -13
- data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_purge.c +1 -1
- data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_storage.c +16 -25
- metadata +195 -249
- data/Manifest +0 -209
- data/README.rdoc +0 -124
- data/ext/extconf-make.rb +0 -25
- data/ext/extconf.rb +0 -78
- data/ext/libmemcached-0.32/config/config.guess +0 -1561
- data/ext/libmemcached-0.32/config/config.sub +0 -1686
- data/lib/memcached/auth.rb +0 -16
- data/test/profile/benchmark.rb +0 -280
- data/test/profile/c_profiler.rb +0 -14
- data/test/profile/exercise.rb +0 -185
- data/test/profile/rb_profiler.rb +0 -21
- data/test/profile/valgrind.rb +0 -10
- data/test/setup.rb +0 -30
- data/test/teardown.rb +0 -0
- data/test/test_helper.rb +0 -18
- data/test/unit/binding_test.rb +0 -8
- data/test/unit/memcached_experimental_test.rb +0 -272
- data/test/unit/memcached_test.rb +0 -1487
- data/test/unit/rails_test.rb +0 -330
- /data/{ext → vendor}/libmemcached-0.32/AUTHORS +0 -0
- /data/{ext → vendor}/libmemcached-0.32/COPYING +0 -0
- /data/{ext → vendor}/libmemcached-0.32/ChangeLog +0 -0
- /data/{ext → vendor}/libmemcached-0.32/INSTALL +0 -0
- /data/{ext → vendor}/libmemcached-0.32/Makefile.am +0 -0
- /data/{ext → vendor}/libmemcached-0.32/Makefile.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/NEWS +0 -0
- /data/{ext → vendor}/libmemcached-0.32/README +0 -0
- /data/{ext → vendor}/libmemcached-0.32/THANKS +0 -0
- /data/{ext → vendor}/libmemcached-0.32/TODO +0 -0
- /data/{ext → vendor}/libmemcached-0.32/aclocal.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/Makefile.am +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/Makefile.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/client_options.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/execute.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/execute.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/generator.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/generator.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memcat.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memcp.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memdump.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memerror.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memflush.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memrm.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memslap.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/memstat.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/utilities.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/clients/utilities.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config/compile +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config/config.rpath +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config/depcomp +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config/install-sh +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config/ltmain.sh +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config/missing +0 -0
- /data/{ext → vendor}/libmemcached-0.32/config.h.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/configure +0 -0
- /data/{ext → vendor}/libmemcached-0.32/configure.ac +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/Makefile.am +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/Makefile.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/byteorder.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/common.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/crc.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/hsieh_hash.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/jenkins_hash.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/libmemcached.ver +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/libmemcached_probes.d +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/libmemcached_probes.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/md5.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached/README.txt +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached/protocol_binary.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached.hpp +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_allocators.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_analyze.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_auto.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_behavior.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_callback.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_configure.h.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_constants.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_delete.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_do.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_dump.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_exist.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_exist.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_fetch.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_flush.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_flush_buffers.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_get.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_get.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_hash.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_hosts.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_internal.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_io.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_key.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_parse.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_pool.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_quit.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_response.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_result.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_result.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_sasl.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_sasl.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_server.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_server.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_stats.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_storage.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_strerror.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_string.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_string.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_touch.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_touch.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_types.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_util.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_verbosity.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_version.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_watchpoint.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/murmur_hash.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcached/visibility.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/Makefile.am +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/Makefile.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/libmemcachedutil.ver +0 -0
- /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/memcached_pool.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/ac_cxx_compile_stdcxx_0x.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/ac_cxx_header_stdcxx_98.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/acx_pthread.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/byteorder.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/deprecated.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/enable_utillib.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/extensions.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/hsieh.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/lib-prefix.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/libtool.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/ltoptions.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/ltsugar.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/ltversion.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/lt~obsolete.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/memcached.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_64bit.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_canonical.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_check_compiler_version.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_check_cxx_standard.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_enable_dtrace.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_ensure_gcc_version.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_have_better_malloc.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_have_sasl.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_header_assert.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_libtool.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_optimize.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_shared_ptr.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_vc_build.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pandora_warnings.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/pod2man.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/protocol_binary.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/setsockopt.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/m4/visibility.m4 +0 -0
- /data/{ext → vendor}/libmemcached-0.32/support/Makefile.am +0 -0
- /data/{ext → vendor}/libmemcached-0.32/support/Makefile.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/support/libmemcached-fc.spec.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/support/libmemcached.pc.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/support/libmemcached.spec +0 -0
- /data/{ext → vendor}/libmemcached-0.32/support/libmemcached.spec.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/support/set_benchmark.sh +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/Makefile.am +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/Makefile.in +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/atomsmasher.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/function.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/ketama_test_cases.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/output.cmp +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/output.res +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/output2.res +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/plus.cpp +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/r/memcat.res +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/r/memcp.res +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/r/memrm.res +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/r/memslap.res +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/r/memstat.res +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/server.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/server.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/start.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/t/memcat.test +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/t/memcp.test +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/t/memrm.test +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/t/memslap.test +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/t/memstat.test +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/test.c +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/test.h +0 -0
- /data/{ext → vendor}/libmemcached-0.32/tests/udp.c +0 -0
data/README.md
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
# memcached
|
2
|
+
|
3
|
+
An interface to the libmemcached C client.
|
4
|
+
[](https://github.com/arthurnn/memcached/actions?query=branch%3A1-0-stable)
|
5
|
+
|
6
|
+
## License
|
7
|
+
|
8
|
+
Copyright 2009-2013 Cloudburst, LLC. Licensed under the AFL 3. See the
|
9
|
+
included LICENSE file. Portions copyright 2007-2009 TangentOrg, Brian Aker,
|
10
|
+
licensed under the BSD license, and used with permission.
|
11
|
+
|
12
|
+
## Features
|
13
|
+
|
14
|
+
* clean API
|
15
|
+
* robust access to all memcached features
|
16
|
+
* SASL support for the binary protocol
|
17
|
+
* multiple hashing modes, including consistent hashing
|
18
|
+
* ludicrous speed, including optional pipelined IO with no_reply
|
19
|
+
|
20
|
+
|
21
|
+
The **memcached** library wraps the pure-C libmemcached client via SWIG.
|
22
|
+
|
23
|
+
## Installation
|
24
|
+
|
25
|
+
You need Ruby 1.8.7 or Ruby 1.9.2. Other versions may work, but are not
|
26
|
+
guaranteed. You also need the `libsasl2-dev` and `gettext` libraries, which
|
27
|
+
should be provided through your system's package manager.
|
28
|
+
|
29
|
+
Install the gem:
|
30
|
+
sudo gem install memcached --no-rdoc --no-ri
|
31
|
+
|
32
|
+
## Usage
|
33
|
+
|
34
|
+
Start a local networked memcached server:
|
35
|
+
$ memcached -p 11211 &
|
36
|
+
|
37
|
+
Now, in Ruby, require the library and instantiate a Memcached object at a
|
38
|
+
global level:
|
39
|
+
|
40
|
+
require 'memcached'
|
41
|
+
$cache = Memcached.new("localhost:11211")
|
42
|
+
|
43
|
+
Now you can set things and get things:
|
44
|
+
|
45
|
+
value = 'hello'
|
46
|
+
$cache.set 'test', value
|
47
|
+
$cache.get 'test' #=> "hello"
|
48
|
+
|
49
|
+
You can set with an expiration timeout:
|
50
|
+
|
51
|
+
value = 'hello'
|
52
|
+
$cache.set 'test', value, 1
|
53
|
+
sleep(2)
|
54
|
+
$cache.get 'test' #=> raises Memcached::NotFound
|
55
|
+
|
56
|
+
You can get multiple values at once:
|
57
|
+
|
58
|
+
value = 'hello'
|
59
|
+
$cache.set 'test', value
|
60
|
+
$cache.set 'test2', value
|
61
|
+
$cache.get ['test', 'test2', 'missing']
|
62
|
+
#=> {"test" => "hello", "test2" => "hello"}
|
63
|
+
|
64
|
+
You can set a counter and increment it. Note that you must initialize it with
|
65
|
+
an integer, encoded as an unmarshalled ASCII string:
|
66
|
+
|
67
|
+
start = 1
|
68
|
+
$cache.set 'counter', start.to_s, 0, false
|
69
|
+
$cache.increment 'counter' #=> 2
|
70
|
+
$cache.increment 'counter' #=> 3
|
71
|
+
$cache.get('counter', false).to_i #=> 3
|
72
|
+
|
73
|
+
You can get some server stats:
|
74
|
+
|
75
|
+
$cache.stats #=> {..., :bytes_written=>[62], :version=>["1.2.4"] ...}
|
76
|
+
|
77
|
+
Note that the API is not the same as that of **Ruby-MemCache** or
|
78
|
+
**memcache-client**. In particular, `nil` is a valid record value.
|
79
|
+
Memcached#get does not return `nil` on failure, rather it raises
|
80
|
+
**Memcached::NotFound**. This is consistent with the behavior of memcached
|
81
|
+
itself. For example:
|
82
|
+
|
83
|
+
$cache.set 'test', nil
|
84
|
+
$cache.get 'test' #=> nil
|
85
|
+
$cache.delete 'test'
|
86
|
+
$cache.get 'test' #=> raises Memcached::NotFound
|
87
|
+
|
88
|
+
## Rails 3 and 4
|
89
|
+
|
90
|
+
Use [memcached_store gem](https://github.com/Shopify/memcached_store) to
|
91
|
+
integrate ActiveSupport cache store and memcached gem
|
92
|
+
|
93
|
+
## Pipelining
|
94
|
+
|
95
|
+
Pipelining updates is extremely effective in **memcached**, leading to more
|
96
|
+
than 25x write throughput than the default settings. Use the following options
|
97
|
+
to enable it:
|
98
|
+
|
99
|
+
:no_block => true,
|
100
|
+
:buffer_requests => true,
|
101
|
+
:noreply => true,
|
102
|
+
:binary_protocol => false
|
103
|
+
|
104
|
+
Currently #append, #prepend, #set, and #delete are pipelined. Note that when
|
105
|
+
you perform a read, all pending writes are flushed to the servers.
|
106
|
+
|
107
|
+
## Threading
|
108
|
+
|
109
|
+
**memcached** is threadsafe, but each thread requires its own Memcached
|
110
|
+
instance. Create a global Memcached, and then call Memcached#clone each time
|
111
|
+
you spawn a thread.
|
112
|
+
|
113
|
+
thread = Thread.new do
|
114
|
+
cache = $cache.clone
|
115
|
+
# Perform operations on cache, not $cache
|
116
|
+
cache.set 'example', 1
|
117
|
+
cache.get 'example'
|
118
|
+
end
|
119
|
+
|
120
|
+
# Join the thread so that exceptions don't get lost
|
121
|
+
thread.join
|
122
|
+
|
123
|
+
## Legacy applications
|
124
|
+
|
125
|
+
There is a compatibility wrapper for legacy applications called
|
126
|
+
Memcached::Rails.
|
127
|
+
|
128
|
+
## Benchmarks
|
129
|
+
|
130
|
+
**memcached**, correctly configured, is at least twice as fast as
|
131
|
+
**memcache-client** and **dalli**. See link:BENCHMARKS for details.
|
132
|
+
|
133
|
+
## Reporting problems
|
134
|
+
|
135
|
+
The support forum is [here](http://github.com/evan/memcached/issues).
|
136
|
+
|
137
|
+
Patches and contributions are very welcome. Please note that contributors are
|
138
|
+
required to assign copyright for their additions to Cloudburst, LLC.
|
139
|
+
|
140
|
+
## Further resources
|
141
|
+
|
142
|
+
* [Memcached wiki](https://github.com/memcached/memcached/wiki)
|
143
|
+
* [Libmemcached homepage](libmemcached.org)
|
144
|
+
|
data/Rakefile
CHANGED
@@ -1,58 +1,26 @@
|
|
1
|
-
require '
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/extensiontask'
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
"ext/Makefile.in",
|
19
|
-
"ext/libmemcached-*/autom4te.cache",
|
20
|
-
"ext/libmemcached-*/clients/memcat",
|
21
|
-
"ext/libmemcached-*/clients/memcp",
|
22
|
-
"ext/libmemcached-*/clients/memdump",
|
23
|
-
"ext/libmemcached-*/clients/memerror",
|
24
|
-
"ext/libmemcached-*/clients/memflush",
|
25
|
-
"ext/libmemcached-*/clients/memrm",
|
26
|
-
"ext/libmemcached-*/clients/memslap",
|
27
|
-
"ext/libmemcached-*/clients/memstat",
|
28
|
-
"ext/libmemcached-*/tests/atomsmasher",
|
29
|
-
"ext/libmemcached-*/tests/startservers",
|
30
|
-
"ext/libmemcached-*/tests/testapp",
|
31
|
-
"ext/libmemcached-*/tests/testplus",
|
32
|
-
"ext/libmemcached-*/tests/udptest",
|
33
|
-
"ext/libmemcached-*/config.h",
|
34
|
-
"ext/libmemcached-*/config.log",
|
35
|
-
"ext/libmemcached-*/config.status",
|
36
|
-
"ext/libmemcached-*/docs/*.[1,3]",
|
37
|
-
"ext/libmemcached-*/libmemcached/memcached_configure.h",
|
38
|
-
"ext/libmemcached-*/libtool",
|
39
|
-
"ext/libmemcached-*/stamp*",
|
40
|
-
"ext/libmemcached-*/support/libmemcached.pc",
|
41
|
-
"ext/libmemcached-*/support/libmemcached-fc.spec",
|
42
|
-
"ext/libmemcached-*/**/*.s[oa]",
|
43
|
-
"ext/libmemcached-*/**/*.l[oa]",
|
44
|
-
"ext/conftest.dSYM",
|
45
|
-
"lib/rlibmemcached*",
|
46
|
-
"**/*.rbc"]
|
5
|
+
spec = Gem::Specification.load('memcached.gemspec')
|
6
|
+
Rake::ExtensionTask.new('rlibmemcached', spec) do |ext|
|
7
|
+
ext.lib_dir = 'lib'
|
8
|
+
end
|
9
|
+
|
10
|
+
Rake::TestTask.new do |t|
|
11
|
+
t.libs << 'lib' << 'test'
|
12
|
+
t.pattern = 'test/**/*_test.rb'
|
13
|
+
t.verbose = false
|
14
|
+
t.warning = true
|
15
|
+
end
|
16
|
+
task :default => [:compile, :test]
|
17
|
+
|
18
|
+
Rake::Task[:clean].enhance do
|
19
|
+
FileUtils.rm_rf(File.read(".gitignore").lines.flat_map { |l| Dir["**/#{l.chomp}"] })
|
47
20
|
end
|
48
21
|
|
49
22
|
task :swig do
|
50
|
-
run("swig -DLIBMEMCACHED_WITH_SASL_SUPPORT -
|
51
|
-
swig_patches = {
|
52
|
-
"#ifndef RUBY_INIT_STACK" => "#ifdef __NEVER__" # Patching SWIG output for JRuby.
|
53
|
-
}.map{|pair| "s/#{pair.join('/')}/"}.join(';')
|
54
|
-
# sed has different syntax for inplace switch in BSD and GNU version, so using intermediate file
|
55
|
-
run("sed '#{swig_patches}' ext/rlibmemcached_wrap.c.in > ext/rlibmemcached_wrap.c", "Apply patches to SWIG output")
|
23
|
+
run("swig -DLIBMEMCACHED_WITH_SASL_SUPPORT -Ivendor/libmemcached-0.32 -ruby -autorename -o ext/rlibmemcached/rlibmemcached_wrap.c ext/rlibmemcached/rlibmemcached.i", "Running SWIG")
|
56
24
|
end
|
57
25
|
|
58
26
|
task :exceptions do
|
@@ -83,47 +51,7 @@ task :valgrind do
|
|
83
51
|
exec("ruby #{File.dirname(__FILE__)}/test/profile/valgrind.rb")
|
84
52
|
end
|
85
53
|
|
86
|
-
|
87
|
-
bindir = vm.split("/")[0..-2].join("/")
|
88
|
-
puts "#{vm} #{cmd} started"
|
89
|
-
if !File.exist?("#{bindir}/rake")
|
90
|
-
puts "#{vm} not found"
|
91
|
-
exit(1)
|
92
|
-
elsif system("bash --norc --noprofile -c 'export PATH=#{bindir}:/bin:/usr/bin && which rake && #{bindir}/rake clean && #{bindir}/rake compile'")
|
93
|
-
puts "#{vm} compiled"
|
94
|
-
if system("bash --norc --noprofile -c 'export PATH=#{bindir}:/bin:/usr/bin && #{bindir}/rake #{cmd}'")
|
95
|
-
puts "#{vm} #{cmd} success (1st try)"
|
96
|
-
elsif system("bash --norc --noprofile -c 'export PATH=#{bindir}:/bin:/usr/bin && #{bindir}/rake #{cmd}'")
|
97
|
-
puts "#{vm} #{cmd} success (2nd try)"
|
98
|
-
else
|
99
|
-
puts "#{vm} #{cmd} failed"
|
100
|
-
exit(1)
|
101
|
-
end
|
102
|
-
else
|
103
|
-
puts "#{vm} compilation failed"
|
104
|
-
exit(1)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
task :test_20 do
|
109
|
-
with_vm("/usr/bin/ruby", "test")
|
110
|
-
end
|
111
|
-
|
112
|
-
task :test_19 do
|
113
|
-
with_vm("/opt/local/bin/ruby1.9", "test")
|
114
|
-
end
|
115
|
-
|
116
|
-
task :test_rbx do
|
117
|
-
with_vm("/usr/local/rubinius/1.2.4/bin/rbx", "test")
|
118
|
-
end
|
119
|
-
|
120
|
-
task :test_all => [:test_20, :test_19, :test_rbx]
|
121
|
-
|
122
|
-
task :prerelease => [:manifest, :test_all, :install]
|
123
|
-
|
124
|
-
task :benchmark_all do
|
125
|
-
with_vms("benchmark CLIENT=libm")
|
126
|
-
end
|
54
|
+
task :prerelease => [:manifest, :test, :install]
|
127
55
|
|
128
56
|
def run(cmd, reason)
|
129
57
|
puts reason
|
@@ -131,7 +59,7 @@ def run(cmd, reason)
|
|
131
59
|
raise "'#{cmd}' failed" unless system(cmd)
|
132
60
|
end
|
133
61
|
|
134
|
-
task :version do
|
62
|
+
task :version do
|
135
63
|
require 'memcached/version'
|
136
64
|
puts Memcached::VERSION
|
137
65
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
require 'rbconfig'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
unless find_header('sasl/sasl.h')
|
6
|
+
abort 'Please install SASL to continue. The package is called libsasl2-dev on Ubuntu and cyrus-sasl on Gentoo.'
|
7
|
+
end
|
8
|
+
|
9
|
+
HERE = File.expand_path(File.dirname(__FILE__))
|
10
|
+
LIBMEMCACHED_DIR = Dir.glob(File.join(HERE, '..', '..', 'vendor',"libmemcached-*")).first
|
11
|
+
|
12
|
+
SOLARIS_32 = RbConfig::CONFIG['target'] == "i386-pc-solaris2.10"
|
13
|
+
BSD = RbConfig::CONFIG['host_os'].downcase =~ /bsd/
|
14
|
+
|
15
|
+
$CFLAGS = "#{RbConfig::CONFIG['CFLAGS']} #{$CFLAGS}".gsub("$(cflags)", "").gsub("-fno-common", "").gsub("-Werror=declaration-after-statement", "").gsub("-Werror=shorten-64-to-32", "").gsub("-Werror=deprecated-declarations", "")
|
16
|
+
$CFLAGS << " -Os"
|
17
|
+
$CFLAGS << " -std=gnu99" if SOLARIS_32
|
18
|
+
$CFLAGS << " -I/usr/local/include" if BSD
|
19
|
+
$EXTRA_CONF = " --disable-64bit" if SOLARIS_32
|
20
|
+
$LDFLAGS = "#{RbConfig::CONFIG['LDFLAGS']} #{$LDFLAGS} -L#{RbConfig::CONFIG['libdir']}".gsub("$(ldflags)", "").gsub("-fno-common", "")
|
21
|
+
$CXXFLAGS = "#{RbConfig::CONFIG['CXXFLAGS']} -std=gnu++98"
|
22
|
+
$CC = "CC=#{RbConfig::MAKEFILE_CONFIG["CC"].inspect}"
|
23
|
+
|
24
|
+
LIBM_CFLAGS = $CFLAGS
|
25
|
+
LIBM_LDFLAGS = $LDFLAGS
|
26
|
+
|
27
|
+
GMAKE_CMD = RbConfig::CONFIG['host_os'].downcase =~ /bsd|solaris/ ? "gmake" : "make"
|
28
|
+
TAR_CMD = SOLARIS_32 ? 'gtar' : 'tar'
|
29
|
+
PATCH_CMD = SOLARIS_32 ? 'gpatch' : 'patch'
|
30
|
+
|
31
|
+
if ENV['DEBUG']
|
32
|
+
puts "Setting debug flags."
|
33
|
+
$CFLAGS << " -O0 -ggdb -DHAVE_DEBUG"
|
34
|
+
$EXTRA_CONF = ""
|
35
|
+
end
|
36
|
+
|
37
|
+
def check_libmemcached
|
38
|
+
return if ENV["EXTERNAL_LIB"]
|
39
|
+
|
40
|
+
Dir.chdir(LIBMEMCACHED_DIR) do
|
41
|
+
# Cleanup any previously built files since the following touch all files command
|
42
|
+
# could make them seem rebuilt when there are changes that require recompiling them.
|
43
|
+
FileUtils.rm_rf("build")
|
44
|
+
run("#{GMAKE_CMD} clean 2>&1") if File.exist?("Makefile")
|
45
|
+
ts_now=Time.now.strftime("%Y%m%d%H%M.%S")
|
46
|
+
run("find . | xargs touch -t #{ts_now}", "Touching all files so autoconf doesn't run.")
|
47
|
+
|
48
|
+
Dir.mkdir("build")
|
49
|
+
build_folder = File.join(LIBMEMCACHED_DIR, "build")
|
50
|
+
run("env CFLAGS='-fPIC #{LIBM_CFLAGS}' LDFLAGS='-fPIC #{LIBM_LDFLAGS}' ./configure --prefix=#{build_folder} --libdir=#{build_folder}/lib --without-memcached --disable-shared --disable-utils --disable-dependency-tracking #{$CC} #{$EXTRA_CONF} 2>&1", "Configuring libmemcached.")
|
51
|
+
run("#{GMAKE_CMD} CXXFLAGS='#{$CXXFLAGS}' 2>&1")
|
52
|
+
run("#{GMAKE_CMD} install 2>&1")
|
53
|
+
|
54
|
+
|
55
|
+
pcfile = File.join(LIBMEMCACHED_DIR, "build", "lib", "pkgconfig", "libmemcached.pc")
|
56
|
+
$LDFLAGS << " -lsasl2 " + `pkg-config --libs --static #{pcfile}`.strip
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
$DEFLIBPATH.unshift("#{LIBMEMCACHED_DIR}/build")
|
61
|
+
dir_config('memcached', "#{LIBMEMCACHED_DIR}/build/include", "#{LIBMEMCACHED_DIR}/build/lib")
|
62
|
+
end
|
63
|
+
|
64
|
+
def run(cmd, reason = nil)
|
65
|
+
puts reason if reason
|
66
|
+
puts cmd
|
67
|
+
raise "'#{cmd}' failed" unless system(cmd)
|
68
|
+
end
|
69
|
+
|
70
|
+
check_libmemcached
|
71
|
+
|
72
|
+
unless have_library 'memcached' and have_header 'libmemcached/memcached.h'
|
73
|
+
abort "ERROR: Failed to build libmemcached"
|
74
|
+
end
|
75
|
+
|
76
|
+
create_makefile 'rlibmemcached'
|
@@ -3,7 +3,6 @@
|
|
3
3
|
#include <libmemcached/visibility.h>
|
4
4
|
#include <libmemcached/memcached.h>
|
5
5
|
#include <libmemcached/memcached_exist.h>
|
6
|
-
#include <ruby/version.h>
|
7
6
|
%}
|
8
7
|
|
9
8
|
%warnfilter(SWIGWARN_RUBY_WRONG_NAME) memcached_st;
|
@@ -110,12 +109,16 @@
|
|
110
109
|
$result = UINT2NUM($1);
|
111
110
|
};
|
112
111
|
|
112
|
+
%typemap(in, numinputs=0) (const char **key, size_t *key_length) {
|
113
|
+
const char *key_ptr;
|
114
|
+
size_t key_length_ptr;
|
115
|
+
$1 = &key_ptr;
|
116
|
+
$2 = &key_length_ptr;
|
117
|
+
}
|
118
|
+
|
113
119
|
// String for memcached_fetch
|
114
|
-
%typemap(
|
115
|
-
|
116
|
-
size_t length = 0;
|
117
|
-
$1 = string;
|
118
|
-
$2 = &length;
|
120
|
+
%typemap(argout) (const char **key, size_t *key_length) {
|
121
|
+
rb_ary_push($result, rb_str_new(*$1, *$2));
|
119
122
|
};
|
120
123
|
|
121
124
|
// Strings with lengths
|
@@ -150,87 +153,63 @@
|
|
150
153
|
%include "libmemcached/memcached_touch.h"
|
151
154
|
%include "libmemcached/memcached_exist.h"
|
152
155
|
|
153
|
-
//// Custom C functions
|
154
|
-
|
155
|
-
VALUE rb_str_new_by_ref(char *ptr, long len);
|
156
|
-
%{
|
157
|
-
VALUE rb_str_new_by_ref(char *ptr, long len)
|
158
|
-
{
|
159
|
-
#ifdef OBJSETUP
|
160
|
-
NEWOBJ(str, struct RString);
|
161
|
-
OBJSETUP(str, rb_cString, T_STRING);
|
162
|
-
#ifdef RSTRING_NOEMBED
|
163
|
-
/* Ruby 1.9 */
|
164
|
-
str->as.heap.ptr = ptr;
|
165
|
-
#if RUBY_API_VERSION_MAJOR < 3 || (RUBY_API_VERSION_MAJOR == 3 && RUBY_API_VERSION_MINOR < 3)
|
166
|
-
str->as.heap.len = len;
|
167
|
-
#else
|
168
|
-
// Ruby 3.3.0 moved the len field out of heap into toplevel RString
|
169
|
-
str->len = len;
|
170
|
-
#endif
|
171
|
-
str->as.heap.aux.capa = len + 1;
|
172
|
-
// Set STR_NOEMBED
|
173
|
-
FL_SET(str, FL_USER1);
|
174
|
-
#else
|
175
|
-
/* Ruby 1.8 */
|
176
|
-
str->ptr = ptr;
|
177
|
-
str->len = len;
|
178
|
-
str->aux.capa = 0;
|
179
|
-
#endif
|
180
|
-
#else
|
181
|
-
/* Rubinius, JRuby */
|
182
|
-
VALUE str = rb_str_new(ptr, len);
|
183
|
-
free(ptr);
|
184
|
-
#endif
|
185
|
-
return (VALUE)str;
|
186
|
-
}
|
187
|
-
%}
|
188
|
-
|
189
156
|
//// Manual wrappers
|
190
157
|
|
191
|
-
// Single get
|
192
|
-
VALUE memcached_get_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error);
|
193
|
-
%{
|
194
|
-
VALUE memcached_get_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error) {
|
195
|
-
size_t value_length = 0;
|
196
|
-
char *value = memcached_get(ptr, key, key_length, &value_length, flags, error);
|
197
|
-
return rb_str_new_by_ref(value, value_length);
|
198
|
-
};
|
199
|
-
%}
|
200
|
-
|
201
|
-
VALUE memcached_get_len_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t user_spec_len, uint32_t *flags, memcached_return *error);
|
202
|
-
%{
|
203
|
-
VALUE memcached_get_len_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t user_spec_len, uint32_t *flags, memcached_return *error) {
|
204
|
-
size_t value_length = 0;
|
205
|
-
char *value = memcached_get_len(ptr, key, key_length, user_spec_len, &value_length, flags, error);
|
206
|
-
return rb_str_new_by_ref(value, value_length);
|
207
|
-
};
|
208
|
-
%}
|
209
|
-
|
210
158
|
VALUE memcached_get_from_last_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error);
|
211
159
|
%{
|
212
160
|
VALUE memcached_get_from_last_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error) {
|
213
161
|
size_t value_length = 0;
|
214
162
|
char *value = memcached_get_from_last(ptr, key, key_length, &value_length, flags, error);
|
215
|
-
|
163
|
+
VALUE str = rb_str_new(value, value_length);
|
164
|
+
free(value);
|
165
|
+
return str;
|
216
166
|
};
|
217
167
|
%}
|
218
168
|
|
219
169
|
// Multi get
|
220
|
-
VALUE memcached_fetch_rvalue(memcached_st *ptr, char
|
170
|
+
VALUE memcached_fetch_rvalue(memcached_st *ptr, const char **key, size_t *key_length, uint32_t *flags, memcached_return *error);
|
221
171
|
%{
|
222
|
-
VALUE memcached_fetch_rvalue(memcached_st *ptr, char
|
223
|
-
size_t value_length = 0;
|
172
|
+
VALUE memcached_fetch_rvalue(memcached_st *ptr, const char **key, size_t *key_length, uint32_t *flags, memcached_return *error) {
|
224
173
|
VALUE ary = rb_ary_new();
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
VALUE str =
|
174
|
+
|
175
|
+
*error = MEMCACHED_TIMEOUT; // timeouts leave error uninitialized
|
176
|
+
memcached_result_st *result = memcached_fetch_result(ptr, &ptr->result, error);
|
177
|
+
VALUE str = Qnil;
|
178
|
+
if (result == NULL || *error != MEMCACHED_SUCCESS) {
|
179
|
+
*key = NULL;
|
180
|
+
*key_length = 0;
|
181
|
+
*flags = 0;
|
182
|
+
str = Qnil;
|
183
|
+
} else {
|
184
|
+
*key = memcached_result_key_value(result);
|
185
|
+
*key_length = memcached_result_key_length(result);
|
186
|
+
*flags = memcached_result_flags(result);
|
187
|
+
str = rb_str_new(memcached_result_value(result), memcached_result_length(result));
|
188
|
+
}
|
229
189
|
rb_ary_push(ary, str);
|
230
190
|
return ary;
|
231
191
|
};
|
232
192
|
%}
|
233
193
|
|
194
|
+
// Single get
|
195
|
+
VALUE memcached_get_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error);
|
196
|
+
%{
|
197
|
+
VALUE memcached_get_rvalue(memcached_st *ptr, const char *key, size_t key_length, uint32_t *flags, memcached_return *error) {
|
198
|
+
*error = memcached_mget(ptr, &key, &key_length, 1);
|
199
|
+
if (*error != MEMCACHED_SUCCESS) {
|
200
|
+
return rb_ary_new_from_args(1, Qnil);
|
201
|
+
}
|
202
|
+
VALUE ret = memcached_fetch_rvalue(ptr, &key, &key_length, flags, error);
|
203
|
+
if (*error == MEMCACHED_END) {
|
204
|
+
*error = MEMCACHED_NOTFOUND;
|
205
|
+
} else {
|
206
|
+
memcached_return end_error;
|
207
|
+
memcached_fetch_result(ptr, &ptr->result, &end_error);
|
208
|
+
}
|
209
|
+
return ret;
|
210
|
+
};
|
211
|
+
%}
|
212
|
+
|
234
213
|
// Ruby isn't aware that the pointer is an array... there is probably a better way to do this
|
235
214
|
memcached_server_st *memcached_select_server_at(memcached_st *in_ptr, int index);
|
236
215
|
%{
|