boourns-memcached 1.4.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (542) hide show
  1. data/BENCHMARKS +128 -0
  2. data/CHANGELOG +158 -0
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +41 -0
  5. data/LICENSE +184 -0
  6. data/Manifest +243 -0
  7. data/README.rdoc +124 -0
  8. data/Rakefile +118 -0
  9. data/TODO +4 -0
  10. data/ext/Makefile +213 -0
  11. data/ext/Makefile.in +213 -0
  12. data/ext/bin/memcat +0 -0
  13. data/ext/bin/memcp +0 -0
  14. data/ext/bin/memdump +0 -0
  15. data/ext/bin/memerror +0 -0
  16. data/ext/bin/memflush +0 -0
  17. data/ext/bin/memrm +0 -0
  18. data/ext/bin/memslap +0 -0
  19. data/ext/bin/memstat +0 -0
  20. data/ext/extconf-make.rb +25 -0
  21. data/ext/extconf.rb +87 -0
  22. data/ext/include/libmemcached/memcached.h +304 -0
  23. data/ext/include/libmemcached/memcached.hpp +799 -0
  24. data/ext/include/libmemcached/memcached_configure.h +23 -0
  25. data/ext/include/libmemcached/memcached_constants.h +145 -0
  26. data/ext/include/libmemcached/memcached_exist.h +20 -0
  27. data/ext/include/libmemcached/memcached_get.h +87 -0
  28. data/ext/include/libmemcached/memcached_result.h +59 -0
  29. data/ext/include/libmemcached/memcached_sasl.h +44 -0
  30. data/ext/include/libmemcached/memcached_server.h +93 -0
  31. data/ext/include/libmemcached/memcached_storage.h +107 -0
  32. data/ext/include/libmemcached/memcached_string.h +53 -0
  33. data/ext/include/libmemcached/memcached_touch.h +31 -0
  34. data/ext/include/libmemcached/memcached_types.h +44 -0
  35. data/ext/include/libmemcached/memcached_watchpoint.h +38 -0
  36. data/ext/include/libmemcached/visibility.h +51 -0
  37. data/ext/lib/libmemcached.a +0 -0
  38. data/ext/lib/libmemcached.la +41 -0
  39. data/ext/lib/libmemcached_gem.a +0 -0
  40. data/ext/lib/libmemcached_gem.la +41 -0
  41. data/ext/lib/pkgconfig/libmemcached.pc +10 -0
  42. data/ext/libmemcached-0.32/AUTHORS +7 -0
  43. data/ext/libmemcached-0.32/COPYING +32 -0
  44. data/ext/libmemcached-0.32/ChangeLog +303 -0
  45. data/ext/libmemcached-0.32/INSTALL +302 -0
  46. data/ext/libmemcached-0.32/Makefile +831 -0
  47. data/ext/libmemcached-0.32/Makefile.am +36 -0
  48. data/ext/libmemcached-0.32/Makefile.in +831 -0
  49. data/ext/libmemcached-0.32/NEWS +1 -0
  50. data/ext/libmemcached-0.32/README +33 -0
  51. data/ext/libmemcached-0.32/THANKS +14 -0
  52. data/ext/libmemcached-0.32/TODO +11 -0
  53. data/ext/libmemcached-0.32/aclocal.m4 +1917 -0
  54. data/ext/libmemcached-0.32/clients/Makefile +773 -0
  55. data/ext/libmemcached-0.32/clients/Makefile.am +80 -0
  56. data/ext/libmemcached-0.32/clients/Makefile.in +773 -0
  57. data/ext/libmemcached-0.32/clients/client_options.h +32 -0
  58. data/ext/libmemcached-0.32/clients/execute.c +64 -0
  59. data/ext/libmemcached-0.32/clients/execute.h +5 -0
  60. data/ext/libmemcached-0.32/clients/execute.lo +12 -0
  61. data/ext/libmemcached-0.32/clients/execute.o +0 -0
  62. data/ext/libmemcached-0.32/clients/generator.c +74 -0
  63. data/ext/libmemcached-0.32/clients/generator.h +20 -0
  64. data/ext/libmemcached-0.32/clients/generator.lo +12 -0
  65. data/ext/libmemcached-0.32/clients/generator.o +0 -0
  66. data/ext/libmemcached-0.32/clients/libgenexec.la +41 -0
  67. data/ext/libmemcached-0.32/clients/libutilities.la +41 -0
  68. data/ext/libmemcached-0.32/clients/memcat +0 -0
  69. data/ext/libmemcached-0.32/clients/memcat.c +178 -0
  70. data/ext/libmemcached-0.32/clients/memcat.o +0 -0
  71. data/ext/libmemcached-0.32/clients/memcp +0 -0
  72. data/ext/libmemcached-0.32/clients/memcp.c +251 -0
  73. data/ext/libmemcached-0.32/clients/memcp.o +0 -0
  74. data/ext/libmemcached-0.32/clients/memdump +0 -0
  75. data/ext/libmemcached-0.32/clients/memdump.c +170 -0
  76. data/ext/libmemcached-0.32/clients/memdump.o +0 -0
  77. data/ext/libmemcached-0.32/clients/memerror +0 -0
  78. data/ext/libmemcached-0.32/clients/memerror.c +80 -0
  79. data/ext/libmemcached-0.32/clients/memerror.o +0 -0
  80. data/ext/libmemcached-0.32/clients/memflush +0 -0
  81. data/ext/libmemcached-0.32/clients/memflush.c +143 -0
  82. data/ext/libmemcached-0.32/clients/memflush.o +0 -0
  83. data/ext/libmemcached-0.32/clients/memrm +0 -0
  84. data/ext/libmemcached-0.32/clients/memrm.c +160 -0
  85. data/ext/libmemcached-0.32/clients/memrm.o +0 -0
  86. data/ext/libmemcached-0.32/clients/memslap +0 -0
  87. data/ext/libmemcached-0.32/clients/memslap-memslap.o +0 -0
  88. data/ext/libmemcached-0.32/clients/memslap.c +441 -0
  89. data/ext/libmemcached-0.32/clients/memstat +0 -0
  90. data/ext/libmemcached-0.32/clients/memstat.c +326 -0
  91. data/ext/libmemcached-0.32/clients/memstat.o +0 -0
  92. data/ext/libmemcached-0.32/clients/utilities.c +207 -0
  93. data/ext/libmemcached-0.32/clients/utilities.h +41 -0
  94. data/ext/libmemcached-0.32/clients/utilities.lo +12 -0
  95. data/ext/libmemcached-0.32/clients/utilities.o +0 -0
  96. data/ext/libmemcached-0.32/config.h +253 -0
  97. data/ext/libmemcached-0.32/config.h.in +252 -0
  98. data/ext/libmemcached-0.32/config.log +2440 -0
  99. data/ext/libmemcached-0.32/config.status +2384 -0
  100. data/ext/libmemcached-0.32/config/compile +143 -0
  101. data/ext/libmemcached-0.32/config/config.guess +1561 -0
  102. data/ext/libmemcached-0.32/config/config.rpath +666 -0
  103. data/ext/libmemcached-0.32/config/config.sub +1686 -0
  104. data/ext/libmemcached-0.32/config/depcomp +630 -0
  105. data/ext/libmemcached-0.32/config/install-sh +520 -0
  106. data/ext/libmemcached-0.32/config/ltmain.sh +9636 -0
  107. data/ext/libmemcached-0.32/config/missing +376 -0
  108. data/ext/libmemcached-0.32/configure +23825 -0
  109. data/ext/libmemcached-0.32/configure.ac +122 -0
  110. data/ext/libmemcached-0.32/docs/Makefile +920 -0
  111. data/ext/libmemcached-0.32/docs/Makefile.am +415 -0
  112. data/ext/libmemcached-0.32/docs/Makefile.in +920 -0
  113. data/ext/libmemcached-0.32/docs/libmemcached.3 +229 -0
  114. data/ext/libmemcached-0.32/docs/libmemcached.pod +123 -0
  115. data/ext/libmemcached-0.32/docs/libmemcached_examples.3 +242 -0
  116. data/ext/libmemcached-0.32/docs/libmemcached_examples.pod +115 -0
  117. data/ext/libmemcached-0.32/docs/libmemcachedutil.pod +40 -0
  118. data/ext/libmemcached-0.32/docs/memcached_add.3 +308 -0
  119. data/ext/libmemcached-0.32/docs/memcached_add_by_key.3 +308 -0
  120. data/ext/libmemcached-0.32/docs/memcached_analyze.3 +175 -0
  121. data/ext/libmemcached-0.32/docs/memcached_analyze.pod +52 -0
  122. data/ext/libmemcached-0.32/docs/memcached_append.3 +308 -0
  123. data/ext/libmemcached-0.32/docs/memcached_append_by_key.3 +308 -0
  124. data/ext/libmemcached-0.32/docs/memcached_auto.pod +97 -0
  125. data/ext/libmemcached-0.32/docs/memcached_behavior.pod +224 -0
  126. data/ext/libmemcached-0.32/docs/memcached_behavior_get.3 +317 -0
  127. data/ext/libmemcached-0.32/docs/memcached_behavior_set.3 +317 -0
  128. data/ext/libmemcached-0.32/docs/memcached_callback.pod +123 -0
  129. data/ext/libmemcached-0.32/docs/memcached_callback_get.3 +231 -0
  130. data/ext/libmemcached-0.32/docs/memcached_callback_set.3 +231 -0
  131. data/ext/libmemcached-0.32/docs/memcached_cas.3 +308 -0
  132. data/ext/libmemcached-0.32/docs/memcached_cas_by_key.3 +308 -0
  133. data/ext/libmemcached-0.32/docs/memcached_clone.3 +183 -0
  134. data/ext/libmemcached-0.32/docs/memcached_create.3 +183 -0
  135. data/ext/libmemcached-0.32/docs/memcached_create.pod +61 -0
  136. data/ext/libmemcached-0.32/docs/memcached_decrement.3 +219 -0
  137. data/ext/libmemcached-0.32/docs/memcached_decrement_with_initial.3 +219 -0
  138. data/ext/libmemcached-0.32/docs/memcached_delete.3 +176 -0
  139. data/ext/libmemcached-0.32/docs/memcached_delete.pod +54 -0
  140. data/ext/libmemcached-0.32/docs/memcached_delete_by_key.3 +176 -0
  141. data/ext/libmemcached-0.32/docs/memcached_destroy_sasl_auth_data.3 +184 -0
  142. data/ext/libmemcached-0.32/docs/memcached_dump.3 +175 -0
  143. data/ext/libmemcached-0.32/docs/memcached_dump.pod +53 -0
  144. data/ext/libmemcached-0.32/docs/memcached_fetch.3 +283 -0
  145. data/ext/libmemcached-0.32/docs/memcached_fetch_execute.3 +283 -0
  146. data/ext/libmemcached-0.32/docs/memcached_fetch_result.3 +283 -0
  147. data/ext/libmemcached-0.32/docs/memcached_flush.pod +46 -0
  148. data/ext/libmemcached-0.32/docs/memcached_flush_buffers.3 +164 -0
  149. data/ext/libmemcached-0.32/docs/memcached_flush_buffers.pod +42 -0
  150. data/ext/libmemcached-0.32/docs/memcached_free.3 +183 -0
  151. data/ext/libmemcached-0.32/docs/memcached_generate_hash_value.3 +179 -0
  152. data/ext/libmemcached-0.32/docs/memcached_generate_hash_value.pod +57 -0
  153. data/ext/libmemcached-0.32/docs/memcached_get.3 +283 -0
  154. data/ext/libmemcached-0.32/docs/memcached_get.pod +161 -0
  155. data/ext/libmemcached-0.32/docs/memcached_get_by_key.3 +283 -0
  156. data/ext/libmemcached-0.32/docs/memcached_get_memory_allocators.3 +194 -0
  157. data/ext/libmemcached-0.32/docs/memcached_get_sasl_callbacks.3 +184 -0
  158. data/ext/libmemcached-0.32/docs/memcached_get_user_data.3 +171 -0
  159. data/ext/libmemcached-0.32/docs/memcached_increment.3 +219 -0
  160. data/ext/libmemcached-0.32/docs/memcached_increment_with_initial.3 +219 -0
  161. data/ext/libmemcached-0.32/docs/memcached_lib_version.3 +176 -0
  162. data/ext/libmemcached-0.32/docs/memcached_memory_allocators.pod +73 -0
  163. data/ext/libmemcached-0.32/docs/memcached_mget.3 +283 -0
  164. data/ext/libmemcached-0.32/docs/memcached_mget_by_key.3 +283 -0
  165. data/ext/libmemcached-0.32/docs/memcached_pool.pod +77 -0
  166. data/ext/libmemcached-0.32/docs/memcached_prepend.3 +308 -0
  167. data/ext/libmemcached-0.32/docs/memcached_prepend_by_key.3 +308 -0
  168. data/ext/libmemcached-0.32/docs/memcached_quit.3 +169 -0
  169. data/ext/libmemcached-0.32/docs/memcached_quit.pod +47 -0
  170. data/ext/libmemcached-0.32/docs/memcached_replace.3 +308 -0
  171. data/ext/libmemcached-0.32/docs/memcached_replace_by_key.3 +308 -0
  172. data/ext/libmemcached-0.32/docs/memcached_sasl.pod +63 -0
  173. data/ext/libmemcached-0.32/docs/memcached_server_add.3 +224 -0
  174. data/ext/libmemcached-0.32/docs/memcached_server_count.3 +224 -0
  175. data/ext/libmemcached-0.32/docs/memcached_server_list.3 +224 -0
  176. data/ext/libmemcached-0.32/docs/memcached_server_list_append.3 +196 -0
  177. data/ext/libmemcached-0.32/docs/memcached_server_list_count.3 +196 -0
  178. data/ext/libmemcached-0.32/docs/memcached_server_list_free.3 +196 -0
  179. data/ext/libmemcached-0.32/docs/memcached_server_push.3 +224 -0
  180. data/ext/libmemcached-0.32/docs/memcached_server_st.pod +75 -0
  181. data/ext/libmemcached-0.32/docs/memcached_servers.pod +102 -0
  182. data/ext/libmemcached-0.32/docs/memcached_servers_parse.3 +196 -0
  183. data/ext/libmemcached-0.32/docs/memcached_set.3 +308 -0
  184. data/ext/libmemcached-0.32/docs/memcached_set.pod +187 -0
  185. data/ext/libmemcached-0.32/docs/memcached_set_by_key.3 +308 -0
  186. data/ext/libmemcached-0.32/docs/memcached_set_memory_allocators.3 +194 -0
  187. data/ext/libmemcached-0.32/docs/memcached_set_sasl_auth_data.3 +184 -0
  188. data/ext/libmemcached-0.32/docs/memcached_set_sasl_callbacks.3 +184 -0
  189. data/ext/libmemcached-0.32/docs/memcached_set_user_data.3 +171 -0
  190. data/ext/libmemcached-0.32/docs/memcached_stat.3 +204 -0
  191. data/ext/libmemcached-0.32/docs/memcached_stat_get_keys.3 +204 -0
  192. data/ext/libmemcached-0.32/docs/memcached_stat_get_value.3 +204 -0
  193. data/ext/libmemcached-0.32/docs/memcached_stat_servername.3 +204 -0
  194. data/ext/libmemcached-0.32/docs/memcached_stats.pod +82 -0
  195. data/ext/libmemcached-0.32/docs/memcached_strerror.3 +168 -0
  196. data/ext/libmemcached-0.32/docs/memcached_strerror.pod +46 -0
  197. data/ext/libmemcached-0.32/docs/memcached_user_data.pod +49 -0
  198. data/ext/libmemcached-0.32/docs/memcached_verbosity.3 +163 -0
  199. data/ext/libmemcached-0.32/docs/memcached_verbosity.pod +41 -0
  200. data/ext/libmemcached-0.32/docs/memcached_version.3 +176 -0
  201. data/ext/libmemcached-0.32/docs/memcached_version.pod +56 -0
  202. data/ext/libmemcached-0.32/docs/memcat.1 +161 -0
  203. data/ext/libmemcached-0.32/docs/memcat.pod +37 -0
  204. data/ext/libmemcached-0.32/docs/memcp.1 +164 -0
  205. data/ext/libmemcached-0.32/docs/memcp.pod +40 -0
  206. data/ext/libmemcached-0.32/docs/memdump.1 +155 -0
  207. data/ext/libmemcached-0.32/docs/memdump.pod +31 -0
  208. data/ext/libmemcached-0.32/docs/memerror.1 +154 -0
  209. data/ext/libmemcached-0.32/docs/memerror.pod +30 -0
  210. data/ext/libmemcached-0.32/docs/memflush.1 +159 -0
  211. data/ext/libmemcached-0.32/docs/memflush.pod +35 -0
  212. data/ext/libmemcached-0.32/docs/memrm.1 +158 -0
  213. data/ext/libmemcached-0.32/docs/memrm.pod +34 -0
  214. data/ext/libmemcached-0.32/docs/memslap.1 +157 -0
  215. data/ext/libmemcached-0.32/docs/memslap.pod +33 -0
  216. data/ext/libmemcached-0.32/docs/memstat.1 +159 -0
  217. data/ext/libmemcached-0.32/docs/memstat.pod +35 -0
  218. data/ext/libmemcached-0.32/libmemcached/Makefile +1069 -0
  219. data/ext/libmemcached-0.32/libmemcached/Makefile.am +111 -0
  220. data/ext/libmemcached-0.32/libmemcached/Makefile.in +1069 -0
  221. data/ext/libmemcached-0.32/libmemcached/byteorder.c +31 -0
  222. data/ext/libmemcached-0.32/libmemcached/common.h +189 -0
  223. data/ext/libmemcached-0.32/libmemcached/crc.c +86 -0
  224. data/ext/libmemcached-0.32/libmemcached/hsieh_hash.c +68 -0
  225. data/ext/libmemcached-0.32/libmemcached/jenkins_hash.c +213 -0
  226. data/ext/libmemcached-0.32/libmemcached/libmemcached.la +41 -0
  227. data/ext/libmemcached-0.32/libmemcached/libmemcached.ver +1 -0
  228. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-byteorder.lo +12 -0
  229. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-byteorder.o +0 -0
  230. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-crc.lo +12 -0
  231. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-crc.o +0 -0
  232. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-jenkins_hash.lo +12 -0
  233. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-jenkins_hash.o +0 -0
  234. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-md5.lo +12 -0
  235. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-md5.o +0 -0
  236. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached.lo +12 -0
  237. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached.o +0 -0
  238. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_allocators.lo +12 -0
  239. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_allocators.o +0 -0
  240. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_analyze.lo +12 -0
  241. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_analyze.o +0 -0
  242. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_auto.lo +12 -0
  243. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_auto.o +0 -0
  244. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_behavior.lo +12 -0
  245. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_behavior.o +0 -0
  246. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_connect.lo +12 -0
  247. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_connect.o +0 -0
  248. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_delete.lo +12 -0
  249. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_delete.o +0 -0
  250. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_do.lo +12 -0
  251. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_do.o +0 -0
  252. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_dump.lo +12 -0
  253. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_dump.o +0 -0
  254. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_exist.lo +12 -0
  255. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_exist.o +0 -0
  256. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_fetch.lo +12 -0
  257. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_fetch.o +0 -0
  258. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_flush.lo +12 -0
  259. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_flush.o +0 -0
  260. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_flush_buffers.lo +12 -0
  261. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_flush_buffers.o +0 -0
  262. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_get.lo +12 -0
  263. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_get.o +0 -0
  264. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_hash.lo +12 -0
  265. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_hash.o +0 -0
  266. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_hosts.lo +12 -0
  267. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_hosts.o +0 -0
  268. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_io.lo +12 -0
  269. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_io.o +0 -0
  270. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_key.lo +12 -0
  271. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_key.o +0 -0
  272. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_parse.lo +12 -0
  273. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_parse.o +0 -0
  274. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_purge.lo +12 -0
  275. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_purge.o +0 -0
  276. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_quit.lo +12 -0
  277. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_quit.o +0 -0
  278. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_response.lo +12 -0
  279. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_response.o +0 -0
  280. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_result.lo +12 -0
  281. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_result.o +0 -0
  282. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_sasl.lo +12 -0
  283. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_sasl.o +0 -0
  284. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_server.lo +12 -0
  285. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_server.o +0 -0
  286. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_stats.lo +12 -0
  287. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_stats.o +0 -0
  288. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_storage.lo +12 -0
  289. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_storage.o +0 -0
  290. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_strerror.lo +12 -0
  291. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_strerror.o +0 -0
  292. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_string.lo +12 -0
  293. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_string.o +0 -0
  294. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_touch.lo +12 -0
  295. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_touch.o +0 -0
  296. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_verbosity.lo +12 -0
  297. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_verbosity.o +0 -0
  298. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_version.lo +12 -0
  299. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-memcached_version.o +0 -0
  300. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-murmur_hash.lo +12 -0
  301. data/ext/libmemcached-0.32/libmemcached/libmemcached_la-murmur_hash.o +0 -0
  302. data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.d +30 -0
  303. data/ext/libmemcached-0.32/libmemcached/libmemcached_probes.h +82 -0
  304. data/ext/libmemcached-0.32/libmemcached/libmemcachedcallbacks.la +41 -0
  305. data/ext/libmemcached-0.32/libmemcached/libmemcachedcallbacks_la-memcached_callback.lo +12 -0
  306. data/ext/libmemcached-0.32/libmemcached/libmemcachedcallbacks_la-memcached_callback.o +0 -0
  307. data/ext/libmemcached-0.32/libmemcached/md5.c +354 -0
  308. data/ext/libmemcached-0.32/libmemcached/memcached.c +152 -0
  309. data/ext/libmemcached-0.32/libmemcached/memcached.h +304 -0
  310. data/ext/libmemcached-0.32/libmemcached/memcached.hpp +799 -0
  311. data/ext/libmemcached-0.32/libmemcached/memcached/README.txt +7 -0
  312. data/ext/libmemcached-0.32/libmemcached/memcached/protocol_binary.h +385 -0
  313. data/ext/libmemcached-0.32/libmemcached/memcached_allocators.c +72 -0
  314. data/ext/libmemcached-0.32/libmemcached/memcached_analyze.c +100 -0
  315. data/ext/libmemcached-0.32/libmemcached/memcached_auto.c +207 -0
  316. data/ext/libmemcached-0.32/libmemcached/memcached_behavior.c +285 -0
  317. data/ext/libmemcached-0.32/libmemcached/memcached_callback.c +175 -0
  318. data/ext/libmemcached-0.32/libmemcached/memcached_configure.h +23 -0
  319. data/ext/libmemcached-0.32/libmemcached/memcached_configure.h.in +23 -0
  320. data/ext/libmemcached-0.32/libmemcached/memcached_connect.c +371 -0
  321. data/ext/libmemcached-0.32/libmemcached/memcached_constants.h +145 -0
  322. data/ext/libmemcached-0.32/libmemcached/memcached_delete.c +0 -0
  323. data/ext/libmemcached-0.32/libmemcached/memcached_do.c +70 -0
  324. data/ext/libmemcached-0.32/libmemcached/memcached_dump.c +79 -0
  325. data/ext/libmemcached-0.32/libmemcached/memcached_exist.c +114 -0
  326. data/ext/libmemcached-0.32/libmemcached/memcached_exist.h +20 -0
  327. data/ext/libmemcached-0.32/libmemcached/memcached_fetch.c +102 -0
  328. data/ext/libmemcached-0.32/libmemcached/memcached_flush.c +89 -0
  329. data/ext/libmemcached-0.32/libmemcached/memcached_flush_buffers.c +22 -0
  330. data/ext/libmemcached-0.32/libmemcached/memcached_get.c +494 -0
  331. data/ext/libmemcached-0.32/libmemcached/memcached_get.h +87 -0
  332. data/ext/libmemcached-0.32/libmemcached/memcached_hash.c +252 -0
  333. data/ext/libmemcached-0.32/libmemcached/memcached_hosts.c +510 -0
  334. data/ext/libmemcached-0.32/libmemcached/memcached_internal.h +31 -0
  335. data/ext/libmemcached-0.32/libmemcached/memcached_io.c +575 -0
  336. data/ext/libmemcached-0.32/libmemcached/memcached_io.h +72 -0
  337. data/ext/libmemcached-0.32/libmemcached/memcached_key.c +28 -0
  338. data/ext/libmemcached-0.32/libmemcached/memcached_parse.c +74 -0
  339. data/ext/libmemcached-0.32/libmemcached/memcached_pool.h +38 -0
  340. data/ext/libmemcached-0.32/libmemcached/memcached_purge.c +76 -0
  341. data/ext/libmemcached-0.32/libmemcached/memcached_quit.c +75 -0
  342. data/ext/libmemcached-0.32/libmemcached/memcached_response.c +529 -0
  343. data/ext/libmemcached-0.32/libmemcached/memcached_result.c +57 -0
  344. data/ext/libmemcached-0.32/libmemcached/memcached_result.h +59 -0
  345. data/ext/libmemcached-0.32/libmemcached/memcached_sasl.c +225 -0
  346. data/ext/libmemcached-0.32/libmemcached/memcached_sasl.h +44 -0
  347. data/ext/libmemcached-0.32/libmemcached/memcached_server.c +159 -0
  348. data/ext/libmemcached-0.32/libmemcached/memcached_server.h +93 -0
  349. data/ext/libmemcached-0.32/libmemcached/memcached_stats.c +437 -0
  350. data/ext/libmemcached-0.32/libmemcached/memcached_storage.c +515 -0
  351. data/ext/libmemcached-0.32/libmemcached/memcached_storage.h +107 -0
  352. data/ext/libmemcached-0.32/libmemcached/memcached_strerror.c +92 -0
  353. data/ext/libmemcached-0.32/libmemcached/memcached_string.c +138 -0
  354. data/ext/libmemcached-0.32/libmemcached/memcached_string.h +53 -0
  355. data/ext/libmemcached-0.32/libmemcached/memcached_touch.c +60 -0
  356. data/ext/libmemcached-0.32/libmemcached/memcached_touch.h +31 -0
  357. data/ext/libmemcached-0.32/libmemcached/memcached_types.h +44 -0
  358. data/ext/libmemcached-0.32/libmemcached/memcached_util.h +15 -0
  359. data/ext/libmemcached-0.32/libmemcached/memcached_verbosity.c +36 -0
  360. data/ext/libmemcached-0.32/libmemcached/memcached_version.c +112 -0
  361. data/ext/libmemcached-0.32/libmemcached/memcached_watchpoint.h +38 -0
  362. data/ext/libmemcached-0.32/libmemcached/murmur_hash.c +76 -0
  363. data/ext/libmemcached-0.32/libmemcached/visibility.h +51 -0
  364. data/ext/libmemcached-0.32/libmemcachedutil/Makefile +604 -0
  365. data/ext/libmemcached-0.32/libmemcachedutil/Makefile.am +11 -0
  366. data/ext/libmemcached-0.32/libmemcachedutil/Makefile.in +604 -0
  367. data/ext/libmemcached-0.32/libmemcachedutil/libmemcachedutil.ver +1 -0
  368. data/ext/libmemcached-0.32/libmemcachedutil/memcached_pool.c +170 -0
  369. data/ext/libmemcached-0.32/libtool +10223 -0
  370. data/ext/libmemcached-0.32/m4/ac_cxx_compile_stdcxx_0x.m4 +103 -0
  371. data/ext/libmemcached-0.32/m4/ac_cxx_header_stdcxx_98.m4 +67 -0
  372. data/ext/libmemcached-0.32/m4/acx_pthread.m4 +276 -0
  373. data/ext/libmemcached-0.32/m4/byteorder.m4 +40 -0
  374. data/ext/libmemcached-0.32/m4/deprecated.m4 +17 -0
  375. data/ext/libmemcached-0.32/m4/enable_utillib.m4 +16 -0
  376. data/ext/libmemcached-0.32/m4/extensions.m4 +94 -0
  377. data/ext/libmemcached-0.32/m4/hsieh.m4 +18 -0
  378. data/ext/libmemcached-0.32/m4/lib-prefix.m4 +221 -0
  379. data/ext/libmemcached-0.32/m4/libtool.m4 +7831 -0
  380. data/ext/libmemcached-0.32/m4/ltoptions.m4 +369 -0
  381. data/ext/libmemcached-0.32/m4/ltsugar.m4 +123 -0
  382. data/ext/libmemcached-0.32/m4/ltversion.m4 +23 -0
  383. data/ext/libmemcached-0.32/m4/lt~obsolete.m4 +98 -0
  384. data/ext/libmemcached-0.32/m4/memcached.m4 +30 -0
  385. data/ext/libmemcached-0.32/m4/pandora_64bit.m4 +55 -0
  386. data/ext/libmemcached-0.32/m4/pandora_canonical.m4 +151 -0
  387. data/ext/libmemcached-0.32/m4/pandora_check_compiler_version.m4 +37 -0
  388. data/ext/libmemcached-0.32/m4/pandora_check_cxx_standard.m4 +16 -0
  389. data/ext/libmemcached-0.32/m4/pandora_enable_dtrace.m4 +41 -0
  390. data/ext/libmemcached-0.32/m4/pandora_ensure_gcc_version.m4 +36 -0
  391. data/ext/libmemcached-0.32/m4/pandora_have_better_malloc.m4 +54 -0
  392. data/ext/libmemcached-0.32/m4/pandora_have_sasl.m4 +133 -0
  393. data/ext/libmemcached-0.32/m4/pandora_header_assert.m4 +23 -0
  394. data/ext/libmemcached-0.32/m4/pandora_libtool.m4 +15 -0
  395. data/ext/libmemcached-0.32/m4/pandora_optimize.m4 +79 -0
  396. data/ext/libmemcached-0.32/m4/pandora_shared_ptr.m4 +56 -0
  397. data/ext/libmemcached-0.32/m4/pandora_vc_build.m4 +32 -0
  398. data/ext/libmemcached-0.32/m4/pandora_warnings.m4 +262 -0
  399. data/ext/libmemcached-0.32/m4/pod2man.m4 +7 -0
  400. data/ext/libmemcached-0.32/m4/protocol_binary.m4 +23 -0
  401. data/ext/libmemcached-0.32/m4/setsockopt.m4 +57 -0
  402. data/ext/libmemcached-0.32/m4/visibility.m4 +52 -0
  403. data/ext/libmemcached-0.32/stamp-h1 +1 -0
  404. data/ext/libmemcached-0.32/support/Makefile +487 -0
  405. data/ext/libmemcached-0.32/support/Makefile.am +4 -0
  406. data/ext/libmemcached-0.32/support/Makefile.in +487 -0
  407. data/ext/libmemcached-0.32/support/libmemcached-fc.spec +105 -0
  408. data/ext/libmemcached-0.32/support/libmemcached-fc.spec.in +105 -0
  409. data/ext/libmemcached-0.32/support/libmemcached.pc +10 -0
  410. data/ext/libmemcached-0.32/support/libmemcached.pc.in +10 -0
  411. data/ext/libmemcached-0.32/support/libmemcached.spec +105 -0
  412. data/ext/libmemcached-0.32/support/libmemcached.spec.in +105 -0
  413. data/ext/libmemcached-0.32/support/set_benchmark.sh +5 -0
  414. data/ext/libmemcached-0.32/tests/Makefile +762 -0
  415. data/ext/libmemcached-0.32/tests/Makefile.am +113 -0
  416. data/ext/libmemcached-0.32/tests/Makefile.in +762 -0
  417. data/ext/libmemcached-0.32/tests/atomsmasher +0 -0
  418. data/ext/libmemcached-0.32/tests/atomsmasher.c +245 -0
  419. data/ext/libmemcached-0.32/tests/atomsmasher.o +0 -0
  420. data/ext/libmemcached-0.32/tests/function.c +4893 -0
  421. data/ext/libmemcached-0.32/tests/ketama_test_cases.h +108 -0
  422. data/ext/libmemcached-0.32/tests/libserver.la +41 -0
  423. data/ext/libmemcached-0.32/tests/libtest.la +41 -0
  424. data/ext/libmemcached-0.32/tests/output.cmp +7 -0
  425. data/ext/libmemcached-0.32/tests/output.res +7 -0
  426. data/ext/libmemcached-0.32/tests/output2.res +46 -0
  427. data/ext/libmemcached-0.32/tests/plus.cpp +293 -0
  428. data/ext/libmemcached-0.32/tests/plus.o +0 -0
  429. data/ext/libmemcached-0.32/tests/r/memcat.res +19 -0
  430. data/ext/libmemcached-0.32/tests/r/memcp.res +27 -0
  431. data/ext/libmemcached-0.32/tests/r/memrm.res +19 -0
  432. data/ext/libmemcached-0.32/tests/r/memslap.res +33 -0
  433. data/ext/libmemcached-0.32/tests/r/memstat.res +33 -0
  434. data/ext/libmemcached-0.32/tests/server.c +118 -0
  435. data/ext/libmemcached-0.32/tests/server.h +25 -0
  436. data/ext/libmemcached-0.32/tests/server.lo +12 -0
  437. data/ext/libmemcached-0.32/tests/server.o +0 -0
  438. data/ext/libmemcached-0.32/tests/start.c +16 -0
  439. data/ext/libmemcached-0.32/tests/start.o +0 -0
  440. data/ext/libmemcached-0.32/tests/startservers +0 -0
  441. data/ext/libmemcached-0.32/tests/t/memcat.test +4 -0
  442. data/ext/libmemcached-0.32/tests/t/memcp.test +3 -0
  443. data/ext/libmemcached-0.32/tests/t/memrm.test +3 -0
  444. data/ext/libmemcached-0.32/tests/t/memslap.test +5 -0
  445. data/ext/libmemcached-0.32/tests/t/memstat.test +3 -0
  446. data/ext/libmemcached-0.32/tests/test.c +137 -0
  447. data/ext/libmemcached-0.32/tests/test.h +46 -0
  448. data/ext/libmemcached-0.32/tests/test.lo +12 -0
  449. data/ext/libmemcached-0.32/tests/test.o +0 -0
  450. data/ext/libmemcached-0.32/tests/testapp +0 -0
  451. data/ext/libmemcached-0.32/tests/testapp-function.o +0 -0
  452. data/ext/libmemcached-0.32/tests/testplus +0 -0
  453. data/ext/libmemcached-0.32/tests/udp.c +76 -0
  454. data/ext/libmemcached-0.32/tests/udp.o +0 -0
  455. data/ext/libmemcached-0.32/tests/udptest +0 -0
  456. data/ext/rlibmemcached.bundle +0 -0
  457. data/ext/rlibmemcached.i +249 -0
  458. data/ext/rlibmemcached_wrap.c +13781 -0
  459. data/ext/rlibmemcached_wrap.o +0 -0
  460. data/ext/share/man/man1/memcat.1 +161 -0
  461. data/ext/share/man/man1/memcp.1 +164 -0
  462. data/ext/share/man/man1/memdump.1 +155 -0
  463. data/ext/share/man/man1/memerror.1 +154 -0
  464. data/ext/share/man/man1/memflush.1 +159 -0
  465. data/ext/share/man/man1/memrm.1 +158 -0
  466. data/ext/share/man/man1/memslap.1 +157 -0
  467. data/ext/share/man/man1/memstat.1 +159 -0
  468. data/ext/share/man/man3/libmemcached.3 +229 -0
  469. data/ext/share/man/man3/libmemcached_examples.3 +242 -0
  470. data/ext/share/man/man3/memcached_add.3 +308 -0
  471. data/ext/share/man/man3/memcached_add_by_key.3 +308 -0
  472. data/ext/share/man/man3/memcached_analyze.3 +175 -0
  473. data/ext/share/man/man3/memcached_append.3 +308 -0
  474. data/ext/share/man/man3/memcached_append_by_key.3 +308 -0
  475. data/ext/share/man/man3/memcached_behavior_get.3 +317 -0
  476. data/ext/share/man/man3/memcached_behavior_set.3 +317 -0
  477. data/ext/share/man/man3/memcached_callback_get.3 +231 -0
  478. data/ext/share/man/man3/memcached_callback_set.3 +231 -0
  479. data/ext/share/man/man3/memcached_cas.3 +308 -0
  480. data/ext/share/man/man3/memcached_cas_by_key.3 +308 -0
  481. data/ext/share/man/man3/memcached_clone.3 +183 -0
  482. data/ext/share/man/man3/memcached_create.3 +183 -0
  483. data/ext/share/man/man3/memcached_decrement.3 +219 -0
  484. data/ext/share/man/man3/memcached_decrement_with_initial.3 +219 -0
  485. data/ext/share/man/man3/memcached_delete.3 +176 -0
  486. data/ext/share/man/man3/memcached_delete_by_key.3 +176 -0
  487. data/ext/share/man/man3/memcached_destroy_sasl_auth_data.3 +184 -0
  488. data/ext/share/man/man3/memcached_dump.3 +175 -0
  489. data/ext/share/man/man3/memcached_fetch.3 +283 -0
  490. data/ext/share/man/man3/memcached_fetch_execute.3 +283 -0
  491. data/ext/share/man/man3/memcached_fetch_result.3 +283 -0
  492. data/ext/share/man/man3/memcached_flush_buffers.3 +164 -0
  493. data/ext/share/man/man3/memcached_free.3 +183 -0
  494. data/ext/share/man/man3/memcached_generate_hash_value.3 +179 -0
  495. data/ext/share/man/man3/memcached_get.3 +283 -0
  496. data/ext/share/man/man3/memcached_get_by_key.3 +283 -0
  497. data/ext/share/man/man3/memcached_get_memory_allocators.3 +194 -0
  498. data/ext/share/man/man3/memcached_get_sasl_callbacks.3 +184 -0
  499. data/ext/share/man/man3/memcached_get_user_data.3 +171 -0
  500. data/ext/share/man/man3/memcached_increment.3 +219 -0
  501. data/ext/share/man/man3/memcached_increment_with_initial.3 +219 -0
  502. data/ext/share/man/man3/memcached_lib_version.3 +176 -0
  503. data/ext/share/man/man3/memcached_mget.3 +283 -0
  504. data/ext/share/man/man3/memcached_mget_by_key.3 +283 -0
  505. data/ext/share/man/man3/memcached_prepend.3 +308 -0
  506. data/ext/share/man/man3/memcached_prepend_by_key.3 +308 -0
  507. data/ext/share/man/man3/memcached_quit.3 +169 -0
  508. data/ext/share/man/man3/memcached_replace.3 +308 -0
  509. data/ext/share/man/man3/memcached_replace_by_key.3 +308 -0
  510. data/ext/share/man/man3/memcached_server_add.3 +224 -0
  511. data/ext/share/man/man3/memcached_server_count.3 +224 -0
  512. data/ext/share/man/man3/memcached_server_list.3 +224 -0
  513. data/ext/share/man/man3/memcached_server_list_append.3 +196 -0
  514. data/ext/share/man/man3/memcached_server_list_count.3 +196 -0
  515. data/ext/share/man/man3/memcached_server_list_free.3 +196 -0
  516. data/ext/share/man/man3/memcached_server_push.3 +224 -0
  517. data/ext/share/man/man3/memcached_servers_parse.3 +196 -0
  518. data/ext/share/man/man3/memcached_set.3 +308 -0
  519. data/ext/share/man/man3/memcached_set_by_key.3 +308 -0
  520. data/ext/share/man/man3/memcached_set_memory_allocators.3 +194 -0
  521. data/ext/share/man/man3/memcached_set_sasl_auth_data.3 +184 -0
  522. data/ext/share/man/man3/memcached_set_sasl_callbacks.3 +184 -0
  523. data/ext/share/man/man3/memcached_set_user_data.3 +171 -0
  524. data/ext/share/man/man3/memcached_stat.3 +204 -0
  525. data/ext/share/man/man3/memcached_stat_get_keys.3 +204 -0
  526. data/ext/share/man/man3/memcached_stat_get_value.3 +204 -0
  527. data/ext/share/man/man3/memcached_stat_servername.3 +204 -0
  528. data/ext/share/man/man3/memcached_strerror.3 +168 -0
  529. data/ext/share/man/man3/memcached_verbosity.3 +163 -0
  530. data/ext/share/man/man3/memcached_version.3 +176 -0
  531. data/lib/memcached.rb +32 -0
  532. data/lib/memcached/behaviors.rb +77 -0
  533. data/lib/memcached/exceptions.rb +84 -0
  534. data/lib/memcached/experimental.rb +48 -0
  535. data/lib/memcached/memcached.rb +683 -0
  536. data/lib/memcached/rails.rb +200 -0
  537. data/test/test_helper.rb +19 -0
  538. data/test/unit/binding_test.rb +8 -0
  539. data/test/unit/memcached_experimental_test.rb +274 -0
  540. data/test/unit/memcached_test.rb +1340 -0
  541. data/test/unit/rails_test.rb +282 -0
  542. metadata +658 -0
