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,163 @@
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
+ #include "config.h"
40
+ #if !defined(__cplusplus)
41
+ # include <stdbool.h>
42
+ #endif
43
+ #include <assert.h>
44
+
45
+ #include <libmemcached/visibility.h>
46
+ #include <libmemcached/protocol_handler.h>
47
+ #include <libmemcached/protocol/cache.h>
48
+
49
+ /*
50
+ * I don't really need the following two functions as function pointers
51
+ * in the instance handle, but I don't want to put them in the global
52
+ * namespace for those linking statically (personally I don't like that,
53
+ * but some people still do). If it ever shows up as a performance thing
54
+ * I'll look into optimizing this ;-)
55
+ */
56
+ typedef bool (*drain_func)(memcached_protocol_client_st *client);
57
+ typedef protocol_binary_response_status (*spool_func)(memcached_protocol_client_st *client,
58
+ const void *data,
59
+ size_t length);
60
+
61
+ /**
62
+ * Definition of the per instance structure.
63
+ */
64
+ struct memcached_protocol_st {
65
+ memcached_binary_protocol_callback_st *callback;
66
+ memcached_protocol_recv_func recv;
67
+ memcached_protocol_send_func send;
68
+
69
+ /*
70
+ * I really don't need these as funciton pointers, but I don't want
71
+ * to clutter the namespace if someone links statically.
72
+ */
73
+ drain_func drain;
74
+ spool_func spool;
75
+
76
+ /*
77
+ * To avoid keeping a buffer in each client all the time I have a
78
+ * bigger buffer in the instance that I read to initially, and then
79
+ * I try to parse and execute as much from the buffer. If I wasn't able
80
+ * to process all data I'll keep that in a per-connection buffer until
81
+ * the next time I can read from the socket.
82
+ */
83
+ uint8_t *input_buffer;
84
+ size_t input_buffer_size;
85
+
86
+ bool pedantic;
87
+ /* @todo use multiple sized buffers */
88
+ cache_t *buffer_cache;
89
+ };
90
+
91
+ struct chunk_st {
92
+ /* Pointer to the data */
93
+ char *data;
94
+ /* The offset to the first byte into the buffer that is used */
95
+ size_t offset;
96
+ /* The offset into the buffer for the first free byte */
97
+ size_t nbytes;
98
+ /* The number of bytes in the buffer */
99
+ size_t size;
100
+ /* Pointer to the next buffer in the chain */
101
+ struct chunk_st *next;
102
+ };
103
+
104
+ #define CHUNK_BUFFERSIZE 2048
105
+
106
+ typedef memcached_protocol_event_t (*process_data)(struct memcached_protocol_client_st *client, ssize_t *length, void **endptr);
107
+
108
+ enum ascii_cmd {
109
+ GET_CMD,
110
+ GETS_CMD,
111
+ SET_CMD,
112
+ ADD_CMD,
113
+ REPLACE_CMD,
114
+ CAS_CMD,
115
+ APPEND_CMD,
116
+ PREPEND_CMD,
117
+ DELETE_CMD,
118
+ INCR_CMD,
119
+ DECR_CMD,
120
+ STATS_CMD,
121
+ FLUSH_ALL_CMD,
122
+ VERSION_CMD,
123
+ QUIT_CMD,
124
+ VERBOSITY_CMD,
125
+ UNKNOWN_CMD
126
+ };
127
+
128
+ struct memcached_protocol_client_st {
129
+ memcached_protocol_st *root;
130
+ memcached_socket_t sock;
131
+ int error;
132
+
133
+ /* Linked list of data to send */
134
+ struct chunk_st *output;
135
+ struct chunk_st *output_tail;
136
+
137
+ /*
138
+ * While we process input data, this is where we spool incomplete commands
139
+ * if we need to receive more data....
140
+ * @todo use the buffercace
141
+ */
142
+ uint8_t *input_buffer;
143
+ size_t input_buffer_size;
144
+ size_t input_buffer_offset;
145
+
146
+ /* The callback to the protocol handler to use (ascii or binary) */
147
+ process_data work;
148
+
149
+ /*
150
+ * Should the spool data discard the data to send or not? (aka noreply in
151
+ * the ascii protocol..
152
+ */
153
+ bool mute;
154
+
155
+ /* Members used by the binary protocol */
156
+ protocol_binary_request_header *current_command;
157
+
158
+ /* Members used by the ascii protocol */
159
+ enum ascii_cmd ascii_command;
160
+ };
161
+
162
+ #include "ascii_handler.h"
163
+ #include "binary_handler.h"
@@ -0,0 +1,26 @@
1
+ # vim:ft=automake
2
+ # included from Top Level Makefile.am
3
+ # All paths should be given relative to the root
4
+
5
+
6
+ lib_LTLIBRARIES+= libmemcached/libmemcachedprotocol.la
7
+ libmemcached_libmemcachedprotocol_la_SOURCES= \
8
+ libmemcached/byteorder.cc \
9
+ libmemcached/protocol/ascii_handler.c \
10
+ libmemcached/protocol/binary_handler.c \
11
+ libmemcached/protocol/cache.c \
12
+ libmemcached/protocol/pedantic.c \
13
+ libmemcached/protocol/protocol_handler.c
14
+
15
+ libmemcached_libmemcachedprotocol_la_CFLAGS= \
16
+ ${AM_CFLAGS} \
17
+ ${NO_CONVERSION} \
18
+ ${PTHREAD_CFLAGS} \
19
+ -DBUILDING_LIBMEMCACHED
20
+
21
+ libmemcached_libmemcachedprotocol_la_CXXFLAGS= \
22
+ ${AM_CXXFLAGS} \
23
+ ${PTHREAD_CFLAGS} \
24
+ -DBUILDING_LIBMEMCACHED
25
+
26
+ libmemcached_libmemcachedprotocol_la_LDFLAGS= ${AM_LDFLAGS} ${PTHREAD_LIBS} -version-info ${MEMCACHED_PROTOCAL_LIBRARY_VERSION}
@@ -0,0 +1,202 @@
1
+ /* -*- Mode: C; tab-width: 2; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
+ #include "libmemcached/protocol/common.h"
3
+
4
+ #include <sys/types.h>
5
+ #include <inttypes.h>
6
+
7
+ #define ensure(a) if (!(a)) { return false; }
8
+
9
+ bool memcached_binary_protocol_pedantic_check_request(const protocol_binary_request_header *request)
10
+ {
11
+ ensure(request->request.magic == PROTOCOL_BINARY_REQ);
12
+ ensure(request->request.datatype == PROTOCOL_BINARY_RAW_BYTES);
13
+
14
+ ensure(request->bytes[6] == 0);
15
+ ensure(request->bytes[7] == 0);
16
+
17
+ uint8_t opcode= request->request.opcode;
18
+ uint16_t keylen= ntohs(request->request.keylen);
19
+ uint8_t extlen= request->request.extlen;
20
+ uint32_t bodylen= ntohl(request->request.bodylen);
21
+
22
+ ensure(bodylen >= (keylen + extlen));
23
+
24
+ switch (opcode) {
25
+ case PROTOCOL_BINARY_CMD_GET:
26
+ case PROTOCOL_BINARY_CMD_GETK:
27
+ case PROTOCOL_BINARY_CMD_GETKQ:
28
+ case PROTOCOL_BINARY_CMD_GETQ:
29
+ ensure(extlen == 0);
30
+ ensure(keylen > 0);
31
+ ensure(keylen == bodylen);
32
+ ensure(request->request.cas == 0);
33
+ break;
34
+
35
+ case PROTOCOL_BINARY_CMD_ADD:
36
+ case PROTOCOL_BINARY_CMD_ADDQ:
37
+ /* it makes no sense to run add with a cas value */
38
+ ensure(request->request.cas == 0);
39
+ /* FALLTHROUGH */
40
+ case PROTOCOL_BINARY_CMD_SET:
41
+ case PROTOCOL_BINARY_CMD_SETQ:
42
+ case PROTOCOL_BINARY_CMD_REPLACE:
43
+ case PROTOCOL_BINARY_CMD_REPLACEQ:
44
+ ensure(keylen > 0);
45
+ ensure(extlen == 8);
46
+ break;
47
+
48
+ case PROTOCOL_BINARY_CMD_DELETE:
49
+ case PROTOCOL_BINARY_CMD_DELETEQ:
50
+ ensure(extlen == 0);
51
+ ensure(keylen > 0);
52
+ ensure(keylen == bodylen);
53
+ break;
54
+
55
+ case PROTOCOL_BINARY_CMD_INCREMENT:
56
+ case PROTOCOL_BINARY_CMD_INCREMENTQ:
57
+ case PROTOCOL_BINARY_CMD_DECREMENT:
58
+ case PROTOCOL_BINARY_CMD_DECREMENTQ:
59
+ ensure(extlen == 20);
60
+ ensure(keylen > 0);
61
+ ensure(keylen + extlen == bodylen);
62
+ break;
63
+
64
+ case PROTOCOL_BINARY_CMD_QUIT:
65
+ case PROTOCOL_BINARY_CMD_QUITQ:
66
+ case PROTOCOL_BINARY_CMD_NOOP:
67
+ case PROTOCOL_BINARY_CMD_VERSION:
68
+ ensure(extlen == 0);
69
+ ensure(keylen == 0);
70
+ ensure(bodylen == 0);
71
+ break;
72
+
73
+ case PROTOCOL_BINARY_CMD_FLUSH:
74
+ case PROTOCOL_BINARY_CMD_FLUSHQ:
75
+ ensure(extlen == 0 || extlen == 4);
76
+ ensure(keylen == 0);
77
+ ensure(bodylen == extlen);
78
+ break;
79
+
80
+ case PROTOCOL_BINARY_CMD_STAT:
81
+ ensure(extlen == 0);
82
+ /* May have key, but not value */
83
+ ensure(keylen == bodylen);
84
+ break;
85
+
86
+ case PROTOCOL_BINARY_CMD_APPEND:
87
+ case PROTOCOL_BINARY_CMD_APPENDQ:
88
+ case PROTOCOL_BINARY_CMD_PREPEND:
89
+ case PROTOCOL_BINARY_CMD_PREPENDQ:
90
+ ensure(extlen == 0);
91
+ ensure(keylen > 0);
92
+ break;
93
+ default:
94
+ /* Unknown command */
95
+ ;
96
+ }
97
+
98
+ return true;
99
+ }
100
+
101
+ bool memcached_binary_protocol_pedantic_check_response(const protocol_binary_request_header *request,
102
+ const protocol_binary_response_header *response)
103
+ {
104
+ ensure(response->response.magic == PROTOCOL_BINARY_RES);
105
+ ensure(response->response.datatype == PROTOCOL_BINARY_RAW_BYTES);
106
+ ensure(response->response.opaque == request->request.opaque);
107
+
108
+ uint16_t status= ntohs(response->response.status);
109
+ uint8_t opcode= response->response.opcode;
110
+
111
+ if (status == PROTOCOL_BINARY_RESPONSE_SUCCESS)
112
+ {
113
+ switch (opcode) {
114
+ case PROTOCOL_BINARY_CMD_ADDQ:
115
+ case PROTOCOL_BINARY_CMD_APPENDQ:
116
+ case PROTOCOL_BINARY_CMD_DECREMENTQ:
117
+ case PROTOCOL_BINARY_CMD_DELETEQ:
118
+ case PROTOCOL_BINARY_CMD_FLUSHQ:
119
+ case PROTOCOL_BINARY_CMD_INCREMENTQ:
120
+ case PROTOCOL_BINARY_CMD_PREPENDQ:
121
+ case PROTOCOL_BINARY_CMD_QUITQ:
122
+ case PROTOCOL_BINARY_CMD_REPLACEQ:
123
+ case PROTOCOL_BINARY_CMD_SETQ:
124
+ /* Quiet command shouldn't return on success */
125
+ return false;
126
+ default:
127
+ break;
128
+ }
129
+
130
+ switch (opcode) {
131
+ case PROTOCOL_BINARY_CMD_ADD:
132
+ case PROTOCOL_BINARY_CMD_REPLACE:
133
+ case PROTOCOL_BINARY_CMD_SET:
134
+ case PROTOCOL_BINARY_CMD_APPEND:
135
+ case PROTOCOL_BINARY_CMD_PREPEND:
136
+ ensure(response->response.keylen == 0);
137
+ ensure(response->response.extlen == 0);
138
+ ensure(response->response.bodylen == 0);
139
+ ensure(response->response.cas != 0);
140
+ break;
141
+ case PROTOCOL_BINARY_CMD_FLUSH:
142
+ case PROTOCOL_BINARY_CMD_NOOP:
143
+ case PROTOCOL_BINARY_CMD_QUIT:
144
+ case PROTOCOL_BINARY_CMD_DELETE:
145
+ ensure(response->response.keylen == 0);
146
+ ensure(response->response.extlen == 0);
147
+ ensure(response->response.bodylen == 0);
148
+ ensure(response->response.cas == 0);
149
+ break;
150
+
151
+ case PROTOCOL_BINARY_CMD_DECREMENT:
152
+ case PROTOCOL_BINARY_CMD_INCREMENT:
153
+ ensure(response->response.keylen == 0);
154
+ ensure(response->response.extlen == 0);
155
+ ensure(ntohl(response->response.bodylen) == 8);
156
+ ensure(response->response.cas != 0);
157
+ break;
158
+
159
+ case PROTOCOL_BINARY_CMD_STAT:
160
+ ensure(response->response.extlen == 0);
161
+ /* key and value exists in all packets except in the terminating */
162
+ ensure(response->response.cas == 0);
163
+ break;
164
+
165
+ case PROTOCOL_BINARY_CMD_VERSION:
166
+ ensure(response->response.keylen == 0);
167
+ ensure(response->response.extlen == 0);
168
+ ensure(response->response.bodylen != 0);
169
+ ensure(response->response.cas == 0);
170
+ break;
171
+
172
+ case PROTOCOL_BINARY_CMD_GET:
173
+ case PROTOCOL_BINARY_CMD_GETQ:
174
+ ensure(response->response.keylen == 0);
175
+ ensure(response->response.extlen == 4);
176
+ ensure(response->response.cas != 0);
177
+ break;
178
+
179
+ case PROTOCOL_BINARY_CMD_GETK:
180
+ case PROTOCOL_BINARY_CMD_GETKQ:
181
+ ensure(response->response.keylen != 0);
182
+ ensure(response->response.extlen == 4);
183
+ ensure(response->response.cas != 0);
184
+ break;
185
+
186
+ default:
187
+ /* Undefined command code */
188
+ break;
189
+ }
190
+ }
191
+ else
192
+ {
193
+ ensure(response->response.cas == 0);
194
+ ensure(response->response.extlen == 0);
195
+ if (opcode != PROTOCOL_BINARY_CMD_GETK)
196
+ {
197
+ ensure(response->response.keylen == 0);
198
+ }
199
+ }
200
+
201
+ return true;
202
+ }
@@ -0,0 +1,365 @@
1
+ /* -*- Mode: C; tab-width: 2; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
+ #include "libmemcached/protocol/common.h"
3
+
4
+ #include <stdlib.h>
5
+ #include <sys/types.h>
6
+ #include <errno.h>
7
+ #include <stdbool.h>
8
+ #include <string.h>
9
+ #include <strings.h>
10
+ #include <ctype.h>
11
+ #include <stdio.h>
12
+
13
+ /*
14
+ ** **********************************************************************
15
+ ** INTERNAL INTERFACE
16
+ ** **********************************************************************
17
+ */
18
+
19
+ /**
20
+ * The default function to receive data from the client. This function
21
+ * just wraps the recv function to receive from a socket.
22
+ * See man -s3socket recv for more information.
23
+ *
24
+ * @param cookie cookie indentifying a client, not used
25
+ * @param sock socket to read from
26
+ * @param buf the destination buffer
27
+ * @param nbytes the number of bytes to read
28
+ * @return the number of bytes transferred of -1 upon error
29
+ */
30
+ static ssize_t default_recv(const void *cookie,
31
+ memcached_socket_t sock,
32
+ void *buf,
33
+ size_t nbytes)
34
+ {
35
+ (void)cookie;
36
+ return recv(sock, buf, nbytes, 0);
37
+ }
38
+
39
+ /**
40
+ * The default function to send data to the server. This function
41
+ * just wraps the send function to send through a socket.
42
+ * See man -s3socket send for more information.
43
+ *
44
+ * @param cookie cookie indentifying a client, not used
45
+ * @param sock socket to send to
46
+ * @param buf the source buffer
47
+ * @param nbytes the number of bytes to send
48
+ * @return the number of bytes transferred of -1 upon error
49
+ */
50
+ static ssize_t default_send(const void *cookie,
51
+ memcached_socket_t fd,
52
+ const void *buf,
53
+ size_t nbytes)
54
+ {
55
+ (void)cookie;
56
+ return send(fd, buf, nbytes, 0);
57
+ }
58
+
59
+ /**
60
+ * Try to drain the output buffers without blocking
61
+ *
62
+ * @param client the client to drain
63
+ * @return false if an error occured (connection should be shut down)
64
+ * true otherwise (please note that there may be more data to
65
+ * left in the buffer to send)
66
+ */
67
+ static bool drain_output(struct memcached_protocol_client_st *client)
68
+ {
69
+ ssize_t len;
70
+
71
+ /* Do we have pending data to send? */
72
+ while (client->output != NULL)
73
+ {
74
+ len= client->root->send(client,
75
+ client->sock,
76
+ client->output->data + client->output->offset,
77
+ client->output->nbytes - client->output->offset);
78
+
79
+ if (len == -1)
80
+ {
81
+ if (get_socket_errno() == EWOULDBLOCK)
82
+ {
83
+ return true;
84
+ }
85
+ else if (get_socket_errno() != EINTR)
86
+ {
87
+ client->error= get_socket_errno();
88
+ return false;
89
+ }
90
+ }
91
+ else
92
+ {
93
+ client->output->offset += (size_t)len;
94
+ if (client->output->offset == client->output->nbytes)
95
+ {
96
+ /* This was the complete buffer */
97
+ struct chunk_st *old= client->output;
98
+ client->output= client->output->next;
99
+ if (client->output == NULL)
100
+ {
101
+ client->output_tail= NULL;
102
+ }
103
+ cache_free(client->root->buffer_cache, old);
104
+ }
105
+ }
106
+ }
107
+
108
+ return true;
109
+ }
110
+
111
+ /**
112
+ * Allocate an output buffer and chain it into the output list
113
+ *
114
+ * @param client the client that needs the buffer
115
+ * @return pointer to the new chunk if the allocation succeeds, NULL otherwise
116
+ */
117
+ static struct chunk_st *allocate_output_chunk(struct memcached_protocol_client_st *client)
118
+ {
119
+ struct chunk_st *ret= cache_alloc(client->root->buffer_cache);
120
+
121
+ if (ret == NULL)
122
+ {
123
+ return NULL;
124
+ }
125
+
126
+ ret->offset= ret->nbytes= 0;
127
+ ret->next= NULL;
128
+ ret->size= CHUNK_BUFFERSIZE;
129
+ ret->data= (void*)(ret + 1);
130
+ if (client->output == NULL)
131
+ {
132
+ client->output= client->output_tail= ret;
133
+ }
134
+ else
135
+ {
136
+ client->output_tail->next= ret;
137
+ client->output_tail= ret;
138
+ }
139
+
140
+ return ret;
141
+ }
142
+
143
+ /**
144
+ * Spool data into the send-buffer for a client.
145
+ *
146
+ * @param client the client to spool the data for
147
+ * @param data the data to spool
148
+ * @param length the number of bytes of data to spool
149
+ * @return PROTOCOL_BINARY_RESPONSE_SUCCESS if success,
150
+ * PROTOCOL_BINARY_RESPONSE_ENOMEM if we failed to allocate memory
151
+ */
152
+ static protocol_binary_response_status spool_output(struct memcached_protocol_client_st *client,
153
+ const void *data,
154
+ size_t length)
155
+ {
156
+ if (client->mute)
157
+ {
158
+ return PROTOCOL_BINARY_RESPONSE_SUCCESS;
159
+ }
160
+
161
+ size_t offset= 0;
162
+
163
+ struct chunk_st *chunk= client->output;
164
+ while (offset < length)
165
+ {
166
+ if (chunk == NULL || (chunk->size - chunk->nbytes) == 0)
167
+ {
168
+ if ((chunk= allocate_output_chunk(client)) == NULL)
169
+ {
170
+ return PROTOCOL_BINARY_RESPONSE_ENOMEM;
171
+ }
172
+ }
173
+
174
+ size_t bulk= length - offset;
175
+ if (bulk > chunk->size - chunk->nbytes)
176
+ {
177
+ bulk= chunk->size - chunk->nbytes;
178
+ }
179
+
180
+ memcpy(chunk->data + chunk->nbytes, data, bulk);
181
+ chunk->nbytes += bulk;
182
+ offset += bulk;
183
+ }
184
+
185
+ return PROTOCOL_BINARY_RESPONSE_SUCCESS;
186
+ }
187
+
188
+ /**
189
+ * Try to determine the protocol used on this connection.
190
+ * If the first byte contains the magic byte PROTOCOL_BINARY_REQ we should
191
+ * be using the binary protocol on the connection. I implemented the support
192
+ * for the ASCII protocol by wrapping into the simple interface (aka v1),
193
+ * so the implementors needs to provide an implementation of that interface
194
+ *
195
+ */
196
+ static memcached_protocol_event_t determine_protocol(struct memcached_protocol_client_st *client, ssize_t *length, void **endptr)
197
+ {
198
+ if (*client->root->input_buffer == (uint8_t)PROTOCOL_BINARY_REQ)
199
+ {
200
+ client->work= memcached_binary_protocol_process_data;
201
+ }
202
+ else if (client->root->callback->interface_version == 1)
203
+ {
204
+ /*
205
+ * The ASCII protocol can only be used if the implementors provide
206
+ * an implementation for the version 1 of the interface..
207
+ *
208
+ * @todo I should allow the implementors to provide an implementation
209
+ * for version 0 and 1 at the same time and set the preferred
210
+ * interface to use...
211
+ */
212
+ client->work= memcached_ascii_protocol_process_data;
213
+ }
214
+ else
215
+ {
216
+ /* Let's just output a warning the way it is supposed to look like
217
+ * in the ASCII protocol...
218
+ */
219
+ const char *err= "CLIENT_ERROR: Unsupported protocol\r\n";
220
+ client->root->spool(client, err, strlen(err));
221
+ client->root->drain(client);
222
+ return MEMCACHED_PROTOCOL_ERROR_EVENT; /* Unsupported protocol */
223
+ }
224
+
225
+ return client->work(client, length, endptr);
226
+ }
227
+
228
+ /*
229
+ ** **********************************************************************
230
+ ** * PUBLIC INTERFACE
231
+ ** * See protocol_handler.h for function description
232
+ ** **********************************************************************
233
+ */
234
+ struct memcached_protocol_st *memcached_protocol_create_instance(void)
235
+ {
236
+ struct memcached_protocol_st *ret= calloc(1, sizeof(*ret));
237
+ if (ret != NULL)
238
+ {
239
+ ret->recv= default_recv;
240
+ ret->send= default_send;
241
+ ret->drain= drain_output;
242
+ ret->spool= spool_output;
243
+ ret->input_buffer_size= 1 * 1024 * 1024;
244
+ ret->input_buffer= malloc(ret->input_buffer_size);
245
+ if (ret->input_buffer == NULL)
246
+ {
247
+ free(ret);
248
+ ret= NULL;
249
+ return NULL;
250
+ }
251
+
252
+ ret->buffer_cache= cache_create("protocol_handler",
253
+ CHUNK_BUFFERSIZE + sizeof(struct chunk_st),
254
+ 0, NULL, NULL);
255
+ if (ret->buffer_cache == NULL)
256
+ {
257
+ free(ret->input_buffer);
258
+ free(ret);
259
+ }
260
+ }
261
+
262
+ return ret;
263
+ }
264
+
265
+ void memcached_protocol_destroy_instance(struct memcached_protocol_st *instance)
266
+ {
267
+ cache_destroy(instance->buffer_cache);
268
+ free(instance->input_buffer);
269
+ free(instance);
270
+ }
271
+
272
+ struct memcached_protocol_client_st *memcached_protocol_create_client(struct memcached_protocol_st *instance, memcached_socket_t sock)
273
+ {
274
+ struct memcached_protocol_client_st *ret= calloc(1, sizeof(*ret));
275
+ if (ret != NULL)
276
+ {
277
+ ret->root= instance;
278
+ ret->sock= sock;
279
+ ret->work= determine_protocol;
280
+ }
281
+
282
+ return ret;
283
+ }
284
+
285
+ void memcached_protocol_client_destroy(struct memcached_protocol_client_st *client)
286
+ {
287
+ free(client);
288
+ }
289
+
290
+ memcached_protocol_event_t memcached_protocol_client_work(struct memcached_protocol_client_st *client)
291
+ {
292
+ /* Try to send data and read from the socket */
293
+ bool more_data= true;
294
+ do
295
+ {
296
+ ssize_t len= client->root->recv(client,
297
+ client->sock,
298
+ client->root->input_buffer + client->input_buffer_offset,
299
+ client->root->input_buffer_size - client->input_buffer_offset);
300
+
301
+ if (len > 0)
302
+ {
303
+ /* Do we have the complete packet? */
304
+ if (client->input_buffer_offset > 0)
305
+ {
306
+ memcpy(client->root->input_buffer, client->input_buffer,
307
+ client->input_buffer_offset);
308
+ len += (ssize_t)client->input_buffer_offset;
309
+
310
+ /* @todo use buffer-cache! */
311
+ free(client->input_buffer);
312
+ client->input_buffer_offset= 0;
313
+ }
314
+
315
+ void *endptr;
316
+ memcached_protocol_event_t events= client->work(client, &len, &endptr);
317
+ if (events == MEMCACHED_PROTOCOL_ERROR_EVENT)
318
+ {
319
+ return MEMCACHED_PROTOCOL_ERROR_EVENT;
320
+ }
321
+
322
+ if (len > 0)
323
+ {
324
+ /* save the data for later on */
325
+ /* @todo use buffer-cache */
326
+ client->input_buffer= malloc((size_t)len);
327
+ if (client->input_buffer == NULL)
328
+ {
329
+ client->error= ENOMEM;
330
+ return MEMCACHED_PROTOCOL_ERROR_EVENT;
331
+ }
332
+ memcpy(client->input_buffer, endptr, (size_t)len);
333
+ client->input_buffer_offset= (size_t)len;
334
+ more_data= false;
335
+ }
336
+ }
337
+ else if (len == 0)
338
+ {
339
+ /* Connection closed */
340
+ drain_output(client);
341
+ return MEMCACHED_PROTOCOL_ERROR_EVENT;
342
+ }
343
+ else
344
+ {
345
+ if (get_socket_errno() != EWOULDBLOCK)
346
+ {
347
+ client->error= get_socket_errno();
348
+ /* mark this client as terminated! */
349
+ return MEMCACHED_PROTOCOL_ERROR_EVENT;
350
+ }
351
+ more_data= false;
352
+ }
353
+ } while (more_data);
354
+
355
+ if (!drain_output(client))
356
+ {
357
+ return MEMCACHED_PROTOCOL_ERROR_EVENT;
358
+ }
359
+
360
+ memcached_protocol_event_t ret= MEMCACHED_PROTOCOL_READ_EVENT;
361
+ if (client->output)
362
+ ret|= MEMCACHED_PROTOCOL_READ_EVENT;
363
+
364
+ return ret;
365
+ }