vinted-memcached 1.8.4 → 1.8.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (211) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build_release_pipeline.yaml +53 -0
  3. data/.gitignore +33 -0
  4. data/BENCHMARKS +130 -126
  5. data/CHANGELOG +1 -6
  6. data/Gemfile +8 -1
  7. data/Gemfile.lock +25 -38
  8. data/README.md +144 -0
  9. data/Rakefile +21 -93
  10. data/ext/rlibmemcached/extconf.rb +76 -0
  11. data/ext/{rlibmemcached.i → rlibmemcached/rlibmemcached.i} +48 -69
  12. data/ext/{rlibmemcached_wrap.c → rlibmemcached/rlibmemcached_wrap.c} +146 -320
  13. data/lib/memcached/exceptions.rb +1 -12
  14. data/lib/memcached/experimental.rb +1 -33
  15. data/lib/memcached/memcached.rb +41 -34
  16. data/lib/memcached/version.rb +1 -1
  17. data/lib/memcached.rb +9 -4
  18. data/memcached.gemspec +0 -0
  19. data/memcached.pem +21 -0
  20. data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_connect.c +23 -13
  21. data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_io.c +18 -13
  22. data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_purge.c +1 -1
  23. metadata +192 -246
  24. data/Manifest +0 -209
  25. data/README.rdoc +0 -124
  26. data/ext/extconf-make.rb +0 -25
  27. data/ext/extconf.rb +0 -78
  28. data/lib/memcached/auth.rb +0 -16
  29. data/test/profile/benchmark.rb +0 -280
  30. data/test/profile/c_profiler.rb +0 -14
  31. data/test/profile/exercise.rb +0 -185
  32. data/test/profile/rb_profiler.rb +0 -21
  33. data/test/profile/valgrind.rb +0 -10
  34. data/test/setup.rb +0 -30
  35. data/test/teardown.rb +0 -0
  36. data/test/test_helper.rb +0 -18
  37. data/test/unit/binding_test.rb +0 -8
  38. data/test/unit/memcached_experimental_test.rb +0 -272
  39. data/test/unit/memcached_test.rb +0 -1487
  40. data/test/unit/rails_test.rb +0 -330
  41. /data/{ext → vendor}/libmemcached-0.32/AUTHORS +0 -0
  42. /data/{ext → vendor}/libmemcached-0.32/COPYING +0 -0
  43. /data/{ext → vendor}/libmemcached-0.32/ChangeLog +0 -0
  44. /data/{ext → vendor}/libmemcached-0.32/INSTALL +0 -0
  45. /data/{ext → vendor}/libmemcached-0.32/Makefile.am +0 -0
  46. /data/{ext → vendor}/libmemcached-0.32/Makefile.in +0 -0
  47. /data/{ext → vendor}/libmemcached-0.32/NEWS +0 -0
  48. /data/{ext → vendor}/libmemcached-0.32/README +0 -0
  49. /data/{ext → vendor}/libmemcached-0.32/THANKS +0 -0
  50. /data/{ext → vendor}/libmemcached-0.32/TODO +0 -0
  51. /data/{ext → vendor}/libmemcached-0.32/aclocal.m4 +0 -0
  52. /data/{ext → vendor}/libmemcached-0.32/clients/Makefile.am +0 -0
  53. /data/{ext → vendor}/libmemcached-0.32/clients/Makefile.in +0 -0
  54. /data/{ext → vendor}/libmemcached-0.32/clients/client_options.h +0 -0
  55. /data/{ext → vendor}/libmemcached-0.32/clients/execute.c +0 -0
  56. /data/{ext → vendor}/libmemcached-0.32/clients/execute.h +0 -0
  57. /data/{ext → vendor}/libmemcached-0.32/clients/generator.c +0 -0
  58. /data/{ext → vendor}/libmemcached-0.32/clients/generator.h +0 -0
  59. /data/{ext → vendor}/libmemcached-0.32/clients/memcat.c +0 -0
  60. /data/{ext → vendor}/libmemcached-0.32/clients/memcp.c +0 -0
  61. /data/{ext → vendor}/libmemcached-0.32/clients/memdump.c +0 -0
  62. /data/{ext → vendor}/libmemcached-0.32/clients/memerror.c +0 -0
  63. /data/{ext → vendor}/libmemcached-0.32/clients/memflush.c +0 -0
  64. /data/{ext → vendor}/libmemcached-0.32/clients/memrm.c +0 -0
  65. /data/{ext → vendor}/libmemcached-0.32/clients/memslap.c +0 -0
  66. /data/{ext → vendor}/libmemcached-0.32/clients/memstat.c +0 -0
  67. /data/{ext → vendor}/libmemcached-0.32/clients/utilities.c +0 -0
  68. /data/{ext → vendor}/libmemcached-0.32/clients/utilities.h +0 -0
  69. /data/{ext → vendor}/libmemcached-0.32/config/compile +0 -0
  70. /data/{ext → vendor}/libmemcached-0.32/config/config.guess +0 -0
  71. /data/{ext → vendor}/libmemcached-0.32/config/config.rpath +0 -0
  72. /data/{ext → vendor}/libmemcached-0.32/config/config.sub +0 -0
  73. /data/{ext → vendor}/libmemcached-0.32/config/depcomp +0 -0
  74. /data/{ext → vendor}/libmemcached-0.32/config/install-sh +0 -0
  75. /data/{ext → vendor}/libmemcached-0.32/config/ltmain.sh +0 -0
  76. /data/{ext → vendor}/libmemcached-0.32/config/missing +0 -0
  77. /data/{ext → vendor}/libmemcached-0.32/config.h.in +0 -0
  78. /data/{ext → vendor}/libmemcached-0.32/configure +0 -0
  79. /data/{ext → vendor}/libmemcached-0.32/configure.ac +0 -0
  80. /data/{ext → vendor}/libmemcached-0.32/libmemcached/Makefile.am +0 -0
  81. /data/{ext → vendor}/libmemcached-0.32/libmemcached/Makefile.in +0 -0
  82. /data/{ext → vendor}/libmemcached-0.32/libmemcached/byteorder.c +0 -0
  83. /data/{ext → vendor}/libmemcached-0.32/libmemcached/common.h +0 -0
  84. /data/{ext → vendor}/libmemcached-0.32/libmemcached/crc.c +0 -0
  85. /data/{ext → vendor}/libmemcached-0.32/libmemcached/hsieh_hash.c +0 -0
  86. /data/{ext → vendor}/libmemcached-0.32/libmemcached/jenkins_hash.c +0 -0
  87. /data/{ext → vendor}/libmemcached-0.32/libmemcached/libmemcached.ver +0 -0
  88. /data/{ext → vendor}/libmemcached-0.32/libmemcached/libmemcached_probes.d +0 -0
  89. /data/{ext → vendor}/libmemcached-0.32/libmemcached/libmemcached_probes.h +0 -0
  90. /data/{ext → vendor}/libmemcached-0.32/libmemcached/md5.c +0 -0
  91. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached/README.txt +0 -0
  92. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached/protocol_binary.h +0 -0
  93. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached.c +0 -0
  94. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached.h +0 -0
  95. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached.hpp +0 -0
  96. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_allocators.c +0 -0
  97. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_analyze.c +0 -0
  98. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_auto.c +0 -0
  99. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_behavior.c +0 -0
  100. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_callback.c +0 -0
  101. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_configure.h.in +0 -0
  102. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_constants.h +0 -0
  103. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_delete.c +0 -0
  104. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_do.c +0 -0
  105. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_dump.c +0 -0
  106. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_exist.c +0 -0
  107. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_exist.h +0 -0
  108. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_fetch.c +0 -0
  109. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_flush.c +0 -0
  110. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_flush_buffers.c +0 -0
  111. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_get.c +0 -0
  112. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_get.h +0 -0
  113. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_hash.c +0 -0
  114. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_hosts.c +0 -0
  115. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_internal.h +0 -0
  116. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_io.h +0 -0
  117. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_key.c +0 -0
  118. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_parse.c +0 -0
  119. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_pool.h +0 -0
  120. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_quit.c +0 -0
  121. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_response.c +0 -0
  122. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_result.c +0 -0
  123. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_result.h +0 -0
  124. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_sasl.c +0 -0
  125. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_sasl.h +0 -0
  126. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_server.c +0 -0
  127. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_server.h +0 -0
  128. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_stats.c +0 -0
  129. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_storage.c +0 -0
  130. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_storage.h +0 -0
  131. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_strerror.c +0 -0
  132. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_string.c +0 -0
  133. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_string.h +0 -0
  134. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_touch.c +0 -0
  135. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_touch.h +0 -0
  136. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_types.h +0 -0
  137. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_util.h +0 -0
  138. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_verbosity.c +0 -0
  139. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_version.c +0 -0
  140. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_watchpoint.h +0 -0
  141. /data/{ext → vendor}/libmemcached-0.32/libmemcached/murmur_hash.c +0 -0
  142. /data/{ext → vendor}/libmemcached-0.32/libmemcached/visibility.h +0 -0
  143. /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/Makefile.am +0 -0
  144. /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/Makefile.in +0 -0
  145. /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/libmemcachedutil.ver +0 -0
  146. /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/memcached_pool.c +0 -0
  147. /data/{ext → vendor}/libmemcached-0.32/m4/ac_cxx_compile_stdcxx_0x.m4 +0 -0
  148. /data/{ext → vendor}/libmemcached-0.32/m4/ac_cxx_header_stdcxx_98.m4 +0 -0
  149. /data/{ext → vendor}/libmemcached-0.32/m4/acx_pthread.m4 +0 -0
  150. /data/{ext → vendor}/libmemcached-0.32/m4/byteorder.m4 +0 -0
  151. /data/{ext → vendor}/libmemcached-0.32/m4/deprecated.m4 +0 -0
  152. /data/{ext → vendor}/libmemcached-0.32/m4/enable_utillib.m4 +0 -0
  153. /data/{ext → vendor}/libmemcached-0.32/m4/extensions.m4 +0 -0
  154. /data/{ext → vendor}/libmemcached-0.32/m4/hsieh.m4 +0 -0
  155. /data/{ext → vendor}/libmemcached-0.32/m4/lib-prefix.m4 +0 -0
  156. /data/{ext → vendor}/libmemcached-0.32/m4/libtool.m4 +0 -0
  157. /data/{ext → vendor}/libmemcached-0.32/m4/ltoptions.m4 +0 -0
  158. /data/{ext → vendor}/libmemcached-0.32/m4/ltsugar.m4 +0 -0
  159. /data/{ext → vendor}/libmemcached-0.32/m4/ltversion.m4 +0 -0
  160. /data/{ext → vendor}/libmemcached-0.32/m4/lt~obsolete.m4 +0 -0
  161. /data/{ext → vendor}/libmemcached-0.32/m4/memcached.m4 +0 -0
  162. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_64bit.m4 +0 -0
  163. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_canonical.m4 +0 -0
  164. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_check_compiler_version.m4 +0 -0
  165. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_check_cxx_standard.m4 +0 -0
  166. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_enable_dtrace.m4 +0 -0
  167. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_ensure_gcc_version.m4 +0 -0
  168. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_have_better_malloc.m4 +0 -0
  169. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_have_sasl.m4 +0 -0
  170. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_header_assert.m4 +0 -0
  171. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_libtool.m4 +0 -0
  172. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_optimize.m4 +0 -0
  173. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_shared_ptr.m4 +0 -0
  174. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_vc_build.m4 +0 -0
  175. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_warnings.m4 +0 -0
  176. /data/{ext → vendor}/libmemcached-0.32/m4/pod2man.m4 +0 -0
  177. /data/{ext → vendor}/libmemcached-0.32/m4/protocol_binary.m4 +0 -0
  178. /data/{ext → vendor}/libmemcached-0.32/m4/setsockopt.m4 +0 -0
  179. /data/{ext → vendor}/libmemcached-0.32/m4/visibility.m4 +0 -0
  180. /data/{ext → vendor}/libmemcached-0.32/support/Makefile.am +0 -0
  181. /data/{ext → vendor}/libmemcached-0.32/support/Makefile.in +0 -0
  182. /data/{ext → vendor}/libmemcached-0.32/support/libmemcached-fc.spec.in +0 -0
  183. /data/{ext → vendor}/libmemcached-0.32/support/libmemcached.pc.in +0 -0
  184. /data/{ext → vendor}/libmemcached-0.32/support/libmemcached.spec +0 -0
  185. /data/{ext → vendor}/libmemcached-0.32/support/libmemcached.spec.in +0 -0
  186. /data/{ext → vendor}/libmemcached-0.32/support/set_benchmark.sh +0 -0
  187. /data/{ext → vendor}/libmemcached-0.32/tests/Makefile.am +0 -0
  188. /data/{ext → vendor}/libmemcached-0.32/tests/Makefile.in +0 -0
  189. /data/{ext → vendor}/libmemcached-0.32/tests/atomsmasher.c +0 -0
  190. /data/{ext → vendor}/libmemcached-0.32/tests/function.c +0 -0
  191. /data/{ext → vendor}/libmemcached-0.32/tests/ketama_test_cases.h +0 -0
  192. /data/{ext → vendor}/libmemcached-0.32/tests/output.cmp +0 -0
  193. /data/{ext → vendor}/libmemcached-0.32/tests/output.res +0 -0
  194. /data/{ext → vendor}/libmemcached-0.32/tests/output2.res +0 -0
  195. /data/{ext → vendor}/libmemcached-0.32/tests/plus.cpp +0 -0
  196. /data/{ext → vendor}/libmemcached-0.32/tests/r/memcat.res +0 -0
  197. /data/{ext → vendor}/libmemcached-0.32/tests/r/memcp.res +0 -0
  198. /data/{ext → vendor}/libmemcached-0.32/tests/r/memrm.res +0 -0
  199. /data/{ext → vendor}/libmemcached-0.32/tests/r/memslap.res +0 -0
  200. /data/{ext → vendor}/libmemcached-0.32/tests/r/memstat.res +0 -0
  201. /data/{ext → vendor}/libmemcached-0.32/tests/server.c +0 -0
  202. /data/{ext → vendor}/libmemcached-0.32/tests/server.h +0 -0
  203. /data/{ext → vendor}/libmemcached-0.32/tests/start.c +0 -0
  204. /data/{ext → vendor}/libmemcached-0.32/tests/t/memcat.test +0 -0
  205. /data/{ext → vendor}/libmemcached-0.32/tests/t/memcp.test +0 -0
  206. /data/{ext → vendor}/libmemcached-0.32/tests/t/memrm.test +0 -0
  207. /data/{ext → vendor}/libmemcached-0.32/tests/t/memslap.test +0 -0
  208. /data/{ext → vendor}/libmemcached-0.32/tests/t/memstat.test +0 -0
  209. /data/{ext → vendor}/libmemcached-0.32/tests/test.c +0 -0
  210. /data/{ext → vendor}/libmemcached-0.32/tests/test.h +0 -0
  211. /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