@@ -0,0 +1,176 @@
1
+ .\" Automatically generated by Pod::Man 2.23 (Pod::Simple 3.14)
2
+ .\"
3
+ .\" Standard preamble:
4
+ .\" ========================================================================
5
+ .de Sp \" Vertical space (when we can't use .PP)
6
+ .if t .sp .5v
7
+ .if n .sp
8
+ ..
9
+ .de Vb \" Begin verbatim text
10
+ .ft CW
11
+ .nf
12
+ .ne \\$1
13
+ ..
14
+ .de Ve \" End verbatim text
15
+ .ft R
16
+ .fi
17
+ ..
18
+ .\" Set up some character translations and predefined strings. \*(-- will
19
+ .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
20
+ .\" double quote, and \*(R" will give a right double quote. \*(C+ will
21
+ .\" give a nicer C++. Capital omega is used to do unbreakable dashes and
22
+ .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
23
+ .\" nothing in troff, for use with C<>.
24
+ .tr \(*W-
25
+ .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
26
+ .ie n \{\
27
+ . ds -- \(*W-
28
+ . ds PI pi
29
+ . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
30
+ . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
31
+ . ds L" ""
32
+ . ds R" ""
33
+ . ds C` ""
34
+ . ds C' ""
35
+ 'br\}
36
+ .el\{\
37
+ . ds -- \|\(em\|
38
+ . ds PI \(*p
39
+ . ds L" ``
40
+ . ds R" ''
41
+ 'br\}
42
+ .\"
43
+ .\" Escape single quotes in literal strings from groff's Unicode transform.
44
+ .ie \n(.g .ds Aq \(aq
45
+ .el .ds Aq '
46
+ .\"
47
+ .\" If the F register is turned on, we'll generate index entries on stderr for
48
+ .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
49
+ .\" entries marked with X<> in POD. Of course, you'll have to process the
50
+ .\" output yourself in some meaningful fashion.
51
+ .ie \nF \{\
52
+ . de IX
53
+ . tm Index:\\$1\t\\n%\t"\\$2"
54
+ ..
55
+ . nr % 0
56
+ . rr F
57
+ .\}
58
+ .el \{\
59
+ . de IX
60
+ ..
61
+ .\}
62
+ .\"
63
+ .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
64
+ .\" Fear. Run. Save yourself. No user-serviceable parts.
65
+ . \" fudge factors for nroff and troff
66
+ .if n \{\
67
+ . ds #H 0
68
+ . ds #V .8m
69
+ . ds #F .3m
70
+ . ds #[ \f1
71
+ . ds #] \fP
72
+ .\}
73
+ .if t \{\
74
+ . ds #H ((1u-(\\\\n(.fu%2u))*.13m)
75
+ . ds #V .6m
76
+ . ds #F 0
77
+ . ds #[ \&
78
+ . ds #] \&
79
+ .\}
80
+ . \" simple accents for nroff and troff
81
+ .if n \{\
82
+ . ds ' \&
83
+ . ds ` \&
84
+ . ds ^ \&
85
+ . ds , \&
86
+ . ds ~ ~
87
+ . ds /
88
+ .\}
89
+ .if t \{\
90
+ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
91
+ . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
92
+ . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
93
+ . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
94
+ . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
95
+ . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
96
+ .\}
97
+ . \" troff and (daisy-wheel) nroff accents
98
+ .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
99
+ .ds 8 \h'\*(#H'\(*b\h'-\*(#H'
100
+ .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
101
+ .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
102
+ .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
103
+ .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
104
+ .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
105
+ .ds ae a\h'-(\w'a'u*4/10)'e
106
+ .ds Ae A\h'-(\w'A'u*4/10)'E
107
+ . \" corrections for vroff
108
+ .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
109
+ .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
110
+ . \" for low resolution devices (crt and lpr)
111
+ .if \n(.H>23 .if \n(.V>19 \
112
+ \{\
113
+ . ds : e
114
+ . ds 8 ss
115
+ . ds o a
116
+ . ds d- d\h'-1'\(ga
117
+ . ds D- D\h'-1'\(hy
118
+ . ds th \o'bp'
119
+ . ds Th \o'LP'
120
+ . ds ae ae
121
+ . ds Ae AE
122
+ .\}
123
+ .rm #[ #] #H #V #F C
124
+ .\" ========================================================================
125
+ .\"
126
+ .IX Title "..::docs::memcached_version 3"
127
+ .TH ..::docs::memcached_version 3 "2012-10-24" "" "libmemcached"
128
+ .\" For nroff, turn off justification. Always turn off hyphenation; it makes
129
+ .\" way too many mistakes in technical documents.
130
+ .if n .ad l
131
+ .nh
132
+ .SH "NAME"
133
+ memcached_lib_version, memcached_version \- Get library version
134
+ .SH "LIBRARY"
135
+ .IX Header "LIBRARY"
136
+ C Client Library for memcached (libmemcached, \-lmemcached)
137
+ .SH "SYNOPSIS"
138
+ .IX Header "SYNOPSIS"
139
+ .Vb 1
140
+ \& #include <memcached.h>
141
+ \&
142
+ \& const char *
143
+ \& memcached_lib_version(void)
144
+ \&
145
+ \&
146
+ \& memcached_return
147
+ \& memcached_version(memcached_st *ptr)
148
+ .Ve
149
+ .SH "DESCRIPTION"
150
+ .IX Header "DESCRIPTION"
151
+ \&\fImemcached_lib_version()\fR is used to return a simple version string representing
152
+ the libmemcached version (version of the client library, not server)
153
+ .PP
154
+ \&\fImemcached_version()\fR is used to set the major, minor, and micro versions of each
155
+ memcached server being used by the memcached_st connection structure. It returns the
156
+ memcached server return code.
157
+ .SH "RETURN"
158
+ .IX Header "RETURN"
159
+ A string with the version of libmemcached driver is returned from
160
+ \&\fImemcached_lib_version()\fR
161
+ .PP
162
+ A value of type \f(CW\*(C`memcached_return\*(C'\fR is returned from \fImemcached_version()\fR
163
+ On success that value will be \f(CW\*(C`MEMCACHED_SUCCESS\*(C'\fR. If called with the
164
+ \&\f(CW\*(C`MEMCACHED_BEHAVIOR_USE_UDP\*(C'\fR behavior set, the value \f(CW\*(C`MEMCACHED_NOT_SUPPORTED\*(C'\fR
165
+ will be returned. Use \fImemcached_strerror()\fR to translate this value to
166
+ a printable string.
167
+ .SH "HOME"
168
+ .IX Header "HOME"
169
+ To find out more information please check:
170
+ <http://tangent.org/552/libmemcached.html>
171
+ .SH "AUTHOR"
172
+ .IX Header "AUTHOR"
173
+ Brian Aker, <brian@tangent.org>
174
+ .SH "SEE ALSO"
175
+ .IX Header "SEE ALSO"
176
+ \&\fImemcached\fR\|(1) \fIlibmemcached\fR\|(3) \fImemcached_strerror\fR\|(3)
@@ -0,0 +1,32 @@
1
+
2
+ =begin rdoc
3
+ The generated SWIG module for accessing libmemcached's C API.
4
+
5
+ Includes the full set of libmemcached static methods (as defined in <tt>$INCLUDE_PATH/libmemcached/memcached.h</tt>), and classes for the available structs:
6
+
7
+ * <b>Rlibmemcached::MemcachedResultSt</b>
8
+ * <b>Rlibmemcached::MemcachedServerSt</b>
9
+ * <b>Rlibmemcached::MemcachedSt</b>
10
+ * <b>Rlibmemcached::MemcachedStatSt</b>
11
+ * <b>Rlibmemcached::MemcachedStringSt</b>
12
+
13
+ A number of SWIG typemaps and C helper methods are also defined in <tt>ext/libmemcached.i</tt>.
14
+
15
+ =end
16
+ module Rlibmemcached
17
+ end
18
+
19
+ require 'rlibmemcached'
20
+
21
+ class Memcached
22
+ Lib = Rlibmemcached
23
+ raise "libmemcached 0.32 required; you somehow linked to #{Lib.memcached_lib_version}." unless "0.32" == Lib.memcached_lib_version
24
+ VERSION = File.read("#{File.dirname(__FILE__)}/../CHANGELOG")[/v([\d\.]+)\./, 1]
25
+ end
26
+
27
+ require 'memcached/exceptions'
28
+ require 'memcached/behaviors'
29
+ require 'memcached/auth'
30
+ require 'memcached/memcached'
31
+ require 'memcached/rails'
32
+ require 'memcached/experimental'
@@ -0,0 +1,77 @@
1
+
2
+ class Memcached
3
+
4
+ #:stopdoc:
5
+
6
+ def self.load_constants(prefix, hash = {})
7
+ Lib.constants.grep(/^#{prefix}/).each do |const_name|
8
+ hash[const_name[prefix.length..-1].downcase.to_sym] = Lib.const_get(const_name)
9
+ end
10
+ hash
11
+ end
12
+
13
+ BEHAVIORS = load_constants("MEMCACHED_BEHAVIOR_")
14
+
15
+ BEHAVIOR_VALUES = {
16
+ false => 0,
17
+ true => 1
18
+ }
19
+
20
+ HASH_VALUES = {}
21
+ BEHAVIOR_VALUES.merge!(load_constants("MEMCACHED_HASH_", HASH_VALUES))
22
+
23
+ DISTRIBUTION_VALUES = {}
24
+ BEHAVIOR_VALUES.merge!(load_constants("MEMCACHED_DISTRIBUTION_", DISTRIBUTION_VALUES))
25
+
26
+ DIRECT_VALUE_BEHAVIORS = [:retry_timeout, :connect_timeout, :rcv_timeout, :socket_recv_size, :poll_timeout, :socket_send_size, :server_failure_limit]
27
+
28
+ CONVERSION_FACTORS = {
29
+ :rcv_timeout => 1_000_000,
30
+ :poll_timeout => 1_000,
31
+ :connect_timeout => 1_000
32
+ }
33
+
34
+ #:startdoc:
35
+
36
+ private
37
+
38
+ # Set a behavior option for this Memcached instance. Accepts a Symbol <tt>behavior</tt> and either <tt>true</tt>, <tt>false</tt>, or a Symbol for <tt>value</tt>. Arguments are validated and converted into integers for the struct setter method.
39
+ def set_behavior(behavior, value) #:doc:
40
+ raise ArgumentError, "No behavior #{behavior.inspect}" unless b_id = BEHAVIORS[behavior]
41
+
42
+ # Scoped validations; annoying
43
+ msg = "Invalid behavior value #{value.inspect} for #{behavior.inspect}"
44
+ case behavior
45
+ when :hash then raise(ArgumentError, msg) unless HASH_VALUES[value]
46
+ when :distribution then raise(ArgumentError, msg) unless DISTRIBUTION_VALUES[value]
47
+ when *DIRECT_VALUE_BEHAVIORS then raise(ArgumentError, msg) unless value.is_a?(Numeric) and value >= 0
48
+ else
49
+ raise(ArgumentError, msg) unless BEHAVIOR_VALUES[value]
50
+ end
51
+
52
+ lib_value = BEHAVIOR_VALUES[value] || (value * (CONVERSION_FACTORS[behavior] || 1)).to_i
53
+ #STDERR.puts "Setting #{behavior}:#{b_id} => #{value} (#{lib_value})"
54
+ Lib.memcached_behavior_set(@struct, b_id, lib_value)
55
+ #STDERR.puts " -> set to #{get_behavior(behavior).inspect}"
56
+ end
57
+
58
+ # Get a behavior value for this Memcached instance. Accepts a Symbol.
59
+ def get_behavior(behavior)
60
+ raise ArgumentError, "No behavior #{behavior.inspect}" unless b_id = BEHAVIORS[behavior]
61
+ value = Lib.memcached_behavior_get(@struct, b_id)
62
+
63
+ if BEHAVIOR_VALUES.invert.has_key?(value)
64
+ # False, nil are valid values so we can not rely on direct lookups
65
+ case behavior
66
+ # Scoped values; still annoying
67
+ when :hash then HASH_VALUES.invert[value]
68
+ when :distribution then DISTRIBUTION_VALUES.invert[value]
69
+ else
70
+ value
71
+ end
72
+ else
73
+ value
74
+ end
75
+ end
76
+
77
+ end
@@ -0,0 +1,84 @@
1
+
2
+ class Memcached
3
+
4
+ =begin rdoc
5
+
6
+ Superclass for all Memcached runtime exceptions.
7
+
8
+ Subclasses correspond one-to-one with server response strings or libmemcached errors. For example, raising <b>Memcached::NotFound</b> means that the server returned <tt>"NOT_FOUND\r\n"</tt>.
9
+
10
+ == Subclasses
11
+
12
+ * Memcached::ABadKeyWasProvidedOrCharactersOutOfRange
13
+ * Memcached::AKeyLengthOfZeroWasProvided
14
+ * Memcached::ATimeoutOccurred
15
+ * Memcached::ActionNotSupported
16
+ * Memcached::ActionQueued
17
+ * Memcached::ClientError
18
+ * Memcached::ConnectionBindFailure
19
+ * Memcached::ConnectionDataDoesNotExist
20
+ * Memcached::ConnectionDataExists
21
+ * Memcached::ConnectionFailure
22
+ * Memcached::ConnectionSocketCreateFailure
23
+ * Memcached::CouldNotOpenUnixSocket
24
+ * Memcached::EncounteredAnUnknownStatKey
25
+ * Memcached::Failure
26
+ * Memcached::FetchWasNotCompleted
27
+ * Memcached::HostnameLookupFailure
28
+ * Memcached::ItemValue
29
+ * Memcached::MemoryAllocationFailure
30
+ * Memcached::NoServersDefined
31
+ * Memcached::NotFound
32
+ * Memcached::NotStored
33
+ * Memcached::PartialRead
34
+ * Memcached::ProtocolError
35
+ * Memcached::ReadFailure
36
+ * Memcached::ServerDelete
37
+ * Memcached::ServerEnd
38
+ * Memcached::ServerError
39
+ * Memcached::ServerIsMarkedDead
40
+ * Memcached::ServerValue
41
+ * Memcached::SomeErrorsWereReported
42
+ * Memcached::StatValue
43
+ * Memcached::SystemError
44
+ * Memcached::TheHostTransportProtocolDoesNotMatchThatOfTheClient
45
+ * Memcached::UnknownReadFailure
46
+ * Memcached::WriteFailure
47
+
48
+ =end
49
+ class Error < RuntimeError
50
+ attr_accessor :no_backtrace
51
+
52
+ def set_backtrace(*args)
53
+ @no_backtrace ? [] : super
54
+ end
55
+
56
+ def backtrace(*args)
57
+ @no_backtrace ? [] : super
58
+ end
59
+ end
60
+
61
+ #:stopdoc:
62
+
63
+ class << self
64
+ private
65
+ def camelize(string)
66
+ string.downcase.gsub('/', ' or ').split(' ').map {|s| s.capitalize}.join
67
+ end
68
+ end
69
+
70
+ ERRNO_HASH = Hash[*Errno.constants.grep(/^E/).map{ |c| [Errno.const_get(c)::Errno, Errno.const_get(c).new.message] }.flatten]
71
+
72
+ EXCEPTIONS = []
73
+ empty_struct = Lib.memcached_create(nil)
74
+ Lib.memcached_create(empty_struct)
75
+
76
+ # Generate exception classes
77
+ Lib::MEMCACHED_MAXIMUM_RETURN.times do |index|
78
+ description = Lib.memcached_strerror(empty_struct, index).gsub("!", "")
79
+ exception_class = eval("class #{camelize(description)} < Error; self; end")
80
+ EXCEPTIONS << exception_class
81
+ end
82
+
83
+ #:startdoc:
84
+ end
@@ -0,0 +1,48 @@
1
+ class Memcached
2
+ module Experimental
3
+
4
+ # TOUCH is used to set a new expiration time for an existing item
5
+ def touch(key, ttl=@default_ttl)
6
+ check_return_code(
7
+ Lib.memcached_touch(@struct, key, ttl),
8
+ key
9
+ )
10
+ rescue => e
11
+ tries ||= 0
12
+ raise unless tries < options[:exception_retry_limit] && should_retry(e)
13
+ tries += 1
14
+ retry
15
+ end
16
+
17
+ def get_len(bytes, keys)
18
+ if keys.is_a? ::Array
19
+ # Multi get
20
+ ret = Lib.memcached_mget_len(@struct, keys, bytes);
21
+ check_return_code(ret, keys)
22
+
23
+ hash = {}
24
+ keys.each do
25
+ value, key, flags, ret = Lib.memcached_fetch_rvalue(@struct)
26
+ break if ret == Lib::MEMCACHED_END
27
+ if ret != Lib::MEMCACHED_NOTFOUND
28
+ check_return_code(ret, key)
29
+ # Assign the value
30
+ hash[key] = value
31
+ end
32
+ end
33
+ hash
34
+ else
35
+ # Single get_len
36
+ value, flags, ret = Lib.memcached_get_len_rvalue(@struct, keys, bytes)
37
+ check_return_code(ret, keys)
38
+ value
39
+ end
40
+ rescue => e
41
+ tries ||= 0
42
+ raise unless tries < options[:exception_retry_limit] && should_retry(e)
43
+ tries += 1
44
+ retry
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,683 @@
1
+ =begin rdoc
2
+ The Memcached client class.
3
+ =end
4
+ class Memcached
5
+ FLAGS = 0x0
6
+
7
+ DEFAULTS = {
8
+ :hash => :fnv1_32,
9
+ :no_block => false,
10
+ :noreply => false,
11
+ :distribution => :consistent_ketama,
12
+ :ketama_weighted => true,
13
+ :buffer_requests => false,
14
+ :cache_lookups => true,
15
+ :support_cas => false,
16
+ :tcp_nodelay => false,
17
+ :show_backtraces => false,
18
+ :retry_timeout => 30,
19
+ :timeout => 0.25,
20
+ :rcv_timeout => nil,
21
+ :poll_timeout => nil,
22
+ :connect_timeout => 4,
23
+ :prefix_key => '',
24
+ :prefix_delimiter => '',
25
+ :hash_with_prefix_key => true,
26
+ :default_ttl => 604800,
27
+ :default_weight => 8,
28
+ :sort_hosts => false,
29
+ :auto_eject_hosts => true,
30
+ :server_failure_limit => 2,
31
+ :verify_key => true,
32
+ :use_udp => false,
33
+ :binary_protocol => false,
34
+ :credentials => nil,
35
+ :experimental_features => false,
36
+ :exception_retry_limit => 5,
37
+ :exceptions_to_retry => [
38
+ Memcached::ServerIsMarkedDead,
39
+ Memcached::ATimeoutOccurred,
40
+ Memcached::ConnectionBindFailure,
41
+ Memcached::ConnectionFailure,
42
+ Memcached::ConnectionSocketCreateFailure,
43
+ Memcached::Failure,
44
+ Memcached::MemoryAllocationFailure,
45
+ Memcached::ReadFailure,
46
+ Memcached::ServerEnd,
47
+ Memcached::ServerError,
48
+ Memcached::SystemError,
49
+ Memcached::UnknownReadFailure,
50
+ Memcached::WriteFailure,
51
+ Memcached::SomeErrorsWereReported]
52
+ }
53
+
54
+ #:stopdoc:
55
+ IGNORED = 0
56
+ #:startdoc:
57
+
58
+ attr_reader :options # Return the options Hash used to configure this instance.
59
+
60
+ ###### Configuration
61
+
62
+ =begin rdoc
63
+ Create a new Memcached instance. Accepts string or array of server strings, as well an an optional configuration hash.
64
+
65
+ Memcached.new('localhost', ...) # A single server
66
+ Memcached.new(['web001:11212', 'web002:11212'], ...) # Two servers with custom ports
67
+ Memcached.new(['web001:11211:2', 'web002:11211:8'], ...) # Two servers with default ports and explicit weights
68
+
69
+ Weights only affect Ketama hashing. If you use Ketama hashing and don't specify a weight, the client will poll each server's stats and use its size as the weight.
70
+
71
+ Valid option parameters are:
72
+
73
+ <tt>:prefix_key</tt>:: A string to prepend to every key, for namespacing. Max length is 127. Defaults to the empty string.
74
+ <tt>:prefix_delimiter</tt>:: A character to append to the prefix key. Defaults to the empty string.
75
+ <tt>:hash</tt>:: The name of a hash function to use. Possible values are: <tt>:crc</tt>, <tt>:default</tt>, <tt>:fnv1_32</tt>, <tt>:fnv1_64</tt>, <tt>:fnv1a_32</tt>, <tt>:fnv1a_64</tt>, <tt>:hsieh</tt>, <tt>:md5</tt>, <tt>:murmur</tt>, and <tt>:none</tt>. <tt>:fnv1_32</tt> is fast and well known, and is the default. Use <tt>:md5</tt> for compatibility with other ketama clients. <tt>:none</tt> is for use when there is a single server, and performs no actual hashing.
76
+ <tt>:distribution</tt>:: Either <tt>:modula</tt>, <tt>:consistent_ketama</tt>, <tt>:consistent_wheel</tt>, or <tt>:ketama</tt>. Defaults to <tt>:ketama</tt>.
77
+ <tt>:server_failure_limit</tt>:: How many consecutive failures to allow before marking a host as dead. Has no effect unless <tt>:retry_timeout</tt> is also set.
78
+ <tt>:retry_timeout</tt>:: How long to wait until retrying a dead server. Has no effect unless <tt>:server_failure_limit</tt> is non-zero. Defaults to <tt>30</tt>.
79
+ <tt>:auto_eject_hosts</tt>:: Whether to temporarily eject dead hosts from the pool. Defaults to <tt>true</tt>. Note that in the event of an ejection, <tt>:auto_eject_hosts</tt> will remap the entire pool unless <tt>:distribution</tt> is set to <tt>:consistent</tt>.
80
+ <tt>:exception_retry_limit</tt>:: How many times to retry before raising exceptions in <tt>:exceptions_to_retry</tt>. Defaults to <tt>5</tt>.
81
+ <tt>:exceptions_to_retry</tt>:: Which exceptions to retry. Defaults to <b>ServerIsMarkedDead</b>, <b>ATimeoutOccurred</b>, <b>ConnectionBindFailure</b>, <b>ConnectionFailure</b>, <b>ConnectionSocketCreateFailure</b>, <b>Failure</b>, <b>MemoryAllocationFailure</b>, <b>ReadFailure</b>, <b>ServerError</b>, <b>SystemError</b>, <b>UnknownReadFailure</b>, and <b>WriteFailure</b>.
82
+ <tt>:cache_lookups</tt>:: Whether to cache hostname lookups for the life of the instance. Defaults to <tt>true</tt>.
83
+ <tt>:support_cas</tt>:: Flag CAS support in the client. Accepts <tt>true</tt> or <tt>false</tt>. Defaults to <tt>false</tt> because it imposes a slight performance penalty. Note that your server must also support CAS or you will trigger <b>ProtocolError</b> exceptions.
84
+ <tt>:tcp_nodelay</tt>:: Turns on the no-delay feature for connecting sockets. Accepts <tt>true</tt> or <tt>false</tt>. Performance may or may not change, depending on your system.
85
+ <tt>:no_block</tt>:: Whether to use pipelining for writes. Defaults to <tt>false</tt>.
86
+ <tt>:buffer_requests</tt>:: Whether to use an internal write buffer. Accepts <tt>true</tt> or <tt>false</tt>. Calling <tt>get</tt> or closing the connection will force the buffer to flush. Client behavior is undefined unless <tt>:no_block</tt> is enabled. Defaults to <tt>false</tt>.
87
+ <tt>:noreply</tt>:: Ask server not to reply for storage commands. Client behavior is undefined unless <tt>:no_block</tt> and <tt>:buffer_requests</tt> are enabled. Defaults to <tt>false</tt>.
88
+ <tt>:show_backtraces</tt>:: Whether <b>NotFound</b> and <b>NotStored</b> exceptions should include backtraces. Generating backtraces is slow, so this is off by default. Turn it on to ease debugging.
89
+ <tt>:connect_timeout</tt>:: How long to wait for a connection to a server. Defaults to 2 seconds. Set to <tt>0</tt> if you want to wait forever.
90
+ <tt>:timeout</tt>:: How long to wait for a response from the server. Defaults to 0.25 seconds. Set to <tt>0</tt> if you want to wait forever.
91
+ <tt>:default_ttl</tt>:: The <tt>ttl</tt> to use on set if no <tt>ttl</tt> is specified, in seconds. Defaults to one week. Set to <tt>0</tt> if you want things to never expire.
92
+ <tt>:default_weight</tt>:: The weight to use if <tt>:ketama_weighted</tt> is <tt>true</tt>, but no weight is specified for a server.
93
+ <tt>:hash_with_prefix_key</tt>:: Whether to include the prefix when calculating which server a key falls on. Defaults to <tt>true</tt>.
94
+ <tt>:use_udp</tt>:: Use the UDP protocol to reduce connection overhead. Defaults to false.
95
+ <tt>:binary_protocol</tt>:: Use the binary protocol. Defaults to false. Please note that using the binary protocol is usually <b>slower</b> than the ASCII protocol.
96
+ <tt>:sort_hosts</tt>:: Whether to force the server list to stay sorted. This defeats consistent hashing and is rarely useful.
97
+ <tt>:verify_key</tt>:: Validate keys before accepting them. Never disable this.
98
+
99
+ Please note that when <tt>:no_block => true</tt>, update methods do not raise on errors. For example, if you try to <tt>set</tt> an invalid key, it will appear to succeed. The actual setting of the key occurs after libmemcached has returned control to your program, so there is no way to backtrack and raise the exception.
100
+
101
+ =end
102
+
103
+ def initialize(servers = nil, opts = {})
104
+ @struct = Lib.memcached_create(nil)
105
+
106
+ # Merge option defaults and discard meaningless keys
107
+ @options = DEFAULTS.merge(opts)
108
+ @options.delete_if { |k,v| not DEFAULTS.keys.include? k }
109
+ @default_ttl = options[:default_ttl]
110
+
111
+ if servers == nil || servers == []
112
+ if ENV.key?("MEMCACHE_SERVERS")
113
+ servers = ENV["MEMCACHE_SERVERS"].split(",").map do | s | s.strip end
114
+ else
115
+ servers = "127.0.0.1:11211"
116
+ end
117
+ end
118
+
119
+ if !options[:credentials] and ENV["MEMCACHE_USERNAME"] and ENV["MEMCACHE_PASSWORD"]
120
+ options[:credentials] = [ENV["MEMCACHE_USERNAME"], ENV["MEMCACHE_PASSWORD"]]
121
+ end
122
+
123
+ instance_eval { send(:extend, Experimental) } if options[:experimental_features]
124
+
125
+ # SASL requires binary protocol
126
+ options[:binary_protocol] = true if options[:credentials]
127
+
128
+ # UDP requires noreply
129
+ options[:noreply] = true if options[:use_udp]
130
+
131
+ # Buffering requires non-blocking
132
+ # FIXME This should all be wrapped up in a single :pipeline option.
133
+ options[:no_block] = true if options[:buffer_requests]
134
+
135
+ # Disallow weights without ketama
136
+ options.delete(:ketama_weighted) if options[:distribution] != :consistent_ketama
137
+
138
+ # Disallow :sort_hosts with consistent hashing
139
+ if options[:sort_hosts] and options[:distribution] == :consistent
140
+ raise ArgumentError, ":sort_hosts defeats :consistent hashing"
141
+ end
142
+
143
+ # Read timeouts
144
+ options[:rcv_timeout] ||= options[:timeout]
145
+ options[:poll_timeout] ||= options[:timeout]
146
+
147
+ # Set the prefix key. Support the legacy name.
148
+ set_prefix_key(options[:prefix_key] || options[:namespace])
149
+
150
+ # Set the behaviors and credentials on the struct
151
+ set_behaviors
152
+ set_credentials
153
+
154
+ # Freeze the hash
155
+ options.freeze
156
+
157
+ # Set the servers on the struct
158
+ set_servers(servers)
159
+
160
+ # Not found exceptions
161
+ if options[:show_backtraces]
162
+ # Raise classes for full context
163
+ @not_found = NotFound
164
+ @not_stored = NotStored
165
+ else
166
+ # Raise fast context-free exception instances
167
+ @not_found = NotFound.new
168
+ @not_found.no_backtrace = true
169
+ @not_stored = NotStored.new
170
+ @not_stored.no_backtrace = true
171
+ end
172
+ end
173
+
174
+ # Set the server list.
175
+ # FIXME Does not necessarily free any existing server structs.
176
+ def set_servers(servers)
177
+ Array(servers).each_with_index do |server, index|
178
+ # Socket
179
+ check_return_code(
180
+ if server.is_a?(String) and File.socket?(server)
181
+ args = [@struct, server, options[:default_weight].to_i]
182
+ Lib.memcached_server_add_unix_socket_with_weight(*args)
183
+ # Network
184
+ elsif server.is_a?(String) and server =~ /^[\w\d\.-]+(:\d{1,5}){0,2}$/
185
+ host, port, weight = server.split(":")
186
+ args = [@struct, host, port.to_i, (weight || options[:default_weight]).to_i]
187
+ if options[:use_udp]
188
+ Lib.memcached_server_add_udp_with_weight(*args)
189
+ else
190
+ Lib.memcached_server_add_with_weight(*args)
191
+ end
192
+ else
193
+ raise ArgumentError, "Servers must be either in the format 'host:port[:weight]' (e.g., 'localhost:11211' or 'localhost:11211:10') for a network server, or a valid path to a Unix domain socket (e.g., /var/run/memcached)."
194
+ end
195
+ )
196
+ end
197
+ end
198
+
199
+ # Return the array of server strings used to configure this instance.
200
+ def servers
201
+ server_structs.map do |server|
202
+ inspect_server(server)
203
+ end
204
+ end
205
+
206
+ # Set the prefix key.
207
+ def set_prefix_key(key)
208
+ check_return_code(
209
+ if key
210
+ key += options[:prefix_delimiter]
211
+ raise ArgumentError, "Max prefix key + prefix delimiter size is #{Lib::MEMCACHED_PREFIX_KEY_MAX_SIZE - 1}" unless
212
+ key.size < Lib::MEMCACHED_PREFIX_KEY_MAX_SIZE
213
+ Lib.memcached_callback_set(@struct, Lib::MEMCACHED_CALLBACK_PREFIX_KEY, key)
214
+ else
215
+ Lib.memcached_callback_set(@struct, Lib::MEMCACHED_CALLBACK_PREFIX_KEY, "")
216
+ end
217
+ )
218
+ end
219
+ alias :set_namespace :set_prefix_key
220
+
221
+ # Return the current prefix key.
222
+ def prefix_key
223
+ if @struct.prefix_key.size > 0
224
+ @struct.prefix_key[0..-1 - options[:prefix_delimiter].size]
225
+ else
226
+ ""
227
+ end
228
+ end
229
+ alias :namespace :prefix_key
230
+
231
+ # Safely copy this instance. Returns a Memcached instance.
232
+ #
233
+ # <tt>clone</tt> is useful for threading, since each thread must have its own unshared Memcached
234
+ # object.
235
+ #
236
+ def clone
237
+ memcached = super
238
+ struct = Lib.memcached_clone(nil, @struct)
239
+ memcached.instance_variable_set('@struct', struct)
240
+ memcached
241
+ end
242
+
243
+ # Reset the state of the libmemcached struct. This is useful for changing the server list at runtime.
244
+ def reset(current_servers = nil)
245
+ # Store state and teardown
246
+ current_servers ||= servers
247
+ prev_prefix_key = prefix_key
248
+ quit
249
+
250
+ # Create
251
+ # FIXME Duplicates logic with initialize()
252
+ @struct = Lib.memcached_create(nil)
253
+ set_prefix_key(prev_prefix_key)
254
+ set_behaviors
255
+ set_credentials
256
+ set_servers(current_servers)
257
+ end
258
+
259
+ # Disconnect from all currently connected servers
260
+ def quit
261
+ Lib.memcached_quit(@struct)
262
+ self
263
+ end
264
+
265
+ # Should retry the exception
266
+ def should_retry(e)
267
+ options[:exceptions_to_retry].each {|ex_class| return true if e.instance_of?(ex_class)}
268
+ false
269
+ end
270
+
271
+ #:stopdoc:
272
+ alias :dup :clone #:nodoc:
273
+ #:startdoc:
274
+
275
+ ### Configuration helpers
276
+
277
+ private
278
+
279
+ # Return an array of raw <tt>memcached_host_st</tt> structs for this instance.
280
+ def server_structs
281
+ array = []
282
+ if @struct.hosts
283
+ @struct.hosts.count.times do |i|
284
+ array << Lib.memcached_select_server_at(@struct, i)
285
+ end
286
+ end
287
+ array
288
+ end
289
+
290
+ ###### Operations
291
+
292
+ public
293
+
294
+ ### Setters
295
+
296
+ # Set a key/value pair. Accepts a String <tt>key</tt> and an arbitrary Ruby object. Overwrites any existing value on the server.
297
+ #
298
+ # Accepts an optional <tt>ttl</tt> value to specify the maximum lifetime of the key on the server, in seconds. <tt>ttl</tt> must be a <tt>FixNum</tt>. <tt>0</tt> means no ttl. Note that there is no guarantee that the key will persist as long as the <tt>ttl</tt>, but it will not persist longer.
299
+ #
300
+ # Also accepts a <tt>marshal</tt> value, which defaults to <tt>true</tt>. Set <tt>marshal</tt> to <tt>false</tt>, and pass a String as the <tt>value</tt>, if you want to set a raw byte array.
301
+ #
302
+ def set(key, value, ttl=@default_ttl, marshal=true, flags=FLAGS)
303
+ value = marshal ? Marshal.dump(value) : value
304
+ begin
305
+ check_return_code(
306
+ Lib.memcached_set(@struct, key, value, ttl, flags),
307
+ key
308
+ )
309
+ rescue => e
310
+ tries ||= 0
311
+ retry if e.instance_of?(ClientError) && !tries
312
+ raise unless tries < options[:exception_retry_limit] && should_retry(e)
313
+ tries += 1
314
+ retry
315
+ end
316
+ end
317
+
318
+ # Add a key/value pair. Raises <b>Memcached::NotStored</b> if the key already exists on the server. The parameters are the same as <tt>set</tt>.
319
+ def add(key, value, ttl=@default_ttl, marshal=true, flags=FLAGS)
320
+ value = marshal ? Marshal.dump(value) : value
321
+ begin
322
+ check_return_code(
323
+ Lib.memcached_add(@struct, key, value, ttl, flags),
324
+ key
325
+ )
326
+ rescue => e
327
+ tries ||= 0
328
+ raise unless tries < options[:exception_retry_limit] && should_retry(e)
329
+ tries += 1
330
+ retry
331
+ end
332
+ end
333
+
334
+ # Increment a key's value. Accepts a String <tt>key</tt>. Raises <b>Memcached::NotFound</b> if the key does not exist.
335
+ #
336
+ # Also accepts an optional <tt>offset</tt> paramater, which defaults to 1. <tt>offset</tt> must be an integer.
337
+ #
338
+ # Note that the key must be initialized to an unmarshalled integer first, via <tt>set</tt>, <tt>add</tt>, or <tt>replace</tt> with <tt>marshal</tt> set to <tt>false</tt>.
339
+ def increment(key, offset=1)
340
+ ret, value = Lib.memcached_increment(@struct, key, offset)
341
+ check_return_code(ret, key)
342
+ value
343
+ rescue => e
344
+ tries ||= 0
345
+ raise unless tries < options[:exception_retry_limit] && should_retry(e)
346
+ tries += 1
347
+ retry
348
+ end
349
+
350
+ # Decrement a key's value. The parameters and exception behavior are the same as <tt>increment</tt>.
351
+ def decrement(key, offset=1)
352
+ ret, value = Lib.memcached_decrement(@struct, key, offset)
353
+ check_return_code(ret, key)
354
+ value
355
+ rescue => e
356
+ tries ||= 0
357
+ raise unless tries < options[:exception_retry_limit] && should_retry(e)
358
+ tries += 1
359
+ retry
360
+ end
361
+
362
+ #:stopdoc:
363
+ alias :incr :increment
364
+ alias :decr :decrement
365
+ #:startdoc:
366
+
367
+ # Replace a key/value pair. Raises <b>Memcached::NotFound</b> if the key does not exist on the server. The parameters are the same as <tt>set</tt>.
368
+ def replace(key, value, ttl=@default_ttl, marshal=true, flags=FLAGS)
369
+ value = marshal ? Marshal.dump(value) : value
370
+ begin
371
+ check_return_code(
372
+ Lib.memcached_replace(@struct, key, value, ttl, flags),
373
+ key
374
+ )
375
+ rescue => e
376
+ tries ||= 0
377
+ raise unless tries < options[:exception_retry_limit] && should_retry(e)
378
+ tries += 1
379
+ retry
380
+ end
381
+ end
382
+
383
+ # Appends a string to a key's value. Accepts a String <tt>key</tt> and a String <tt>value</tt>. Raises <b>Memcached::NotFound</b> if the key does not exist on the server.
384
+ #
385
+ # Note that the key must be initialized to an unmarshalled string first, via <tt>set</tt>, <tt>add</tt>, or <tt>replace</tt> with <tt>marshal</tt> set to <tt>false</tt>.
386
+ def append(key, value)
387
+ # Requires memcached 1.2.4
388
+ check_return_code(
389
+ Lib.memcached_append(@struct, key, value.to_s, IGNORED, IGNORED),
390
+ key
391
+ )
392
+ rescue => e
393
+ tries ||= 0
394
+ raise unless tries < options[:exception_retry_limit] && should_retry(e)
395
+ tries += 1
396
+ retry
397
+ end
398
+
399
+ # Prepends a string to a key's value. The parameters and exception behavior are the same as <tt>append</tt>.
400
+ def prepend(key, value)
401
+ # Requires memcached 1.2.4
402
+ check_return_code(
403
+ Lib.memcached_prepend(@struct, key, value.to_s, IGNORED, IGNORED),
404
+ key
405
+ )
406
+ rescue => e
407
+ tries ||= 0
408
+ raise unless tries < options[:exception_retry_limit] && should_retry(e)
409
+ tries += 1
410
+ retry
411
+ end
412
+
413
+ # Reads a key's value from the server and yields it to a block. Replaces the key's value with the result of the block as long as the key hasn't been updated in the meantime, otherwise raises <b>Memcached::NotStored</b>. Accepts a String <tt>key</tt> and a block.
414
+ #
415
+ # Also accepts an optional <tt>ttl</tt> value.
416
+ #
417
+ # CAS stands for "compare and swap", and avoids the need for manual key mutexing. CAS support must be enabled in Memcached.new or a <b>Memcached::ClientError</b> will be raised. Note that CAS may be buggy in memcached itself.
418
+ # :retry_on_exceptions does not apply to this method
419
+ def cas(key, ttl=@default_ttl, marshal=true, flags=FLAGS)
420
+ raise ClientError, "CAS not enabled for this Memcached instance" unless options[:support_cas]
421
+
422
+ begin
423
+ value, flags, ret = Lib.memcached_get_rvalue(@struct, key)
424
+ check_return_code(ret, key)
425
+ rescue => e
426
+ tries_for_get ||= 0
427
+ raise unless tries_for_get < options[:exception_retry_limit] && should_retry(e)
428
+ tries_for_get += 1
429
+ retry
430
+ end
431
+
432
+ cas = @struct.result.cas
433
+
434
+ value = Marshal.load(value) if marshal
435
+ value = yield value
436
+ value = Marshal.dump(value) if marshal
437
+
438
+ begin
439
+ check_return_code(
440
+ Lib.memcached_cas(@struct, key, value, ttl, flags, cas),
441
+ key
442
+ )
443
+ rescue => e
444
+ tries_for_cas ||= 0
445
+ raise unless tries_for_cas < options[:exception_retry_limit] && should_retry(e)
446
+ tries_for_cas += 1
447
+ retry
448
+ end
449
+ end
450
+
451
+ alias :compare_and_swap :cas
452
+
453
+ ### Deleters
454
+
455
+ # Deletes a key/value pair from the server. Accepts a String <tt>key</tt>. Raises <b>Memcached::NotFound</b> if the key does not exist.
456
+ def delete(key)
457
+ check_return_code(
458
+ Lib.memcached_delete(@struct, key, IGNORED),
459
+ key
460
+ )
461
+ rescue => e
462
+ tries ||= 0
463
+ raise unless tries < options[:exception_retry_limit] && should_retry(e)
464
+ tries += 1
465
+ retry
466
+ end
467
+
468
+ # Flushes all key/value pairs from all the servers.
469
+ def flush
470
+ check_return_code(
471
+ Lib.memcached_flush(@struct, IGNORED)
472
+ )
473
+ rescue => e
474
+ tries ||= 0
475
+ raise unless tries < options[:exception_retry_limit] && should_retry(e)
476
+ tries += 1
477
+ retry
478
+ end
479
+
480
+ ### Getters
481
+
482
+ # Gets a key's value from the server. Accepts a String <tt>key</tt> or array of String <tt>keys</tt>.
483
+ #
484
+ # Also accepts a <tt>marshal</tt> value, which defaults to <tt>true</tt>. Set <tt>marshal</tt> to <tt>false</tt> if you want the <tt>value</tt> to be returned directly as a String. Otherwise it will be assumed to be a marshalled Ruby object and unmarshalled.
485
+ #
486
+ # If you pass a String key, and the key does not exist on the server, <b>Memcached::NotFound</b> will be raised. If you pass an array of keys, memcached's <tt>multiget</tt> mode will be used, and a hash of key/value pairs will be returned. The hash will contain only the keys that were found.
487
+ #
488
+ # The multiget behavior is subject to change in the future; however, for multiple lookups, it is much faster than normal mode.
489
+ #
490
+ # Note that when you rescue Memcached::NotFound exceptions, you should use a the block rescue syntax instead of the inline syntax. Block rescues are very fast, but inline rescues are very slow.
491
+ #
492
+ def get(keys, marshal=true)
493
+ if keys.is_a? Array
494
+ # Multi get
495
+ ret = Lib.memcached_mget(@struct, keys);
496
+ check_return_code(ret, keys)
497
+
498
+ hash = {}
499
+ value, key, flags, ret = Lib.memcached_fetch_rvalue(@struct)
500
+ while ret != 21 do # Lib::MEMCACHED_END
501
+ if ret == 0 # Lib::MEMCACHED_SUCCESS
502
+ hash[key] = value
503
+ elsif ret != 16 # Lib::MEMCACHED_NOTFOUND
504
+ check_return_code(ret, key)
505
+ end
506
+ value, key, flags, ret = Lib.memcached_fetch_rvalue(@struct)
507
+ end
508
+ if marshal
509
+ hash.each do |key, value|
510
+ hash[key] = Marshal.load(value)
511
+ end
512
+ end
513
+ hash
514
+ else
515
+ # Single get
516
+ value, flags, ret = Lib.memcached_get_rvalue(@struct, keys)
517
+ check_return_code(ret, keys)
518
+ marshal ? Marshal.load(value) : value
519
+ end
520
+ rescue => e
521
+ tries ||= 0
522
+ raise unless tries < options[:exception_retry_limit] && should_retry(e)
523
+ tries += 1
524
+ retry
525
+ end
526
+
527
+ # Check if a key exists on the server. It will return nil if the value is found, or raise
528
+ # <tt>Memcached::NotFound</tt> if the key does not exist.
529
+ def exist(key)
530
+ check_return_code(
531
+ Lib.memcached_exist(@struct, key),
532
+ key
533
+ )
534
+ end
535
+
536
+ # Gets a key's value from the previous server. Only useful with random distribution.
537
+ def get_from_last(key, marshal=true)
538
+ raise ArgumentError, "get_from_last() is not useful unless :random distribution is enabled." unless options[:distribution] == :random
539
+ value, flags, ret = Lib.memcached_get_from_last_rvalue(@struct, key)
540
+ check_return_code(ret, key)
541
+ marshal ? Marshal.load(value) : value
542
+ end
543
+
544
+ ### Information methods
545
+
546
+ # Return the server used by a particular key.
547
+ def server_by_key(key)
548
+ ret = Lib.memcached_server_by_key(@struct, key)
549
+ if ret.is_a?(Array)
550
+ check_return_code(ret.last)
551
+ inspect_server(ret.first)
552
+ else
553
+ check_return_code(ret)
554
+ end
555
+ rescue ABadKeyWasProvidedOrCharactersOutOfRange
556
+ end
557
+
558
+ # Return a Hash of statistics responses from the set of servers. Each value is an array with one entry for each server, in the same order the servers were defined.
559
+ def stats(subcommand = nil)
560
+ stats = Hash.new([])
561
+
562
+ stat_struct, ret = Lib.memcached_stat(@struct, subcommand)
563
+ check_return_code(ret)
564
+
565
+ keys, ret = Lib.memcached_stat_get_keys(@struct, stat_struct)
566
+ check_return_code(ret)
567
+
568
+ keys.each do |key|
569
+ server_structs.size.times do |index|
570
+
571
+ value, ret = Lib.memcached_stat_get_value(
572
+ @struct,
573
+ Lib.memcached_select_stat_at(@struct, stat_struct, index),
574
+ key)
575
+ check_return_code(ret, key)
576
+
577
+ value = case value
578
+ when /^\d+\.\d+$/ then value.to_f
579
+ when /^\d+$/ then value.to_i
580
+ else value
581
+ end
582
+
583
+ stats[key.to_sym] += [value]
584
+ end
585
+ end
586
+
587
+ Lib.memcached_stat_free(@struct, stat_struct)
588
+ stats
589
+ rescue Memcached::SomeErrorsWereReported => _
590
+ e = _.class.new("Error getting stats")
591
+ e.set_backtrace(_.backtrace)
592
+ raise e
593
+ end
594
+
595
+ ### Operations helpers
596
+
597
+ private
598
+
599
+ # Checks the return code from Rlibmemcached against the exception list. Raises the corresponding exception if the return code is not Memcached::Success or Memcached::ActionQueued. Accepts an integer return code and an optional key, for exception messages.
600
+ def check_return_code(ret, key = nil) #:doc:
601
+ if ret == 0 # Lib::MEMCACHED_SUCCESS
602
+ elsif ret == 32 # Lib::MEMCACHED_BUFFERED
603
+ elsif ret == 16
604
+ raise @not_found # Lib::MEMCACHED_NOTFOUND
605
+ elsif ret == 14
606
+ raise @not_stored # Lib::MEMCACHED_NOTSTORED
607
+ else
608
+ reraise(key, ret)
609
+ end
610
+ rescue TypeError
611
+ reraise(key, ret)
612
+ end
613
+
614
+ def reraise(key, ret)
615
+ message = "Key #{inspect_keys(key, (detect_failure if ret == Lib::MEMCACHED_SERVER_MARKED_DEAD)).inspect}"
616
+ if key.is_a?(String)
617
+ if ret == Lib::MEMCACHED_ERRNO
618
+ if (server = Lib.memcached_server_by_key(@struct, key)).is_a?(Array)
619
+ errno = server.first.cached_errno
620
+ message = "Errno #{errno}: #{ERRNO_HASH[errno].inspect}. #{message}"
621
+ end
622
+ elsif ret == Lib::MEMCACHED_SERVER_ERROR
623
+ if (server = Lib.memcached_server_by_key(@struct, key)).is_a?(Array)
624
+ message = "\"#{server.first.cached_server_error}\". #{message}."
625
+ end
626
+ end
627
+ end
628
+ if EXCEPTIONS[ret]
629
+ raise EXCEPTIONS[ret], message
630
+ else
631
+ raise Memcached::Error, "Unknown return code: #{ret}"
632
+ end
633
+ end
634
+
635
+ # Turn an array of keys into a hash of keys to servers.
636
+ def inspect_keys(keys, server = nil)
637
+ Hash[*Array(keys).map do |key|
638
+ [key, server || server_by_key(key)]
639
+ end.flatten]
640
+ end
641
+
642
+ # Find which server failed most recently.
643
+ # FIXME Is this still necessary with cached_errno?
644
+ def detect_failure
645
+ time = Time.now
646
+ server = server_structs.detect do |server|
647
+ server.next_retry > time
648
+ end
649
+ inspect_server(server) if server
650
+ end
651
+
652
+ # Set the behaviors on the struct from the current options.
653
+ def set_behaviors
654
+ BEHAVIORS.keys.each do |behavior|
655
+ set_behavior(behavior, options[behavior]) if options.key?(behavior)
656
+ end
657
+ # BUG Hash must be last due to the weird Libmemcached multi-behaviors
658
+ set_behavior(:hash, options[:hash])
659
+ end
660
+
661
+ # Set the SASL credentials from the current options. If credentials aren't provided, try to get them from the environment.
662
+ def set_credentials
663
+ if options[:credentials]
664
+ check_return_code(
665
+ Lib.memcached_set_sasl_auth_data(@struct, *options[:credentials])
666
+ )
667
+ end
668
+ end
669
+
670
+ def is_unix_socket?(server)
671
+ server.type == Lib::MEMCACHED_CONNECTION_UNIX_SOCKET
672
+ end
673
+
674
+ # Stringify an opaque server struct
675
+ def inspect_server(server)
676
+ strings = [server.hostname]
677
+ if !is_unix_socket?(server)
678
+ strings << ":#{server.port}"
679
+ strings << ":#{server.weight}" if options[:ketama_weighted]
680
+ end
681
+ strings.join
682
+ end
683
+ end