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,183 @@
1
+ # vim:ft=automake
2
+ # included from Top Level Makefile.am
3
+ # All paths should be given relative to the root
4
+
5
+ libmemcached_libmemcached_la_SOURCES =
6
+
7
+ include libmemcached/options/include.am
8
+
9
+ EXTRA_DIST+= \
10
+ libmemcached/configure.h.in \
11
+ libmemcached/libmemcached_probes.d \
12
+ libmemcached/memcached/README.txt
13
+
14
+ noinst_HEADERS+= \
15
+ libmemcached/byteorder.h \
16
+ libmemcached/common.h \
17
+ libmemcached/do.hpp \
18
+ libmemcached/error.hpp \
19
+ libmemcached/initialize_query.h \
20
+ libmemcached/internal.h \
21
+ libmemcached/io.h \
22
+ libmemcached/is.h \
23
+ libmemcached/libmemcached_probes.h \
24
+ libmemcached/memory.h \
25
+ libmemcached/options.hpp \
26
+ libmemcached/protocol/ascii_handler.h \
27
+ libmemcached/protocol/binary_handler.h \
28
+ libmemcached/protocol/common.h \
29
+ libmemcached/response.h \
30
+ libmemcached/virtual_bucket.h
31
+
32
+ nobase_include_HEADERS+= \
33
+ libmemcached/allocators.h \
34
+ libmemcached/analyze.h \
35
+ libmemcached/array.h \
36
+ libmemcached/auto.h \
37
+ libmemcached/basic_string.h \
38
+ libmemcached/behavior.h \
39
+ libmemcached/callback.h \
40
+ libmemcached/configure.h \
41
+ libmemcached/constants.h \
42
+ libmemcached/delete.h \
43
+ libmemcached/dump.h \
44
+ libmemcached/error.h \
45
+ libmemcached/exception.hpp \
46
+ libmemcached/fetch.h \
47
+ libmemcached/flush.h \
48
+ libmemcached/flush_buffers.h \
49
+ libmemcached/get.h \
50
+ libmemcached/touch.h \
51
+ libmemcached/hash.h \
52
+ libmemcached/memcached.h \
53
+ libmemcached/memcached.hpp \
54
+ libmemcached/memcached/protocol_binary.h \
55
+ libmemcached/memcached/vbucket.h \
56
+ libmemcached/options.h \
57
+ libmemcached/parse.h \
58
+ libmemcached/prefix_key.h \
59
+ libmemcached/protocol/cache.h \
60
+ libmemcached/protocol/callback.h \
61
+ libmemcached/protocol_handler.h \
62
+ libmemcached/quit.h \
63
+ libmemcached/return.h \
64
+ libmemcached/platform.h \
65
+ libmemcached/result.h \
66
+ libmemcached/sasl.h \
67
+ libmemcached/server.h \
68
+ libmemcached/server_list.h \
69
+ libmemcached/stats.h \
70
+ libmemcached/storage.h \
71
+ libmemcached/strerror.h \
72
+ libmemcached/string.h \
73
+ libmemcached/types.h \
74
+ libmemcached/verbosity.h \
75
+ libmemcached/version.h \
76
+ libmemcached/visibility.h \
77
+ libmemcached/watchpoint.h
78
+
79
+ # This noinst lib contains things we want to be ABI private but still want to
80
+ # either use in client programs or be able to test in test cases
81
+ # These symbols will not be exposed in the shipped .so
82
+ noinst_LTLIBRARIES+= libmemcached/libmemcachedinternal.la
83
+ libmemcached_libmemcachedinternal_la_SOURCES= \
84
+ libmemcached/array.c \
85
+ libmemcached/error.cc \
86
+ libmemcached/string.cc
87
+ libmemcached_libmemcachedinternal_la_CFLAGS= \
88
+ ${AM_CFLAGS} \
89
+ ${NO_CONVERSION} \
90
+ -DBUILDING_LIBMEMCACHED
91
+
92
+ libmemcached_libmemcachedinternal_la_CXXFLAGS= \
93
+ ${AM_CXXFLAGS} \
94
+ ${NO_CONVERSION} \
95
+ -DBUILDING_LIBMEMCACHED
96
+
97
+ lib_LTLIBRARIES+= libmemcached/libmemcached.la
98
+ libmemcached_libmemcached_la_CFLAGS= \
99
+ ${AM_CFLAGS} \
100
+ ${NO_CONVERSION} \
101
+ -DBUILDING_LIBMEMCACHED
102
+
103
+ libmemcached_libmemcached_la_CXXFLAGS= \
104
+ ${AM_CXXFLAGS} \
105
+ ${NO_CONVERSION} \
106
+ -DBUILDING_LIBMEMCACHED
107
+
108
+ libmemcached_libmemcached_la_SOURCES+= \
109
+ ${libhashkit_libhashkit_la_SOURCES} \
110
+ libmemcached/allocators.cc \
111
+ libmemcached/analyze.cc \
112
+ libmemcached/array.c \
113
+ libmemcached/auto.cc \
114
+ libmemcached/behavior.cc \
115
+ libmemcached/byteorder.cc \
116
+ libmemcached/callback.cc \
117
+ libmemcached/connect.cc \
118
+ libmemcached/delete.cc \
119
+ libmemcached/do.cc \
120
+ libmemcached/dump.cc \
121
+ libmemcached/error.cc \
122
+ libmemcached/fetch.cc \
123
+ libmemcached/flush.cc \
124
+ libmemcached/flush_buffers.cc \
125
+ libmemcached/get.cc \
126
+ libmemcached/touch.cc \
127
+ libmemcached/hash.cc \
128
+ libmemcached/hosts.cc \
129
+ libmemcached/initialize_query.cc \
130
+ libmemcached/io.cc \
131
+ libmemcached/key.cc \
132
+ libmemcached/memcached.cc \
133
+ libmemcached/options.cc \
134
+ libmemcached/parse.cc \
135
+ libmemcached/prefix_key.cc \
136
+ libmemcached/purge.cc \
137
+ libmemcached/quit.cc \
138
+ libmemcached/response.cc \
139
+ libmemcached/result.cc \
140
+ libmemcached/server.cc \
141
+ libmemcached/server_list.cc \
142
+ libmemcached/stats.cc \
143
+ libmemcached/storage.cc \
144
+ libmemcached/strerror.cc \
145
+ libmemcached/string.cc \
146
+ libmemcached/verbosity.cc \
147
+ libmemcached/version.cc \
148
+ libmemcached/virtual_bucket.c
149
+
150
+ libmemcached/options.cc: libmemcached/options/parser.h
151
+
152
+
153
+ libmemcached_libmemcached_la_DEPENDENCIES=
154
+ libmemcached_libmemcached_la_LIBADD= $(LIBM)
155
+ libmemcached_libmemcached_la_LDFLAGS= ${AM_LDFLAGS} -version-info ${MEMCACHED_LIBRARY_VERSION}
156
+
157
+ if HAVE_SASL
158
+ libmemcached_libmemcached_la_LDFLAGS+= $(LTLIBSASL) $(LTLIBSASL2)
159
+ libmemcached_libmemcached_la_SOURCES += libmemcached/sasl.c
160
+ endif
161
+
162
+ if HAVE_DTRACE
163
+ BUILT_SOURCES+= libmemcached/dtrace_probes.h
164
+ CLEANFILES+= libmemcached/dtrace_probes.h
165
+ endif
166
+
167
+ if DTRACE_NEEDS_OBJECTS
168
+ libmemcached_libmemcached_la_SOURCES += libmemcached/libmemcached_probes.d
169
+ libmemcached_libmemcached_la_DEPENDENCIES += libmemcached/libmemcached_probes.o
170
+ libmemcached_libmemcached_la_LIBADD += libmemcached/libmemcached_probes.o
171
+ CLEANFILES+= libmemcached/libmemcached_probes.o
172
+ endif
173
+
174
+ SUFFIXES+= .d
175
+
176
+ libmemcached/dtrace_probes.h: libmemcached/libmemcached_probes.d
177
+ $(DTRACE) $(DTRACEFLAGS) -h -o libmemcached/dtrace_probes.h -s ${top_srcdir}/libmemcached/libmemcached_probes.d
178
+
179
+ libmemcached/libmemcached_probes.o: libmemcached/libmemcached_probes.d ${libmemcached_libmemcached_la_OBJECTS} config.h
180
+
181
+ .d.o:
182
+ $(DTRACE) $(DTRACEFLAGS) -o $@ -G -s $< `grep '^pic_object' ${top_builddir}/libmemcached/*.lo | cut -f 2 -d\' | sed "s/^/${top_builddir}\/libmemcached\//"`
183
+
@@ -0,0 +1,70 @@
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
+ memcached_return_t initialize_query(memcached_st *self)
40
+ {
41
+ if (not self)
42
+ return MEMCACHED_INVALID_ARGUMENTS;
43
+
44
+ self->query_id++;
45
+
46
+ if (self->state.is_time_for_rebuild)
47
+ {
48
+ memcached_reset(self);
49
+ }
50
+
51
+ if (memcached_server_count(self) == 0)
52
+ {
53
+ return memcached_set_error(*self, MEMCACHED_NO_SERVERS, MEMCACHED_AT);
54
+ }
55
+
56
+ return MEMCACHED_SUCCESS;
57
+ }
58
+
59
+ memcached_return_t initialize_const_query(const memcached_st *self)
60
+ {
61
+ if (not self)
62
+ return MEMCACHED_INVALID_ARGUMENTS;
63
+
64
+ if (memcached_server_count(self) == 0)
65
+ {
66
+ return MEMCACHED_NO_SERVERS;
67
+ }
68
+
69
+ return MEMCACHED_SUCCESS;
70
+ }
@@ -0,0 +1,51 @@
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
+ #pragma once
38
+
39
+ #ifdef __cplusplus
40
+ extern "C" {
41
+ #endif
42
+
43
+ LIBMEMCACHED_LOCAL
44
+ memcached_return_t initialize_query(memcached_st *self);
45
+
46
+ LIBMEMCACHED_LOCAL
47
+ memcached_return_t initialize_const_query(const memcached_st *self);
48
+
49
+ #ifdef __cplusplus
50
+ } // extern "C"
51
+ #endif
@@ -0,0 +1,46 @@
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
+ #pragma once
39
+
40
+ #ifdef __cplusplus
41
+ extern "C" {
42
+ #endif
43
+
44
+ #ifdef __cplusplus
45
+ }
46
+ #endif
@@ -0,0 +1,920 @@
1
+ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
+ *
3
+ * LibMemcached
4
+ *
5
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
+ * Copyright (C) 2006-2009 Brian Aker
7
+ * All rights reserved.
8
+ *
9
+ * Redistribution and use in source and binary forms, with or without
10
+ * modification, are permitted provided that the following conditions are
11
+ * met:
12
+ *
13
+ * * Redistributions of source code must retain the above copyright
14
+ * notice, this list of conditions and the following disclaimer.
15
+ *
16
+ * * Redistributions in binary form must reproduce the above
17
+ * copyright notice, this list of conditions and the following disclaimer
18
+ * in the documentation and/or other materials provided with the
19
+ * distribution.
20
+ *
21
+ * * The names of its contributors may not be used to endorse or
22
+ * promote products derived from this software without specific prior
23
+ * written permission.
24
+ *
25
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
+ *
37
+ */
38
+
39
+
40
+ #include <libmemcached/common.h>
41
+ #include <cassert>
42
+
43
+ enum memc_read_or_write {
44
+ MEM_READ,
45
+ MEM_WRITE
46
+ };
47
+
48
+ static ssize_t io_flush(memcached_server_write_instance_st ptr,
49
+ const bool with_flush,
50
+ memcached_return_t *error);
51
+ static void increment_udp_message_id(memcached_server_write_instance_st ptr);
52
+
53
+ static memcached_return_t io_wait(memcached_server_write_instance_st ptr,
54
+ memc_read_or_write read_or_write)
55
+ {
56
+ struct pollfd fds;
57
+ fds.fd= ptr->fd;
58
+ fds.events= POLLIN;
59
+
60
+ if (read_or_write == MEM_WRITE) /* write */
61
+ {
62
+ fds.events= POLLOUT;
63
+ WATCHPOINT_SET(ptr->io_wait_count.write++);
64
+ }
65
+ else
66
+ {
67
+ WATCHPOINT_SET(ptr->io_wait_count.read++);
68
+ }
69
+
70
+ /*
71
+ ** We are going to block on write, but at least on Solaris we might block
72
+ ** on write if we haven't read anything from our input buffer..
73
+ ** Try to purge the input buffer if we don't do any flow control in the
74
+ ** application layer (just sending a lot of data etc)
75
+ ** The test is moved down in the purge function to avoid duplication of
76
+ ** the test.
77
+ */
78
+ if (read_or_write == MEM_WRITE)
79
+ {
80
+ memcached_return_t rc= memcached_purge(ptr);
81
+ if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_STORED)
82
+ {
83
+ return MEMCACHED_FAILURE;
84
+ }
85
+ }
86
+
87
+ if (ptr->root->poll_timeout == 0) // Mimic 0 causes timeout behavior (not all platforms do this)
88
+ {
89
+ return memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT);
90
+ }
91
+
92
+ size_t loop_max= 5;
93
+ while (--loop_max) // While loop is for ERESTART or EINTR
94
+ {
95
+
96
+ int error= poll(&fds, 1, ptr->root->poll_timeout);
97
+ switch (error)
98
+ {
99
+ case 1: // Success!
100
+ WATCHPOINT_IF_LABELED_NUMBER(read_or_write && loop_max < 4, "read() times we had to loop, decremented down from 5", loop_max);
101
+ WATCHPOINT_IF_LABELED_NUMBER(!read_or_write && loop_max < 4, "write() times we had to loop, decremented down from 5", loop_max);
102
+
103
+ return MEMCACHED_SUCCESS;
104
+
105
+ case 0: // Timeout occured, we let the while() loop do its thing.
106
+ return memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT);
107
+
108
+ default:
109
+ WATCHPOINT_ERRNO(get_socket_errno());
110
+ switch (get_socket_errno())
111
+ {
112
+ #ifdef TARGET_OS_LINUX
113
+ case ERESTART:
114
+ #endif
115
+ case EINTR:
116
+ break;
117
+
118
+ case EFAULT:
119
+ case ENOMEM:
120
+ return memcached_set_error(*ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT);
121
+
122
+ case EINVAL:
123
+ return memcached_set_error(*ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT, memcached_literal_param("RLIMIT_NOFILE exceeded, or if OSX the timeout value was invalid"));
124
+
125
+ default:
126
+ if (fds.revents & POLLERR)
127
+ {
128
+ int err;
129
+ socklen_t len= sizeof (err);
130
+ (void)getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len);
131
+ ptr->cached_errno= (err == 0) ? get_socket_errno() : err;
132
+ }
133
+ else
134
+ {
135
+ ptr->cached_errno= get_socket_errno();
136
+ }
137
+ memcached_quit_server(ptr, true);
138
+
139
+ return memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
140
+ }
141
+ }
142
+ }
143
+
144
+ ptr->cached_errno= get_socket_errno();
145
+ memcached_quit_server(ptr, true);
146
+
147
+ return memcached_set_error(*ptr, MEMCACHED_FAILURE, MEMCACHED_AT);
148
+ }
149
+
150
+ memcached_return_t memcached_io_wait_for_write(memcached_server_write_instance_st ptr)
151
+ {
152
+ return io_wait(ptr, MEM_WRITE);
153
+ }
154
+
155
+ /**
156
+ * Try to fill the input buffer for a server with as much
157
+ * data as possible.
158
+ *
159
+ * @param ptr the server to pack
160
+ */
161
+ static bool repack_input_buffer(memcached_server_write_instance_st ptr)
162
+ {
163
+ if (ptr->read_ptr != ptr->read_buffer)
164
+ {
165
+ /* Move all of the data to the beginning of the buffer so
166
+ ** that we can fit more data into the buffer...
167
+ */
168
+ memmove(ptr->read_buffer, ptr->read_ptr, ptr->read_buffer_length);
169
+ ptr->read_ptr= ptr->read_buffer;
170
+ ptr->read_data_length= ptr->read_buffer_length;
171
+ }
172
+
173
+ /* There is room in the buffer, try to fill it! */
174
+ if (ptr->read_buffer_length != MEMCACHED_MAX_BUFFER)
175
+ {
176
+ do {
177
+ /* Just try a single read to grab what's available */
178
+ ssize_t nr= recv(ptr->fd,
179
+ ptr->read_ptr + ptr->read_data_length,
180
+ MEMCACHED_MAX_BUFFER - ptr->read_data_length,
181
+ MSG_DONTWAIT);
182
+
183
+ switch (nr)
184
+ {
185
+ case SOCKET_ERROR:
186
+ {
187
+ switch (get_socket_errno())
188
+ {
189
+ case EINTR:
190
+ continue;
191
+
192
+ case EWOULDBLOCK:
193
+ #ifdef USE_EAGAIN
194
+ case EAGAIN:
195
+ #endif
196
+ #ifdef TARGET_OS_LINUX
197
+ case ERESTART:
198
+ #endif
199
+ break; // No IO is fine, we can just move on
200
+
201
+ default:
202
+ memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
203
+ }
204
+ }
205
+ break;
206
+
207
+ case 0: // Shutdown on the socket has occurred
208
+ {
209
+ memcached_set_error(*ptr, MEMCACHED_CONNECTION_FAILURE, MEMCACHED_AT);
210
+ }
211
+ break;
212
+
213
+ default:
214
+ {
215
+ ptr->read_data_length+= size_t(nr);
216
+ ptr->read_buffer_length+= size_t(nr);
217
+ return true;
218
+ }
219
+ break;
220
+ }
221
+ } while (0);
222
+ }
223
+ return false;
224
+ }
225
+
226
+ /**
227
+ * If the we have callbacks connected to this server structure
228
+ * we may start process the input queue and fire the callbacks
229
+ * for the incomming messages. This function is _only_ called
230
+ * when the input buffer is full, so that we _know_ that we have
231
+ * at least _one_ message to process.
232
+ *
233
+ * @param ptr the server to star processing iput messages for
234
+ * @return true if we processed anything, false otherwise
235
+ */
236
+ static bool process_input_buffer(memcached_server_write_instance_st ptr)
237
+ {
238
+ /*
239
+ ** We might be able to process some of the response messages if we
240
+ ** have a callback set up
241
+ */
242
+ if (ptr->root->callbacks != NULL && ptr->root->flags.use_udp == false)
243
+ {
244
+ /*
245
+ * We might have responses... try to read them out and fire
246
+ * callbacks
247
+ */
248
+ memcached_callback_st cb= *ptr->root->callbacks;
249
+
250
+ memcached_set_processing_input((memcached_st *)ptr->root, true);
251
+
252
+ char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
253
+ memcached_return_t error;
254
+ memcached_st *root= (memcached_st *)ptr->root;
255
+ error= memcached_response(ptr, buffer, sizeof(buffer),
256
+ &root->result);
257
+
258
+ memcached_set_processing_input(root, false);
259
+
260
+ if (error == MEMCACHED_SUCCESS)
261
+ {
262
+ for (unsigned int x= 0; x < cb.number_of_callback; x++)
263
+ {
264
+ error= (*cb.callback[x])(ptr->root, &root->result, cb.context);
265
+ if (error != MEMCACHED_SUCCESS)
266
+ break;
267
+ }
268
+
269
+ /* @todo what should I do with the error message??? */
270
+ }
271
+ /* @todo what should I do with other error messages?? */
272
+ return true;
273
+ }
274
+
275
+ return false;
276
+ }
277
+
278
+ memcached_return_t memcached_io_read(memcached_server_write_instance_st ptr,
279
+ void *buffer, size_t length, ssize_t *nread)
280
+ {
281
+ assert(ptr); // Programmer error
282
+ char *buffer_ptr= static_cast<char *>(buffer);
283
+
284
+ if (ptr->fd == INVALID_SOCKET)
285
+ {
286
+ assert(int(ptr->state) <= int(MEMCACHED_SERVER_STATE_ADDRINFO));
287
+ return MEMCACHED_CONNECTION_FAILURE;
288
+ }
289
+
290
+ while (length)
291
+ {
292
+ if (not ptr->read_buffer_length)
293
+ {
294
+ ssize_t data_read;
295
+ do
296
+ {
297
+ data_read= recv(ptr->fd, ptr->read_buffer, MEMCACHED_MAX_BUFFER, MSG_DONTWAIT);
298
+ if (data_read == SOCKET_ERROR)
299
+ {
300
+ switch (get_socket_errno())
301
+ {
302
+ case EINTR: // We just retry
303
+ continue;
304
+
305
+ case ETIMEDOUT: // OSX
306
+ case EWOULDBLOCK:
307
+ #ifdef USE_EAGAIN
308
+ case EAGAIN:
309
+ #endif
310
+ #ifdef TARGET_OS_LINUX
311
+ case ERESTART:
312
+ #endif
313
+ if (memcached_success(io_wait(ptr, MEM_READ)))
314
+ {
315
+ continue;
316
+ }
317
+ return MEMCACHED_IN_PROGRESS;
318
+
319
+ /* fall through */
320
+
321
+ case ENOTCONN: // Programmer Error
322
+ WATCHPOINT_ASSERT(0);
323
+ case ENOTSOCK:
324
+ WATCHPOINT_ASSERT(0);
325
+ case EBADF:
326
+ assert(ptr->fd != INVALID_SOCKET);
327
+ case EINVAL:
328
+ case EFAULT:
329
+ case ECONNREFUSED:
330
+ default:
331
+ {
332
+ memcached_quit_server(ptr, true);
333
+ *nread= -1;
334
+ return memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
335
+ }
336
+ }
337
+ }
338
+ else if (data_read == 0)
339
+ {
340
+ /*
341
+ EOF. Any data received so far is incomplete
342
+ so discard it. This always reads by byte in case of TCP
343
+ and protocol enforcement happens at memcached_response()
344
+ looking for '\n'. We do not care for UDB which requests 8 bytes
345
+ at once. Generally, this means that connection went away. Since
346
+ for blocking I/O we do not return 0 and for non-blocking case
347
+ it will return EGAIN if data is not immediatly available.
348
+ */
349
+ WATCHPOINT_STRING("We had a zero length recv()");
350
+ assert(0);
351
+ memcached_quit_server(ptr, true);
352
+ *nread= -1;
353
+ return memcached_set_error(*ptr, MEMCACHED_UNKNOWN_READ_FAILURE, MEMCACHED_AT);
354
+ }
355
+ } while (data_read <= 0);
356
+
357
+ ptr->io_bytes_sent = 0;
358
+ ptr->read_data_length= (size_t) data_read;
359
+ ptr->read_buffer_length= (size_t) data_read;
360
+ ptr->read_ptr= ptr->read_buffer;
361
+ }
362
+
363
+ if (length > 1)
364
+ {
365
+ size_t difference;
366
+
367
+ difference= (length > ptr->read_buffer_length) ? ptr->read_buffer_length : length;
368
+
369
+ memcpy(buffer_ptr, ptr->read_ptr, difference);
370
+ length -= difference;
371
+ ptr->read_ptr+= difference;
372
+ ptr->read_buffer_length-= difference;
373
+ buffer_ptr+= difference;
374
+ }
375
+ else
376
+ {
377
+ *buffer_ptr= *ptr->read_ptr;
378
+ ptr->read_ptr++;
379
+ ptr->read_buffer_length--;
380
+ buffer_ptr++;
381
+ break;
382
+ }
383
+ }
384
+
385
+ ptr->server_failure_counter= 0;
386
+ *nread = (ssize_t)(buffer_ptr - (char*)buffer);
387
+ return MEMCACHED_SUCCESS;
388
+ }
389
+
390
+ memcached_return_t memcached_io_slurp(memcached_server_write_instance_st ptr)
391
+ {
392
+ assert(ptr); // Programmer error
393
+
394
+ if (ptr->fd == INVALID_SOCKET)
395
+ {
396
+ assert(int(ptr->state) <= int(MEMCACHED_SERVER_STATE_ADDRINFO));
397
+ return MEMCACHED_CONNECTION_FAILURE;
398
+ }
399
+
400
+ ssize_t data_read;
401
+ char buffer[MEMCACHED_MAX_BUFFER];
402
+ do
403
+ {
404
+ data_read= recv(ptr->fd, ptr->read_buffer, sizeof(buffer), MSG_DONTWAIT);
405
+ if (data_read == SOCKET_ERROR)
406
+ {
407
+ switch (get_socket_errno())
408
+ {
409
+ case EINTR: // We just retry
410
+ continue;
411
+
412
+ case ETIMEDOUT: // OSX
413
+ case EWOULDBLOCK:
414
+ #ifdef USE_EAGAIN
415
+ case EAGAIN:
416
+ #endif
417
+ #ifdef TARGET_OS_LINUX
418
+ case ERESTART:
419
+ #endif
420
+ if (memcached_success(io_wait(ptr, MEM_READ)))
421
+ {
422
+ continue;
423
+ }
424
+ return MEMCACHED_IN_PROGRESS;
425
+
426
+ /* fall through */
427
+
428
+ case ENOTCONN: // Programmer Error
429
+ WATCHPOINT_ASSERT(0);
430
+ case ENOTSOCK:
431
+ WATCHPOINT_ASSERT(0);
432
+ case EBADF:
433
+ assert(ptr->fd != INVALID_SOCKET);
434
+ case EINVAL:
435
+ case EFAULT:
436
+ case ECONNREFUSED:
437
+ default:
438
+ return MEMCACHED_CONNECTION_FAILURE; // We want this!
439
+ }
440
+ }
441
+ } while (data_read > 0);
442
+
443
+ return MEMCACHED_CONNECTION_FAILURE;
444
+ }
445
+
446
+ static ssize_t _io_write(memcached_server_write_instance_st ptr,
447
+ const void *buffer, size_t length, bool with_flush)
448
+ {
449
+ size_t original_length;
450
+ const char* buffer_ptr;
451
+
452
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
453
+
454
+ original_length= length;
455
+ buffer_ptr= static_cast<const char *>(buffer);
456
+
457
+ while (length)
458
+ {
459
+ char *write_ptr;
460
+ size_t should_write;
461
+ size_t buffer_end;
462
+
463
+ if (ptr->type == MEMCACHED_CONNECTION_UDP)
464
+ {
465
+ //UDP does not support partial writes
466
+ buffer_end= MAX_UDP_DATAGRAM_LENGTH;
467
+ should_write= length;
468
+ if (ptr->write_buffer_offset + should_write > buffer_end)
469
+ {
470
+ return -1;
471
+ }
472
+ }
473
+ else
474
+ {
475
+ buffer_end= MEMCACHED_MAX_BUFFER;
476
+ should_write= buffer_end - ptr->write_buffer_offset;
477
+ should_write= (should_write < length) ? should_write : length;
478
+ }
479
+
480
+ write_ptr= ptr->write_buffer + ptr->write_buffer_offset;
481
+ memcpy(write_ptr, buffer_ptr, should_write);
482
+ ptr->write_buffer_offset+= should_write;
483
+ buffer_ptr+= should_write;
484
+ length-= should_write;
485
+
486
+ if (ptr->write_buffer_offset == buffer_end && ptr->type != MEMCACHED_CONNECTION_UDP)
487
+ {
488
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
489
+
490
+ memcached_return_t rc;
491
+ ssize_t sent_length= io_flush(ptr, with_flush, &rc);
492
+ if (sent_length == -1)
493
+ {
494
+ return -1;
495
+ }
496
+
497
+ /* If io_flush calls memcached_purge, sent_length may be 0 */
498
+ unlikely (sent_length != 0)
499
+ {
500
+ WATCHPOINT_ASSERT(sent_length == (ssize_t)buffer_end);
501
+ }
502
+ }
503
+ }
504
+
505
+ if (with_flush)
506
+ {
507
+ memcached_return_t rc;
508
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
509
+ if (io_flush(ptr, with_flush, &rc) == -1)
510
+ {
511
+ return -1;
512
+ }
513
+ }
514
+
515
+ return (ssize_t) original_length;
516
+ }
517
+
518
+ ssize_t memcached_io_write(memcached_server_write_instance_st ptr,
519
+ const void *buffer, size_t length, bool with_flush)
520
+ {
521
+ return _io_write(ptr, buffer, length, with_flush);
522
+ }
523
+
524
+ ssize_t memcached_io_writev(memcached_server_write_instance_st ptr,
525
+ const struct libmemcached_io_vector_st *vector,
526
+ size_t number_of, bool with_flush)
527
+ {
528
+ ssize_t total= 0;
529
+
530
+ for (size_t x= 0; x < number_of; x++, vector++)
531
+ {
532
+ ssize_t returnable;
533
+
534
+ if ((returnable= _io_write(ptr, vector->buffer, vector->length, false)) == -1)
535
+ {
536
+ return -1;
537
+ }
538
+ total+= returnable;
539
+ }
540
+
541
+ if (with_flush)
542
+ {
543
+ if (memcached_io_write(ptr, NULL, 0, true) == -1)
544
+ {
545
+ return -1;
546
+ }
547
+ }
548
+
549
+ return total;
550
+ }
551
+
552
+
553
+ void memcached_io_close(memcached_server_write_instance_st ptr)
554
+ {
555
+ if (ptr->fd == INVALID_SOCKET)
556
+ {
557
+ return;
558
+ }
559
+
560
+ /* in case of death shutdown to avoid blocking at close() */
561
+ if (shutdown(ptr->fd, SHUT_RDWR) == SOCKET_ERROR && get_socket_errno() != ENOTCONN)
562
+ {
563
+ WATCHPOINT_NUMBER(ptr->fd);
564
+ WATCHPOINT_ERRNO(get_socket_errno());
565
+ WATCHPOINT_ASSERT(get_socket_errno());
566
+ }
567
+
568
+ if (closesocket(ptr->fd) == SOCKET_ERROR)
569
+ {
570
+ WATCHPOINT_ERRNO(get_socket_errno());
571
+ }
572
+ ptr->state= MEMCACHED_SERVER_STATE_NEW;
573
+ ptr->fd= INVALID_SOCKET;
574
+ }
575
+
576
+ memcached_server_write_instance_st memcached_io_get_readable_server(memcached_st *memc)
577
+ {
578
+ #define MAX_SERVERS_TO_POLL 100
579
+ struct pollfd fds[MAX_SERVERS_TO_POLL];
580
+ unsigned int host_index= 0;
581
+
582
+ for (uint32_t x= 0; x < memcached_server_count(memc) && host_index < MAX_SERVERS_TO_POLL; ++x)
583
+ {
584
+ memcached_server_write_instance_st instance=
585
+ memcached_server_instance_fetch(memc, x);
586
+
587
+ if (instance->read_buffer_length > 0) /* I have data in the buffer */
588
+ return instance;
589
+
590
+ if (memcached_server_response_count(instance) > 0)
591
+ {
592
+ fds[host_index].events = POLLIN;
593
+ fds[host_index].revents = 0;
594
+ fds[host_index].fd = instance->fd;
595
+ ++host_index;
596
+ }
597
+ }
598
+
599
+ if (host_index < 2)
600
+ {
601
+ /* We have 0 or 1 server with pending events.. */
602
+ for (uint32_t x= 0; x< memcached_server_count(memc); ++x)
603
+ {
604
+ memcached_server_write_instance_st instance=
605
+ memcached_server_instance_fetch(memc, x);
606
+
607
+ if (memcached_server_response_count(instance) > 0)
608
+ {
609
+ return instance;
610
+ }
611
+ }
612
+
613
+ return NULL;
614
+ }
615
+
616
+ int error= poll(fds, host_index, memc->poll_timeout);
617
+ switch (error)
618
+ {
619
+ case -1:
620
+ memcached_set_errno(*memc, get_socket_errno(), MEMCACHED_AT);
621
+ /* FALLTHROUGH */
622
+ case 0:
623
+ break;
624
+
625
+ default:
626
+ for (size_t x= 0; x < host_index; ++x)
627
+ {
628
+ if (fds[x].revents & POLLIN)
629
+ {
630
+ for (uint32_t y= 0; y < memcached_server_count(memc); ++y)
631
+ {
632
+ memcached_server_write_instance_st instance=
633
+ memcached_server_instance_fetch(memc, y);
634
+
635
+ if (instance->fd == fds[x].fd)
636
+ return instance;
637
+ }
638
+ }
639
+ }
640
+ }
641
+
642
+ return NULL;
643
+ }
644
+
645
+ static ssize_t io_flush(memcached_server_write_instance_st ptr,
646
+ const bool with_flush,
647
+ memcached_return_t *error)
648
+ {
649
+ /*
650
+ ** We might want to purge the input buffer if we haven't consumed
651
+ ** any output yet... The test for the limits is the purge is inline
652
+ ** in the purge function to avoid duplicating the logic..
653
+ */
654
+ {
655
+ memcached_return_t rc;
656
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
657
+ rc= memcached_purge(ptr);
658
+
659
+ if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_STORED)
660
+ {
661
+ return -1;
662
+ }
663
+ }
664
+ ssize_t sent_length;
665
+ size_t return_length;
666
+ char *local_write_ptr= ptr->write_buffer;
667
+ size_t write_length= ptr->write_buffer_offset;
668
+
669
+ *error= MEMCACHED_SUCCESS;
670
+
671
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
672
+
673
+ // UDP Sanity check, make sure that we are not sending somthing too big
674
+ if (ptr->type == MEMCACHED_CONNECTION_UDP && write_length > MAX_UDP_DATAGRAM_LENGTH)
675
+ {
676
+ *error= MEMCACHED_WRITE_FAILURE;
677
+ return -1;
678
+ }
679
+
680
+ if (ptr->write_buffer_offset == 0 || (ptr->type == MEMCACHED_CONNECTION_UDP
681
+ && ptr->write_buffer_offset == UDP_DATAGRAM_HEADER_LENGTH))
682
+ {
683
+ return 0;
684
+ }
685
+
686
+ /* Looking for memory overflows */
687
+ #if defined(DEBUG)
688
+ if (write_length == MEMCACHED_MAX_BUFFER)
689
+ WATCHPOINT_ASSERT(ptr->write_buffer == local_write_ptr);
690
+ WATCHPOINT_ASSERT((ptr->write_buffer + MEMCACHED_MAX_BUFFER) >= (local_write_ptr + write_length));
691
+ #endif
692
+
693
+ return_length= 0;
694
+ while (write_length)
695
+ {
696
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
697
+ WATCHPOINT_ASSERT(write_length > 0);
698
+ sent_length= 0;
699
+ if (ptr->type == MEMCACHED_CONNECTION_UDP)
700
+ increment_udp_message_id(ptr);
701
+
702
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
703
+ if (with_flush)
704
+ {
705
+ sent_length= send(ptr->fd, local_write_ptr, write_length, MSG_NOSIGNAL|MSG_DONTWAIT);
706
+ }
707
+ else
708
+ {
709
+ sent_length= send(ptr->fd, local_write_ptr, write_length, MSG_NOSIGNAL|MSG_DONTWAIT|MSG_MORE);
710
+ }
711
+
712
+ if (sent_length == SOCKET_ERROR)
713
+ {
714
+ ptr->cached_errno= get_socket_errno();
715
+ #if 0 // @todo I should look at why we hit this bit of code hard frequently
716
+ WATCHPOINT_ERRNO(get_socket_errno());
717
+ WATCHPOINT_NUMBER(get_socket_errno());
718
+ #endif
719
+ switch (get_socket_errno())
720
+ {
721
+ case ENOBUFS:
722
+ continue;
723
+ case EWOULDBLOCK:
724
+ #ifdef USE_EAGAIN
725
+ case EAGAIN:
726
+ #endif
727
+ {
728
+ /*
729
+ * We may be blocked on write because the input buffer
730
+ * is full. Let's check if we have room in our input
731
+ * buffer for more data and retry the write before
732
+ * waiting..
733
+ */
734
+ if (repack_input_buffer(ptr) or
735
+ process_input_buffer(ptr))
736
+ {
737
+ continue;
738
+ }
739
+
740
+ memcached_return_t rc= io_wait(ptr, MEM_WRITE);
741
+ if (memcached_success(rc))
742
+ {
743
+ continue;
744
+ }
745
+ else if (rc == MEMCACHED_TIMEOUT)
746
+ {
747
+ *error= memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT);
748
+ return -1;
749
+ }
750
+
751
+ memcached_quit_server(ptr, true);
752
+ *error= memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
753
+ return -1;
754
+ }
755
+ case ENOTCONN:
756
+ case EPIPE:
757
+ default:
758
+ memcached_quit_server(ptr, true);
759
+ *error= memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
760
+ WATCHPOINT_ASSERT(ptr->fd == -1);
761
+ return -1;
762
+ }
763
+ }
764
+
765
+ if (ptr->type == MEMCACHED_CONNECTION_UDP and
766
+ (size_t)sent_length != write_length)
767
+ {
768
+ memcached_quit_server(ptr, true);
769
+ *error= memcached_set_error(*ptr, MEMCACHED_WRITE_FAILURE, MEMCACHED_AT);
770
+ return -1;
771
+ }
772
+
773
+ ptr->io_bytes_sent += (uint32_t) sent_length;
774
+
775
+ local_write_ptr+= sent_length;
776
+ write_length-= (uint32_t) sent_length;
777
+ return_length+= (uint32_t) sent_length;
778
+ }
779
+
780
+ WATCHPOINT_ASSERT(write_length == 0);
781
+ // Need to study this assert() WATCHPOINT_ASSERT(return_length ==
782
+ // ptr->write_buffer_offset);
783
+
784
+ // if we are a udp server, the begining of the buffer is reserverd for
785
+ // the upd frame header
786
+ if (ptr->type == MEMCACHED_CONNECTION_UDP)
787
+ ptr->write_buffer_offset= UDP_DATAGRAM_HEADER_LENGTH;
788
+ else
789
+ ptr->write_buffer_offset= 0;
790
+
791
+ return (ssize_t) return_length;
792
+ }
793
+
794
+ /*
795
+ Eventually we will just kill off the server with the problem.
796
+ */
797
+ void memcached_io_reset(memcached_server_write_instance_st ptr)
798
+ {
799
+ memcached_quit_server(ptr, true);
800
+ }
801
+
802
+ /**
803
+ * Read a given number of bytes from the server and place it into a specific
804
+ * buffer. Reset the IO channel on this server if an error occurs.
805
+ */
806
+ memcached_return_t memcached_safe_read(memcached_server_write_instance_st ptr,
807
+ void *dta,
808
+ size_t size)
809
+ {
810
+ size_t offset= 0;
811
+ char *data= static_cast<char *>(dta);
812
+
813
+ while (offset < size)
814
+ {
815
+ ssize_t nread;
816
+ memcached_return_t rc;
817
+
818
+ while (memcached_continue(rc= memcached_io_read(ptr, data + offset, size - offset, &nread))) { };
819
+
820
+ if (memcached_failed(rc))
821
+ {
822
+ return rc;
823
+ }
824
+
825
+ offset+= (size_t) nread;
826
+ }
827
+
828
+ return MEMCACHED_SUCCESS;
829
+ }
830
+
831
+ memcached_return_t memcached_io_readline(memcached_server_write_instance_st ptr,
832
+ char *buffer_ptr,
833
+ size_t size)
834
+ {
835
+ bool line_complete= false;
836
+ size_t total_nr= 0;
837
+
838
+ while (not line_complete)
839
+ {
840
+ if (ptr->read_buffer_length == 0)
841
+ {
842
+ /*
843
+ * We don't have any data in the buffer, so let's fill the read
844
+ * buffer. Call the standard read function to avoid duplicating
845
+ * the logic.
846
+ */
847
+ ssize_t nread;
848
+ memcached_return_t rc= memcached_io_read(ptr, buffer_ptr, 1, &nread);
849
+ if (memcached_failed(rc) and rc == MEMCACHED_IN_PROGRESS)
850
+ {
851
+ memcached_quit_server(ptr, true);
852
+ return memcached_set_error(*ptr, rc, MEMCACHED_AT);
853
+ }
854
+ else if (memcached_failed(rc))
855
+ {
856
+ return rc;
857
+ }
858
+
859
+ if (*buffer_ptr == '\n')
860
+ line_complete= true;
861
+
862
+ ++buffer_ptr;
863
+ ++total_nr;
864
+ }
865
+
866
+ /* Now let's look in the buffer and copy as we go! */
867
+ while (ptr->read_buffer_length && total_nr < size && !line_complete)
868
+ {
869
+ *buffer_ptr = *ptr->read_ptr;
870
+ if (*buffer_ptr == '\n')
871
+ line_complete = true;
872
+ --ptr->read_buffer_length;
873
+ ++ptr->read_ptr;
874
+ ++total_nr;
875
+ ++buffer_ptr;
876
+ }
877
+
878
+ if (total_nr == size)
879
+ return MEMCACHED_PROTOCOL_ERROR;
880
+ }
881
+
882
+ return MEMCACHED_SUCCESS;
883
+ }
884
+
885
+ /*
886
+ * The udp request id consists of two seperate sections
887
+ * 1) The thread id
888
+ * 2) The message number
889
+ * The thread id should only be set when the memcached_st struct is created
890
+ * and should not be changed.
891
+ *
892
+ * The message num is incremented for each new message we send, this function
893
+ * extracts the message number from message_id, increments it and then
894
+ * writes the new value back into the header
895
+ */
896
+ static void increment_udp_message_id(memcached_server_write_instance_st ptr)
897
+ {
898
+ struct udp_datagram_header_st *header= (struct udp_datagram_header_st *)ptr->write_buffer;
899
+ uint16_t cur_req= get_udp_datagram_request_id(header);
900
+ int msg_num= get_msg_num_from_request_id(cur_req);
901
+ int thread_id= get_thread_id_from_request_id(cur_req);
902
+
903
+ if (((++msg_num) & UDP_REQUEST_ID_THREAD_MASK) != 0)
904
+ msg_num= 0;
905
+
906
+ header->request_id= htons((uint16_t) (thread_id | msg_num));
907
+ }
908
+
909
+ memcached_return_t memcached_io_init_udp_header(memcached_server_write_instance_st ptr, uint16_t thread_id)
910
+ {
911
+ if (thread_id > UDP_REQUEST_ID_MAX_THREAD_ID)
912
+ return MEMCACHED_FAILURE;
913
+
914
+ struct udp_datagram_header_st *header= (struct udp_datagram_header_st *)ptr->write_buffer;
915
+ header->request_id= htons((uint16_t) (generate_udp_request_thread_id(thread_id)));
916
+ header->num_datagrams= htons(1);
917
+ header->sequence_number= htons(0);
918
+
919
+ return MEMCACHED_SUCCESS;
920
+ }