couchbase-memcached 1.2.8

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 (539) hide show
  1. data.tar.gz.sig +2 -0
  2. data/BENCHMARKS +134 -0
  3. data/CHANGELOG +127 -0
  4. data/LICENSE +184 -0
  5. data/Manifest +535 -0
  6. data/README +118 -0
  7. data/Rakefile +83 -0
  8. data/TODO +4 -0
  9. data/couchbase-memcached.gemspec +33 -0
  10. data/ext/extconf-make.rb +25 -0
  11. data/ext/extconf.rb +91 -0
  12. data/ext/libmemcached-0.50/AUTHORS +11 -0
  13. data/ext/libmemcached-0.50/COPYING +33 -0
  14. data/ext/libmemcached-0.50/ChangeLog +392 -0
  15. data/ext/libmemcached-0.50/Makefile.am +114 -0
  16. data/ext/libmemcached-0.50/Makefile.in +4232 -0
  17. data/ext/libmemcached-0.50/NEWS +1 -0
  18. data/ext/libmemcached-0.50/README +43 -0
  19. data/ext/libmemcached-0.50/README.FIRST +31 -0
  20. data/ext/libmemcached-0.50/README.win32 +25 -0
  21. data/ext/libmemcached-0.50/THANKS +14 -0
  22. data/ext/libmemcached-0.50/TODO +11 -0
  23. data/ext/libmemcached-0.50/aclocal.m4 +1077 -0
  24. data/ext/libmemcached-0.50/clients/client_options.h +45 -0
  25. data/ext/libmemcached-0.50/clients/execute.cc +131 -0
  26. data/ext/libmemcached-0.50/clients/execute.h +30 -0
  27. data/ext/libmemcached-0.50/clients/generator.cc +96 -0
  28. data/ext/libmemcached-0.50/clients/generator.h +36 -0
  29. data/ext/libmemcached-0.50/clients/include.am +116 -0
  30. data/ext/libmemcached-0.50/clients/memaslap.c +908 -0
  31. data/ext/libmemcached-0.50/clients/memcapable.cc +2094 -0
  32. data/ext/libmemcached-0.50/clients/memcat.cc +242 -0
  33. data/ext/libmemcached-0.50/clients/memcp.cc +317 -0
  34. data/ext/libmemcached-0.50/clients/memdump.cc +183 -0
  35. data/ext/libmemcached-0.50/clients/memerror.cc +102 -0
  36. data/ext/libmemcached-0.50/clients/memflush.cc +154 -0
  37. data/ext/libmemcached-0.50/clients/memparse.cc +68 -0
  38. data/ext/libmemcached-0.50/clients/memrm.cc +177 -0
  39. data/ext/libmemcached-0.50/clients/memslap.cc +495 -0
  40. data/ext/libmemcached-0.50/clients/memstat.cc +349 -0
  41. data/ext/libmemcached-0.50/clients/ms_atomic.h +69 -0
  42. data/ext/libmemcached-0.50/clients/ms_conn.c +3413 -0
  43. data/ext/libmemcached-0.50/clients/ms_conn.h +241 -0
  44. data/ext/libmemcached-0.50/clients/ms_memslap.h +132 -0
  45. data/ext/libmemcached-0.50/clients/ms_setting.c +1068 -0
  46. data/ext/libmemcached-0.50/clients/ms_setting.h +181 -0
  47. data/ext/libmemcached-0.50/clients/ms_sigsegv.c +126 -0
  48. data/ext/libmemcached-0.50/clients/ms_sigsegv.h +34 -0
  49. data/ext/libmemcached-0.50/clients/ms_stats.c +307 -0
  50. data/ext/libmemcached-0.50/clients/ms_stats.h +69 -0
  51. data/ext/libmemcached-0.50/clients/ms_task.c +1114 -0
  52. data/ext/libmemcached-0.50/clients/ms_task.h +94 -0
  53. data/ext/libmemcached-0.50/clients/ms_thread.c +351 -0
  54. data/ext/libmemcached-0.50/clients/ms_thread.h +78 -0
  55. data/ext/libmemcached-0.50/clients/utilities.cc +231 -0
  56. data/ext/libmemcached-0.50/clients/utilities.h +64 -0
  57. data/ext/libmemcached-0.50/config.h.in +647 -0
  58. data/ext/libmemcached-0.50/config/autorun.sh +126 -0
  59. data/ext/libmemcached-0.50/config/compile +143 -0
  60. data/ext/libmemcached-0.50/config/config.guess +1517 -0
  61. data/ext/libmemcached-0.50/config/config.rpath +666 -0
  62. data/ext/libmemcached-0.50/config/config.sub +1760 -0
  63. data/ext/libmemcached-0.50/config/depcomp +630 -0
  64. data/ext/libmemcached-0.50/config/install-sh +520 -0
  65. data/ext/libmemcached-0.50/config/ltmain.sh +9642 -0
  66. data/ext/libmemcached-0.50/config/missing +376 -0
  67. data/ext/libmemcached-0.50/config/pandora-plugin +752 -0
  68. data/ext/libmemcached-0.50/config/uncrustify.cfg +1112 -0
  69. data/ext/libmemcached-0.50/configure +27103 -0
  70. data/ext/libmemcached-0.50/configure.ac +186 -0
  71. data/ext/libmemcached-0.50/docs/conf.py.in +354 -0
  72. data/ext/libmemcached-0.50/docs/include.am +240 -0
  73. data/ext/libmemcached-0.50/docs/man/hashkit_clone.3 +88 -0
  74. data/ext/libmemcached-0.50/docs/man/hashkit_crc32.3 +105 -0
  75. data/ext/libmemcached-0.50/docs/man/hashkit_create.3 +88 -0
  76. data/ext/libmemcached-0.50/docs/man/hashkit_fnv1_32.3 +105 -0
  77. data/ext/libmemcached-0.50/docs/man/hashkit_fnv1_64.3 +105 -0
  78. data/ext/libmemcached-0.50/docs/man/hashkit_fnv1a_32.3 +105 -0
  79. data/ext/libmemcached-0.50/docs/man/hashkit_fnv1a_64.3 +105 -0
  80. data/ext/libmemcached-0.50/docs/man/hashkit_free.3 +88 -0
  81. data/ext/libmemcached-0.50/docs/man/hashkit_functions.3 +105 -0
  82. data/ext/libmemcached-0.50/docs/man/hashkit_hsieh.3 +105 -0
  83. data/ext/libmemcached-0.50/docs/man/hashkit_is_allocated.3 +88 -0
  84. data/ext/libmemcached-0.50/docs/man/hashkit_jenkins.3 +105 -0
  85. data/ext/libmemcached-0.50/docs/man/hashkit_md5.3 +105 -0
  86. data/ext/libmemcached-0.50/docs/man/hashkit_murmur.3 +105 -0
  87. data/ext/libmemcached-0.50/docs/man/hashkit_value.3 +66 -0
  88. data/ext/libmemcached-0.50/docs/man/libhashkit.3 +57 -0
  89. data/ext/libmemcached-0.50/docs/man/libmemcached.3 +208 -0
  90. data/ext/libmemcached-0.50/docs/man/libmemcached_check_configuration.3 +293 -0
  91. data/ext/libmemcached-0.50/docs/man/libmemcached_configuration.3 +293 -0
  92. data/ext/libmemcached-0.50/docs/man/libmemcached_examples.3 +144 -0
  93. data/ext/libmemcached-0.50/docs/man/libmemcachedutil.3 +68 -0
  94. data/ext/libmemcached-0.50/docs/man/memaslap.1 +1222 -0
  95. data/ext/libmemcached-0.50/docs/man/memcached.3 +293 -0
  96. data/ext/libmemcached-0.50/docs/man/memcached_add.3 +132 -0
  97. data/ext/libmemcached-0.50/docs/man/memcached_add_by_key.3 +132 -0
  98. data/ext/libmemcached-0.50/docs/man/memcached_analyze.3 +77 -0
  99. data/ext/libmemcached-0.50/docs/man/memcached_append.3 +111 -0
  100. data/ext/libmemcached-0.50/docs/man/memcached_append_by_key.3 +111 -0
  101. data/ext/libmemcached-0.50/docs/man/memcached_behavior_get.3 +333 -0
  102. data/ext/libmemcached-0.50/docs/man/memcached_behavior_set.3 +333 -0
  103. data/ext/libmemcached-0.50/docs/man/memcached_callback_get.3 +159 -0
  104. data/ext/libmemcached-0.50/docs/man/memcached_callback_set.3 +159 -0
  105. data/ext/libmemcached-0.50/docs/man/memcached_cas.3 +91 -0
  106. data/ext/libmemcached-0.50/docs/man/memcached_cas_by_key.3 +91 -0
  107. data/ext/libmemcached-0.50/docs/man/memcached_clone.3 +99 -0
  108. data/ext/libmemcached-0.50/docs/man/memcached_create.3 +99 -0
  109. data/ext/libmemcached-0.50/docs/man/memcached_decrement.3 +124 -0
  110. data/ext/libmemcached-0.50/docs/man/memcached_decrement_with_initial.3 +124 -0
  111. data/ext/libmemcached-0.50/docs/man/memcached_delete.3 +83 -0
  112. data/ext/libmemcached-0.50/docs/man/memcached_delete_by_key.3 +83 -0
  113. data/ext/libmemcached-0.50/docs/man/memcached_destroy_sasl_auth_data.3 +95 -0
  114. data/ext/libmemcached-0.50/docs/man/memcached_dump.3 +77 -0
  115. data/ext/libmemcached-0.50/docs/man/memcached_fetch.3 +174 -0
  116. data/ext/libmemcached-0.50/docs/man/memcached_fetch_execute.3 +174 -0
  117. data/ext/libmemcached-0.50/docs/man/memcached_fetch_result.3 +174 -0
  118. data/ext/libmemcached-0.50/docs/man/memcached_flush_buffers.3 +72 -0
  119. data/ext/libmemcached-0.50/docs/man/memcached_free.3 +99 -0
  120. data/ext/libmemcached-0.50/docs/man/memcached_generate_hash.3 +85 -0
  121. data/ext/libmemcached-0.50/docs/man/memcached_generate_hash_value.3 +85 -0
  122. data/ext/libmemcached-0.50/docs/man/memcached_get.3 +174 -0
  123. data/ext/libmemcached-0.50/docs/man/memcached_get_by_key.3 +174 -0
  124. data/ext/libmemcached-0.50/docs/man/memcached_get_memory_allocators.3 +111 -0
  125. data/ext/libmemcached-0.50/docs/man/memcached_get_sasl_callbacks.3 +95 -0
  126. data/ext/libmemcached-0.50/docs/man/memcached_get_user_data.3 +79 -0
  127. data/ext/libmemcached-0.50/docs/man/memcached_increment.3 +124 -0
  128. data/ext/libmemcached-0.50/docs/man/memcached_increment_with_initial.3 +124 -0
  129. data/ext/libmemcached-0.50/docs/man/memcached_lib_version.3 +76 -0
  130. data/ext/libmemcached-0.50/docs/man/memcached_mget.3 +174 -0
  131. data/ext/libmemcached-0.50/docs/man/memcached_mget_by_key.3 +174 -0
  132. data/ext/libmemcached-0.50/docs/man/memcached_mget_execute.3 +174 -0
  133. data/ext/libmemcached-0.50/docs/man/memcached_mget_execute_by_key.3 +174 -0
  134. data/ext/libmemcached-0.50/docs/man/memcached_pool_behavior_get.3 +139 -0
  135. data/ext/libmemcached-0.50/docs/man/memcached_pool_behavior_set.3 +139 -0
  136. data/ext/libmemcached-0.50/docs/man/memcached_pool_create.3 +139 -0
  137. data/ext/libmemcached-0.50/docs/man/memcached_pool_destroy.3 +139 -0
  138. data/ext/libmemcached-0.50/docs/man/memcached_pool_pop.3 +139 -0
  139. data/ext/libmemcached-0.50/docs/man/memcached_pool_push.3 +139 -0
  140. data/ext/libmemcached-0.50/docs/man/memcached_pool_st.3 +139 -0
  141. data/ext/libmemcached-0.50/docs/man/memcached_prepend.3 +111 -0
  142. data/ext/libmemcached-0.50/docs/man/memcached_prepend_by_key.3 +111 -0
  143. data/ext/libmemcached-0.50/docs/man/memcached_quit.3 +74 -0
  144. data/ext/libmemcached-0.50/docs/man/memcached_replace.3 +132 -0
  145. data/ext/libmemcached-0.50/docs/man/memcached_replace_by_key.3 +132 -0
  146. data/ext/libmemcached-0.50/docs/man/memcached_sasl_set_auth_data.3 +95 -0
  147. data/ext/libmemcached-0.50/docs/man/memcached_server_add.3 +141 -0
  148. data/ext/libmemcached-0.50/docs/man/memcached_server_count.3 +141 -0
  149. data/ext/libmemcached-0.50/docs/man/memcached_server_cursor.3 +141 -0
  150. data/ext/libmemcached-0.50/docs/man/memcached_server_list.3 +141 -0
  151. data/ext/libmemcached-0.50/docs/man/memcached_server_list_append.3 +111 -0
  152. data/ext/libmemcached-0.50/docs/man/memcached_server_list_count.3 +111 -0
  153. data/ext/libmemcached-0.50/docs/man/memcached_server_list_free.3 +111 -0
  154. data/ext/libmemcached-0.50/docs/man/memcached_server_push.3 +141 -0
  155. data/ext/libmemcached-0.50/docs/man/memcached_servers_parse.3 +111 -0
  156. data/ext/libmemcached-0.50/docs/man/memcached_set.3 +132 -0
  157. data/ext/libmemcached-0.50/docs/man/memcached_set_by_key.3 +132 -0
  158. data/ext/libmemcached-0.50/docs/man/memcached_set_memory_allocators.3 +111 -0
  159. data/ext/libmemcached-0.50/docs/man/memcached_set_sasl_callbacks.3 +95 -0
  160. data/ext/libmemcached-0.50/docs/man/memcached_set_user_data.3 +79 -0
  161. data/ext/libmemcached-0.50/docs/man/memcached_stat.3 +116 -0
  162. data/ext/libmemcached-0.50/docs/man/memcached_stat_execute.3 +116 -0
  163. data/ext/libmemcached-0.50/docs/man/memcached_stat_get_keys.3 +116 -0
  164. data/ext/libmemcached-0.50/docs/man/memcached_stat_get_value.3 +116 -0
  165. data/ext/libmemcached-0.50/docs/man/memcached_stat_servername.3 +116 -0
  166. data/ext/libmemcached-0.50/docs/man/memcached_strerror.3 +69 -0
  167. data/ext/libmemcached-0.50/docs/man/memcached_verbosity.3 +66 -0
  168. data/ext/libmemcached-0.50/docs/man/memcached_version.3 +76 -0
  169. data/ext/libmemcached-0.50/docs/man/memcapable.1 +92 -0
  170. data/ext/libmemcached-0.50/docs/man/memcat.1 +71 -0
  171. data/ext/libmemcached-0.50/docs/man/memcp.1 +77 -0
  172. data/ext/libmemcached-0.50/docs/man/memdump.1 +66 -0
  173. data/ext/libmemcached-0.50/docs/man/memerror.1 +65 -0
  174. data/ext/libmemcached-0.50/docs/man/memflush.1 +73 -0
  175. data/ext/libmemcached-0.50/docs/man/memrm.1 +72 -0
  176. data/ext/libmemcached-0.50/docs/man/memslap.1 +59 -0
  177. data/ext/libmemcached-0.50/docs/man/memstat.1 +70 -0
  178. data/ext/libmemcached-0.50/example/include.am +24 -0
  179. data/ext/libmemcached-0.50/example/interface_v0.c +594 -0
  180. data/ext/libmemcached-0.50/example/interface_v1.c +411 -0
  181. data/ext/libmemcached-0.50/example/memcached_light.c +474 -0
  182. data/ext/libmemcached-0.50/example/memcached_light.h +7 -0
  183. data/ext/libmemcached-0.50/example/storage.c +172 -0
  184. data/ext/libmemcached-0.50/example/storage.h +27 -0
  185. data/ext/libmemcached-0.50/example/storage_innodb.c +535 -0
  186. data/ext/libmemcached-0.50/libhashkit/algorithm.cc +69 -0
  187. data/ext/libmemcached-0.50/libhashkit/algorithm.h +96 -0
  188. data/ext/libmemcached-0.50/libhashkit/behavior.cc +9 -0
  189. data/ext/libmemcached-0.50/libhashkit/behavior.h +26 -0
  190. data/ext/libmemcached-0.50/libhashkit/common.h +33 -0
  191. data/ext/libmemcached-0.50/libhashkit/configure.h.in +19 -0
  192. data/ext/libmemcached-0.50/libhashkit/crc32.cc +86 -0
  193. data/ext/libmemcached-0.50/libhashkit/digest.cc +62 -0
  194. data/ext/libmemcached-0.50/libhashkit/digest.h +30 -0
  195. data/ext/libmemcached-0.50/libhashkit/fnv.cc +75 -0
  196. data/ext/libmemcached-0.50/libhashkit/function.cc +156 -0
  197. data/ext/libmemcached-0.50/libhashkit/function.h +44 -0
  198. data/ext/libmemcached-0.50/libhashkit/hashkit.cc +100 -0
  199. data/ext/libmemcached-0.50/libhashkit/hashkit.h +95 -0
  200. data/ext/libmemcached-0.50/libhashkit/hashkit.hpp +97 -0
  201. data/ext/libmemcached-0.50/libhashkit/hsieh.cc +70 -0
  202. data/ext/libmemcached-0.50/libhashkit/include.am +69 -0
  203. data/ext/libmemcached-0.50/libhashkit/jenkins.cc +214 -0
  204. data/ext/libmemcached-0.50/libhashkit/ketama.cc +164 -0
  205. data/ext/libmemcached-0.50/libhashkit/md5.cc +367 -0
  206. data/ext/libmemcached-0.50/libhashkit/murmur.cc +77 -0
  207. data/ext/libmemcached-0.50/libhashkit/one_at_a_time.cc +34 -0
  208. data/ext/libmemcached-0.50/libhashkit/str_algorithm.cc +58 -0
  209. data/ext/libmemcached-0.50/libhashkit/str_algorithm.h +48 -0
  210. data/ext/libmemcached-0.50/libhashkit/strerror.cc +25 -0
  211. data/ext/libmemcached-0.50/libhashkit/strerror.h +23 -0
  212. data/ext/libmemcached-0.50/libhashkit/types.h +90 -0
  213. data/ext/libmemcached-0.50/libhashkit/visibility.h +48 -0
  214. data/ext/libmemcached-0.50/libmemcached/allocators.cc +119 -0
  215. data/ext/libmemcached-0.50/libmemcached/allocators.h +87 -0
  216. data/ext/libmemcached-0.50/libmemcached/analyze.cc +110 -0
  217. data/ext/libmemcached-0.50/libmemcached/analyze.h +66 -0
  218. data/ext/libmemcached-0.50/libmemcached/array.c +128 -0
  219. data/ext/libmemcached-0.50/libmemcached/array.h +75 -0
  220. data/ext/libmemcached-0.50/libmemcached/auto.cc +383 -0
  221. data/ext/libmemcached-0.50/libmemcached/auto.h +111 -0
  222. data/ext/libmemcached-0.50/libmemcached/basic_string.h +55 -0
  223. data/ext/libmemcached-0.50/libmemcached/behavior.cc +590 -0
  224. data/ext/libmemcached-0.50/libmemcached/behavior.h +86 -0
  225. data/ext/libmemcached-0.50/libmemcached/byteorder.cc +90 -0
  226. data/ext/libmemcached-0.50/libmemcached/byteorder.h +52 -0
  227. data/ext/libmemcached-0.50/libmemcached/callback.cc +160 -0
  228. data/ext/libmemcached-0.50/libmemcached/callback.h +61 -0
  229. data/ext/libmemcached-0.50/libmemcached/common.h +182 -0
  230. data/ext/libmemcached-0.50/libmemcached/configure.h.in +52 -0
  231. data/ext/libmemcached-0.50/libmemcached/connect.cc +626 -0
  232. data/ext/libmemcached-0.50/libmemcached/constants.h +167 -0
  233. data/ext/libmemcached-0.50/libmemcached/delete.cc +266 -0
  234. data/ext/libmemcached-0.50/libmemcached/delete.h +57 -0
  235. data/ext/libmemcached-0.50/libmemcached/do.cc +100 -0
  236. data/ext/libmemcached-0.50/libmemcached/do.hpp +49 -0
  237. data/ext/libmemcached-0.50/libmemcached/dump.cc +107 -0
  238. data/ext/libmemcached-0.50/libmemcached/dump.h +51 -0
  239. data/ext/libmemcached-0.50/libmemcached/error.cc +419 -0
  240. data/ext/libmemcached-0.50/libmemcached/error.h +61 -0
  241. data/ext/libmemcached-0.50/libmemcached/error.hpp +87 -0
  242. data/ext/libmemcached-0.50/libmemcached/exception.hpp +63 -0
  243. data/ext/libmemcached-0.50/libmemcached/fetch.cc +267 -0
  244. data/ext/libmemcached-0.50/libmemcached/fetch.h +53 -0
  245. data/ext/libmemcached-0.50/libmemcached/flush.cc +149 -0
  246. data/ext/libmemcached-0.50/libmemcached/flush.h +49 -0
  247. data/ext/libmemcached-0.50/libmemcached/flush_buffers.cc +66 -0
  248. data/ext/libmemcached-0.50/libmemcached/flush_buffers.h +49 -0
  249. data/ext/libmemcached-0.50/libmemcached/get.cc +842 -0
  250. data/ext/libmemcached-0.50/libmemcached/get.h +135 -0
  251. data/ext/libmemcached-0.50/libmemcached/hash.cc +178 -0
  252. data/ext/libmemcached-0.50/libmemcached/hash.h +68 -0
  253. data/ext/libmemcached-0.50/libmemcached/hosts.cc +516 -0
  254. data/ext/libmemcached-0.50/libmemcached/include.am +183 -0
  255. data/ext/libmemcached-0.50/libmemcached/initialize_query.cc +70 -0
  256. data/ext/libmemcached-0.50/libmemcached/initialize_query.h +51 -0
  257. data/ext/libmemcached-0.50/libmemcached/internal.h +46 -0
  258. data/ext/libmemcached-0.50/libmemcached/io.cc +920 -0
  259. data/ext/libmemcached-0.50/libmemcached/io.h +119 -0
  260. data/ext/libmemcached-0.50/libmemcached/is.h +48 -0
  261. data/ext/libmemcached-0.50/libmemcached/key.cc +23 -0
  262. data/ext/libmemcached-0.50/libmemcached/libmemcached_probes.d +30 -0
  263. data/ext/libmemcached-0.50/libmemcached/libmemcached_probes.h +118 -0
  264. data/ext/libmemcached-0.50/libmemcached/memcached.cc +437 -0
  265. data/ext/libmemcached-0.50/libmemcached/memcached.h +214 -0
  266. data/ext/libmemcached-0.50/libmemcached/memcached.hpp +799 -0
  267. data/ext/libmemcached-0.50/libmemcached/memcached/README.txt +7 -0
  268. data/ext/libmemcached-0.50/libmemcached/memcached/protocol_binary.h +726 -0
  269. data/ext/libmemcached-0.50/libmemcached/memcached/vbucket.h +26 -0
  270. data/ext/libmemcached-0.50/libmemcached/memcached_util.h +44 -0
  271. data/ext/libmemcached-0.50/libmemcached/memory.h +79 -0
  272. data/ext/libmemcached-0.50/libmemcached/options.cc +178 -0
  273. data/ext/libmemcached-0.50/libmemcached/options.h +49 -0
  274. data/ext/libmemcached-0.50/libmemcached/options.hpp +56 -0
  275. data/ext/libmemcached-0.50/libmemcached/options/context.h +151 -0
  276. data/ext/libmemcached-0.50/libmemcached/options/include.am +19 -0
  277. data/ext/libmemcached-0.50/libmemcached/options/parser.am +0 -0
  278. data/ext/libmemcached-0.50/libmemcached/options/parser.cc +2324 -0
  279. data/ext/libmemcached-0.50/libmemcached/options/parser.h +122 -0
  280. data/ext/libmemcached-0.50/libmemcached/options/scanner.cc +3203 -0
  281. data/ext/libmemcached-0.50/libmemcached/options/scanner.h +479 -0
  282. data/ext/libmemcached-0.50/libmemcached/options/server.h +60 -0
  283. data/ext/libmemcached-0.50/libmemcached/options/symbol.h +57 -0
  284. data/ext/libmemcached-0.50/libmemcached/parse.cc +110 -0
  285. data/ext/libmemcached-0.50/libmemcached/parse.h +23 -0
  286. data/ext/libmemcached-0.50/libmemcached/platform.h +56 -0
  287. data/ext/libmemcached-0.50/libmemcached/prefix_key.cc +65 -0
  288. data/ext/libmemcached-0.50/libmemcached/prefix_key.h +49 -0
  289. data/ext/libmemcached-0.50/libmemcached/protocol/ascii_handler.c +963 -0
  290. data/ext/libmemcached-0.50/libmemcached/protocol/ascii_handler.h +40 -0
  291. data/ext/libmemcached-0.50/libmemcached/protocol/binary_handler.c +1121 -0
  292. data/ext/libmemcached-0.50/libmemcached/protocol/binary_handler.h +47 -0
  293. data/ext/libmemcached-0.50/libmemcached/protocol/cache.c +149 -0
  294. data/ext/libmemcached-0.50/libmemcached/protocol/cache.h +116 -0
  295. data/ext/libmemcached-0.50/libmemcached/protocol/callback.h +418 -0
  296. data/ext/libmemcached-0.50/libmemcached/protocol/common.h +163 -0
  297. data/ext/libmemcached-0.50/libmemcached/protocol/include.am +26 -0
  298. data/ext/libmemcached-0.50/libmemcached/protocol/pedantic.c +202 -0
  299. data/ext/libmemcached-0.50/libmemcached/protocol/protocol_handler.c +365 -0
  300. data/ext/libmemcached-0.50/libmemcached/protocol_handler.h +215 -0
  301. data/ext/libmemcached-0.50/libmemcached/purge.cc +90 -0
  302. data/ext/libmemcached-0.50/libmemcached/quit.cc +139 -0
  303. data/ext/libmemcached-0.50/libmemcached/quit.h +55 -0
  304. data/ext/libmemcached-0.50/libmemcached/response.cc +619 -0
  305. data/ext/libmemcached-0.50/libmemcached/response.h +57 -0
  306. data/ext/libmemcached-0.50/libmemcached/result.cc +173 -0
  307. data/ext/libmemcached-0.50/libmemcached/result.h +100 -0
  308. data/ext/libmemcached-0.50/libmemcached/return.h +98 -0
  309. data/ext/libmemcached-0.50/libmemcached/sasl.c +408 -0
  310. data/ext/libmemcached-0.50/libmemcached/sasl.h +86 -0
  311. data/ext/libmemcached-0.50/libmemcached/server.cc +351 -0
  312. data/ext/libmemcached-0.50/libmemcached/server.h +169 -0
  313. data/ext/libmemcached-0.50/libmemcached/server_list.cc +88 -0
  314. data/ext/libmemcached-0.50/libmemcached/server_list.h +77 -0
  315. data/ext/libmemcached-0.50/libmemcached/stats.cc +623 -0
  316. data/ext/libmemcached-0.50/libmemcached/stats.h +96 -0
  317. data/ext/libmemcached-0.50/libmemcached/storage.cc +567 -0
  318. data/ext/libmemcached-0.50/libmemcached/storage.h +133 -0
  319. data/ext/libmemcached-0.50/libmemcached/strerror.cc +189 -0
  320. data/ext/libmemcached-0.50/libmemcached/strerror.h +50 -0
  321. data/ext/libmemcached-0.50/libmemcached/string.cc +253 -0
  322. data/ext/libmemcached-0.50/libmemcached/string.h +121 -0
  323. data/ext/libmemcached-0.50/libmemcached/touch.cc +106 -0
  324. data/ext/libmemcached-0.50/libmemcached/touch.h +59 -0
  325. data/ext/libmemcached-0.50/libmemcached/types.h +117 -0
  326. data/ext/libmemcached-0.50/libmemcached/util.h +40 -0
  327. data/ext/libmemcached-0.50/libmemcached/util/flush.cc +61 -0
  328. data/ext/libmemcached-0.50/libmemcached/util/flush.h +50 -0
  329. data/ext/libmemcached-0.50/libmemcached/util/include.am +34 -0
  330. data/ext/libmemcached-0.50/libmemcached/util/ping.cc +62 -0
  331. data/ext/libmemcached-0.50/libmemcached/util/ping.h +49 -0
  332. data/ext/libmemcached-0.50/libmemcached/util/pool.cc +392 -0
  333. data/ext/libmemcached-0.50/libmemcached/util/pool.h +78 -0
  334. data/ext/libmemcached-0.50/libmemcached/util/version.cc +87 -0
  335. data/ext/libmemcached-0.50/libmemcached/util/version.h +53 -0
  336. data/ext/libmemcached-0.50/libmemcached/verbosity.cc +97 -0
  337. data/ext/libmemcached-0.50/libmemcached/verbosity.h +50 -0
  338. data/ext/libmemcached-0.50/libmemcached/version.cc +214 -0
  339. data/ext/libmemcached-0.50/libmemcached/version.h +52 -0
  340. data/ext/libmemcached-0.50/libmemcached/virtual_bucket.c +118 -0
  341. data/ext/libmemcached-0.50/libmemcached/virtual_bucket.h +59 -0
  342. data/ext/libmemcached-0.50/libmemcached/visibility.h +51 -0
  343. data/ext/libmemcached-0.50/libmemcached/watchpoint.h +110 -0
  344. data/ext/libmemcached-0.50/libtest/callbacks.h +21 -0
  345. data/ext/libmemcached-0.50/libtest/collection.h +19 -0
  346. data/ext/libmemcached-0.50/libtest/common.h +50 -0
  347. data/ext/libmemcached-0.50/libtest/core.h +11 -0
  348. data/ext/libmemcached-0.50/libtest/error.h +18 -0
  349. data/ext/libmemcached-0.50/libtest/failed.h +52 -0
  350. data/ext/libmemcached-0.50/libtest/framework.cc +57 -0
  351. data/ext/libmemcached-0.50/libtest/framework.h +137 -0
  352. data/ext/libmemcached-0.50/libtest/get.h +22 -0
  353. data/ext/libmemcached-0.50/libtest/include.am +52 -0
  354. data/ext/libmemcached-0.50/libtest/runner.h +19 -0
  355. data/ext/libmemcached-0.50/libtest/server.c +355 -0
  356. data/ext/libmemcached-0.50/libtest/server.h +43 -0
  357. data/ext/libmemcached-0.50/libtest/stats.h +30 -0
  358. data/ext/libmemcached-0.50/libtest/strerror.h +14 -0
  359. data/ext/libmemcached-0.50/libtest/test.cc +319 -0
  360. data/ext/libmemcached-0.50/libtest/test.h +162 -0
  361. data/ext/libmemcached-0.50/libtest/test.hpp +46 -0
  362. data/ext/libmemcached-0.50/libtest/visibility.h +69 -0
  363. data/ext/libmemcached-0.50/m4/ac_cxx_header_stdcxx_98.m4 +83 -0
  364. data/ext/libmemcached-0.50/m4/acx_pthread.m4 +271 -0
  365. data/ext/libmemcached-0.50/m4/byteorder.m4 +19 -0
  366. data/ext/libmemcached-0.50/m4/deprecated.m4 +17 -0
  367. data/ext/libmemcached-0.50/m4/eagain.m4 +28 -0
  368. data/ext/libmemcached-0.50/m4/enable_utillib.m4 +16 -0
  369. data/ext/libmemcached-0.50/m4/gettext.m4 +379 -0
  370. data/ext/libmemcached-0.50/m4/hsieh.m4 +18 -0
  371. data/ext/libmemcached-0.50/m4/iconv.m4 +214 -0
  372. data/ext/libmemcached-0.50/m4/lib-ld.m4 +110 -0
  373. data/ext/libmemcached-0.50/m4/lib-link.m4 +767 -0
  374. data/ext/libmemcached-0.50/m4/lib-prefix.m4 +221 -0
  375. data/ext/libmemcached-0.50/m4/libtool.m4 +7851 -0
  376. data/ext/libmemcached-0.50/m4/ltoptions.m4 +369 -0
  377. data/ext/libmemcached-0.50/m4/ltsugar.m4 +123 -0
  378. data/ext/libmemcached-0.50/m4/ltversion.m4 +23 -0
  379. data/ext/libmemcached-0.50/m4/lt~obsolete.m4 +98 -0
  380. data/ext/libmemcached-0.50/m4/memaslap.m4 +9 -0
  381. data/ext/libmemcached-0.50/m4/memcached.m4 +31 -0
  382. data/ext/libmemcached-0.50/m4/murmur.m4 +18 -0
  383. data/ext/libmemcached-0.50/m4/pandora_64bit.m4 +60 -0
  384. data/ext/libmemcached-0.50/m4/pandora_bison.m4 +33 -0
  385. data/ext/libmemcached-0.50/m4/pandora_canonical.m4 +418 -0
  386. data/ext/libmemcached-0.50/m4/pandora_check_compiler_version.m4 +37 -0
  387. data/ext/libmemcached-0.50/m4/pandora_check_cxx_standard.m4 +23 -0
  388. data/ext/libmemcached-0.50/m4/pandora_cinttypes.m4 +39 -0
  389. data/ext/libmemcached-0.50/m4/pandora_clock_gettime.m4 +15 -0
  390. data/ext/libmemcached-0.50/m4/pandora_compile_stdcxx_0x.m4 +103 -0
  391. data/ext/libmemcached-0.50/m4/pandora_cstdint.m4 +38 -0
  392. data/ext/libmemcached-0.50/m4/pandora_cxx_demangle.m4 +27 -0
  393. data/ext/libmemcached-0.50/m4/pandora_enable_dtrace.m4 +60 -0
  394. data/ext/libmemcached-0.50/m4/pandora_ensure_gcc_version.m4 +62 -0
  395. data/ext/libmemcached-0.50/m4/pandora_extensions.m4 +16 -0
  396. data/ext/libmemcached-0.50/m4/pandora_fdatasync.m4 +25 -0
  397. data/ext/libmemcached-0.50/m4/pandora_flex.m4 +33 -0
  398. data/ext/libmemcached-0.50/m4/pandora_have_better_malloc.m4 +66 -0
  399. data/ext/libmemcached-0.50/m4/pandora_have_boost.m4 +93 -0
  400. data/ext/libmemcached-0.50/m4/pandora_have_gcc_atomics.m4 +37 -0
  401. data/ext/libmemcached-0.50/m4/pandora_have_innodb.m4 +41 -0
  402. data/ext/libmemcached-0.50/m4/pandora_have_libaio.m4 +56 -0
  403. data/ext/libmemcached-0.50/m4/pandora_have_libavahi.m4 +41 -0
  404. data/ext/libmemcached-0.50/m4/pandora_have_libbdb.m4 +40 -0
  405. data/ext/libmemcached-0.50/m4/pandora_have_libboost_date_time.m4 +46 -0
  406. data/ext/libmemcached-0.50/m4/pandora_have_libboost_filesystem.m4 +47 -0
  407. data/ext/libmemcached-0.50/m4/pandora_have_libboost_iostreams.m4 +49 -0
  408. data/ext/libmemcached-0.50/m4/pandora_have_libboost_options.m4 +47 -0
  409. data/ext/libmemcached-0.50/m4/pandora_have_libboost_regex.m4 +54 -0
  410. data/ext/libmemcached-0.50/m4/pandora_have_libboost_test.m4 +45 -0
  411. data/ext/libmemcached-0.50/m4/pandora_have_libboost_thread.m4 +54 -0
  412. data/ext/libmemcached-0.50/m4/pandora_have_libcassandra.m4 +44 -0
  413. data/ext/libmemcached-0.50/m4/pandora_have_libcurl.m4 +62 -0
  414. data/ext/libmemcached-0.50/m4/pandora_have_libdl.m4 +51 -0
  415. data/ext/libmemcached-0.50/m4/pandora_have_libdrizzle.m4 +61 -0
  416. data/ext/libmemcached-0.50/m4/pandora_have_libevent.m4 +66 -0
  417. data/ext/libmemcached-0.50/m4/pandora_have_libgearman.m4 +41 -0
  418. data/ext/libmemcached-0.50/m4/pandora_have_libgtest.m4 +47 -0
  419. data/ext/libmemcached-0.50/m4/pandora_have_libhaildb.m4 +43 -0
  420. data/ext/libmemcached-0.50/m4/pandora_have_libhashkit.m4 +42 -0
  421. data/ext/libmemcached-0.50/m4/pandora_have_libinnodb.m4 +64 -0
  422. data/ext/libmemcached-0.50/m4/pandora_have_libldap.m4 +73 -0
  423. data/ext/libmemcached-0.50/m4/pandora_have_libmemcached.m4 +106 -0
  424. data/ext/libmemcached-0.50/m4/pandora_have_libmysqlclient.m4 +146 -0
  425. data/ext/libmemcached-0.50/m4/pandora_have_libndbclient.m4 +80 -0
  426. data/ext/libmemcached-0.50/m4/pandora_have_libpcre.m4 +73 -0
  427. data/ext/libmemcached-0.50/m4/pandora_have_libpq.m4 +46 -0
  428. data/ext/libmemcached-0.50/m4/pandora_have_libpqxx.m4 +44 -0
  429. data/ext/libmemcached-0.50/m4/pandora_have_libsqlite3.m4 +42 -0
  430. data/ext/libmemcached-0.50/m4/pandora_have_libtokyocabinet.m4 +54 -0
  431. data/ext/libmemcached-0.50/m4/pandora_have_libuuid.m4 +55 -0
  432. data/ext/libmemcached-0.50/m4/pandora_have_libvbucket.m4 +40 -0
  433. data/ext/libmemcached-0.50/m4/pandora_have_libxml2.m4 +52 -0
  434. data/ext/libmemcached-0.50/m4/pandora_have_libz.m4 +51 -0
  435. data/ext/libmemcached-0.50/m4/pandora_have_protobuf.m4 +82 -0
  436. data/ext/libmemcached-0.50/m4/pandora_have_sasl.m4 +133 -0
  437. data/ext/libmemcached-0.50/m4/pandora_have_thrift.m4 +45 -0
  438. data/ext/libmemcached-0.50/m4/pandora_header_assert.m4 +23 -0
  439. data/ext/libmemcached-0.50/m4/pandora_header_stdcxx_98.m4 +83 -0
  440. data/ext/libmemcached-0.50/m4/pandora_intltool.m4 +225 -0
  441. data/ext/libmemcached-0.50/m4/pandora_libtool.m4 +25 -0
  442. data/ext/libmemcached-0.50/m4/pandora_optimize.m4 +75 -0
  443. data/ext/libmemcached-0.50/m4/pandora_platform.m4 +117 -0
  444. data/ext/libmemcached-0.50/m4/pandora_plugins.m4 +62 -0
  445. data/ext/libmemcached-0.50/m4/pandora_print_callstack.m4 +61 -0
  446. data/ext/libmemcached-0.50/m4/pandora_pthread.m4 +258 -0
  447. data/ext/libmemcached-0.50/m4/pandora_python3_devel.m4 +236 -0
  448. data/ext/libmemcached-0.50/m4/pandora_run_cpplint.m4 +8 -0
  449. data/ext/libmemcached-0.50/m4/pandora_sasl.m4 +133 -0
  450. data/ext/libmemcached-0.50/m4/pandora_shared_ptr.m4 +59 -0
  451. data/ext/libmemcached-0.50/m4/pandora_stack_direction.m4 +39 -0
  452. data/ext/libmemcached-0.50/m4/pandora_stl_hash.m4 +94 -0
  453. data/ext/libmemcached-0.50/m4/pandora_swig.m4 +39 -0
  454. data/ext/libmemcached-0.50/m4/pandora_use_pipe.m4 +36 -0
  455. data/ext/libmemcached-0.50/m4/pandora_vc_build.m4 +168 -0
  456. data/ext/libmemcached-0.50/m4/pandora_version.m4 +11 -0
  457. data/ext/libmemcached-0.50/m4/pandora_visibility.m4 +75 -0
  458. data/ext/libmemcached-0.50/m4/pandora_warnings.m4 +447 -0
  459. data/ext/libmemcached-0.50/m4/pandora_with_gettext.m4 +44 -0
  460. data/ext/libmemcached-0.50/m4/pandora_with_lua.m4 +55 -0
  461. data/ext/libmemcached-0.50/m4/pandora_with_memcached.m4 +41 -0
  462. data/ext/libmemcached-0.50/m4/pandora_with_perl.m4 +81 -0
  463. data/ext/libmemcached-0.50/m4/pandora_with_php.m4 +56 -0
  464. data/ext/libmemcached-0.50/m4/pandora_with_python.m4 +37 -0
  465. data/ext/libmemcached-0.50/m4/pandora_with_python3.m4 +44 -0
  466. data/ext/libmemcached-0.50/m4/pandora_with_r.m4 +33 -0
  467. data/ext/libmemcached-0.50/m4/pandora_with_ruby.m4 +79 -0
  468. data/ext/libmemcached-0.50/m4/pandora_with_valgrind.m4 +17 -0
  469. data/ext/libmemcached-0.50/m4/pkg.m4 +157 -0
  470. data/ext/libmemcached-0.50/m4/po.m4 +449 -0
  471. data/ext/libmemcached-0.50/m4/progtest.m4 +92 -0
  472. data/ext/libmemcached-0.50/m4/protocol_binary.m4 +36 -0
  473. data/ext/libmemcached-0.50/m4/setsockopt.m4 +73 -0
  474. data/ext/libmemcached-0.50/m4/socket_send_flags.m4 +66 -0
  475. data/ext/libmemcached-0.50/poll/include.am +8 -0
  476. data/ext/libmemcached-0.50/poll/poll.c +77 -0
  477. data/ext/libmemcached-0.50/poll/poll.h +45 -0
  478. data/ext/libmemcached-0.50/support/include.am +11 -0
  479. data/ext/libmemcached-0.50/support/libmemcached-fc.spec.in +105 -0
  480. data/ext/libmemcached-0.50/support/libmemcached.pc.in +10 -0
  481. data/ext/libmemcached-0.50/support/libmemcached.spec.in +281 -0
  482. data/ext/libmemcached-0.50/support/set_benchmark.sh +5 -0
  483. data/ext/libmemcached-0.50/tests/atomsmasher.cc +295 -0
  484. data/ext/libmemcached-0.50/tests/basic.cc +134 -0
  485. data/ext/libmemcached-0.50/tests/basic.h +66 -0
  486. data/ext/libmemcached-0.50/tests/cpp_example.cc +195 -0
  487. data/ext/libmemcached-0.50/tests/deprecated.cc +72 -0
  488. data/ext/libmemcached-0.50/tests/deprecated.h +49 -0
  489. data/ext/libmemcached-0.50/tests/error_conditions.cc +63 -0
  490. data/ext/libmemcached-0.50/tests/error_conditions.h +48 -0
  491. data/ext/libmemcached-0.50/tests/hash_plus.cc +225 -0
  492. data/ext/libmemcached-0.50/tests/hash_results.h +127 -0
  493. data/ext/libmemcached-0.50/tests/hashkit_functions.cc +619 -0
  494. data/ext/libmemcached-0.50/tests/include.am +342 -0
  495. data/ext/libmemcached-0.50/tests/ketama_test_cases.h +121 -0
  496. data/ext/libmemcached-0.50/tests/ketama_test_cases_spy.h +118 -0
  497. data/ext/libmemcached-0.50/tests/libmemcached_world.h +205 -0
  498. data/ext/libmemcached-0.50/tests/mem_functions.cc +6648 -0
  499. data/ext/libmemcached-0.50/tests/mem_udp.cc +510 -0
  500. data/ext/libmemcached-0.50/tests/output_plus.res +5 -0
  501. data/ext/libmemcached-0.50/tests/parser.cc +599 -0
  502. data/ext/libmemcached-0.50/tests/parser.h +109 -0
  503. data/ext/libmemcached-0.50/tests/plus.cpp +240 -0
  504. data/ext/libmemcached-0.50/tests/pool.cc +78 -0
  505. data/ext/libmemcached-0.50/tests/pool.h +49 -0
  506. data/ext/libmemcached-0.50/tests/print.cc +58 -0
  507. data/ext/libmemcached-0.50/tests/print.h +51 -0
  508. data/ext/libmemcached-0.50/tests/replication.cc +333 -0
  509. data/ext/libmemcached-0.50/tests/replication.h +64 -0
  510. data/ext/libmemcached-0.50/tests/start.cc +29 -0
  511. data/ext/libmemcached-0.50/tests/string.cc +174 -0
  512. data/ext/libmemcached-0.50/tests/string.h +67 -0
  513. data/ext/libmemcached-0.50/tests/virtual_buckets.cc +143 -0
  514. data/ext/libmemcached-0.50/tests/virtual_buckets.h +51 -0
  515. data/ext/libmemcached-0.50/win32/include.am +11 -0
  516. data/ext/libmemcached-0.50/win32/wrappers.h +55 -0
  517. data/ext/rlibmemcached.i +263 -0
  518. data/ext/rlibmemcached_wrap.c +16732 -0
  519. data/lib/memcached.rb +32 -0
  520. data/lib/memcached/auth.rb +16 -0
  521. data/lib/memcached/behaviors.rb +77 -0
  522. data/lib/memcached/exceptions.rb +84 -0
  523. data/lib/memcached/experimental.rb +48 -0
  524. data/lib/memcached/memcached.rb +660 -0
  525. data/lib/memcached/rails.rb +133 -0
  526. data/test/profile/benchmark.rb +245 -0
  527. data/test/profile/c_profiler.rb +14 -0
  528. data/test/profile/exercise.rb +185 -0
  529. data/test/profile/rb_profiler.rb +21 -0
  530. data/test/profile/valgrind.rb +10 -0
  531. data/test/setup.rb +30 -0
  532. data/test/teardown.rb +0 -0
  533. data/test/test_helper.rb +19 -0
  534. data/test/unit/binding_test.rb +8 -0
  535. data/test/unit/memcached_experimental_test.rb +274 -0
  536. data/test/unit/memcached_test.rb +1293 -0
  537. data/test/unit/rails_test.rb +122 -0
  538. metadata +650 -0
  539. metadata.gz.sig +0 -0
