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,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
+ }