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.
Files changed (213) 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/vendor/libmemcached-0.32/config/config.guess +1815 -0
  21. data/vendor/libmemcached-0.32/config/config.sub +2354 -0
  22. data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_connect.c +23 -13
  23. data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_io.c +18 -13
  24. data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_purge.c +1 -1
  25. data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_storage.c +16 -25
  26. metadata +195 -249
  27. data/Manifest +0 -209
  28. data/README.rdoc +0 -124
  29. data/ext/extconf-make.rb +0 -25
  30. data/ext/extconf.rb +0 -78
  31. data/ext/libmemcached-0.32/config/config.guess +0 -1561
  32. data/ext/libmemcached-0.32/config/config.sub +0 -1686
  33. data/lib/memcached/auth.rb +0 -16
  34. data/test/profile/benchmark.rb +0 -280
  35. data/test/profile/c_profiler.rb +0 -14
  36. data/test/profile/exercise.rb +0 -185
  37. data/test/profile/rb_profiler.rb +0 -21
  38. data/test/profile/valgrind.rb +0 -10
  39. data/test/setup.rb +0 -30
  40. data/test/teardown.rb +0 -0
  41. data/test/test_helper.rb +0 -18
  42. data/test/unit/binding_test.rb +0 -8
  43. data/test/unit/memcached_experimental_test.rb +0 -272
  44. data/test/unit/memcached_test.rb +0 -1487
  45. data/test/unit/rails_test.rb +0 -330
  46. /data/{ext → vendor}/libmemcached-0.32/AUTHORS +0 -0
  47. /data/{ext → vendor}/libmemcached-0.32/COPYING +0 -0
  48. /data/{ext → vendor}/libmemcached-0.32/ChangeLog +0 -0
  49. /data/{ext → vendor}/libmemcached-0.32/INSTALL +0 -0
  50. /data/{ext → vendor}/libmemcached-0.32/Makefile.am +0 -0
  51. /data/{ext → vendor}/libmemcached-0.32/Makefile.in +0 -0
  52. /data/{ext → vendor}/libmemcached-0.32/NEWS +0 -0
  53. /data/{ext → vendor}/libmemcached-0.32/README +0 -0
  54. /data/{ext → vendor}/libmemcached-0.32/THANKS +0 -0
  55. /data/{ext → vendor}/libmemcached-0.32/TODO +0 -0
  56. /data/{ext → vendor}/libmemcached-0.32/aclocal.m4 +0 -0
  57. /data/{ext → vendor}/libmemcached-0.32/clients/Makefile.am +0 -0
  58. /data/{ext → vendor}/libmemcached-0.32/clients/Makefile.in +0 -0
  59. /data/{ext → vendor}/libmemcached-0.32/clients/client_options.h +0 -0
  60. /data/{ext → vendor}/libmemcached-0.32/clients/execute.c +0 -0
  61. /data/{ext → vendor}/libmemcached-0.32/clients/execute.h +0 -0
  62. /data/{ext → vendor}/libmemcached-0.32/clients/generator.c +0 -0
  63. /data/{ext → vendor}/libmemcached-0.32/clients/generator.h +0 -0
  64. /data/{ext → vendor}/libmemcached-0.32/clients/memcat.c +0 -0
  65. /data/{ext → vendor}/libmemcached-0.32/clients/memcp.c +0 -0
  66. /data/{ext → vendor}/libmemcached-0.32/clients/memdump.c +0 -0
  67. /data/{ext → vendor}/libmemcached-0.32/clients/memerror.c +0 -0
  68. /data/{ext → vendor}/libmemcached-0.32/clients/memflush.c +0 -0
  69. /data/{ext → vendor}/libmemcached-0.32/clients/memrm.c +0 -0
  70. /data/{ext → vendor}/libmemcached-0.32/clients/memslap.c +0 -0
  71. /data/{ext → vendor}/libmemcached-0.32/clients/memstat.c +0 -0
  72. /data/{ext → vendor}/libmemcached-0.32/clients/utilities.c +0 -0
  73. /data/{ext → vendor}/libmemcached-0.32/clients/utilities.h +0 -0
  74. /data/{ext → vendor}/libmemcached-0.32/config/compile +0 -0
  75. /data/{ext → vendor}/libmemcached-0.32/config/config.rpath +0 -0
  76. /data/{ext → vendor}/libmemcached-0.32/config/depcomp +0 -0
  77. /data/{ext → vendor}/libmemcached-0.32/config/install-sh +0 -0
  78. /data/{ext → vendor}/libmemcached-0.32/config/ltmain.sh +0 -0
  79. /data/{ext → vendor}/libmemcached-0.32/config/missing +0 -0
  80. /data/{ext → vendor}/libmemcached-0.32/config.h.in +0 -0
  81. /data/{ext → vendor}/libmemcached-0.32/configure +0 -0
  82. /data/{ext → vendor}/libmemcached-0.32/configure.ac +0 -0
  83. /data/{ext → vendor}/libmemcached-0.32/libmemcached/Makefile.am +0 -0
  84. /data/{ext → vendor}/libmemcached-0.32/libmemcached/Makefile.in +0 -0
  85. /data/{ext → vendor}/libmemcached-0.32/libmemcached/byteorder.c +0 -0
  86. /data/{ext → vendor}/libmemcached-0.32/libmemcached/common.h +0 -0
  87. /data/{ext → vendor}/libmemcached-0.32/libmemcached/crc.c +0 -0
  88. /data/{ext → vendor}/libmemcached-0.32/libmemcached/hsieh_hash.c +0 -0
  89. /data/{ext → vendor}/libmemcached-0.32/libmemcached/jenkins_hash.c +0 -0
  90. /data/{ext → vendor}/libmemcached-0.32/libmemcached/libmemcached.ver +0 -0
  91. /data/{ext → vendor}/libmemcached-0.32/libmemcached/libmemcached_probes.d +0 -0
  92. /data/{ext → vendor}/libmemcached-0.32/libmemcached/libmemcached_probes.h +0 -0
  93. /data/{ext → vendor}/libmemcached-0.32/libmemcached/md5.c +0 -0
  94. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached/README.txt +0 -0
  95. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached/protocol_binary.h +0 -0
  96. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached.c +0 -0
  97. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached.h +0 -0
  98. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached.hpp +0 -0
  99. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_allocators.c +0 -0
  100. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_analyze.c +0 -0
  101. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_auto.c +0 -0
  102. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_behavior.c +0 -0
  103. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_callback.c +0 -0
  104. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_configure.h.in +0 -0
  105. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_constants.h +0 -0
  106. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_delete.c +0 -0
  107. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_do.c +0 -0
  108. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_dump.c +0 -0
  109. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_exist.c +0 -0
  110. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_exist.h +0 -0
  111. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_fetch.c +0 -0
  112. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_flush.c +0 -0
  113. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_flush_buffers.c +0 -0
  114. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_get.c +0 -0
  115. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_get.h +0 -0
  116. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_hash.c +0 -0
  117. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_hosts.c +0 -0
  118. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_internal.h +0 -0
  119. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_io.h +0 -0
  120. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_key.c +0 -0
  121. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_parse.c +0 -0
  122. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_pool.h +0 -0
  123. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_quit.c +0 -0
  124. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_response.c +0 -0
  125. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_result.c +0 -0
  126. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_result.h +0 -0
  127. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_sasl.c +0 -0
  128. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_sasl.h +0 -0
  129. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_server.c +0 -0
  130. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_server.h +0 -0
  131. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_stats.c +0 -0
  132. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_storage.h +0 -0
  133. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_strerror.c +0 -0
  134. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_string.c +0 -0
  135. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_string.h +0 -0
  136. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_touch.c +0 -0
  137. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_touch.h +0 -0
  138. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_types.h +0 -0
  139. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_util.h +0 -0
  140. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_verbosity.c +0 -0
  141. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_version.c +0 -0
  142. /data/{ext → vendor}/libmemcached-0.32/libmemcached/memcached_watchpoint.h +0 -0
  143. /data/{ext → vendor}/libmemcached-0.32/libmemcached/murmur_hash.c +0 -0
  144. /data/{ext → vendor}/libmemcached-0.32/libmemcached/visibility.h +0 -0
  145. /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/Makefile.am +0 -0
  146. /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/Makefile.in +0 -0
  147. /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/libmemcachedutil.ver +0 -0
  148. /data/{ext → vendor}/libmemcached-0.32/libmemcachedutil/memcached_pool.c +0 -0
  149. /data/{ext → vendor}/libmemcached-0.32/m4/ac_cxx_compile_stdcxx_0x.m4 +0 -0
  150. /data/{ext → vendor}/libmemcached-0.32/m4/ac_cxx_header_stdcxx_98.m4 +0 -0
  151. /data/{ext → vendor}/libmemcached-0.32/m4/acx_pthread.m4 +0 -0
  152. /data/{ext → vendor}/libmemcached-0.32/m4/byteorder.m4 +0 -0
  153. /data/{ext → vendor}/libmemcached-0.32/m4/deprecated.m4 +0 -0
  154. /data/{ext → vendor}/libmemcached-0.32/m4/enable_utillib.m4 +0 -0
  155. /data/{ext → vendor}/libmemcached-0.32/m4/extensions.m4 +0 -0
  156. /data/{ext → vendor}/libmemcached-0.32/m4/hsieh.m4 +0 -0
  157. /data/{ext → vendor}/libmemcached-0.32/m4/lib-prefix.m4 +0 -0
  158. /data/{ext → vendor}/libmemcached-0.32/m4/libtool.m4 +0 -0
  159. /data/{ext → vendor}/libmemcached-0.32/m4/ltoptions.m4 +0 -0
  160. /data/{ext → vendor}/libmemcached-0.32/m4/ltsugar.m4 +0 -0
  161. /data/{ext → vendor}/libmemcached-0.32/m4/ltversion.m4 +0 -0
  162. /data/{ext → vendor}/libmemcached-0.32/m4/lt~obsolete.m4 +0 -0
  163. /data/{ext → vendor}/libmemcached-0.32/m4/memcached.m4 +0 -0
  164. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_64bit.m4 +0 -0
  165. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_canonical.m4 +0 -0
  166. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_check_compiler_version.m4 +0 -0
  167. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_check_cxx_standard.m4 +0 -0
  168. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_enable_dtrace.m4 +0 -0
  169. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_ensure_gcc_version.m4 +0 -0
  170. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_have_better_malloc.m4 +0 -0
  171. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_have_sasl.m4 +0 -0
  172. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_header_assert.m4 +0 -0
  173. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_libtool.m4 +0 -0
  174. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_optimize.m4 +0 -0
  175. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_shared_ptr.m4 +0 -0
  176. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_vc_build.m4 +0 -0
  177. /data/{ext → vendor}/libmemcached-0.32/m4/pandora_warnings.m4 +0 -0
  178. /data/{ext → vendor}/libmemcached-0.32/m4/pod2man.m4 +0 -0
  179. /data/{ext → vendor}/libmemcached-0.32/m4/protocol_binary.m4 +0 -0
  180. /data/{ext → vendor}/libmemcached-0.32/m4/setsockopt.m4 +0 -0
  181. /data/{ext → vendor}/libmemcached-0.32/m4/visibility.m4 +0 -0
  182. /data/{ext → vendor}/libmemcached-0.32/support/Makefile.am +0 -0
  183. /data/{ext → vendor}/libmemcached-0.32/support/Makefile.in +0 -0
  184. /data/{ext → vendor}/libmemcached-0.32/support/libmemcached-fc.spec.in +0 -0
  185. /data/{ext → vendor}/libmemcached-0.32/support/libmemcached.pc.in +0 -0
  186. /data/{ext → vendor}/libmemcached-0.32/support/libmemcached.spec +0 -0
  187. /data/{ext → vendor}/libmemcached-0.32/support/libmemcached.spec.in +0 -0
  188. /data/{ext → vendor}/libmemcached-0.32/support/set_benchmark.sh +0 -0
  189. /data/{ext → vendor}/libmemcached-0.32/tests/Makefile.am +0 -0
  190. /data/{ext → vendor}/libmemcached-0.32/tests/Makefile.in +0 -0
  191. /data/{ext → vendor}/libmemcached-0.32/tests/atomsmasher.c +0 -0
  192. /data/{ext → vendor}/libmemcached-0.32/tests/function.c +0 -0
  193. /data/{ext → vendor}/libmemcached-0.32/tests/ketama_test_cases.h +0 -0
  194. /data/{ext → vendor}/libmemcached-0.32/tests/output.cmp +0 -0
  195. /data/{ext → vendor}/libmemcached-0.32/tests/output.res +0 -0
  196. /data/{ext → vendor}/libmemcached-0.32/tests/output2.res +0 -0
  197. /data/{ext → vendor}/libmemcached-0.32/tests/plus.cpp +0 -0
  198. /data/{ext → vendor}/libmemcached-0.32/tests/r/memcat.res +0 -0
  199. /data/{ext → vendor}/libmemcached-0.32/tests/r/memcp.res +0 -0
  200. /data/{ext → vendor}/libmemcached-0.32/tests/r/memrm.res +0 -0
  201. /data/{ext → vendor}/libmemcached-0.32/tests/r/memslap.res +0 -0
  202. /data/{ext → vendor}/libmemcached-0.32/tests/r/memstat.res +0 -0
  203. /data/{ext → vendor}/libmemcached-0.32/tests/server.c +0 -0
  204. /data/{ext → vendor}/libmemcached-0.32/tests/server.h +0 -0
  205. /data/{ext → vendor}/libmemcached-0.32/tests/start.c +0 -0
  206. /data/{ext → vendor}/libmemcached-0.32/tests/t/memcat.test +0 -0
  207. /data/{ext → vendor}/libmemcached-0.32/tests/t/memcp.test +0 -0
  208. /data/{ext → vendor}/libmemcached-0.32/tests/t/memrm.test +0 -0
  209. /data/{ext → vendor}/libmemcached-0.32/tests/t/memslap.test +0 -0
  210. /data/{ext → vendor}/libmemcached-0.32/tests/t/memstat.test +0 -0
  211. /data/{ext → vendor}/libmemcached-0.32/tests/test.c +0 -0
  212. /data/{ext → vendor}/libmemcached-0.32/tests/test.h +0 -0
  213. /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
  %{