+ [![Build Status](https://github.com/arthurnn/memcached/workflows/CI/badge.svg?branch=1-0-stable)](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 'echoe'
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+ require 'rake/extensiontask'
2
4
 
3
- Echoe.new("memcached") do |p|
4
- p.author = "Evan Weaver"
5
- p.project = "evan"
6
- p.summary = "An interface to the libmemcached C client."
7
- p.licenses = "Academic Free License 3.0 (AFL-3.0)"
8
- p.rdoc_pattern = /README|TODO|LICENSE|CHANGELOG|BENCH|COMPAT|exceptions|experimental.rb|behaviors|rails.rb|memcached.rb/
9
- p.rdoc_options = %w[--line-numbers --inline-source --title Memcached --main README.rdoc --exclude=ext/bin --exclude=ext/libmemcached-.*/(clients|tests)]
10
- p.retain_gemspec = true
11
- p.development_dependencies = ["rake", "mocha", "echoe", "activesupport"]
12
- p.clean_pattern += ["ext/Makefile",
13
- "ext/bin",
14
- "ext/include",
15
- "ext/lib",
16
- "ext/share",
17
- "ext/**/Makefile",
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 -Iext/libmemcached-0.32 -ruby -autorename -o ext/rlibmemcached_wrap.c.in ext/rlibmemcached.i", "Running SWIG")
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
- def with_vm(vm, cmd)
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 |t|
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(in, numinputs=0) (char *key, size_t *key_length) {
115
- char string[256];
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
- return rb_str_new_by_ref(value, value_length);
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 *key, size_t *key_length, uint32_t *flags, memcached_return *error);
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 *key, size_t *key_length, uint32_t *flags, memcached_return *error) {
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
- *key_length = 0;
226
- if (error) *error = MEMCACHED_TIMEOUT; // timeouts leave error uninitialized
227
- char *value = memcached_fetch(ptr, key, key_length, &value_length, flags, error);
228
- VALUE str = rb_str_new_by_ref(value, value_length);
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
  %{