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,135 @@
1
+ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
+ *
3
+ * Libmemcached library
4
+ *
5
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
+ * Copyright (C) 2010 Brian Aker All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are
10
+ * met:
11
+ *
12
+ * * Redistributions of source code must retain the above copyright
13
+ * notice, this list of conditions and the following disclaimer.
14
+ *
15
+ * * Redistributions in binary form must reproduce the above
16
+ * copyright notice, this list of conditions and the following disclaimer
17
+ * in the documentation and/or other materials provided with the
18
+ * distribution.
19
+ *
20
+ * * The names of its contributors may not be used to endorse or
21
+ * promote products derived from this software without specific prior
22
+ * written permission.
23
+ *
24
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+ *
36
+ */
37
+
38
+ #pragma once
39
+
40
+
41
+ #ifdef __cplusplus
42
+ extern "C" {
43
+ #endif
44
+
45
+ #define GET_LEN_ARG_UNSPECIFIED -1U
46
+ #define GET_LEN_BUFSZ 32
47
+
48
+ /* Public defines */
49
+ LIBMEMCACHED_API
50
+ char *memcached_get(memcached_st *ptr,
51
+ const char *key, size_t key_length,
52
+ size_t *value_length,
53
+ uint32_t *flags,
54
+ memcached_return_t *error);
55
+
56
+ LIBMEMCACHED_API
57
+ char *memcached_get_from_last(memcached_st *ptr,
58
+ const char *key, size_t key_length,
59
+ size_t *value_length,
60
+ uint32_t *flags,
61
+ memcached_return_t *error);
62
+
63
+ LIBMEMCACHED_API
64
+ memcached_return_t memcached_mget(memcached_st *ptr,
65
+ const char * const *keys,
66
+ const size_t *key_length,
67
+ size_t number_of_keys);
68
+
69
+ LIBMEMCACHED_API
70
+ char *memcached_get_len(memcached_st *ptr,
71
+ const char *key, size_t key_length,
72
+ size_t *value_length,
73
+ uint32_t *flags,
74
+ uint32_t user_spec_len,
75
+ memcached_return *error);
76
+
77
+ LIBMEMCACHED_API
78
+ memcached_return_t memcached_mget_len(memcached_st *ptr,
79
+ const char * const *keys,
80
+ const size_t *key_length,
81
+ size_t number_of_keys,
82
+ uint32_t user_spec_len);
83
+
84
+ LIBMEMCACHED_API
85
+ char *memcached_get_by_key(memcached_st *ptr,
86
+ const char *group_key, size_t group_key_length,
87
+ const char *key, size_t key_length,
88
+ size_t *value_length,
89
+ uint32_t *flags,
90
+ memcached_return_t *error);
91
+
92
+ LIBMEMCACHED_API
93
+ memcached_return_t memcached_mget_by_key(memcached_st *ptr,
94
+ const char *group_key,
95
+ size_t group_key_length,
96
+ const char * const *keys,
97
+ const size_t *key_length,
98
+ const size_t number_of_keys);
99
+
100
+ LIBMEMCACHED_API
101
+ char *memcached_fetch(memcached_st *ptr,
102
+ char *key,
103
+ size_t *key_length,
104
+ size_t *value_length,
105
+ uint32_t *flags,
106
+ memcached_return_t *error);
107
+
108
+ LIBMEMCACHED_API
109
+ memcached_result_st *memcached_fetch_result(memcached_st *ptr,
110
+ memcached_result_st *result,
111
+ memcached_return_t *error);
112
+
113
+ LIBMEMCACHED_API
114
+ memcached_return_t memcached_mget_execute(memcached_st *ptr,
115
+ const char * const *keys,
116
+ const size_t *key_length,
117
+ const size_t number_of_keys,
118
+ memcached_execute_fn *callback,
119
+ void *context,
120
+ const uint32_t number_of_callbacks);
121
+
122
+ LIBMEMCACHED_API
123
+ memcached_return_t memcached_mget_execute_by_key(memcached_st *ptr,
124
+ const char *group_key,
125
+ size_t group_key_length,
126
+ const char * const *keys,
127
+ const size_t *key_length,
128
+ size_t number_of_keys,
129
+ memcached_execute_fn *callback,
130
+ void *context,
131
+ const uint32_t number_of_callbacks);
132
+
133
+ #ifdef __cplusplus
134
+ }
135
+ #endif
@@ -0,0 +1,178 @@
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
+ #include <libmemcached/common.h>
40
+
41
+ #include <sys/time.h>
42
+
43
+ #include <libmemcached/virtual_bucket.h>
44
+
45
+ uint32_t memcached_generate_hash_value(const char *key, size_t key_length, memcached_hash_t hash_algorithm)
46
+ {
47
+ return libhashkit_digest(key, key_length, (hashkit_hash_algorithm_t)hash_algorithm);
48
+ }
49
+
50
+ static inline uint32_t generate_hash(const memcached_st *ptr, const char *key, size_t key_length)
51
+ {
52
+ return hashkit_digest(&ptr->hashkit, key, key_length);
53
+ }
54
+
55
+ static uint32_t dispatch_host(const memcached_st *ptr, uint32_t hash)
56
+ {
57
+ switch (ptr->distribution)
58
+ {
59
+ case MEMCACHED_DISTRIBUTION_CONSISTENT:
60
+ case MEMCACHED_DISTRIBUTION_CONSISTENT_WEIGHTED:
61
+ case MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA:
62
+ case MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY:
63
+ {
64
+ uint32_t num= ptr->ketama.continuum_points_counter;
65
+ WATCHPOINT_ASSERT(ptr->ketama.continuum);
66
+
67
+ hash= hash;
68
+ memcached_continuum_item_st *begin, *end, *left, *right, *middle;
69
+ begin= left= ptr->ketama.continuum;
70
+ end= right= ptr->ketama.continuum + num;
71
+
72
+ while (left < right)
73
+ {
74
+ middle= left + (right - left) / 2;
75
+ if (middle->value < hash)
76
+ left= middle + 1;
77
+ else
78
+ right= middle;
79
+ }
80
+ if (right == end)
81
+ right= begin;
82
+ return right->index;
83
+ }
84
+ case MEMCACHED_DISTRIBUTION_MODULA:
85
+ return hash % memcached_server_count(ptr);
86
+ case MEMCACHED_DISTRIBUTION_RANDOM:
87
+ return (uint32_t) random() % memcached_server_count(ptr);
88
+ case MEMCACHED_DISTRIBUTION_VIRTUAL_BUCKET:
89
+ {
90
+ return memcached_virtual_bucket_get(ptr, hash);
91
+ }
92
+ default:
93
+ case MEMCACHED_DISTRIBUTION_CONSISTENT_MAX:
94
+ WATCHPOINT_ASSERT(0); /* We have added a distribution without extending the logic */
95
+ return hash % memcached_server_count(ptr);
96
+ }
97
+ /* NOTREACHED */
98
+ }
99
+
100
+ /*
101
+ One version is public and will not modify the distribution hash, the other will.
102
+ */
103
+ static inline uint32_t _generate_hash_wrapper(const memcached_st *ptr, const char *key, size_t key_length)
104
+ {
105
+ WATCHPOINT_ASSERT(memcached_server_count(ptr));
106
+
107
+ if (memcached_server_count(ptr) == 1)
108
+ return 0;
109
+
110
+ if (ptr->flags.hash_with_prefix_key)
111
+ {
112
+ size_t temp_length= memcached_array_size(ptr->prefix_key) + key_length;
113
+ char temp[MEMCACHED_MAX_KEY];
114
+
115
+ if (temp_length > MEMCACHED_MAX_KEY -1)
116
+ return 0;
117
+
118
+ strncpy(temp, memcached_array_string(ptr->prefix_key), memcached_array_size(ptr->prefix_key));
119
+ strncpy(temp + memcached_array_size(ptr->prefix_key), key, key_length);
120
+
121
+ return generate_hash(ptr, temp, temp_length);
122
+ }
123
+ else
124
+ {
125
+ return generate_hash(ptr, key, key_length);
126
+ }
127
+ }
128
+
129
+ static inline void _regen_for_auto_eject(memcached_st *ptr)
130
+ {
131
+ if (_is_auto_eject_host(ptr) && ptr->ketama.next_distribution_rebuild)
132
+ {
133
+ struct timeval now;
134
+
135
+ if (gettimeofday(&now, NULL) == 0 &&
136
+ now.tv_sec > ptr->ketama.next_distribution_rebuild)
137
+ {
138
+ run_distribution(ptr);
139
+ }
140
+ }
141
+ }
142
+
143
+ void memcached_autoeject(memcached_st *ptr)
144
+ {
145
+ _regen_for_auto_eject(ptr);
146
+ }
147
+
148
+ uint32_t memcached_generate_hash_with_redistribution(memcached_st *ptr, const char *key, size_t key_length)
149
+ {
150
+ uint32_t hash= _generate_hash_wrapper(ptr, key, key_length);
151
+
152
+ _regen_for_auto_eject(ptr);
153
+
154
+ return dispatch_host(ptr, hash);
155
+ }
156
+
157
+ uint32_t memcached_generate_hash(const memcached_st *ptr, const char *key, size_t key_length)
158
+ {
159
+ return dispatch_host(ptr, _generate_hash_wrapper(ptr, key, key_length));
160
+ }
161
+
162
+ const hashkit_st *memcached_get_hashkit(const memcached_st *ptr)
163
+ {
164
+ return &ptr->hashkit;
165
+ }
166
+
167
+ memcached_return_t memcached_set_hashkit(memcached_st *self, hashkit_st *hashk)
168
+ {
169
+ hashkit_free(&self->hashkit);
170
+ hashkit_clone(&self->hashkit, hashk);
171
+
172
+ return MEMCACHED_SUCCESS;
173
+ }
174
+
175
+ const char * libmemcached_string_hash(memcached_hash_t type)
176
+ {
177
+ return libhashkit_string_hash((hashkit_hash_algorithm_t)type);
178
+ }
@@ -0,0 +1,68 @@
1
+ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
+ *
3
+ * Libmemcached library
4
+ *
5
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
+ * Copyright (C) 2006-2009 Brian Aker All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are
10
+ * met:
11
+ *
12
+ * * Redistributions of source code must retain the above copyright
13
+ * notice, this list of conditions and the following disclaimer.
14
+ *
15
+ * * Redistributions in binary form must reproduce the above
16
+ * copyright notice, this list of conditions and the following disclaimer
17
+ * in the documentation and/or other materials provided with the
18
+ * distribution.
19
+ *
20
+ * * The names of its contributors may not be used to endorse or
21
+ * promote products derived from this software without specific prior
22
+ * written permission.
23
+ *
24
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+ *
36
+ */
37
+
38
+ #pragma once
39
+
40
+ #ifdef __cplusplus
41
+ extern "C" {
42
+ #endif
43
+
44
+ /* The two public hash bits */
45
+ LIBMEMCACHED_API
46
+ uint32_t memcached_generate_hash_value(const char *key, size_t key_length, memcached_hash_t hash_algorithm);
47
+
48
+ LIBMEMCACHED_API
49
+ const hashkit_st *memcached_get_hashkit(const memcached_st *ptr);
50
+
51
+ LIBMEMCACHED_API
52
+ memcached_return_t memcached_set_hashkit(memcached_st *ptr, hashkit_st *hashk);
53
+
54
+ LIBMEMCACHED_API
55
+ uint32_t memcached_generate_hash(const memcached_st *ptr, const char *key, size_t key_length);
56
+
57
+ LIBMEMCACHED_LOCAL
58
+ uint32_t memcached_generate_hash_with_redistribution(memcached_st *ptr, const char *key, size_t key_length);
59
+
60
+ LIBMEMCACHED_API
61
+ void memcached_autoeject(memcached_st *ptr);
62
+
63
+ LIBMEMCACHED_API
64
+ const char * libmemcached_string_hash(memcached_hash_t type);
65
+
66
+ #ifdef __cplusplus
67
+ }
68
+ #endif
@@ -0,0 +1,516 @@
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-2010 Brian Aker All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are
10
+ * met:
11
+ *
12
+ * * Redistributions of source code must retain the above copyright
13
+ * notice, this list of conditions and the following disclaimer.
14
+ *
15
+ * * Redistributions in binary form must reproduce the above
16
+ * copyright notice, this list of conditions and the following disclaimer
17
+ * in the documentation and/or other materials provided with the
18
+ * distribution.
19
+ *
20
+ * * The names of its contributors may not be used to endorse or
21
+ * promote products derived from this software without specific prior
22
+ * written permission.
23
+ *
24
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+ *
36
+ */
37
+
38
+ #include <libmemcached/common.h>
39
+
40
+ #include <cmath>
41
+ #include <sys/time.h>
42
+
43
+ /* Protoypes (static) */
44
+ static memcached_return_t server_add(memcached_st *ptr, const char *hostname,
45
+ in_port_t port,
46
+ uint32_t weight,
47
+ memcached_connection_t type);
48
+
49
+ static memcached_return_t update_continuum(memcached_st *ptr);
50
+
51
+ static int compare_servers(const void *p1, const void *p2)
52
+ {
53
+ int return_value;
54
+ memcached_server_instance_st a= (memcached_server_instance_st)p1;
55
+ memcached_server_instance_st b= (memcached_server_instance_st)p2;
56
+
57
+ return_value= strcmp(a->hostname, b->hostname);
58
+
59
+ if (return_value == 0)
60
+ {
61
+ return_value= (int) (a->port - b->port);
62
+ }
63
+
64
+ return return_value;
65
+ }
66
+
67
+ static void sort_hosts(memcached_st *ptr)
68
+ {
69
+ if (memcached_server_count(ptr))
70
+ {
71
+ memcached_server_write_instance_st instance;
72
+
73
+ qsort(memcached_server_list(ptr), memcached_server_count(ptr), sizeof(memcached_server_st), compare_servers);
74
+ instance= memcached_server_instance_fetch(ptr, 0);
75
+ instance->number_of_hosts= memcached_server_count(ptr);
76
+ }
77
+ }
78
+
79
+
80
+ memcached_return_t run_distribution(memcached_st *ptr)
81
+ {
82
+ if (ptr->flags.use_sort_hosts)
83
+ sort_hosts(ptr);
84
+
85
+ switch (ptr->distribution)
86
+ {
87
+ case MEMCACHED_DISTRIBUTION_CONSISTENT:
88
+ case MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA:
89
+ case MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY:
90
+ case MEMCACHED_DISTRIBUTION_CONSISTENT_WEIGHTED:
91
+ return update_continuum(ptr);
92
+ case MEMCACHED_DISTRIBUTION_VIRTUAL_BUCKET:
93
+ case MEMCACHED_DISTRIBUTION_MODULA:
94
+ break;
95
+ case MEMCACHED_DISTRIBUTION_RANDOM:
96
+ srandom((uint32_t) time(NULL));
97
+ break;
98
+ case MEMCACHED_DISTRIBUTION_CONSISTENT_MAX:
99
+ default:
100
+ WATCHPOINT_ASSERT(0); /* We have added a distribution without extending the logic */
101
+ }
102
+
103
+ return MEMCACHED_SUCCESS;
104
+ }
105
+
106
+ static uint32_t ketama_server_hash(const char *key, size_t key_length, uint32_t alignment)
107
+ {
108
+ unsigned char results[16];
109
+
110
+ libhashkit_md5_signature((unsigned char*)key, key_length, results);
111
+
112
+ return ((uint32_t) (results[3 + alignment * 4] & 0xFF) << 24)
113
+ | ((uint32_t) (results[2 + alignment * 4] & 0xFF) << 16)
114
+ | ((uint32_t) (results[1 + alignment * 4] & 0xFF) << 8)
115
+ | (results[0 + alignment * 4] & 0xFF);
116
+ }
117
+
118
+ static int continuum_item_cmp(const void *t1, const void *t2)
119
+ {
120
+ memcached_continuum_item_st *ct1= (memcached_continuum_item_st *)t1;
121
+ memcached_continuum_item_st *ct2= (memcached_continuum_item_st *)t2;
122
+
123
+ /* Why 153? Hmmm... */
124
+ WATCHPOINT_ASSERT(ct1->value != 153);
125
+ if (ct1->value == ct2->value)
126
+ return 0;
127
+ else if (ct1->value > ct2->value)
128
+ return 1;
129
+ else
130
+ return -1;
131
+ }
132
+
133
+ static memcached_return_t update_continuum(memcached_st *ptr)
134
+ {
135
+ uint32_t continuum_index= 0;
136
+ memcached_server_st *list;
137
+ uint32_t pointer_counter= 0;
138
+ uint32_t pointer_per_server= MEMCACHED_POINTS_PER_SERVER;
139
+ uint32_t pointer_per_hash= 1;
140
+ uint32_t live_servers= 0;
141
+ struct timeval now;
142
+
143
+ if (gettimeofday(&now, NULL))
144
+ {
145
+ return memcached_set_errno(*ptr, errno, MEMCACHED_AT);
146
+ }
147
+
148
+ list= memcached_server_list(ptr);
149
+
150
+ /* count live servers (those without a retry delay set) */
151
+ bool is_auto_ejecting= _is_auto_eject_host(ptr);
152
+ if (is_auto_ejecting)
153
+ {
154
+ live_servers= 0;
155
+ ptr->ketama.next_distribution_rebuild= 0;
156
+ for (uint32_t host_index= 0; host_index < memcached_server_count(ptr); ++host_index)
157
+ {
158
+ if (list[host_index].next_retry <= now.tv_sec)
159
+ {
160
+ live_servers++;
161
+ }
162
+ else
163
+ {
164
+ if (ptr->ketama.next_distribution_rebuild == 0 || list[host_index].next_retry < ptr->ketama.next_distribution_rebuild)
165
+ {
166
+ ptr->ketama.next_distribution_rebuild= list[host_index].next_retry;
167
+ }
168
+ }
169
+ }
170
+ }
171
+ else
172
+ {
173
+ live_servers= memcached_server_count(ptr);
174
+ }
175
+
176
+ uint64_t is_ketama_weighted= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED);
177
+ uint32_t points_per_server= (uint32_t) (is_ketama_weighted ? MEMCACHED_POINTS_PER_SERVER_KETAMA : MEMCACHED_POINTS_PER_SERVER);
178
+
179
+ if (not live_servers)
180
+ {
181
+ return MEMCACHED_SUCCESS;
182
+ }
183
+
184
+ if (live_servers > ptr->ketama.continuum_count)
185
+ {
186
+ memcached_continuum_item_st *new_ptr;
187
+
188
+ new_ptr= static_cast<memcached_continuum_item_st*>(libmemcached_realloc(ptr, ptr->ketama.continuum,
189
+ sizeof(memcached_continuum_item_st) * (live_servers + MEMCACHED_CONTINUUM_ADDITION) * points_per_server));
190
+
191
+ if (new_ptr == 0)
192
+ return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
193
+
194
+ ptr->ketama.continuum= new_ptr;
195
+ ptr->ketama.continuum_count= live_servers + MEMCACHED_CONTINUUM_ADDITION;
196
+ }
197
+
198
+ uint64_t total_weight= 0;
199
+ if (is_ketama_weighted)
200
+ {
201
+ for (uint32_t host_index = 0; host_index < memcached_server_count(ptr); ++host_index)
202
+ {
203
+ if (! is_auto_ejecting || list[host_index].next_retry <= now.tv_sec)
204
+ {
205
+ total_weight += list[host_index].weight;
206
+ }
207
+ }
208
+ }
209
+
210
+ for (uint32_t host_index= 0; host_index < memcached_server_count(ptr); ++host_index)
211
+ {
212
+ if (is_auto_ejecting && list[host_index].next_retry > now.tv_sec)
213
+ continue;
214
+
215
+ if (is_ketama_weighted)
216
+ {
217
+ float pct = (float)list[host_index].weight / (float)total_weight;
218
+ pointer_per_server= (uint32_t) ((floorf((float) (pct * MEMCACHED_POINTS_PER_SERVER_KETAMA / 4 * (float)live_servers + 0.0000000001))) * 4);
219
+ pointer_per_hash= 4;
220
+ #ifdef DEBUG
221
+ printf("ketama_weighted:%s|%d|%llu|%u\n",
222
+ list[host_index].hostname,
223
+ list[host_index].port,
224
+ (unsigned long long)list[host_index].weight,
225
+ pointer_per_server);
226
+ #endif
227
+ }
228
+
229
+
230
+ if (ptr->distribution == MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY)
231
+ {
232
+ for (uint32_t pointer_index= 0;
233
+ pointer_index < pointer_per_server / pointer_per_hash;
234
+ pointer_index++)
235
+ {
236
+ char sort_host[MEMCACHED_MAX_HOST_SORT_LENGTH]= "";
237
+ int sort_host_length;
238
+
239
+ // Spymemcached ketema key format is: hostname/ip:port-index
240
+ // If hostname is not available then: /ip:port-index
241
+ sort_host_length= snprintf(sort_host, MEMCACHED_MAX_HOST_SORT_LENGTH,
242
+ "/%s:%u-%u",
243
+ list[host_index].hostname,
244
+ (uint32_t)list[host_index].port,
245
+ pointer_index);
246
+
247
+ if (sort_host_length >= MEMCACHED_MAX_HOST_SORT_LENGTH || sort_host_length < 0)
248
+ {
249
+ return MEMCACHED_FAILURE;
250
+ }
251
+ #ifdef DEBUG
252
+ printf("update_continuum: key is %s\n", sort_host);
253
+ #endif
254
+
255
+ WATCHPOINT_ASSERT(sort_host_length);
256
+
257
+ if (is_ketama_weighted)
258
+ {
259
+ for (uint32_t x= 0; x < pointer_per_hash; x++)
260
+ {
261
+ uint32_t value= ketama_server_hash(sort_host, (size_t)sort_host_length, x);
262
+ ptr->ketama.continuum[continuum_index].index= host_index;
263
+ ptr->ketama.continuum[continuum_index++].value= value;
264
+ }
265
+ }
266
+ else
267
+ {
268
+ uint32_t value= hashkit_digest(&ptr->hashkit, sort_host, (size_t)sort_host_length);
269
+ ptr->ketama.continuum[continuum_index].index= host_index;
270
+ ptr->ketama.continuum[continuum_index++].value= value;
271
+ }
272
+ }
273
+ }
274
+ else
275
+ {
276
+ for (uint32_t pointer_index= 1;
277
+ pointer_index <= pointer_per_server / pointer_per_hash;
278
+ pointer_index++)
279
+ {
280
+ char sort_host[MEMCACHED_MAX_HOST_SORT_LENGTH]= "";
281
+ int sort_host_length;
282
+
283
+ if (list[host_index].port == MEMCACHED_DEFAULT_PORT)
284
+ {
285
+ sort_host_length= snprintf(sort_host, MEMCACHED_MAX_HOST_SORT_LENGTH,
286
+ "%s-%u",
287
+ list[host_index].hostname,
288
+ pointer_index - 1);
289
+ }
290
+ else
291
+ {
292
+ sort_host_length= snprintf(sort_host, MEMCACHED_MAX_HOST_SORT_LENGTH,
293
+ "%s:%u-%u",
294
+ list[host_index].hostname,
295
+ (uint32_t)list[host_index].port,
296
+ pointer_index - 1);
297
+ }
298
+
299
+ if (sort_host_length >= MEMCACHED_MAX_HOST_SORT_LENGTH || sort_host_length < 0)
300
+ {
301
+ return MEMCACHED_FAILURE;
302
+ }
303
+
304
+ WATCHPOINT_ASSERT(sort_host_length);
305
+
306
+ if (is_ketama_weighted)
307
+ {
308
+ for (uint32_t x = 0; x < pointer_per_hash; x++)
309
+ {
310
+ uint32_t value= ketama_server_hash(sort_host, (size_t)sort_host_length, x);
311
+ ptr->ketama.continuum[continuum_index].index= host_index;
312
+ ptr->ketama.continuum[continuum_index++].value= value;
313
+ }
314
+ }
315
+ else
316
+ {
317
+ uint32_t value= hashkit_digest(&ptr->hashkit, sort_host, (size_t)sort_host_length);
318
+ ptr->ketama.continuum[continuum_index].index= host_index;
319
+ ptr->ketama.continuum[continuum_index++].value= value;
320
+ }
321
+ }
322
+ }
323
+
324
+ pointer_counter+= pointer_per_server;
325
+ }
326
+
327
+ WATCHPOINT_ASSERT(ptr);
328
+ WATCHPOINT_ASSERT(ptr->ketama.continuum);
329
+ WATCHPOINT_ASSERT(memcached_server_count(ptr) * MEMCACHED_POINTS_PER_SERVER <= MEMCACHED_CONTINUUM_SIZE);
330
+ ptr->ketama.continuum_points_counter= pointer_counter;
331
+ qsort(ptr->ketama.continuum, ptr->ketama.continuum_points_counter, sizeof(memcached_continuum_item_st), continuum_item_cmp);
332
+
333
+ #ifdef DEBUG
334
+ for (uint32_t pointer_index= 0; memcached_server_count(ptr) && pointer_index < ((live_servers * MEMCACHED_POINTS_PER_SERVER) - 1); pointer_index++)
335
+ {
336
+ WATCHPOINT_ASSERT(ptr->ketama.continuum[pointer_index].value <= ptr->ketama.continuum[pointer_index + 1].value);
337
+ }
338
+ #endif
339
+
340
+ return MEMCACHED_SUCCESS;
341
+ }
342
+
343
+
344
+ memcached_return_t memcached_server_push(memcached_st *ptr, const memcached_server_list_st list)
345
+ {
346
+ if (not list)
347
+ return MEMCACHED_SUCCESS;
348
+
349
+ uint32_t count= memcached_server_list_count(list);
350
+
351
+ memcached_server_st *new_host_list;
352
+ new_host_list= static_cast<memcached_server_st*>(libmemcached_realloc(ptr, memcached_server_list(ptr),
353
+ sizeof(memcached_server_st) * (count + memcached_server_count(ptr))));
354
+
355
+ if (not new_host_list)
356
+ return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
357
+
358
+ memcached_server_list_set(ptr, new_host_list);
359
+
360
+ for (uint32_t x= 0; x < count; x++)
361
+ {
362
+ memcached_server_write_instance_st instance;
363
+
364
+ if ((ptr->flags.use_udp && list[x].type != MEMCACHED_CONNECTION_UDP)
365
+ or ((list[x].type == MEMCACHED_CONNECTION_UDP)
366
+ and ! (ptr->flags.use_udp)) )
367
+ {
368
+ return MEMCACHED_INVALID_HOST_PROTOCOL;
369
+ }
370
+
371
+ WATCHPOINT_ASSERT(list[x].hostname[0] != 0);
372
+
373
+ // We have extended the array, and now we will find it, and use it.
374
+ instance= memcached_server_instance_fetch(ptr, memcached_server_count(ptr));
375
+ WATCHPOINT_ASSERT(instance);
376
+
377
+ if (not memcached_server_create_with(ptr, instance, list[x].hostname,
378
+ list[x].port, list[x].weight, list[x].type))
379
+ {
380
+ return memcached_set_error(*ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT);
381
+ }
382
+
383
+ if (list[x].weight > 1)
384
+ {
385
+ ptr->ketama.weighted= true;
386
+ }
387
+
388
+ ptr->number_of_hosts++;
389
+ }
390
+
391
+ // Provides backwards compatibility with server list.
392
+ {
393
+ memcached_server_write_instance_st instance;
394
+ instance= memcached_server_instance_fetch(ptr, 0);
395
+ instance->number_of_hosts= memcached_server_count(ptr);
396
+ }
397
+
398
+ return run_distribution(ptr);
399
+ }
400
+
401
+ memcached_return_t memcached_server_add_unix_socket(memcached_st *ptr,
402
+ const char *filename)
403
+ {
404
+ return memcached_server_add_unix_socket_with_weight(ptr, filename, 0);
405
+ }
406
+
407
+ memcached_return_t memcached_server_add_unix_socket_with_weight(memcached_st *ptr,
408
+ const char *filename,
409
+ uint32_t weight)
410
+ {
411
+ if (! filename)
412
+ return MEMCACHED_FAILURE;
413
+
414
+ return server_add(ptr, filename, 0, weight, MEMCACHED_CONNECTION_UNIX_SOCKET);
415
+ }
416
+
417
+ memcached_return_t memcached_server_add_udp(memcached_st *ptr,
418
+ const char *hostname,
419
+ in_port_t port)
420
+ {
421
+ return memcached_server_add_udp_with_weight(ptr, hostname, port, 0);
422
+ }
423
+
424
+ memcached_return_t memcached_server_add_udp_with_weight(memcached_st *ptr,
425
+ const char *hostname,
426
+ in_port_t port,
427
+ uint32_t weight)
428
+ {
429
+ if (not port)
430
+ port= MEMCACHED_DEFAULT_PORT;
431
+
432
+ if (not hostname)
433
+ hostname= "localhost";
434
+
435
+ return server_add(ptr, hostname, port, weight, MEMCACHED_CONNECTION_UDP);
436
+ }
437
+
438
+ memcached_return_t memcached_server_add(memcached_st *ptr,
439
+ const char *hostname,
440
+ in_port_t port)
441
+ {
442
+ return memcached_server_add_with_weight(ptr, hostname, port, 0);
443
+ }
444
+
445
+ memcached_return_t memcached_server_add_with_weight(memcached_st *ptr,
446
+ const char *hostname,
447
+ in_port_t port,
448
+ uint32_t weight)
449
+ {
450
+ if (not port)
451
+ port= MEMCACHED_DEFAULT_PORT;
452
+
453
+ if (not hostname)
454
+ hostname= "localhost";
455
+
456
+ return server_add(ptr, hostname, port, weight, MEMCACHED_CONNECTION_TCP);
457
+ }
458
+
459
+ static memcached_return_t server_add(memcached_st *ptr, const char *hostname,
460
+ in_port_t port,
461
+ uint32_t weight,
462
+ memcached_connection_t type)
463
+ {
464
+
465
+ if ( (ptr->flags.use_udp and type != MEMCACHED_CONNECTION_UDP)
466
+ or ( (type == MEMCACHED_CONNECTION_UDP) and (not ptr->flags.use_udp) ) )
467
+ {
468
+ return MEMCACHED_INVALID_HOST_PROTOCOL;
469
+ }
470
+
471
+ memcached_server_st *new_host_list= static_cast<memcached_server_st*>(libmemcached_realloc(ptr, memcached_server_list(ptr),
472
+ sizeof(memcached_server_st) * (ptr->number_of_hosts + 1)));
473
+
474
+ if (not new_host_list)
475
+ return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
476
+
477
+ memcached_server_list_set(ptr, new_host_list);
478
+
479
+ /* TODO: Check return type */
480
+ memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, memcached_server_count(ptr));
481
+
482
+ if (not memcached_server_create_with(ptr, instance, hostname, port, weight, type))
483
+ {
484
+ return memcached_set_error(*ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT);
485
+ }
486
+
487
+ if (weight > 1)
488
+ {
489
+ ptr->ketama.weighted= true;
490
+ }
491
+
492
+ ptr->number_of_hosts++;
493
+
494
+ // @note we place the count in the bottom of the server list
495
+ instance= memcached_server_instance_fetch(ptr, 0);
496
+ memcached_servers_set_count(instance, memcached_server_count(ptr));
497
+
498
+ return run_distribution(ptr);
499
+ }
500
+
501
+ memcached_return_t memcached_server_add_parsed(memcached_st *ptr,
502
+ const char *hostname,
503
+ size_t hostname_length,
504
+ in_port_t port,
505
+ uint32_t weight)
506
+ {
507
+ char buffer[NI_MAXHOST];
508
+
509
+ memcpy(buffer, hostname, hostname_length);
510
+ buffer[hostname_length]= 0;
511
+
512
+ return server_add(ptr, buffer,
513
+ port,
514
+ weight,
515
+ MEMCACHED_CONNECTION_TCP);
516
+ }