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,182 @@
1
+ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
2
+ *
3
+ * LibMemcached
4
+ *
5
+ * Copyright (C) 2011 Data Differential, http://datadifferential.com/
6
+ * Copyright (C) 2006-2009 Brian Aker
7
+ * All rights reserved.
8
+ *
9
+ * Redistribution and use in source and binary forms, with or without
10
+ * modification, are permitted provided that the following conditions are
11
+ * met:
12
+ *
13
+ * * Redistributions of source code must retain the above copyright
14
+ * notice, this list of conditions and the following disclaimer.
15
+ *
16
+ * * Redistributions in binary form must reproduce the above
17
+ * copyright notice, this list of conditions and the following disclaimer
18
+ * in the documentation and/or other materials provided with the
19
+ * distribution.
20
+ *
21
+ * * The names of its contributors may not be used to endorse or
22
+ * promote products derived from this software without specific prior
23
+ * written permission.
24
+ *
25
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
+ *
37
+ */
38
+
39
+ /*
40
+ Common include file for libmemached
41
+ */
42
+
43
+ #pragma once
44
+
45
+ #include <config.h>
46
+
47
+ #ifdef __cplusplus
48
+ #include <cstdio>
49
+ #include <cstdlib>
50
+ #include <cstring>
51
+ #include <ctime>
52
+ #include <ctype.h>
53
+ #else
54
+ #include <stdio.h>
55
+ #include <stdlib.h>
56
+ #include <string.h>
57
+ #include <time.h>
58
+ #endif
59
+
60
+ #include <errno.h>
61
+ #include <fcntl.h>
62
+ #include <limits.h>
63
+ #include <sys/types.h>
64
+ #include <unistd.h>
65
+
66
+ #include <libmemcached/memcached.h>
67
+ #include <libmemcached/watchpoint.h>
68
+ #include <libmemcached/is.h>
69
+
70
+ #ifdef __cplusplus
71
+ extern "C" {
72
+ #endif
73
+
74
+ typedef struct memcached_server_st * memcached_server_write_instance_st;
75
+
76
+ typedef memcached_return_t (*memcached_server_execute_fn)(memcached_st *ptr, memcached_server_write_instance_st server, void *context);
77
+
78
+ LIBMEMCACHED_LOCAL
79
+ memcached_server_write_instance_st memcached_server_instance_fetch(memcached_st *ptr, uint32_t server_key);
80
+
81
+ LIBMEMCACHED_LOCAL
82
+ memcached_return_t memcached_server_execute(memcached_st *ptr,
83
+ memcached_server_execute_fn callback,
84
+ void *context);
85
+ #ifdef __cplusplus
86
+ } // extern "C"
87
+ #endif
88
+
89
+
90
+ /* These are private not to be installed headers */
91
+ #include <libmemcached/error.hpp>
92
+ #include <libmemcached/memory.h>
93
+ #include <libmemcached/io.h>
94
+ #include <libmemcached/do.hpp>
95
+ #include <libmemcached/internal.h>
96
+ #include <libmemcached/array.h>
97
+ #include <libmemcached/libmemcached_probes.h>
98
+ #include <libmemcached/memcached/protocol_binary.h>
99
+ #include <libmemcached/byteorder.h>
100
+ #include <libmemcached/initialize_query.h>
101
+ #include <libmemcached/response.h>
102
+ #include <libmemcached/prefix_key.h>
103
+
104
+ /* string value */
105
+ struct memcached_continuum_item_st
106
+ {
107
+ uint32_t index;
108
+ uint32_t value;
109
+ };
110
+
111
+ #if !defined(__GNUC__) || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
112
+
113
+ #define likely(x) if((x))
114
+ #define unlikely(x) if((x))
115
+
116
+ #else
117
+
118
+ #define likely(x) if(__builtin_expect((x) != 0, 1))
119
+ #define unlikely(x) if(__builtin_expect((x) != 0, 0))
120
+ #endif
121
+
122
+ #define MEMCACHED_BLOCK_SIZE 1024
123
+ #define MEMCACHED_DEFAULT_COMMAND_SIZE 350
124
+ #define SMALL_STRING_LEN 1024
125
+ #define HUGE_STRING_LEN 8196
126
+
127
+ #ifdef __cplusplus
128
+ extern "C" {
129
+ #endif
130
+
131
+ LIBMEMCACHED_LOCAL
132
+ memcached_return_t memcached_connect(memcached_server_write_instance_st ptr);
133
+
134
+ LIBMEMCACHED_LOCAL
135
+ memcached_return_t run_distribution(memcached_st *ptr);
136
+
137
+ #define memcached_server_response_increment(A) (A)->cursor_active++
138
+ #define memcached_server_response_decrement(A) (A)->cursor_active--
139
+ #define memcached_server_response_reset(A) (A)->cursor_active=0
140
+
141
+ LIBMEMCACHED_LOCAL
142
+ void set_last_disconnected_host(memcached_server_write_instance_st ptr);
143
+
144
+ LIBMEMCACHED_LOCAL
145
+ memcached_return_t memcached_key_test(const char * const *keys,
146
+ const size_t *key_length,
147
+ size_t number_of_keys);
148
+
149
+ LIBMEMCACHED_LOCAL
150
+ memcached_return_t memcached_purge(memcached_server_write_instance_st ptr);
151
+
152
+ LIBMEMCACHED_LOCAL
153
+ memcached_server_st *memcached_server_create_with(const memcached_st *memc,
154
+ memcached_server_write_instance_st host,
155
+ const char *hostname,
156
+ in_port_t port,
157
+ uint32_t weight,
158
+ memcached_connection_t type);
159
+
160
+
161
+ static inline memcached_return_t memcached_validate_key_length(size_t key_length, bool binary)
162
+ {
163
+ unlikely (key_length == 0)
164
+ return MEMCACHED_BAD_KEY_PROVIDED;
165
+
166
+ if (binary)
167
+ {
168
+ unlikely (key_length > 0xffff)
169
+ return MEMCACHED_BAD_KEY_PROVIDED;
170
+ }
171
+ else
172
+ {
173
+ unlikely (key_length >= MEMCACHED_MAX_KEY)
174
+ return MEMCACHED_BAD_KEY_PROVIDED;
175
+ }
176
+
177
+ return MEMCACHED_SUCCESS;
178
+ }
179
+
180
+ #ifdef __cplusplus
181
+ }
182
+ #endif
@@ -0,0 +1,52 @@
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
+ #ifdef __cplusplus
41
+ extern "C" {
42
+ #endif
43
+
44
+ @DEPRECATED@
45
+ @LIBMEMCACHED_WITH_SASL_SUPPORT@
46
+
47
+ #define LIBMEMCACHED_VERSION_STRING "@VERSION@"
48
+ #define LIBMEMCACHED_VERSION_HEX @PANDORA_HEX_VERSION@
49
+
50
+ #ifdef __cplusplus
51
+ }
52
+ #endif
@@ -0,0 +1,626 @@
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
+
39
+ #include <libmemcached/common.h>
40
+ #include <cassert>
41
+ #include <ctime>
42
+ #include <sys/time.h>
43
+
44
+ static memcached_return_t connect_poll(memcached_server_st *ptr)
45
+ {
46
+ struct pollfd fds[1];
47
+ fds[0].fd = ptr->fd;
48
+ fds[0].events = POLLOUT;
49
+
50
+ size_t loop_max= 5;
51
+
52
+ if (ptr->root->poll_timeout == 0)
53
+ {
54
+ return memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT);
55
+ }
56
+
57
+ while (--loop_max) // Should only loop on cases of ERESTART or EINTR
58
+ {
59
+ int error= poll(fds, 1, ptr->root->connect_timeout);
60
+ switch (error)
61
+ {
62
+ case 1:
63
+ {
64
+ int err;
65
+ socklen_t len= sizeof (err);
66
+ (void)getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len);
67
+
68
+ // We check the value to see what happened wth the socket.
69
+ if (err == 0)
70
+ {
71
+ return MEMCACHED_SUCCESS;
72
+ }
73
+
74
+ return memcached_set_errno(*ptr, err, MEMCACHED_AT);
75
+ }
76
+ case 0:
77
+ {
78
+ return memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT);
79
+ }
80
+
81
+ default: // A real error occurred and we need to completely bail
82
+ WATCHPOINT_ERRNO(get_socket_errno());
83
+ switch (get_socket_errno())
84
+ {
85
+ #ifdef TARGET_OS_LINUX
86
+ case ERESTART:
87
+ #endif
88
+ case EINTR:
89
+ continue;
90
+
91
+ case EFAULT:
92
+ case ENOMEM:
93
+ return memcached_set_error(*ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT);
94
+
95
+ case EINVAL:
96
+ return memcached_set_error(*ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT, memcached_literal_param("RLIMIT_NOFILE exceeded, or if OSX the timeout value was invalid"));
97
+
98
+ default: // This should not happen
99
+ if (fds[0].revents & POLLERR)
100
+ {
101
+ int err;
102
+ socklen_t len= sizeof (err);
103
+ (void)getsockopt(ptr->fd, SOL_SOCKET, SO_ERROR, &err, &len);
104
+ ptr->cached_errno= (err == 0) ? get_socket_errno() : err;
105
+ }
106
+ else
107
+ {
108
+ ptr->cached_errno= get_socket_errno();
109
+ }
110
+
111
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
112
+ (void)closesocket(ptr->fd);
113
+ ptr->fd= INVALID_SOCKET;
114
+ ptr->state= MEMCACHED_SERVER_STATE_NEW;
115
+
116
+ return memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
117
+ }
118
+ }
119
+ }
120
+
121
+ // This should only be possible from ERESTART or EINTR;
122
+ return memcached_set_errno(*ptr, get_socket_errno(), MEMCACHED_AT);
123
+ }
124
+
125
+ static memcached_return_t set_hostinfo(memcached_server_st *server)
126
+ {
127
+ WATCHPOINT_ASSERT(not server->address_info); // We cover the case where a programming mistake has been made.
128
+ if (server->address_info)
129
+ {
130
+ freeaddrinfo(server->address_info);
131
+ server->address_info= NULL;
132
+ server->address_info_next= NULL;
133
+ }
134
+
135
+ char str_port[NI_MAXSERV];
136
+ int length= snprintf(str_port, NI_MAXSERV, "%u", (uint32_t)server->port);
137
+ if (length >= NI_MAXSERV || length < 0)
138
+ return MEMCACHED_FAILURE;
139
+
140
+ struct addrinfo hints;
141
+ memset(&hints, 0, sizeof(struct addrinfo));
142
+
143
+ #if 0
144
+ hints.ai_family= AF_INET;
145
+ #endif
146
+ if (server->type == MEMCACHED_CONNECTION_UDP)
147
+ {
148
+ hints.ai_protocol= IPPROTO_UDP;
149
+ hints.ai_socktype= SOCK_DGRAM;
150
+ }
151
+ else
152
+ {
153
+ hints.ai_socktype= SOCK_STREAM;
154
+ hints.ai_protocol= IPPROTO_TCP;
155
+ }
156
+
157
+ int errcode;
158
+ switch(errcode= getaddrinfo(server->hostname, str_port, &hints, &server->address_info))
159
+ {
160
+ case 0:
161
+ break;
162
+
163
+ case EAI_AGAIN:
164
+ return memcached_set_error(*server, MEMCACHED_TIMEOUT, MEMCACHED_AT, memcached_string_make_from_cstr(gai_strerror(errcode)));
165
+
166
+ case EAI_SYSTEM:
167
+ return memcached_set_errno(*server, errno, MEMCACHED_AT, memcached_literal_param("getaddrinfo(EAI_SYSTEM)"));
168
+
169
+ case EAI_BADFLAGS:
170
+ return memcached_set_error(*server, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT, memcached_literal_param("getaddrinfo(EAI_BADFLAGS)"));
171
+
172
+ case EAI_MEMORY:
173
+ return memcached_set_error(*server, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT, memcached_literal_param("getaddrinfo(EAI_MEMORY)"));
174
+
175
+ default:
176
+ {
177
+ WATCHPOINT_STRING(server->hostname);
178
+ WATCHPOINT_STRING(gai_strerror(errcode));
179
+ return memcached_set_error(*server, MEMCACHED_HOST_LOOKUP_FAILURE, MEMCACHED_AT, memcached_string_make_from_cstr(gai_strerror(errcode)));
180
+ }
181
+ }
182
+ server->address_info_next= server->address_info;
183
+ server->state= MEMCACHED_SERVER_STATE_ADDRINFO;
184
+
185
+ return MEMCACHED_SUCCESS;
186
+ }
187
+
188
+ static inline void set_socket_nonblocking(memcached_server_st *ptr)
189
+ {
190
+ #ifdef WIN32
191
+ u_long arg = 1;
192
+ if (ioctlsocket(ptr->fd, FIONBIO, &arg) == SOCKET_ERROR)
193
+ {
194
+ memcached_set_errno(*ptr, get_socket_errno(), NULL);
195
+ }
196
+ #else
197
+ int flags;
198
+
199
+ do
200
+ {
201
+ flags= fcntl(ptr->fd, F_GETFL, 0);
202
+ } while (flags == -1 && (errno == EINTR || errno == EAGAIN));
203
+
204
+ if (flags == -1)
205
+ {
206
+ memcached_set_errno(*ptr, errno, NULL);
207
+ }
208
+ else if ((flags & O_NONBLOCK) == 0)
209
+ {
210
+ int rval;
211
+
212
+ do
213
+ {
214
+ rval= fcntl(ptr->fd, F_SETFL, flags | O_NONBLOCK);
215
+ } while (rval == -1 && (errno == EINTR || errno == EAGAIN));
216
+
217
+ unlikely (rval == -1)
218
+ {
219
+ memcached_set_errno(*ptr, errno, NULL);
220
+ }
221
+ }
222
+ #endif
223
+ }
224
+
225
+ static void set_socket_options(memcached_server_st *ptr)
226
+ {
227
+ WATCHPOINT_ASSERT(ptr->fd != -1);
228
+
229
+ if (ptr->type == MEMCACHED_CONNECTION_UDP)
230
+ return;
231
+
232
+ #ifdef HAVE_SNDTIMEO
233
+ if (ptr->root->snd_timeout)
234
+ {
235
+ int error;
236
+ struct timeval waittime;
237
+
238
+ waittime.tv_sec= 0;
239
+ waittime.tv_usec= ptr->root->snd_timeout;
240
+
241
+ error= setsockopt(ptr->fd, SOL_SOCKET, SO_SNDTIMEO,
242
+ &waittime, (socklen_t)sizeof(struct timeval));
243
+ WATCHPOINT_ASSERT(error == 0);
244
+ }
245
+ #endif
246
+
247
+ #ifdef HAVE_RCVTIMEO
248
+ if (ptr->root->rcv_timeout)
249
+ {
250
+ int error;
251
+ struct timeval waittime;
252
+
253
+ waittime.tv_sec= 0;
254
+ waittime.tv_usec= ptr->root->rcv_timeout;
255
+
256
+ error= setsockopt(ptr->fd, SOL_SOCKET, SO_RCVTIMEO,
257
+ &waittime, (socklen_t)sizeof(struct timeval));
258
+ WATCHPOINT_ASSERT(error == 0);
259
+ }
260
+ #endif
261
+
262
+
263
+ #if defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__)
264
+ {
265
+ int set= 1;
266
+ int error= setsockopt(ptr->fd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));
267
+
268
+ // This is not considered a fatal error
269
+ if (error == -1)
270
+ {
271
+ WATCHPOINT_ERRNO(get_socket_errno());
272
+ perror("setsockopt(SO_NOSIGPIPE)");
273
+ }
274
+ }
275
+ #endif
276
+
277
+ if (ptr->root->flags.no_block)
278
+ {
279
+ int error;
280
+ struct linger linger;
281
+
282
+ linger.l_onoff= 1;
283
+ linger.l_linger= 0; /* By default on close() just drop the socket */
284
+ error= setsockopt(ptr->fd, SOL_SOCKET, SO_LINGER,
285
+ &linger, (socklen_t)sizeof(struct linger));
286
+ WATCHPOINT_ASSERT(error == 0);
287
+ }
288
+
289
+ if (ptr->root->flags.tcp_nodelay)
290
+ {
291
+ int flag= 1;
292
+ int error;
293
+
294
+ error= setsockopt(ptr->fd, IPPROTO_TCP, TCP_NODELAY,
295
+ &flag, (socklen_t)sizeof(int));
296
+ WATCHPOINT_ASSERT(error == 0);
297
+ }
298
+
299
+ if (ptr->root->flags.tcp_keepalive)
300
+ {
301
+ int flag= 1;
302
+ int error;
303
+
304
+ error= setsockopt(ptr->fd, SOL_SOCKET, SO_KEEPALIVE,
305
+ &flag, (socklen_t)sizeof(int));
306
+ WATCHPOINT_ASSERT(error == 0);
307
+ }
308
+
309
+ #ifdef TCP_KEEPIDLE
310
+ if (ptr->root->tcp_keepidle > 0)
311
+ {
312
+ int error;
313
+
314
+ error= setsockopt(ptr->fd, IPPROTO_TCP, TCP_KEEPIDLE,
315
+ &ptr->root->tcp_keepidle, (socklen_t)sizeof(int));
316
+ WATCHPOINT_ASSERT(error == 0);
317
+ }
318
+ #endif
319
+
320
+ if (ptr->root->send_size > 0)
321
+ {
322
+ int error;
323
+
324
+ error= setsockopt(ptr->fd, SOL_SOCKET, SO_SNDBUF,
325
+ &ptr->root->send_size, (socklen_t)sizeof(int));
326
+ WATCHPOINT_ASSERT(error == 0);
327
+ }
328
+
329
+ if (ptr->root->recv_size > 0)
330
+ {
331
+ int error;
332
+
333
+ error= setsockopt(ptr->fd, SOL_SOCKET, SO_RCVBUF,
334
+ &ptr->root->recv_size, (socklen_t)sizeof(int));
335
+ WATCHPOINT_ASSERT(error == 0);
336
+ }
337
+
338
+
339
+ /* libmemcached will always use nonblocking IO to avoid write deadlocks */
340
+ set_socket_nonblocking(ptr);
341
+ }
342
+
343
+ static memcached_return_t unix_socket_connect(memcached_server_st *ptr)
344
+ {
345
+ #ifndef WIN32
346
+ WATCHPOINT_ASSERT(ptr->fd == -1);
347
+
348
+ if ((ptr->fd= socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
349
+ {
350
+ return memcached_set_errno(*ptr, errno, NULL);
351
+ }
352
+
353
+ struct sockaddr_un servAddr;
354
+
355
+ memset(&servAddr, 0, sizeof (struct sockaddr_un));
356
+ servAddr.sun_family= AF_UNIX;
357
+ strncpy(servAddr.sun_path, ptr->hostname, sizeof(servAddr.sun_path)); /* Copy filename */
358
+
359
+ do {
360
+ if (connect(ptr->fd, (struct sockaddr *)&servAddr, sizeof(servAddr)) < 0)
361
+ {
362
+ switch (errno)
363
+ {
364
+ case EINPROGRESS:
365
+ case EALREADY:
366
+ case EINTR:
367
+ continue;
368
+
369
+ case EISCONN: /* We were spinning waiting on connect */
370
+ {
371
+ WATCHPOINT_ASSERT(0); // Programmer error
372
+ break;
373
+ }
374
+
375
+ default:
376
+ WATCHPOINT_ERRNO(errno);
377
+ return memcached_set_errno(*ptr, errno, MEMCACHED_AT);
378
+ }
379
+ }
380
+ } while (0);
381
+ ptr->state= MEMCACHED_SERVER_STATE_CONNECTED;
382
+
383
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
384
+
385
+ return MEMCACHED_SUCCESS;
386
+ #else
387
+ (void)ptr;
388
+ return MEMCACHED_NOT_SUPPORTED;
389
+ #endif
390
+ }
391
+
392
+ static memcached_return_t network_connect(memcached_server_st *ptr)
393
+ {
394
+ bool timeout_error_occured= false;
395
+
396
+ WATCHPOINT_ASSERT(ptr->fd == INVALID_SOCKET);
397
+ WATCHPOINT_ASSERT(ptr->cursor_active == 0);
398
+
399
+ if (not ptr->address_info)
400
+ {
401
+ WATCHPOINT_ASSERT(ptr->state == MEMCACHED_SERVER_STATE_NEW);
402
+ memcached_return_t rc;
403
+ uint32_t counter= 5;
404
+ while (--counter)
405
+ {
406
+ if ((rc= set_hostinfo(ptr)) != MEMCACHED_TIMEOUT)
407
+ break;
408
+
409
+ #ifndef WIN32
410
+ struct timespec dream, rem;
411
+
412
+ dream.tv_nsec= 1000;
413
+ dream.tv_sec= 0;
414
+
415
+ nanosleep(&dream, &rem);
416
+ #endif
417
+ }
418
+
419
+ if (memcached_failed(rc))
420
+ return rc;
421
+ }
422
+
423
+ /* Create the socket */
424
+ while (ptr->address_info_next && ptr->fd == INVALID_SOCKET)
425
+ {
426
+ /* Memcache server does not support IPV6 in udp mode, so skip if not ipv4 */
427
+ if (ptr->type == MEMCACHED_CONNECTION_UDP && ptr->address_info_next->ai_family != AF_INET)
428
+ {
429
+ ptr->address_info_next= ptr->address_info_next->ai_next;
430
+ continue;
431
+ }
432
+
433
+ if ((ptr->fd= socket(ptr->address_info_next->ai_family,
434
+ ptr->address_info_next->ai_socktype,
435
+ ptr->address_info_next->ai_protocol)) < 0)
436
+ {
437
+ return memcached_set_errno(*ptr, get_socket_errno(), NULL);
438
+ }
439
+
440
+ set_socket_options(ptr);
441
+
442
+ /* connect to server */
443
+ if ((connect(ptr->fd, ptr->address_info_next->ai_addr, ptr->address_info_next->ai_addrlen) != SOCKET_ERROR))
444
+ {
445
+ ptr->state= MEMCACHED_SERVER_STATE_CONNECTED;
446
+ break; // Success
447
+ }
448
+
449
+ /* An error occurred */
450
+ switch (get_socket_errno())
451
+ {
452
+ case ETIMEDOUT:
453
+ timeout_error_occured= true;
454
+ break;
455
+
456
+ case EWOULDBLOCK:
457
+ case EINPROGRESS: // nonblocking mode - first return
458
+ case EALREADY: // nonblocking mode - subsequent returns
459
+ {
460
+ ptr->state= MEMCACHED_SERVER_STATE_IN_PROGRESS;
461
+ memcached_return_t rc= connect_poll(ptr);
462
+
463
+ if (memcached_success(rc))
464
+ {
465
+ ptr->state= MEMCACHED_SERVER_STATE_CONNECTED;
466
+ return MEMCACHED_SUCCESS;
467
+ }
468
+
469
+ // A timeout here is treated as an error, we will not retry
470
+ if (rc == MEMCACHED_TIMEOUT)
471
+ {
472
+ timeout_error_occured= true;
473
+ }
474
+ }
475
+ break;
476
+
477
+ case EISCONN: // we are connected :-)
478
+ WATCHPOINT_ASSERT(0); // This is a programmer's error
479
+ break;
480
+
481
+ case EINTR: // Special case, we retry ai_addr
482
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
483
+ (void)closesocket(ptr->fd);
484
+ ptr->fd= INVALID_SOCKET;
485
+ continue;
486
+
487
+ default:
488
+ break;
489
+ }
490
+
491
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
492
+ (void)closesocket(ptr->fd);
493
+ ptr->fd= INVALID_SOCKET;
494
+ ptr->address_info_next= ptr->address_info_next->ai_next;
495
+ }
496
+
497
+ WATCHPOINT_ASSERT(ptr->fd == INVALID_SOCKET);
498
+
499
+ if (timeout_error_occured)
500
+ {
501
+ if (ptr->fd != INVALID_SOCKET)
502
+ {
503
+ (void)closesocket(ptr->fd);
504
+ ptr->fd= INVALID_SOCKET;
505
+ }
506
+ }
507
+
508
+ WATCHPOINT_STRING("Never got a good file descriptor");
509
+ /* Failed to connect. schedule next retry */
510
+ if (ptr->root->retry_timeout)
511
+ {
512
+ struct timeval next_time;
513
+
514
+ if (gettimeofday(&next_time, NULL) == 0)
515
+ ptr->next_retry= next_time.tv_sec + ptr->root->retry_timeout;
516
+ }
517
+
518
+ if (timeout_error_occured)
519
+ return memcached_set_error(*ptr, MEMCACHED_TIMEOUT, MEMCACHED_AT);
520
+
521
+ return memcached_set_error(*ptr, MEMCACHED_CONNECTION_FAILURE, MEMCACHED_AT); /* The last error should be from connect() */
522
+ }
523
+
524
+ void set_last_disconnected_host(memcached_server_write_instance_st self)
525
+ {
526
+ // const_cast
527
+ memcached_st *root= (memcached_st *)self->root;
528
+
529
+ #if 0
530
+ WATCHPOINT_STRING(self->hostname);
531
+ WATCHPOINT_NUMBER(self->port);
532
+ WATCHPOINT_ERRNO(self->cached_errno);
533
+ #endif
534
+ memcached_server_free(root->last_disconnected_server);
535
+ root->last_disconnected_server= memcached_server_clone(NULL, self);
536
+ }
537
+
538
+ memcached_return_t memcached_connect(memcached_server_write_instance_st ptr)
539
+ {
540
+ memcached_return_t rc= MEMCACHED_NO_SERVERS;
541
+
542
+ if (ptr->fd != INVALID_SOCKET)
543
+ return MEMCACHED_SUCCESS;
544
+
545
+ LIBMEMCACHED_MEMCACHED_CONNECT_START();
546
+
547
+ /* both retry_timeout and server_failure_limit must be set in order to delay retrying a server on error. */
548
+ WATCHPOINT_ASSERT(ptr->root);
549
+ // If we are over the counter failure, we just fail. Reject host only
550
+ // works if you have a set number of failures.
551
+ if (ptr->root->server_failure_limit && ptr->server_failure_counter >= ptr->root->server_failure_limit)
552
+ {
553
+ // @todo fix this by fixing behavior to no longer make use of
554
+ // memcached_st
555
+ if (_is_auto_eject_host(ptr->root))
556
+ {
557
+ ptr->server_failure_counter= 0;
558
+ run_distribution((memcached_st *)ptr->root);
559
+ }
560
+
561
+ if (ptr->root->retry_timeout && ptr->next_retry)
562
+ {
563
+ struct timeval curr_time;
564
+
565
+ gettimeofday(&curr_time, NULL);
566
+
567
+ // We should optimize this to remove the allocation if the server was
568
+ // the last server to die
569
+ if (ptr->next_retry > curr_time.tv_sec)
570
+ {
571
+ set_last_disconnected_host(ptr);
572
+ return memcached_set_error(*ptr, MEMCACHED_SERVER_MARKED_DEAD, MEMCACHED_AT);
573
+ }
574
+ }
575
+ }
576
+
577
+ /* We need to clean up the multi startup piece */
578
+ switch (ptr->type)
579
+ {
580
+ case MEMCACHED_CONNECTION_UNKNOWN:
581
+ WATCHPOINT_ASSERT(0);
582
+ rc= MEMCACHED_NOT_SUPPORTED;
583
+ break;
584
+
585
+ case MEMCACHED_CONNECTION_UDP:
586
+ case MEMCACHED_CONNECTION_TCP:
587
+ rc= network_connect(ptr);
588
+ #ifdef LIBMEMCACHED_WITH_SASL_SUPPORT
589
+ if (ptr->fd != INVALID_SOCKET and ptr->root->sasl.callbacks)
590
+ {
591
+ rc= memcached_sasl_authenticate_connection(ptr);
592
+ if (memcached_failed(rc) and ptr->fd != INVALID_SOCKET)
593
+ {
594
+ WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
595
+ (void)closesocket(ptr->fd);
596
+ ptr->fd= INVALID_SOCKET;
597
+ }
598
+ }
599
+ #endif
600
+ break;
601
+
602
+ case MEMCACHED_CONNECTION_UNIX_SOCKET:
603
+ rc= unix_socket_connect(ptr);
604
+ break;
605
+
606
+ case MEMCACHED_CONNECTION_MAX:
607
+ default:
608
+ WATCHPOINT_ASSERT(0);
609
+ }
610
+
611
+ if (memcached_success(rc))
612
+ {
613
+ ptr->server_failure_counter= 0;
614
+ ptr->next_retry= 0;
615
+ }
616
+ else
617
+ {
618
+ memcached_set_error(*ptr, rc, MEMCACHED_AT);
619
+ ptr->server_failure_counter++;
620
+ set_last_disconnected_host(ptr);
621
+ }
622
+
623
+ LIBMEMCACHED_MEMCACHED_CONNECT_END();
624
+
625
+ return rc;
626
+ }