@@ -0,0 +1,53 @@
1
+ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
+ *
3
+ * Libmemcached library
4
+ *
5
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
+ * Copyright (C) 2010 Brian Aker All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are
10
+ * met:
11
+ *
12
+ * * Redistributions of source code must retain the above copyright
13
+ * notice, this list of conditions and the following disclaimer.
14
+ *
15
+ * * Redistributions in binary form must reproduce the above
16
+ * copyright notice, this list of conditions and the following disclaimer
17
+ * in the documentation and/or other materials provided with the
18
+ * distribution.
19
+ *
20
+ * * The names of its contributors may not be used to endorse or
21
+ * promote products derived from this software without specific prior
22
+ * written permission.
23
+ *
24
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+ *
36
+ */
37
+
38
+ #pragma once
39
+
40
+
41
+ #ifdef __cplusplus
42
+ extern "C" {
43
+ #endif
44
+
45
+ LIBMEMCACHED_API
46
+ memcached_return_t memcached_fetch_execute(memcached_st *ptr,
47
+ memcached_execute_fn *callback,
48
+ void *context,
49
+ uint32_t number_of_callbacks);
50
+
51
+ #ifdef __cplusplus
52
+ }
53
+ #endif
@@ -0,0 +1,149 @@
1
+ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
+ *
3
+ * Libmemcached library
4
+ *
5
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are
9
+ * met:
10
+ *
11
+ * * Redistributions of source code must retain the above copyright
12
+ * notice, this list of conditions and the following disclaimer.
13
+ *
14
+ * * Redistributions in binary form must reproduce the above
15
+ * copyright notice, this list of conditions and the following disclaimer
16
+ * in the documentation and/or other materials provided with the
17
+ * distribution.
18
+ *
19
+ * * The names of its contributors may not be used to endorse or
20
+ * promote products derived from this software without specific prior
21
+ * written permission.
22
+ *
23
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
+ *
35
+ */
36
+
37
+ #include <libmemcached/common.h>
38
+
39
+ static memcached_return_t memcached_flush_binary(memcached_st *ptr,
40
+ time_t expiration);
41
+ static memcached_return_t memcached_flush_textual(memcached_st *ptr,
42
+ time_t expiration);
43
+
44
+ memcached_return_t memcached_flush(memcached_st *ptr, time_t expiration)
45
+ {
46
+ memcached_return_t rc;
47
+ if (memcached_failed(rc= initialize_query(ptr)))
48
+ {
49
+ return rc;
50
+ }
51
+
52
+ LIBMEMCACHED_MEMCACHED_FLUSH_START();
53
+ if (ptr->flags.binary_protocol)
54
+ rc= memcached_flush_binary(ptr, expiration);
55
+ else
56
+ rc= memcached_flush_textual(ptr, expiration);
57
+ LIBMEMCACHED_MEMCACHED_FLUSH_END();
58
+ return rc;
59
+ }
60
+
61
+ static memcached_return_t memcached_flush_textual(memcached_st *ptr,
62
+ time_t expiration)
63
+ {
64
+ unlikely (memcached_server_count(ptr) == 0)
65
+ return MEMCACHED_NO_SERVERS;
66
+
67
+ for (unsigned int x= 0; x < memcached_server_count(ptr); x++)
68
+ {
69
+ memcached_return_t rc;
70
+ char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
71
+
72
+ bool no_reply= ptr->flags.no_reply;
73
+ memcached_server_write_instance_st instance=
74
+ memcached_server_instance_fetch(ptr, x);
75
+
76
+ int send_length;
77
+ if (expiration)
78
+ {
79
+ send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE,
80
+ "flush_all %llu%s\r\n",
81
+ (unsigned long long)expiration, no_reply ? " noreply" : "");
82
+ }
83
+ else
84
+ {
85
+ send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE,
86
+ "flush_all%s\r\n", no_reply ? " noreply" : "");
87
+ }
88
+
89
+ if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE || send_length < 0)
90
+ {
91
+ return MEMCACHED_FAILURE;
92
+ }
93
+
94
+ rc= memcached_do(instance, buffer, (size_t)send_length, true);
95
+
96
+ if (rc == MEMCACHED_SUCCESS && !no_reply)
97
+ (void)memcached_response(instance, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, NULL);
98
+ }
99
+
100
+ return MEMCACHED_SUCCESS;
101
+ }
102
+
103
+ static memcached_return_t memcached_flush_binary(memcached_st *ptr,
104
+ time_t expiration)
105
+ {
106
+ protocol_binary_request_flush request= {};
107
+
108
+ unlikely (memcached_server_count(ptr) == 0)
109
+ return MEMCACHED_NO_SERVERS;
110
+
111
+ request.message.header.request.magic= (uint8_t)PROTOCOL_BINARY_REQ;
112
+ request.message.header.request.opcode= PROTOCOL_BINARY_CMD_FLUSH;
113
+ request.message.header.request.extlen= 4;
114
+ request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES;
115
+ request.message.header.request.bodylen= htonl(request.message.header.request.extlen);
116
+ request.message.body.expiration= htonl((uint32_t) expiration);
117
+
118
+ for (uint32_t x= 0; x < memcached_server_count(ptr); x++)
119
+ {
120
+ memcached_server_write_instance_st instance=
121
+ memcached_server_instance_fetch(ptr, x);
122
+
123
+ if (ptr->flags.no_reply)
124
+ {
125
+ request.message.header.request.opcode= PROTOCOL_BINARY_CMD_FLUSHQ;
126
+ }
127
+ else
128
+ {
129
+ request.message.header.request.opcode= PROTOCOL_BINARY_CMD_FLUSH;
130
+ }
131
+
132
+ if (memcached_do(instance, request.bytes, sizeof(request.bytes), true) != MEMCACHED_SUCCESS)
133
+ {
134
+ memcached_io_reset(instance);
135
+ return MEMCACHED_WRITE_FAILURE;
136
+ }
137
+ }
138
+
139
+ for (uint32_t x= 0; x < memcached_server_count(ptr); x++)
140
+ {
141
+ memcached_server_write_instance_st instance=
142
+ memcached_server_instance_fetch(ptr, x);
143
+
144
+ if (memcached_server_response_count(instance) > 0)
145
+ (void)memcached_response(instance, NULL, 0, NULL);
146
+ }
147
+
148
+ return MEMCACHED_SUCCESS;
149
+ }
@@ -0,0 +1,49 @@
1
+ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
+ *
3
+ * Libmemcached library
4
+ *
5
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
+ * Copyright (C) 2010 Brian Aker All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are
10
+ * met:
11
+ *
12
+ * * Redistributions of source code must retain the above copyright
13
+ * notice, this list of conditions and the following disclaimer.
14
+ *
15
+ * * Redistributions in binary form must reproduce the above
16
+ * copyright notice, this list of conditions and the following disclaimer
17
+ * in the documentation and/or other materials provided with the
18
+ * distribution.
19
+ *
20
+ * * The names of its contributors may not be used to endorse or
21
+ * promote products derived from this software without specific prior
22
+ * written permission.
23
+ *
24
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+ *
36
+ */
37
+
38
+ #pragma once
39
+
40
+ #ifdef __cplusplus
41
+ extern "C" {
42
+ #endif
43
+
44
+ LIBMEMCACHED_API
45
+ memcached_return_t memcached_flush(memcached_st *ptr, time_t expiration);
46
+
47
+ #ifdef __cplusplus
48
+ }
49
+ #endif
@@ -0,0 +1,66 @@
1
+ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
+ *
3
+ * Libmemcached library
4
+ *
5
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
+ * Copyright (C) 2010 Brian Aker All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are
10
+ * met:
11
+ *
12
+ * * Redistributions of source code must retain the above copyright
13
+ * notice, this list of conditions and the following disclaimer.
14
+ *
15
+ * * Redistributions in binary form must reproduce the above
16
+ * copyright notice, this list of conditions and the following disclaimer
17
+ * in the documentation and/or other materials provided with the
18
+ * distribution.
19
+ *
20
+ * * The names of its contributors may not be used to endorse or
21
+ * promote products derived from this software without specific prior
22
+ * written permission.
23
+ *
24
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+ *
36
+ */
37
+
38
+ #include <libmemcached/common.h>
39
+
40
+ memcached_return_t memcached_flush_buffers(memcached_st *memc)
41
+ {
42
+ memcached_return_t ret= MEMCACHED_SUCCESS;
43
+
44
+ for (uint32_t x= 0; x < memcached_server_count(memc); ++x)
45
+ {
46
+ memcached_server_write_instance_st instance=
47
+ memcached_server_instance_fetch(memc, x);
48
+
49
+ if (instance->write_buffer_offset != 0)
50
+ {
51
+ if (instance->fd == -1 &&
52
+ (ret= memcached_connect(instance)) != MEMCACHED_SUCCESS)
53
+ {
54
+ WATCHPOINT_ERROR(ret);
55
+ return ret;
56
+ }
57
+
58
+ if (memcached_io_write(instance, NULL, 0, true) == -1)
59
+ {
60
+ ret= MEMCACHED_SOME_ERRORS;
61
+ }
62
+ }
63
+ }
64
+
65
+ return ret;
66
+ }
@@ -0,0 +1,49 @@
1
+ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
+ *
3
+ * Libmemcached library
4
+ *
5
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
+ * Copyright (C) 2010 Brian Aker All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are
10
+ * met:
11
+ *
12
+ * * Redistributions of source code must retain the above copyright
13
+ * notice, this list of conditions and the following disclaimer.
14
+ *
15
+ * * Redistributions in binary form must reproduce the above
16
+ * copyright notice, this list of conditions and the following disclaimer
17
+ * in the documentation and/or other materials provided with the
18
+ * distribution.
19
+ *
20
+ * * The names of its contributors may not be used to endorse or
21
+ * promote products derived from this software without specific prior
22
+ * written permission.
23
+ *
24
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+ *
36
+ */
37
+
38
+ #pragma once
39
+
40
+ #ifdef __cplusplus
41
+ extern "C" {
42
+ #endif
43
+
44
+ LIBMEMCACHED_API
45
+ memcached_return_t memcached_flush_buffers(memcached_st *mem);
46
+
47
+ #ifdef __cplusplus
48
+ }
49
+ #endif
@@ -0,0 +1,842 @@
1
+ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
+ *
3
+ * Libmemcached library
4
+ *
5
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
+ * Copyright (C) 2006-2009 Brian Aker All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are
10
+ * met:
11
+ *
12
+ * * Redistributions of source code must retain the above copyright
13
+ * notice, this list of conditions and the following disclaimer.
14
+ *
15
+ * * Redistributions in binary form must reproduce the above
16
+ * copyright notice, this list of conditions and the following disclaimer
17
+ * in the documentation and/or other materials provided with the
18
+ * distribution.
19
+ *
20
+ * * The names of its contributors may not be used to endorse or
21
+ * promote products derived from this software without specific prior
22
+ * written permission.
23
+ *
24
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+ *
36
+ */
37
+
38
+ #include <libmemcached/common.h>
39
+ #include <cassert>
40
+
41
+ /*
42
+ What happens if no servers exist?
43
+ */
44
+ char *memcached_get(memcached_st *ptr, const char *key,
45
+ size_t key_length,
46
+ size_t *value_length,
47
+ uint32_t *flags,
48
+ memcached_return_t *error)
49
+ {
50
+ return memcached_get_by_key(ptr, NULL, 0, key, key_length, value_length,
51
+ flags, error);
52
+ }
53
+
54
+ static memcached_return_t memcached_mget_by_key_real(memcached_st *ptr,
55
+ const char *group_key,
56
+ size_t group_key_length,
57
+ const char * const *keys,
58
+ const size_t *key_length,
59
+ size_t number_of_keys,
60
+ bool mget_mode,
61
+ uint32_t user_spec_len);
62
+
63
+ static char *memcached_get_len_by_key(memcached_st *ptr,
64
+ const char *group_key,
65
+ size_t group_key_length,
66
+ const char *key, size_t key_length,
67
+ size_t *value_length,
68
+ uint32_t *flags,
69
+ uint32_t user_spec_len,
70
+ memcached_return_t *error)
71
+ {
72
+ unlikely (ptr->flags.use_udp)
73
+ {
74
+ if (value_length)
75
+ *value_length= 0;
76
+
77
+ *error= memcached_set_error(*ptr, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT);
78
+ return NULL;
79
+ }
80
+
81
+ uint64_t query_id= ptr->query_id;
82
+ (void)query_id;
83
+
84
+ /* Request the key */
85
+ *error= memcached_mget_by_key_real(ptr, group_key, group_key_length,
86
+ (const char * const *)&key,
87
+ &key_length, 1, false, user_spec_len);
88
+ assert(ptr->query_id == query_id +1);
89
+
90
+
91
+ if (memcached_failed(*error))
92
+ {
93
+ if (memcached_has_current_error(*ptr)) // Find the most accurate error
94
+ {
95
+ *error= memcached_last_error(ptr);
96
+ }
97
+
98
+ if (value_length)
99
+ *value_length= 0;
100
+
101
+ return NULL;
102
+ }
103
+
104
+ char *value= memcached_fetch(ptr, NULL, NULL,
105
+ value_length, flags, error);
106
+ assert(ptr->query_id == query_id +1);
107
+
108
+ /* This is for historical reasons */
109
+ if (*error == MEMCACHED_END)
110
+ *error= MEMCACHED_NOTFOUND;
111
+
112
+ if (value == NULL)
113
+ {
114
+ if (ptr->get_key_failure && *error == MEMCACHED_NOTFOUND)
115
+ {
116
+ memcached_result_reset(&ptr->result);
117
+ memcached_return_t rc= ptr->get_key_failure(ptr, key, key_length, &ptr->result);
118
+
119
+ /* On all failure drop to returning NULL */
120
+ if (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED)
121
+ {
122
+ if (rc == MEMCACHED_BUFFERED)
123
+ {
124
+ uint64_t latch; /* We use latch to track the state of the original socket */
125
+ latch= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS);
126
+ if (latch == 0)
127
+ memcached_behavior_set(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 1);
128
+
129
+ rc= memcached_set(ptr, key, key_length,
130
+ (memcached_result_value(&ptr->result)),
131
+ (memcached_result_length(&ptr->result)),
132
+ 0,
133
+ (memcached_result_flags(&ptr->result)));
134
+
135
+ if (rc == MEMCACHED_BUFFERED && latch == 0)
136
+ {
137
+ memcached_behavior_set(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 0);
138
+ }
139
+ }
140
+ else
141
+ {
142
+ rc= memcached_set(ptr, key, key_length,
143
+ (memcached_result_value(&ptr->result)),
144
+ (memcached_result_length(&ptr->result)),
145
+ 0,
146
+ (memcached_result_flags(&ptr->result)));
147
+ }
148
+
149
+ if (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED)
150
+ {
151
+ *error= rc;
152
+ *value_length= memcached_result_length(&ptr->result);
153
+ *flags= memcached_result_flags(&ptr->result);
154
+ return memcached_string_take_value(&ptr->result.value);
155
+ }
156
+ }
157
+ }
158
+ assert(ptr->query_id == query_id +1);
159
+
160
+ return NULL;
161
+ }
162
+
163
+ size_t dummy_length;
164
+ uint32_t dummy_flags;
165
+ memcached_return_t dummy_error;
166
+
167
+ char *dummy_value= memcached_fetch(ptr, NULL, NULL,
168
+ &dummy_length, &dummy_flags,
169
+ &dummy_error);
170
+ WATCHPOINT_ASSERT(dummy_length == 0);
171
+ WATCHPOINT_ASSERT(dummy_value == 0);
172
+ assert(ptr->query_id == query_id +1);
173
+
174
+ return value;
175
+ }
176
+
177
+ char *memcached_get_by_key(memcached_st *ptr,
178
+ const char *group_key,
179
+ size_t group_key_length,
180
+ const char *key, size_t key_length,
181
+ size_t *value_length,
182
+ uint32_t *flags,
183
+ memcached_return_t *error)
184
+ {
185
+ return memcached_get_len_by_key(ptr, NULL, 0, key, key_length, value_length,
186
+ flags, GET_LEN_ARG_UNSPECIFIED, error);
187
+ }
188
+
189
+ memcached_return_t memcached_mget(memcached_st *ptr,
190
+ const char * const *keys,
191
+ const size_t *key_length,
192
+ size_t number_of_keys)
193
+ {
194
+ return memcached_mget_by_key(ptr, NULL, 0, keys, key_length, number_of_keys);
195
+ }
196
+
197
+ static memcached_return_t binary_mget_by_key(memcached_st *ptr,
198
+ uint32_t master_server_key,
199
+ bool is_group_key_set,
200
+ const char * const *keys,
201
+ const size_t *key_length,
202
+ size_t number_of_keys,
203
+ bool mget_mode);
204
+
205
+ static memcached_return_t memcached_mget_by_key_real(memcached_st *ptr,
206
+ const char *group_key,
207
+ size_t group_key_length,
208
+ const char * const *keys,
209
+ const size_t *key_length,
210
+ size_t number_of_keys,
211
+ bool mget_mode,
212
+ uint32_t user_spec_len)
213
+ {
214
+ bool failures_occured_in_sending= false;
215
+ const char *get_command;
216
+ uint8_t get_command_length;
217
+ unsigned int master_server_key= (unsigned int)-1; /* 0 is a valid server id! */
218
+ bool length_specified = (user_spec_len != GET_LEN_ARG_UNSPECIFIED);
219
+
220
+
221
+ memcached_return_t rc;
222
+ if (memcached_failed(rc= initialize_query(ptr)))
223
+ {
224
+ return rc;
225
+ }
226
+
227
+ unlikely (ptr->flags.use_udp)
228
+ {
229
+ return memcached_set_error(*ptr, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT);
230
+ }
231
+
232
+ LIBMEMCACHED_MEMCACHED_MGET_START();
233
+
234
+ if (number_of_keys == 0)
235
+ {
236
+ return memcached_set_error(*ptr, MEMCACHED_NOTFOUND, MEMCACHED_AT, memcached_literal_param("number_of_keys was zero"));
237
+ }
238
+
239
+ if (ptr->flags.verify_key && (memcached_key_test(keys, key_length, number_of_keys) == MEMCACHED_BAD_KEY_PROVIDED))
240
+ {
241
+ return memcached_set_error(*ptr, MEMCACHED_BAD_KEY_PROVIDED, MEMCACHED_AT, memcached_literal_param("A bad key value was provided"));
242
+ }
243
+
244
+ bool is_group_key_set= false;
245
+ if (group_key && group_key_length)
246
+ {
247
+ if (ptr->flags.verify_key and (memcached_key_test((const char * const *)&group_key, &group_key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
248
+ {
249
+ return memcached_set_error(*ptr, MEMCACHED_BAD_KEY_PROVIDED, MEMCACHED_AT, memcached_literal_param("A bad group key was provided."));
250
+ }
251
+
252
+ master_server_key= memcached_generate_hash_with_redistribution(ptr, group_key, group_key_length);
253
+ is_group_key_set= true;
254
+ }
255
+
256
+ if (length_specified) {
257
+ if (ptr->flags.binary_protocol)
258
+ return memcached_set_error(*ptr, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT);
259
+
260
+ if (!(user_spec_len > 0 && user_spec_len < GET_LEN_ARG_UNSPECIFIED))
261
+ return memcached_set_error(*ptr, MEMCACHED_FAILURE, MEMCACHED_AT);
262
+ }
263
+
264
+ /*
265
+ Here is where we pay for the non-block API. We need to remove any data sitting
266
+ in the queue before we start our get.
267
+
268
+ It might be optimum to bounce the connection if count > some number.
269
+ */
270
+ for (uint32_t x= 0; x < memcached_server_count(ptr); x++)
271
+ {
272
+ memcached_server_write_instance_st instance=
273
+ memcached_server_instance_fetch(ptr, x);
274
+
275
+ if (memcached_server_response_count(instance))
276
+ {
277
+ char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
278
+
279
+ if (ptr->flags.no_block)
280
+ (void)memcached_io_write(instance, NULL, 0, true);
281
+
282
+ while(memcached_server_response_count(instance))
283
+ (void)memcached_response(instance, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, &ptr->result);
284
+ }
285
+ }
286
+
287
+ if (ptr->flags.binary_protocol)
288
+ {
289
+ return binary_mget_by_key(ptr, master_server_key, is_group_key_set, keys,
290
+ key_length, number_of_keys, mget_mode);
291
+ }
292
+
293
+ if (length_specified) {
294
+ if (ptr->flags.support_cas)
295
+ {
296
+ get_command= "gets_len ";
297
+ get_command_length= 9;
298
+ } else {
299
+ get_command= "get_len ";
300
+ get_command_length= 8;
301
+ }
302
+ } else {
303
+ if (ptr->flags.support_cas)
304
+ {
305
+ get_command= "gets ";
306
+ get_command_length= 5;
307
+ } else {
308
+ get_command= "get ";
309
+ get_command_length= 4;
310
+ }
311
+ }
312
+
313
+ /*
314
+ If a server fails we warn about errors and start all over with sending keys
315
+ to the server.
316
+ */
317
+ WATCHPOINT_ASSERT(rc == MEMCACHED_SUCCESS);
318
+ size_t hosts_connected= 0;
319
+ for (uint32_t x= 0; x < number_of_keys; x++)
320
+ {
321
+ memcached_server_write_instance_st instance;
322
+ uint32_t server_key;
323
+
324
+ if (is_group_key_set)
325
+ {
326
+ server_key= master_server_key;
327
+ }
328
+ else
329
+ {
330
+ server_key= memcached_generate_hash_with_redistribution(ptr, keys[x], key_length[x]);
331
+ }
332
+
333
+ instance= memcached_server_instance_fetch(ptr, server_key);
334
+
335
+ struct libmemcached_io_vector_st vector[]=
336
+ {
337
+ { get_command_length, get_command },
338
+ { memcached_array_size(ptr->prefix_key), memcached_array_string(ptr->prefix_key) },
339
+ { key_length[x], keys[x] },
340
+ { 1, " " }
341
+ };
342
+
343
+
344
+ if (memcached_server_response_count(instance) == 0)
345
+ {
346
+ rc= memcached_connect(instance);
347
+
348
+ if (memcached_failed(rc))
349
+ {
350
+ memcached_set_error(*instance, rc, MEMCACHED_AT);
351
+ continue;
352
+ }
353
+ hosts_connected++;
354
+
355
+ if ((memcached_io_writev(instance, vector, 4, false)) == -1)
356
+ {
357
+ failures_occured_in_sending= true;
358
+ continue;
359
+ }
360
+
361
+ WATCHPOINT_ASSERT(instance->cursor_active == 0);
362
+ memcached_server_response_increment(instance);
363
+ WATCHPOINT_ASSERT(instance->cursor_active == 1);
364
+ }
365
+ else
366
+ {
367
+ if ((memcached_io_writev(instance, (vector + 1), 3, false)) == -1)
368
+ {
369
+ memcached_server_response_reset(instance);
370
+ failures_occured_in_sending= true;
371
+ continue;
372
+ }
373
+ }
374
+
375
+ if (length_specified) {
376
+ char len[GET_LEN_BUFSZ];
377
+ if (snprintf(len, GET_LEN_BUFSZ, "%d ", user_spec_len) < 0 ||
378
+ (memcached_io_write(instance, len, strlen(len), 0) == -1))
379
+ {
380
+ failures_occured_in_sending= true;
381
+ continue;
382
+ }
383
+ }
384
+
385
+ ptr->last_server_key = server_key;
386
+ }
387
+
388
+ if (hosts_connected == 0)
389
+ {
390
+ LIBMEMCACHED_MEMCACHED_MGET_END();
391
+
392
+ if (memcached_failed(rc))
393
+ return rc;
394
+
395
+ return memcached_set_error(*ptr, MEMCACHED_NO_SERVERS, MEMCACHED_AT);
396
+ }
397
+
398
+
399
+ /*
400
+ Should we muddle on if some servers are dead?
401
+ */
402
+ bool success_happened= false;
403
+ for (uint32_t x= 0; x < memcached_server_count(ptr); x++)
404
+ {
405
+ memcached_server_write_instance_st instance=
406
+ memcached_server_instance_fetch(ptr, x);
407
+
408
+ if (memcached_server_response_count(instance))
409
+ {
410
+ /* We need to do something about non-connnected hosts in the future */
411
+ if ((memcached_io_write(instance, "\r\n", 2, true)) == -1)
412
+ {
413
+ failures_occured_in_sending= true;
414
+ }
415
+ else
416
+ {
417
+ success_happened= true;
418
+ }
419
+ }
420
+ }
421
+
422
+ LIBMEMCACHED_MEMCACHED_MGET_END();
423
+
424
+ if (failures_occured_in_sending && success_happened)
425
+ {
426
+ return MEMCACHED_SOME_ERRORS;
427
+ }
428
+
429
+ if (success_happened)
430
+ return MEMCACHED_SUCCESS;
431
+
432
+ return MEMCACHED_FAILURE; // Complete failure occurred
433
+ }
434
+
435
+ memcached_return_t memcached_mget_by_key(memcached_st *ptr,
436
+ const char *group_key,
437
+ size_t group_key_length,
438
+ const char * const *keys,
439
+ const size_t *key_length,
440
+ size_t number_of_keys)
441
+ {
442
+ return memcached_mget_by_key_real(ptr, group_key, group_key_length, keys,
443
+ key_length, number_of_keys, true, GET_LEN_ARG_UNSPECIFIED);
444
+ }
445
+
446
+ memcached_return_t memcached_mget_execute(memcached_st *ptr,
447
+ const char * const *keys,
448
+ const size_t *key_length,
449
+ size_t number_of_keys,
450
+ memcached_execute_fn *callback,
451
+ void *context,
452
+ unsigned int number_of_callbacks)
453
+ {
454
+ return memcached_mget_execute_by_key(ptr, NULL, 0, keys, key_length,
455
+ number_of_keys, callback,
456
+ context, number_of_callbacks);
457
+ }
458
+
459
+ memcached_return_t memcached_mget_execute_by_key(memcached_st *ptr,
460
+ const char *group_key,
461
+ size_t group_key_length,
462
+ const char * const *keys,
463
+ const size_t *key_length,
464
+ size_t number_of_keys,
465
+ memcached_execute_fn *callback,
466
+ void *context,
467
+ unsigned int number_of_callbacks)
468
+ {
469
+ if ((ptr->flags.binary_protocol) == 0)
470
+ return MEMCACHED_NOT_SUPPORTED;
471
+
472
+ memcached_return_t rc;
473
+ memcached_callback_st *original_callbacks= ptr->callbacks;
474
+ memcached_callback_st cb= {
475
+ callback,
476
+ context,
477
+ number_of_callbacks
478
+ };
479
+
480
+ ptr->callbacks= &cb;
481
+ rc= memcached_mget_by_key(ptr, group_key, group_key_length, keys,
482
+ key_length, number_of_keys);
483
+ ptr->callbacks= original_callbacks;
484
+ return rc;
485
+ }
486
+
487
+ static memcached_return_t simple_binary_mget(memcached_st *ptr,
488
+ uint32_t master_server_key,
489
+ bool is_group_key_set,
490
+ const char * const *keys,
491
+ const size_t *key_length,
492
+ size_t number_of_keys, bool mget_mode)
493
+ {
494
+ memcached_return_t rc= MEMCACHED_NOTFOUND;
495
+
496
+ bool flush= (number_of_keys == 1);
497
+
498
+ /*
499
+ If a server fails we warn about errors and start all over with sending keys
500
+ to the server.
501
+ */
502
+ for (uint32_t x= 0; x < number_of_keys; ++x)
503
+ {
504
+ uint32_t server_key;
505
+
506
+ if (is_group_key_set)
507
+ {
508
+ server_key= master_server_key;
509
+ }
510
+ else
511
+ {
512
+ server_key= memcached_generate_hash_with_redistribution(ptr, keys[x], key_length[x]);
513
+ }
514
+
515
+ memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, server_key);
516
+
517
+ if (memcached_server_response_count(instance) == 0)
518
+ {
519
+ rc= memcached_connect(instance);
520
+ if (memcached_failed(rc))
521
+ continue;
522
+ }
523
+
524
+ protocol_binary_request_getk request= { }; //= {.bytes= {0}};
525
+ request.message.header.request.magic= PROTOCOL_BINARY_REQ;
526
+ if (mget_mode)
527
+ request.message.header.request.opcode= PROTOCOL_BINARY_CMD_GETKQ;
528
+ else
529
+ request.message.header.request.opcode= PROTOCOL_BINARY_CMD_GETK;
530
+
531
+ memcached_return_t vk;
532
+ vk= memcached_validate_key_length(key_length[x],
533
+ ptr->flags.binary_protocol);
534
+ unlikely (vk != MEMCACHED_SUCCESS)
535
+ {
536
+ if (x > 0)
537
+ {
538
+ memcached_io_reset(instance);
539
+ }
540
+
541
+ return vk;
542
+ }
543
+
544
+ request.message.header.request.keylen= htons((uint16_t)(key_length[x] + memcached_array_size(ptr->prefix_key)));
545
+ request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES;
546
+ request.message.header.request.bodylen= htonl((uint32_t)( key_length[x] + memcached_array_size(ptr->prefix_key)));
547
+
548
+ struct libmemcached_io_vector_st vector[]=
549
+ {
550
+ { sizeof(request.bytes), request.bytes },
551
+ { memcached_array_size(ptr->prefix_key), memcached_array_string(ptr->prefix_key) },
552
+ { key_length[x], keys[x] }
553
+ };
554
+
555
+ if (memcached_io_writev(instance, vector, 3, flush) == -1)
556
+ {
557
+ memcached_server_response_reset(instance);
558
+ rc= MEMCACHED_SOME_ERRORS;
559
+ continue;
560
+ }
561
+
562
+ /* We just want one pending response per server */
563
+ memcached_server_response_reset(instance);
564
+ memcached_server_response_increment(instance);
565
+ if ((x > 0 && x == ptr->io_key_prefetch) && memcached_flush_buffers(ptr) != MEMCACHED_SUCCESS)
566
+ {
567
+ rc= MEMCACHED_SOME_ERRORS;
568
+ }
569
+ }
570
+
571
+ if (mget_mode)
572
+ {
573
+ /*
574
+ Send a noop command to flush the buffers
575
+ */
576
+ protocol_binary_request_noop request= {}; //= {.bytes= {0}};
577
+ request.message.header.request.magic= PROTOCOL_BINARY_REQ;
578
+ request.message.header.request.opcode= PROTOCOL_BINARY_CMD_NOOP;
579
+ request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES;
580
+
581
+ for (uint32_t x= 0; x < memcached_server_count(ptr); ++x)
582
+ {
583
+ memcached_server_write_instance_st instance=
584
+ memcached_server_instance_fetch(ptr, x);
585
+
586
+ if (memcached_server_response_count(instance))
587
+ {
588
+ if (memcached_io_write(instance, NULL, 0, true) == -1)
589
+ {
590
+ memcached_server_response_reset(instance);
591
+ memcached_io_reset(instance);
592
+ rc= MEMCACHED_SOME_ERRORS;
593
+ }
594
+
595
+ if (memcached_io_write(instance, request.bytes,
596
+ sizeof(request.bytes), true) == -1)
597
+ {
598
+ memcached_server_response_reset(instance);
599
+ memcached_io_reset(instance);
600
+ rc= MEMCACHED_SOME_ERRORS;
601
+ }
602
+ }
603
+ }
604
+ }
605
+
606
+
607
+ return rc;
608
+ }
609
+
610
+ static memcached_return_t replication_binary_mget(memcached_st *ptr,
611
+ uint32_t* hash,
612
+ bool* dead_servers,
613
+ const char *const *keys,
614
+ const size_t *key_length,
615
+ size_t number_of_keys)
616
+ {
617
+ memcached_return_t rc= MEMCACHED_NOTFOUND;
618
+ uint32_t start= 0;
619
+ uint64_t randomize_read= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ);
620
+
621
+ if (randomize_read)
622
+ start= (uint32_t)random() % (uint32_t)(ptr->number_of_replicas + 1);
623
+
624
+ /* Loop for each replica */
625
+ for (uint32_t replica= 0; replica <= ptr->number_of_replicas; ++replica)
626
+ {
627
+ bool success= true;
628
+
629
+ for (uint32_t x= 0; x < number_of_keys; ++x)
630
+ {
631
+ if (hash[x] == memcached_server_count(ptr))
632
+ continue; /* Already successfully sent */
633
+
634
+ uint32_t server= hash[x] + replica;
635
+
636
+ /* In case of randomized reads */
637
+ if (randomize_read && ((server + start) <= (hash[x] + ptr->number_of_replicas)))
638
+ server += start;
639
+
640
+ while (server >= memcached_server_count(ptr))
641
+ server -= memcached_server_count(ptr);
642
+
643
+ if (dead_servers[server])
644
+ continue;
645
+
646
+ memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, server);
647
+
648
+ if (memcached_server_response_count(instance) == 0)
649
+ {
650
+ rc= memcached_connect(instance);
651
+ if (memcached_failed(rc))
652
+ {
653
+ memcached_io_reset(instance);
654
+ dead_servers[server]= true;
655
+ success= false;
656
+ continue;
657
+ }
658
+ }
659
+
660
+ protocol_binary_request_getk request= {};
661
+ request.message.header.request.magic= PROTOCOL_BINARY_REQ;
662
+ request.message.header.request.opcode= PROTOCOL_BINARY_CMD_GETK;
663
+ request.message.header.request.keylen= htons((uint16_t)(key_length[x] + memcached_array_size(ptr->prefix_key)));
664
+ request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES;
665
+ request.message.header.request.bodylen= htonl((uint32_t)(key_length[x] + memcached_array_size(ptr->prefix_key)));
666
+
667
+ /*
668
+ * We need to disable buffering to actually know that the request was
669
+ * successfully sent to the server (so that we should expect a result
670
+ * back). It would be nice to do this in buffered mode, but then it
671
+ * would be complex to handle all error situations if we got to send
672
+ * some of the messages, and then we failed on writing out some others
673
+ * and we used the callback interface from memcached_mget_execute so
674
+ * that we might have processed some of the responses etc. For now,
675
+ * just make sure we work _correctly_
676
+ */
677
+ struct libmemcached_io_vector_st vector[]=
678
+ {
679
+ { sizeof(request.bytes), request.bytes },
680
+ { memcached_array_size(ptr->prefix_key), memcached_array_string(ptr->prefix_key) },
681
+ { key_length[x], keys[x] }
682
+ };
683
+
684
+ if (memcached_io_writev(instance, vector, 3, true) == -1)
685
+ {
686
+ memcached_io_reset(instance);
687
+ dead_servers[server]= true;
688
+ success= false;
689
+ continue;
690
+ }
691
+
692
+ memcached_server_response_increment(instance);
693
+ hash[x]= memcached_server_count(ptr);
694
+ }
695
+
696
+ if (success)
697
+ break;
698
+ }
699
+
700
+ return rc;
701
+ }
702
+
703
+ static memcached_return_t binary_mget_by_key(memcached_st *ptr,
704
+ uint32_t master_server_key,
705
+ bool is_group_key_set,
706
+ const char * const *keys,
707
+ const size_t *key_length,
708
+ size_t number_of_keys,
709
+ bool mget_mode)
710
+ {
711
+ if (ptr->number_of_replicas == 0)
712
+ {
713
+ return simple_binary_mget(ptr, master_server_key, is_group_key_set,
714
+ keys, key_length, number_of_keys, mget_mode);
715
+ }
716
+
717
+ uint32_t* hash= static_cast<uint32_t*>(libmemcached_malloc(ptr, sizeof(uint32_t) * number_of_keys));
718
+ bool* dead_servers= static_cast<bool*>(libmemcached_calloc(ptr, memcached_server_count(ptr), sizeof(bool)));
719
+
720
+ if (hash == NULL || dead_servers == NULL)
721
+ {
722
+ libmemcached_free(ptr, hash);
723
+ libmemcached_free(ptr, dead_servers);
724
+ return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
725
+ }
726
+
727
+ if (is_group_key_set)
728
+ {
729
+ for (size_t x= 0; x < number_of_keys; x++)
730
+ {
731
+ hash[x]= master_server_key;
732
+ }
733
+ }
734
+ else
735
+ {
736
+ for (size_t x= 0; x < number_of_keys; x++)
737
+ {
738
+ hash[x]= memcached_generate_hash_with_redistribution(ptr, keys[x], key_length[x]);
739
+ }
740
+ }
741
+
742
+ memcached_return_t rc= replication_binary_mget(ptr, hash, dead_servers, keys,
743
+ key_length, number_of_keys);
744
+
745
+ WATCHPOINT_IFERROR(rc);
746
+ libmemcached_free(ptr, hash);
747
+ libmemcached_free(ptr, dead_servers);
748
+
749
+ return MEMCACHED_SUCCESS;
750
+ }
751
+
752
+ char *memcached_get_from_last(memcached_st *ptr, const char *key,
753
+ size_t key_length,
754
+ size_t *value_length,
755
+ uint32_t *flags,
756
+ memcached_return *error)
757
+ {
758
+ char *value = NULL;
759
+
760
+ *error = MEMCACHED_NOTFOUND;
761
+ if (memcached_server_response_count(&ptr->servers[ptr->last_server_key]) == 0) {
762
+ *error = memcached_connect(&ptr->servers[ptr->last_server_key]);
763
+
764
+ if (*error != MEMCACHED_SUCCESS) {
765
+ return value;
766
+ }
767
+
768
+ if ((memcached_io_write(&ptr->servers[ptr->last_server_key], "get ", 4, 0)) == -1) {
769
+ *error = MEMCACHED_SOME_ERRORS;
770
+ return value;
771
+ }
772
+ WATCHPOINT_ASSERT(ptr->servers[ptr->last_server_key].cursor_active == 0);
773
+ memcached_server_response_increment(&ptr->servers[ptr->last_server_key]);
774
+ WATCHPOINT_ASSERT(ptr->servers[ptr->last_server_key].cursor_active == 1);
775
+ }
776
+
777
+ /* Only called when we have a prefix key */
778
+ if (ptr->prefix_key && !memcached_array_is_null(ptr->prefix_key)) {
779
+ if ((memcached_io_write(&ptr->servers[ptr->last_server_key],
780
+ memcached_array_string(ptr->prefix_key),
781
+ memcached_array_size(ptr->prefix_key), false)) == -1) {
782
+ memcached_server_response_reset(&ptr->servers[ptr->last_server_key]);
783
+ *error = MEMCACHED_SOME_ERRORS;
784
+ return value;
785
+ }
786
+ }
787
+
788
+
789
+ if ((memcached_io_write(&ptr->servers[ptr->last_server_key], key, key_length, false)) == -1) {
790
+ memcached_server_response_reset(&ptr->servers[ptr->last_server_key]);
791
+ *error = MEMCACHED_SOME_ERRORS;
792
+ return value;
793
+ }
794
+
795
+ if ((memcached_io_write(&ptr->servers[ptr->last_server_key], "\r\n", 2, true)) == -1) {
796
+ memcached_server_response_reset(&ptr->servers[ptr->last_server_key]);
797
+ *error = MEMCACHED_SOME_ERRORS;
798
+ return value;
799
+ }
800
+
801
+ value = memcached_fetch(ptr, NULL, NULL, value_length, flags, error);
802
+
803
+ /* This is for historical reasons */
804
+ if (*error == MEMCACHED_END)
805
+ *error = MEMCACHED_NOTFOUND;
806
+
807
+ if (value != NULL) {
808
+ size_t dummy_length;
809
+ uint32_t dummy_flags;
810
+ memcached_return dummy_error;
811
+
812
+ (void)memcached_fetch(ptr, NULL, NULL,
813
+ &dummy_length, &dummy_flags,
814
+ &dummy_error);
815
+ WATCHPOINT_ASSERT(dummy_length == 0);
816
+ }
817
+
818
+ return value;
819
+ }
820
+
821
+ char *memcached_get_len(memcached_st *ptr, const char *key,
822
+ size_t key_length,
823
+ size_t *value_length,
824
+ uint32_t *flags,
825
+ uint32_t user_spec_len,
826
+ memcached_return_t *error)
827
+ {
828
+ return memcached_get_len_by_key(ptr, NULL, 0, key, key_length, value_length,
829
+ flags, user_spec_len, error);
830
+ }
831
+
832
+
833
+ memcached_return_t memcached_mget_len(memcached_st *ptr,
834
+ const char * const *keys,
835
+ const size_t *key_length,
836
+ size_t number_of_keys,
837
+ uint32_t user_spec_len)
838
+ {
839
+ return memcached_mget_by_key_real(ptr, NULL, 0, keys, key_length,
840
+ number_of_keys, true, user_spec_len);
841
+ }
842
+