couchbase-memcached 1.2.8

Sign up to get free protection for your applications and to get access to all the features.
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,60 @@
1
+ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
+ *
3
+ * Libmemcached library
4
+ *
5
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
+ * 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
+ #include <cstdlib>
41
+ #include <arpa/inet.h>
42
+
43
+ struct server_t
44
+ {
45
+ in_port_t port;
46
+ uint32_t weight;
47
+ const char *c_str;
48
+ size_t size;
49
+ };
50
+
51
+ #if 0
52
+ #include <iostream>
53
+ inline std::ostream& operator<<(std::ostream& output, const server_t& arg)
54
+ {
55
+ output.write(arg.c_str, arg.size);
56
+ output << ':' << arg.port;
57
+ output << '+' << arg.weight;
58
+ return output;
59
+ }
60
+ #endif
@@ -0,0 +1,57 @@
1
+ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
+ *
3
+ * Libmemcached library
4
+ *
5
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
+ * 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
+ #include <libmemcached/basic_string.h>
41
+ #include <libmemcached/constants.h>
42
+ #include <libmemcached/options/server.h>
43
+
44
+ union YYSTYPE
45
+ {
46
+ long long number;
47
+ memcached_string_t string;
48
+ memcached_string_t option;
49
+ double double_number;
50
+ memcached_server_distribution_t distribution;
51
+ memcached_hash_t hash;
52
+ memcached_behavior_t behavior;
53
+ bool boolean;
54
+ server_t server;
55
+ };
56
+
57
+ typedef union YYSTYPE YYSTYPE;
@@ -0,0 +1,110 @@
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
+ /*
39
+ I debated about putting this in the client library since it does an
40
+ action I don't really believe belongs in the library.
41
+
42
+ Frankly its too damn useful not to be here though.
43
+ */
44
+
45
+ #include <libmemcached/common.h>
46
+
47
+ memcached_server_list_st memcached_servers_parse(const char *server_strings)
48
+ {
49
+ char *string;
50
+ const char *begin_ptr;
51
+ const char *end_ptr;
52
+ memcached_server_st *servers= NULL;
53
+ memcached_return_t rc;
54
+
55
+ WATCHPOINT_ASSERT(server_strings);
56
+
57
+ end_ptr= server_strings + strlen(server_strings);
58
+
59
+ for (begin_ptr= server_strings, string= (char *)index(server_strings, ',');
60
+ begin_ptr != end_ptr;
61
+ string= (char *)index(begin_ptr, ','))
62
+ {
63
+ char buffer[HUGE_STRING_LEN];
64
+ char *ptr, *ptr2;
65
+ uint32_t weight= 0;
66
+
67
+ if (string)
68
+ {
69
+ memcpy(buffer, begin_ptr, (size_t) (string - begin_ptr));
70
+ buffer[(unsigned int)(string - begin_ptr)]= 0;
71
+ begin_ptr= string+1;
72
+ }
73
+ else
74
+ {
75
+ size_t length= strlen(begin_ptr);
76
+ memcpy(buffer, begin_ptr, length);
77
+ buffer[length]= 0;
78
+ begin_ptr= end_ptr;
79
+ }
80
+
81
+ ptr= index(buffer, ':');
82
+
83
+ in_port_t port= 0;
84
+ if (ptr)
85
+ {
86
+ ptr[0]= 0;
87
+
88
+ ptr++;
89
+
90
+ port= (in_port_t) strtoul(ptr, (char **)NULL, 10);
91
+
92
+ ptr2= index(ptr, ' ');
93
+ if (! ptr2)
94
+ ptr2= index(ptr, ':');
95
+
96
+ if (ptr2)
97
+ {
98
+ ptr2++;
99
+ weight = (uint32_t) strtoul(ptr2, (char **)NULL, 10);
100
+ }
101
+ }
102
+
103
+ servers= memcached_server_list_append_with_weight(servers, buffer, port, weight, &rc);
104
+
105
+ if (isspace(*begin_ptr))
106
+ begin_ptr++;
107
+ }
108
+
109
+ return servers;
110
+ }
@@ -0,0 +1,23 @@
1
+ /* LibMemcached
2
+ * Copyright (C) 2010 Brian Aker
3
+ * All rights reserved.
4
+ *
5
+ * Use and distribution licensed under the BSD license. See
6
+ * the COPYING file in the parent directory for full text.
7
+ *
8
+ * Summary: Work with fetching results
9
+ *
10
+ */
11
+
12
+ #pragma once
13
+
14
+ #ifdef __cplusplus
15
+ extern "C" {
16
+ #endif
17
+
18
+ LIBMEMCACHED_API
19
+ memcached_server_list_st memcached_servers_parse(const char *server_strings);
20
+
21
+ #ifdef __cplusplus
22
+ }
23
+ #endif
@@ -0,0 +1,56 @@
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, Trond Norbye All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are
10
+ * met:
11
+ *
12
+ * * Redistributions of source code must retain the above copyright
13
+ * notice, this list of conditions and the following disclaimer.
14
+ *
15
+ * * Redistributions in binary form must reproduce the above
16
+ * copyright notice, this list of conditions and the following disclaimer
17
+ * in the documentation and/or other materials provided with the
18
+ * distribution.
19
+ *
20
+ * * The names of its contributors may not be used to endorse or
21
+ * promote products derived from this software without specific prior
22
+ * written permission.
23
+ *
24
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+ *
36
+ */
37
+
38
+ #pragma once
39
+
40
+
41
+ #ifdef WIN32
42
+
43
+ #include <winsock2.h>
44
+ #include <ws2tcpip.h>
45
+ typedef short in_port_t;
46
+ typedef SOCKET memcached_socket_t;
47
+ #else
48
+ typedef int memcached_socket_t;
49
+ #include <sys/socket.h>
50
+ #include <netinet/in.h>
51
+ #include <arpa/inet.h>
52
+ #include <netdb.h>
53
+ #include <sys/un.h>
54
+ #include <netinet/tcp.h>
55
+
56
+ #endif /* WIN32 */
@@ -0,0 +1,65 @@
1
+ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
+ *
3
+ * Libmemcached library
4
+ *
5
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are
10
+ * met:
11
+ *
12
+ * * Redistributions of source code must retain the above copyright
13
+ * notice, this list of conditions and the following disclaimer.
14
+ *
15
+ * * Redistributions in binary form must reproduce the above
16
+ * copyright notice, this list of conditions and the following disclaimer
17
+ * in the documentation and/or other materials provided with the
18
+ * distribution.
19
+ *
20
+ * * The names of its contributors may not be used to endorse or
21
+ * promote products derived from this software without specific prior
22
+ * written permission.
23
+ *
24
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+ *
36
+ */
37
+
38
+ #include <libmemcached/common.h>
39
+
40
+ memcached_return_t memcached_set_prefix_key(memcached_st *self, const char *key, size_t key_length)
41
+ {
42
+ WATCHPOINT_ASSERT(self);
43
+
44
+ if (key and key_length)
45
+ {
46
+ if (memcached_key_test((const char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)
47
+ return memcached_set_error(*self, MEMCACHED_BAD_KEY_PROVIDED, MEMCACHED_AT);
48
+
49
+ if ((key_length > MEMCACHED_PREFIX_KEY_MAX_SIZE -1))
50
+ return memcached_set_error(*self, MEMCACHED_KEY_TOO_BIG, MEMCACHED_AT);
51
+
52
+ memcached_array_free(self->prefix_key);
53
+ self->prefix_key= memcached_strcpy(self, key, key_length);
54
+
55
+ if (not self->prefix_key)
56
+ return memcached_set_error(*self, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT);
57
+ }
58
+ else
59
+ {
60
+ memcached_array_free(self->prefix_key);
61
+ self->prefix_key= NULL;
62
+ }
63
+
64
+ return MEMCACHED_SUCCESS;
65
+ }
@@ -0,0 +1,49 @@
1
+ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
+ *
3
+ * Libmemcached library
4
+ *
5
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are
10
+ * met:
11
+ *
12
+ * * Redistributions of source code must retain the above copyright
13
+ * notice, this list of conditions and the following disclaimer.
14
+ *
15
+ * * Redistributions in binary form must reproduce the above
16
+ * copyright notice, this list of conditions and the following disclaimer
17
+ * in the documentation and/or other materials provided with the
18
+ * distribution.
19
+ *
20
+ * * The names of its contributors may not be used to endorse or
21
+ * promote products derived from this software without specific prior
22
+ * written permission.
23
+ *
24
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+ *
36
+ */
37
+
38
+ #pragma once
39
+
40
+ #ifdef __cplusplus
41
+ extern "C" {
42
+ #endif
43
+
44
+ LIBMEMCACHED_LOCAL
45
+ memcached_return_t memcached_set_prefix_key(memcached_st *self, const char *str, size_t length);
46
+
47
+ #ifdef __cplusplus
48
+ }
49
+ #endif
@@ -0,0 +1,963 @@
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 "config.h"
38
+
39
+ #include <libmemcached/protocol/common.h>
40
+ #include <libmemcached/byteorder.h>
41
+
42
+ #include <ctype.h>
43
+ #include <stdio.h>
44
+ #include <stdlib.h>
45
+ #include <string.h>
46
+
47
+ /**
48
+ * Try to parse a key from the string.
49
+ * @pointer start pointer to a pointer to the string (IN and OUT)
50
+ * @return length of the string of -1 if this was an illegal key (invalid
51
+ * characters or invalid length)
52
+ * @todo add length!
53
+ */
54
+ static uint16_t parse_ascii_key(char **start)
55
+ {
56
+ uint16_t len= 0;
57
+ char *c= *start;
58
+ /* Strip leading whitespaces */
59
+ while (isspace(*c))
60
+ {
61
+ ++c;
62
+ }
63
+
64
+ *start= c;
65
+
66
+ while (*c != '\0' && !isspace(*c) && !iscntrl(*c))
67
+ {
68
+ ++c;
69
+ ++len;
70
+ }
71
+
72
+
73
+ if (len == 0 || len > 240 || (*c != '\0' && *c != '\r' && iscntrl(*c)))
74
+ {
75
+ return 0;
76
+ }
77
+
78
+ return len;
79
+ }
80
+
81
+ /**
82
+ * Spool a zero-terminated string
83
+ * @param client destination
84
+ * @param text the text to spool
85
+ * @return status of the spool operation
86
+ */
87
+ static protocol_binary_response_status
88
+ spool_string(memcached_protocol_client_st *client, const char *text)
89
+ {
90
+ return client->root->spool(client, text, strlen(text));
91
+ }
92
+
93
+ /**
94
+ * Send a "CLIENT_ERROR" message back to the client with the correct
95
+ * format of the command being sent
96
+ * @param client the client to send the message to
97
+ */
98
+ static void send_command_usage(memcached_protocol_client_st *client)
99
+ {
100
+ const char *errmsg[]= {
101
+ [GET_CMD]= "CLIENT_ERROR: Syntax error: get <key>*\r\n",
102
+ [GETS_CMD]= "CLIENT_ERROR: Syntax error: gets <key>*\r\n",
103
+ [SET_CMD]= "CLIENT_ERROR: Syntax error: set <key> <flags> <exptime> <bytes> [noreply]\r\n",
104
+ [ADD_CMD]= "CLIENT_ERROR: Syntax error: add <key> <flags> <exptime> <bytes> [noreply]\r\n",
105
+ [REPLACE_CMD]= "CLIENT_ERROR: Syntax error: replace <key> <flags> <exptime> <bytes> [noreply]\r\n",
106
+ [CAS_CMD]= "CLIENT_ERROR: Syntax error: cas <key> <flags> <exptime> <bytes> <casid> [noreply]\r\n",
107
+ [APPEND_CMD]= "CLIENT_ERROR: Syntax error: append <key> <flags> <exptime> <bytes> [noreply]\r\n",
108
+ [PREPEND_CMD]= "CLIENT_ERROR: Syntax error: prepend <key> <flags> <exptime> <bytes> [noreply]\r\n",
109
+ [DELETE_CMD]= "CLIENT_ERROR: Syntax error: delete <key> [noreply]\r\n",
110
+ [INCR_CMD]= "CLIENT_ERROR: Syntax error: incr <key> <value> [noreply]\r\n",
111
+ [DECR_CMD]= "CLIENT_ERROR: Syntax error: decr <key> <value> [noreply]\r\n",
112
+ [STATS_CMD]= "CLIENT_ERROR: Syntax error: stats [key]\r\n",
113
+ [FLUSH_ALL_CMD]= "CLIENT_ERROR: Syntax error: flush_all [timeout] [noreply]\r\n",
114
+ [VERSION_CMD]= "CLIENT_ERROR: Syntax error: version\r\n",
115
+ [QUIT_CMD]="CLIENT_ERROR: Syntax error: quit\r\n",
116
+
117
+ [VERBOSITY_CMD]= "CLIENT_ERROR: Syntax error: verbosity <num>\r\n",
118
+ [UNKNOWN_CMD]= "CLIENT_ERROR: Unknown command\r\n",
119
+ };
120
+
121
+ client->mute = false;
122
+ spool_string(client, errmsg[client->ascii_command]);
123
+ }
124
+
125
+ /**
126
+ * Callback for the VERSION responses
127
+ * @param cookie client identifier
128
+ * @param text the length of the body
129
+ * @param textlen the length of the body
130
+ */
131
+ static protocol_binary_response_status
132
+ ascii_version_response_handler(const void *cookie,
133
+ const void *text,
134
+ uint32_t textlen)
135
+ {
136
+ memcached_protocol_client_st *client= (memcached_protocol_client_st*)cookie;
137
+ spool_string(client, "VERSION ");
138
+ client->root->spool(client, text, textlen);
139
+ spool_string(client, "\r\n");
140
+ return PROTOCOL_BINARY_RESPONSE_SUCCESS;
141
+ }
142
+
143
+ /**
144
+ * Callback for the GET/GETQ/GETK and GETKQ responses
145
+ * @param cookie client identifier
146
+ * @param key the key for the item
147
+ * @param keylen the length of the key
148
+ * @param body the length of the body
149
+ * @param bodylen the length of the body
150
+ * @param flags the flags for the item
151
+ * @param cas the CAS id for the item
152
+ */
153
+ static protocol_binary_response_status
154
+ ascii_get_response_handler(const void *cookie,
155
+ const void *key,
156
+ uint16_t keylen,
157
+ const void *body,
158
+ uint32_t bodylen,
159
+ uint32_t flags,
160
+ uint64_t cas)
161
+ {
162
+ memcached_protocol_client_st *client= (void*)cookie;
163
+ char buffer[300];
164
+ strcpy(buffer, "VALUE ");
165
+ const char *source= key;
166
+ char *dest= buffer + 6;
167
+
168
+ for (int x= 0; x < keylen; ++x)
169
+ {
170
+ if (*source != '\0' && !isspace(*source) && !iscntrl(*source))
171
+ {
172
+ *dest= *source;
173
+ }
174
+ else
175
+ {
176
+ return PROTOCOL_BINARY_RESPONSE_EINVAL; /* key constraints in ascii */
177
+ }
178
+
179
+ ++dest;
180
+ ++source;
181
+ }
182
+
183
+ size_t used= (size_t)(dest - buffer);
184
+
185
+ if (client->ascii_command == GETS_CMD)
186
+ {
187
+ snprintf(dest, sizeof(buffer) - used, " %u %u %" PRIu64 "\r\n", flags,
188
+ bodylen, cas);
189
+ }
190
+ else
191
+ {
192
+ snprintf(dest, sizeof(buffer) - used, " %u %u\r\n", flags, bodylen);
193
+ }
194
+
195
+ client->root->spool(client, buffer, strlen(buffer));
196
+ client->root->spool(client, body, bodylen);
197
+ client->root->spool(client, "\r\n", 2);
198
+
199
+ return PROTOCOL_BINARY_RESPONSE_SUCCESS;
200
+ }
201
+
202
+ /**
203
+ * Callback for the STAT responses
204
+ * @param cookie client identifier
205
+ * @param key the key for the item
206
+ * @param keylen the length of the key
207
+ * @param body the length of the body
208
+ * @param bodylen the length of the body
209
+ */
210
+ static protocol_binary_response_status
211
+ ascii_stat_response_handler(const void *cookie,
212
+ const void *key,
213
+ uint16_t keylen,
214
+ const void *body,
215
+ uint32_t bodylen)
216
+ {
217
+
218
+ memcached_protocol_client_st *client= (void*)cookie;
219
+
220
+ if (key != NULL)
221
+ {
222
+ spool_string(client, "STAT ");
223
+ client->root->spool(client, key, keylen);
224
+ spool_string(client, " ");
225
+ client->root->spool(client, body, bodylen);
226
+ spool_string(client, "\r\n");
227
+ }
228
+ else
229
+ {
230
+ spool_string(client, "END\r\n");
231
+ }
232
+
233
+ return PROTOCOL_BINARY_RESPONSE_SUCCESS;
234
+ }
235
+
236
+ /**
237
+ * Process a get or a gets request.
238
+ * @param client the client handle
239
+ * @param buffer the complete get(s) command
240
+ * @param end the last character in the command
241
+ */
242
+ static void ascii_process_gets(memcached_protocol_client_st *client,
243
+ char *buffer, char *end)
244
+ {
245
+ char *key= buffer;
246
+
247
+ /* Skip command */
248
+ key += (client->ascii_command == GETS_CMD) ? 5 : 4;
249
+
250
+ int num_keys= 0;
251
+ while (key < end)
252
+ {
253
+ uint16_t nkey= parse_ascii_key(&key);
254
+ if (nkey == 0) /* Invalid key... stop processing this line */
255
+ {
256
+ break;
257
+ }
258
+
259
+ (void)client->root->callback->interface.v1.get(client, key, nkey,
260
+ ascii_get_response_handler);
261
+ key += nkey;
262
+ ++num_keys;
263
+ }
264
+
265
+ if (num_keys == 0)
266
+ {
267
+ send_command_usage(client);
268
+ }
269
+ else
270
+ client->root->spool(client, "END\r\n", 5);
271
+ }
272
+
273
+ /**
274
+ * Try to split up the command line "asdf asdf asdf asdf\n" into an
275
+ * argument vector for easier parsing.
276
+ * @param start the first character in the command line
277
+ * @param end the last character in the command line ("\n")
278
+ * @param vec the vector to insert the pointers into
279
+ * @size the number of elements in the vector
280
+ * @return the number of tokens in the vector
281
+ */
282
+ static int ascii_tokenize_command(char *str, char *end, char **vec, int size)
283
+ {
284
+ int elem= 0;
285
+
286
+ while (str < end)
287
+ {
288
+ /* Skip leading blanks */
289
+ while (str < end && isspace(*str))
290
+ {
291
+ ++str;
292
+ }
293
+
294
+ if (str == end)
295
+ {
296
+ return elem;
297
+ }
298
+
299
+ vec[elem++]= str;
300
+ /* find the next non-blank field */
301
+ while (str < end && !isspace(*str))
302
+ {
303
+ ++str;
304
+ }
305
+
306
+ /* zero-terminate it for easier parsing later on */
307
+ *str= '\0';
308
+ ++str;
309
+
310
+ /* Is the vector full? */
311
+ if (elem == size)
312
+ {
313
+ break;
314
+ }
315
+ }
316
+
317
+ return elem;
318
+ }
319
+
320
+ /**
321
+ * If we for some reasons needs to push the line back to read more
322
+ * data we have to reverse the tokenization. Just do the brain-dead replace
323
+ * of all '\0' to ' ' and set the last character to '\n'. We could have used
324
+ * the vector we created, but then we would have to search for all of the
325
+ * spaces we ignored...
326
+ * @param start pointer to the first character in the buffer to recover
327
+ * @param end pointer to the last character in the buffer to recover
328
+ */
329
+ static void recover_tokenize_command(char *start, char *end)
330
+ {
331
+ while (start < end)
332
+ {
333
+ if (*start == '\0')
334
+ *start= ' ';
335
+ ++start;
336
+ }
337
+
338
+ *end= '\n';
339
+ }
340
+
341
+ /**
342
+ * Convert the textual command into a comcode
343
+ */
344
+ static enum ascii_cmd ascii_to_cmd(char *start, size_t length)
345
+ {
346
+ struct {
347
+ const char *cmd;
348
+ size_t len;
349
+ enum ascii_cmd cc;
350
+ } commands[]= {
351
+ { .cmd= "get", .len= 3, .cc= GET_CMD },
352
+ { .cmd= "gets", .len= 4, .cc= GETS_CMD },
353
+ { .cmd= "set", .len= 3, .cc= SET_CMD },
354
+ { .cmd= "add", .len= 3, .cc= ADD_CMD },
355
+ { .cmd= "replace", .len= 7, .cc= REPLACE_CMD },
356
+ { .cmd= "cas", .len= 3, .cc= CAS_CMD },
357
+ { .cmd= "append", .len= 6, .cc= APPEND_CMD },
358
+ { .cmd= "prepend", .len= 7, .cc= PREPEND_CMD },
359
+ { .cmd= "delete", .len= 6, .cc= DELETE_CMD },
360
+ { .cmd= "incr", .len= 4, .cc= INCR_CMD },
361
+ { .cmd= "decr", .len= 4, .cc= DECR_CMD },
362
+ { .cmd= "stats", .len= 5, .cc= STATS_CMD },
363
+ { .cmd= "flush_all", .len= 9, .cc= FLUSH_ALL_CMD },
364
+ { .cmd= "version", .len= 7, .cc= VERSION_CMD },
365
+ { .cmd= "quit", .len= 4, .cc= QUIT_CMD },
366
+ { .cmd= "verbosity", .len= 9, .cc= VERBOSITY_CMD },
367
+ { .cmd= NULL, .len= 0, .cc= UNKNOWN_CMD }};
368
+
369
+ int x= 0;
370
+ while (commands[x].len > 0) {
371
+ if (length >= commands[x].len)
372
+ {
373
+ if (strncmp(start, commands[x].cmd, commands[x].len) == 0)
374
+ {
375
+ /* Potential hit */
376
+ if (length == commands[x].len || isspace(*(start + commands[x].len)))
377
+ {
378
+ return commands[x].cc;
379
+ }
380
+ }
381
+ }
382
+ ++x;
383
+ }
384
+
385
+ return UNKNOWN_CMD;
386
+ }
387
+
388
+ /**
389
+ * Perform a delete operation.
390
+ *
391
+ * @param client client requesting the deletion
392
+ * @param tokens the command as a vector
393
+ * @param ntokens the number of items in the vector
394
+ */
395
+ static void process_delete(memcached_protocol_client_st *client,
396
+ char **tokens, int ntokens)
397
+ {
398
+ char *key= tokens[1];
399
+ uint16_t nkey;
400
+
401
+ if (ntokens != 2 || (nkey= parse_ascii_key(&key)) == 0)
402
+ {
403
+ send_command_usage(client);
404
+ return;
405
+ }
406
+
407
+ if (client->root->callback->interface.v1.delete == NULL)
408
+ {
409
+ spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
410
+ return;
411
+ }
412
+
413
+ protocol_binary_response_status rval;
414
+ rval= client->root->callback->interface.v1.delete(client, key, nkey, 0);
415
+
416
+ if (rval == PROTOCOL_BINARY_RESPONSE_SUCCESS)
417
+ {
418
+ spool_string(client, "DELETED\r\n");
419
+ }
420
+ else if (rval == PROTOCOL_BINARY_RESPONSE_KEY_ENOENT)
421
+ {
422
+ spool_string(client, "NOT_FOUND\r\n");
423
+ }
424
+ else
425
+ {
426
+ char msg[80];
427
+ snprintf(msg, sizeof(msg), "SERVER_ERROR: delete failed %u\r\n",(uint32_t)rval);
428
+ spool_string(client, msg);
429
+ }
430
+ }
431
+
432
+ static void process_arithmetic(memcached_protocol_client_st *client,
433
+ char **tokens, int ntokens)
434
+ {
435
+ char *key= tokens[1];
436
+ uint16_t nkey;
437
+
438
+ if (ntokens != 3 || (nkey= parse_ascii_key(&key)) == 0)
439
+ {
440
+ send_command_usage(client);
441
+ return;
442
+ }
443
+
444
+ uint64_t cas;
445
+ uint64_t result;
446
+ uint64_t delta= strtoull(tokens[2], NULL, 10);
447
+
448
+ protocol_binary_response_status rval;
449
+ if (client->ascii_command == INCR_CMD)
450
+ {
451
+ if (client->root->callback->interface.v1.increment == NULL)
452
+ {
453
+ spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
454
+ return;
455
+ }
456
+ rval= client->root->callback->interface.v1.increment(client,
457
+ key, nkey,
458
+ delta, 0,
459
+ 0,
460
+ &result,
461
+ &cas);
462
+ }
463
+ else
464
+ {
465
+ if (client->root->callback->interface.v1.decrement == NULL)
466
+ {
467
+ spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
468
+ return;
469
+ }
470
+ rval= client->root->callback->interface.v1.decrement(client,
471
+ key, nkey,
472
+ delta, 0,
473
+ 0,
474
+ &result,
475
+ &cas);
476
+ }
477
+
478
+ if (rval == PROTOCOL_BINARY_RESPONSE_SUCCESS)
479
+ {
480
+ char buffer[80];
481
+ snprintf(buffer, sizeof(buffer), "%"PRIu64"\r\n", result);
482
+ spool_string(client, buffer);
483
+ }
484
+ else
485
+ {
486
+ spool_string(client, "NOT_FOUND\r\n");
487
+ }
488
+ }
489
+
490
+ /**
491
+ * Process the stats command (with or without a key specified)
492
+ * @param key pointer to the first character after "stats"
493
+ * @param end pointer to the "\n"
494
+ */
495
+ static void process_stats(memcached_protocol_client_st *client,
496
+ char *key, char *end)
497
+ {
498
+ if (client->root->callback->interface.v1.stat == NULL)
499
+ {
500
+ spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
501
+ return;
502
+ }
503
+
504
+ while (isspace(*key))
505
+ key++;
506
+
507
+ uint16_t nkey= (uint16_t)(end - key);
508
+ (void)client->root->callback->interface.v1.stat(client, key, nkey,
509
+ ascii_stat_response_handler);
510
+ }
511
+
512
+ static void process_version(memcached_protocol_client_st *client,
513
+ char **tokens, int ntokens)
514
+ {
515
+ (void)tokens;
516
+ if (ntokens != 1)
517
+ {
518
+ send_command_usage(client);
519
+ return;
520
+ }
521
+
522
+ if (client->root->callback->interface.v1.version == NULL)
523
+ {
524
+ spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
525
+ return;
526
+ }
527
+
528
+ client->root->callback->interface.v1.version(client,
529
+ ascii_version_response_handler);
530
+ }
531
+
532
+ static void process_flush(memcached_protocol_client_st *client,
533
+ char **tokens, int ntokens)
534
+ {
535
+ if (ntokens > 2)
536
+ {
537
+ send_command_usage(client);
538
+ return;
539
+ }
540
+
541
+ if (client->root->callback->interface.v1.flush == NULL)
542
+ {
543
+ spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
544
+ return;
545
+ }
546
+
547
+ uint32_t timeout= 0;
548
+ if (ntokens == 2)
549
+ {
550
+ timeout= (uint32_t)strtoul(tokens[1], NULL, 10);
551
+ }
552
+
553
+ protocol_binary_response_status rval;
554
+ rval= client->root->callback->interface.v1.flush(client, timeout);
555
+ if (rval == PROTOCOL_BINARY_RESPONSE_SUCCESS)
556
+ spool_string(client, "OK\r\n");
557
+ else
558
+ spool_string(client, "SERVER_ERROR: internal error\r\n");
559
+ }
560
+
561
+ /**
562
+ * Process one of the storage commands
563
+ * @param client the client performing the operation
564
+ * @param tokens the command tokens
565
+ * @param ntokens the number of tokens
566
+ * @param start pointer to the first character in the line
567
+ * @param end pointer to the pointer where the last character of this
568
+ * command is (IN and OUT)
569
+ * @param length the number of bytes available
570
+ * @return -1 if an error occurs (and we should just terminate the connection
571
+ * because we are out of sync)
572
+ * 0 storage command completed, continue processing
573
+ * 1 We need more data, so just go ahead and wait for more!
574
+ */
575
+ static inline int process_storage_command(memcached_protocol_client_st *client,
576
+ char **tokens, int ntokens, char *start,
577
+ char **end, ssize_t length)
578
+ {
579
+ (void)ntokens; /* already checked */
580
+ char *key= tokens[1];
581
+ uint16_t nkey= parse_ascii_key(&key);
582
+ if (nkey == 0)
583
+ {
584
+ /* return error */
585
+ spool_string(client, "CLIENT_ERROR: bad key\r\n");
586
+ return -1;
587
+ }
588
+
589
+ uint32_t flags= (uint32_t)strtoul(tokens[2], NULL, 10);
590
+ uint32_t timeout= (uint32_t)strtoul(tokens[3], NULL, 10);
591
+ unsigned long nbytes= strtoul(tokens[4], NULL, 10);
592
+
593
+ /* Do we have all data? */
594
+ unsigned long need= nbytes + (unsigned long)((*end - start) + 1) + 2; /* \n\r\n */
595
+ if ((ssize_t)need > length)
596
+ {
597
+ /* Keep on reading */
598
+ recover_tokenize_command(start, *end);
599
+ return 1;
600
+ }
601
+
602
+ void *data= (*end) + 1;
603
+ uint64_t cas= 0;
604
+ uint64_t result_cas;
605
+ protocol_binary_response_status rval;
606
+ switch (client->ascii_command)
607
+ {
608
+ case SET_CMD:
609
+ rval= client->root->callback->interface.v1.set(client, key,
610
+ (uint16_t)nkey,
611
+ data,
612
+ (uint32_t)nbytes,
613
+ flags,
614
+ timeout, cas,
615
+ &result_cas);
616
+ break;
617
+ case ADD_CMD:
618
+ rval= client->root->callback->interface.v1.add(client, key,
619
+ (uint16_t)nkey,
620
+ data,
621
+ (uint32_t)nbytes,
622
+ flags,
623
+ timeout, &result_cas);
624
+ break;
625
+ case CAS_CMD:
626
+ cas= strtoull(tokens[5], NULL, 10);
627
+ /* FALLTHROUGH */
628
+ case REPLACE_CMD:
629
+ rval= client->root->callback->interface.v1.replace(client, key,
630
+ (uint16_t)nkey,
631
+ data,
632
+ (uint32_t)nbytes,
633
+ flags,
634
+ timeout, cas,
635
+ &result_cas);
636
+ break;
637
+ case APPEND_CMD:
638
+ rval= client->root->callback->interface.v1.append(client, key,
639
+ (uint16_t)nkey,
640
+ data,
641
+ (uint32_t)nbytes,
642
+ cas,
643
+ &result_cas);
644
+ break;
645
+ case PREPEND_CMD:
646
+ rval= client->root->callback->interface.v1.prepend(client, key,
647
+ (uint16_t)nkey,
648
+ data,
649
+ (uint32_t)nbytes,
650
+ cas,
651
+ &result_cas);
652
+ break;
653
+
654
+ /* gcc complains if I don't put all of the enums in here.. */
655
+ case GET_CMD:
656
+ case GETS_CMD:
657
+ case DELETE_CMD:
658
+ case DECR_CMD:
659
+ case INCR_CMD:
660
+ case STATS_CMD:
661
+ case FLUSH_ALL_CMD:
662
+ case VERSION_CMD:
663
+ case QUIT_CMD:
664
+ case VERBOSITY_CMD:
665
+ case UNKNOWN_CMD:
666
+ default:
667
+ abort(); /* impossible */
668
+ }
669
+
670
+ if (rval == PROTOCOL_BINARY_RESPONSE_SUCCESS)
671
+ {
672
+ spool_string(client, "STORED\r\n");
673
+ }
674
+ else
675
+ {
676
+ if (client->ascii_command == CAS_CMD)
677
+ {
678
+ if (rval == PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS)
679
+ {
680
+ spool_string(client, "EXISTS\r\n");
681
+ }
682
+ else if (rval == PROTOCOL_BINARY_RESPONSE_KEY_ENOENT)
683
+ {
684
+ spool_string(client, "NOT_FOUND\r\n");
685
+ }
686
+ else
687
+ {
688
+ spool_string(client, "NOT_STORED\r\n");
689
+ }
690
+ }
691
+ else
692
+ {
693
+ spool_string(client, "NOT_STORED\r\n");
694
+ }
695
+ }
696
+
697
+ *end += nbytes + 2;
698
+
699
+ return 0;
700
+ }
701
+
702
+ static int process_cas_command(memcached_protocol_client_st *client,
703
+ char **tokens, int ntokens, char *start,
704
+ char **end, ssize_t length)
705
+ {
706
+ if (ntokens != 6)
707
+ {
708
+ send_command_usage(client);
709
+ return false;
710
+ }
711
+
712
+ if (client->root->callback->interface.v1.replace == NULL)
713
+ {
714
+ spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
715
+ return false;
716
+ }
717
+
718
+ return process_storage_command(client, tokens, ntokens, start, end, length);
719
+ }
720
+
721
+ static int process_set_command(memcached_protocol_client_st *client,
722
+ char **tokens, int ntokens, char *start,
723
+ char **end, ssize_t length)
724
+ {
725
+ if (ntokens != 5)
726
+ {
727
+ send_command_usage(client);
728
+ return false;
729
+ }
730
+
731
+ if (client->root->callback->interface.v1.set == NULL)
732
+ {
733
+ spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
734
+ return false;
735
+ }
736
+
737
+ return process_storage_command(client, tokens, ntokens, start, end, length);
738
+ }
739
+
740
+ static int process_add_command(memcached_protocol_client_st *client,
741
+ char **tokens, int ntokens, char *start,
742
+ char **end, ssize_t length)
743
+ {
744
+ if (ntokens != 5)
745
+ {
746
+ send_command_usage(client);
747
+ return false;
748
+ }
749
+
750
+ if (client->root->callback->interface.v1.add == NULL)
751
+ {
752
+ spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
753
+ return false;
754
+ }
755
+
756
+ return process_storage_command(client, tokens, ntokens, start, end, length);
757
+ }
758
+
759
+ static int process_replace_command(memcached_protocol_client_st *client,
760
+ char **tokens, int ntokens, char *start,
761
+ char **end, ssize_t length)
762
+ {
763
+ if (ntokens != 5)
764
+ {
765
+ send_command_usage(client);
766
+ return false;
767
+ }
768
+
769
+ if (client->root->callback->interface.v1.replace == NULL)
770
+ {
771
+ spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
772
+ return false;
773
+ }
774
+
775
+ return process_storage_command(client, tokens, ntokens, start, end, length);
776
+ }
777
+
778
+ static int process_append_command(memcached_protocol_client_st *client,
779
+ char **tokens, int ntokens, char *start,
780
+ char **end, ssize_t length)
781
+ {
782
+ if (ntokens != 5)
783
+ {
784
+ send_command_usage(client);
785
+ return false;
786
+ }
787
+
788
+ if (client->root->callback->interface.v1.append == NULL)
789
+ {
790
+ spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
791
+ return false;
792
+ }
793
+
794
+ return process_storage_command(client, tokens, ntokens, start, end, length);
795
+ }
796
+
797
+ static int process_prepend_command(memcached_protocol_client_st *client,
798
+ char **tokens, int ntokens, char *start,
799
+ char **end, ssize_t length)
800
+ {
801
+ if (ntokens != 5)
802
+ {
803
+ send_command_usage(client);
804
+ return false;
805
+ }
806
+
807
+ if (client->root->callback->interface.v1.prepend == NULL)
808
+ {
809
+ spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
810
+ return false;
811
+ }
812
+
813
+ return process_storage_command(client, tokens, ntokens, start, end, length);
814
+ }
815
+
816
+ /**
817
+ * The ASCII protocol support is just one giant big hack. Instead of adding
818
+ * a optimal ascii support, I just convert the ASCII commands to the binary
819
+ * protocol and calls back into the command handlers for the binary protocol ;)
820
+ */
821
+ memcached_protocol_event_t memcached_ascii_protocol_process_data(memcached_protocol_client_st *client, ssize_t *length, void **endptr)
822
+ {
823
+ char *ptr= (char*)client->root->input_buffer;
824
+ *endptr= ptr;
825
+
826
+ do {
827
+ /* Do we have \n (indicating the command preamble)*/
828
+ char *end= memchr(ptr, '\n', (size_t)*length);
829
+ if (end == NULL)
830
+ {
831
+ *endptr= ptr;
832
+ return MEMCACHED_PROTOCOL_READ_EVENT;
833
+ }
834
+
835
+ client->ascii_command= ascii_to_cmd(ptr, (size_t)(*length));
836
+
837
+ /* A multiget lists all of the keys, and I don't want to have an
838
+ * avector of let's say 512 pointers to tokenize all of them, so let's
839
+ * just handle them immediately
840
+ */
841
+ if (client->ascii_command == GET_CMD ||
842
+ client->ascii_command == GETS_CMD) {
843
+ if (client->root->callback->interface.v1.get != NULL)
844
+ ascii_process_gets(client, ptr, end);
845
+ else
846
+ spool_string(client, "SERVER_ERROR: Command not implemented\n");
847
+ } else {
848
+ /* None of the defined commands takes 10 parameters, so lets just use
849
+ * that as a maximum limit.
850
+ */
851
+ char *tokens[10];
852
+ int ntokens= ascii_tokenize_command(ptr, end, tokens, 10);
853
+
854
+ if (ntokens < 10)
855
+ {
856
+ client->mute= strcmp(tokens[ntokens - 1], "noreply") == 0;
857
+ if (client->mute)
858
+ --ntokens; /* processed noreply token*/
859
+ }
860
+
861
+ int error= 0;
862
+
863
+ switch (client->ascii_command) {
864
+ case SET_CMD:
865
+ error= process_set_command(client, tokens, ntokens, ptr, &end, *length);
866
+ break;
867
+ case ADD_CMD:
868
+ error= process_add_command(client, tokens, ntokens, ptr, &end, *length);
869
+ break;
870
+ case REPLACE_CMD:
871
+ error= process_replace_command(client, tokens, ntokens,
872
+ ptr, &end, *length);
873
+ break;
874
+ case CAS_CMD:
875
+ error= process_cas_command(client, tokens, ntokens, ptr, &end, *length);
876
+ break;
877
+ case APPEND_CMD:
878
+ error= process_append_command(client, tokens, ntokens,
879
+ ptr, &end, *length);
880
+ break;
881
+ case PREPEND_CMD:
882
+ error= process_prepend_command(client, tokens, ntokens,
883
+ ptr, &end, *length);
884
+ break;
885
+ case DELETE_CMD:
886
+ process_delete(client, tokens, ntokens);
887
+ break;
888
+
889
+ case INCR_CMD: /* FALLTHROUGH */
890
+ case DECR_CMD:
891
+ process_arithmetic(client, tokens, ntokens);
892
+ break;
893
+ case STATS_CMD:
894
+ if (client->mute)
895
+ {
896
+ send_command_usage(client);
897
+ }
898
+ else
899
+ {
900
+ recover_tokenize_command(ptr, end);
901
+ process_stats(client, ptr + 6, end);
902
+ }
903
+ break;
904
+ case FLUSH_ALL_CMD:
905
+ process_flush(client, tokens, ntokens);
906
+ break;
907
+ case VERSION_CMD:
908
+ if (client->mute)
909
+ {
910
+ send_command_usage(client);
911
+ }
912
+ else
913
+ {
914
+ process_version(client, tokens, ntokens);
915
+ }
916
+ break;
917
+ case QUIT_CMD:
918
+ if (ntokens != 1 || client->mute)
919
+ {
920
+ send_command_usage(client);
921
+ }
922
+ else
923
+ {
924
+ if (client->root->callback->interface.v1.quit != NULL)
925
+ client->root->callback->interface.v1.quit(client);
926
+
927
+ return MEMCACHED_PROTOCOL_ERROR_EVENT;
928
+ }
929
+ break;
930
+
931
+ case VERBOSITY_CMD:
932
+ if (ntokens != 2)
933
+ send_command_usage(client);
934
+ else
935
+ spool_string(client, "OK\r\n");
936
+ break;
937
+
938
+ case UNKNOWN_CMD:
939
+ send_command_usage(client);
940
+ break;
941
+
942
+ case GET_CMD:
943
+ case GETS_CMD:
944
+ default:
945
+ /* Should already be handled */
946
+ abort();
947
+ }
948
+
949
+ if (error == -1)
950
+ return MEMCACHED_PROTOCOL_ERROR_EVENT;
951
+ else if (error == 1)
952
+ return MEMCACHED_PROTOCOL_READ_EVENT;
953
+ }
954
+
955
+ /* Move past \n */
956
+ ++end;
957
+ *length -= end - ptr;
958
+ ptr= end;
959
+ } while (*length > 0);
960
+
961
+ *endptr= ptr;
962
+ return MEMCACHED_PROTOCOL_READ_EVENT;
963
+ }