couchbase-memcached 1.2.8
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +2 -0
- data/BENCHMARKS +134 -0
- data/CHANGELOG +127 -0
- data/LICENSE +184 -0
- data/Manifest +535 -0
- data/README +118 -0
- data/Rakefile +83 -0
- data/TODO +4 -0
- data/couchbase-memcached.gemspec +33 -0
- data/ext/extconf-make.rb +25 -0
- data/ext/extconf.rb +91 -0
- data/ext/libmemcached-0.50/AUTHORS +11 -0
- data/ext/libmemcached-0.50/COPYING +33 -0
- data/ext/libmemcached-0.50/ChangeLog +392 -0
- data/ext/libmemcached-0.50/Makefile.am +114 -0
- data/ext/libmemcached-0.50/Makefile.in +4232 -0
- data/ext/libmemcached-0.50/NEWS +1 -0
- data/ext/libmemcached-0.50/README +43 -0
- data/ext/libmemcached-0.50/README.FIRST +31 -0
- data/ext/libmemcached-0.50/README.win32 +25 -0
- data/ext/libmemcached-0.50/THANKS +14 -0
- data/ext/libmemcached-0.50/TODO +11 -0
- data/ext/libmemcached-0.50/aclocal.m4 +1077 -0
- data/ext/libmemcached-0.50/clients/client_options.h +45 -0
- data/ext/libmemcached-0.50/clients/execute.cc +131 -0
- data/ext/libmemcached-0.50/clients/execute.h +30 -0
- data/ext/libmemcached-0.50/clients/generator.cc +96 -0
- data/ext/libmemcached-0.50/clients/generator.h +36 -0
- data/ext/libmemcached-0.50/clients/include.am +116 -0
- data/ext/libmemcached-0.50/clients/memaslap.c +908 -0
- data/ext/libmemcached-0.50/clients/memcapable.cc +2094 -0
- data/ext/libmemcached-0.50/clients/memcat.cc +242 -0
- data/ext/libmemcached-0.50/clients/memcp.cc +317 -0
- data/ext/libmemcached-0.50/clients/memdump.cc +183 -0
- data/ext/libmemcached-0.50/clients/memerror.cc +102 -0
- data/ext/libmemcached-0.50/clients/memflush.cc +154 -0
- data/ext/libmemcached-0.50/clients/memparse.cc +68 -0
- data/ext/libmemcached-0.50/clients/memrm.cc +177 -0
- data/ext/libmemcached-0.50/clients/memslap.cc +495 -0
- data/ext/libmemcached-0.50/clients/memstat.cc +349 -0
- data/ext/libmemcached-0.50/clients/ms_atomic.h +69 -0
- data/ext/libmemcached-0.50/clients/ms_conn.c +3413 -0
- data/ext/libmemcached-0.50/clients/ms_conn.h +241 -0
- data/ext/libmemcached-0.50/clients/ms_memslap.h +132 -0
- data/ext/libmemcached-0.50/clients/ms_setting.c +1068 -0
- data/ext/libmemcached-0.50/clients/ms_setting.h +181 -0
- data/ext/libmemcached-0.50/clients/ms_sigsegv.c +126 -0
- data/ext/libmemcached-0.50/clients/ms_sigsegv.h +34 -0
- data/ext/libmemcached-0.50/clients/ms_stats.c +307 -0
- data/ext/libmemcached-0.50/clients/ms_stats.h +69 -0
- data/ext/libmemcached-0.50/clients/ms_task.c +1114 -0
- data/ext/libmemcached-0.50/clients/ms_task.h +94 -0
- data/ext/libmemcached-0.50/clients/ms_thread.c +351 -0
- data/ext/libmemcached-0.50/clients/ms_thread.h +78 -0
- data/ext/libmemcached-0.50/clients/utilities.cc +231 -0
- data/ext/libmemcached-0.50/clients/utilities.h +64 -0
- data/ext/libmemcached-0.50/config.h.in +647 -0
- data/ext/libmemcached-0.50/config/autorun.sh +126 -0
- data/ext/libmemcached-0.50/config/compile +143 -0
- data/ext/libmemcached-0.50/config/config.guess +1517 -0
- data/ext/libmemcached-0.50/config/config.rpath +666 -0
- data/ext/libmemcached-0.50/config/config.sub +1760 -0
- data/ext/libmemcached-0.50/config/depcomp +630 -0
- data/ext/libmemcached-0.50/config/install-sh +520 -0
- data/ext/libmemcached-0.50/config/ltmain.sh +9642 -0
- data/ext/libmemcached-0.50/config/missing +376 -0
- data/ext/libmemcached-0.50/config/pandora-plugin +752 -0
- data/ext/libmemcached-0.50/config/uncrustify.cfg +1112 -0
- data/ext/libmemcached-0.50/configure +27103 -0
- data/ext/libmemcached-0.50/configure.ac +186 -0
- data/ext/libmemcached-0.50/docs/conf.py.in +354 -0
- data/ext/libmemcached-0.50/docs/include.am +240 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_clone.3 +88 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_crc32.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_create.3 +88 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_fnv1_32.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_fnv1_64.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_fnv1a_32.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_fnv1a_64.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_free.3 +88 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_functions.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_hsieh.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_is_allocated.3 +88 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_jenkins.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_md5.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_murmur.3 +105 -0
- data/ext/libmemcached-0.50/docs/man/hashkit_value.3 +66 -0
- data/ext/libmemcached-0.50/docs/man/libhashkit.3 +57 -0
- data/ext/libmemcached-0.50/docs/man/libmemcached.3 +208 -0
- data/ext/libmemcached-0.50/docs/man/libmemcached_check_configuration.3 +293 -0
- data/ext/libmemcached-0.50/docs/man/libmemcached_configuration.3 +293 -0
- data/ext/libmemcached-0.50/docs/man/libmemcached_examples.3 +144 -0
- data/ext/libmemcached-0.50/docs/man/libmemcachedutil.3 +68 -0
- data/ext/libmemcached-0.50/docs/man/memaslap.1 +1222 -0
- data/ext/libmemcached-0.50/docs/man/memcached.3 +293 -0
- data/ext/libmemcached-0.50/docs/man/memcached_add.3 +132 -0
- data/ext/libmemcached-0.50/docs/man/memcached_add_by_key.3 +132 -0
- data/ext/libmemcached-0.50/docs/man/memcached_analyze.3 +77 -0
- data/ext/libmemcached-0.50/docs/man/memcached_append.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_append_by_key.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_behavior_get.3 +333 -0
- data/ext/libmemcached-0.50/docs/man/memcached_behavior_set.3 +333 -0
- data/ext/libmemcached-0.50/docs/man/memcached_callback_get.3 +159 -0
- data/ext/libmemcached-0.50/docs/man/memcached_callback_set.3 +159 -0
- data/ext/libmemcached-0.50/docs/man/memcached_cas.3 +91 -0
- data/ext/libmemcached-0.50/docs/man/memcached_cas_by_key.3 +91 -0
- data/ext/libmemcached-0.50/docs/man/memcached_clone.3 +99 -0
- data/ext/libmemcached-0.50/docs/man/memcached_create.3 +99 -0
- data/ext/libmemcached-0.50/docs/man/memcached_decrement.3 +124 -0
- data/ext/libmemcached-0.50/docs/man/memcached_decrement_with_initial.3 +124 -0
- data/ext/libmemcached-0.50/docs/man/memcached_delete.3 +83 -0
- data/ext/libmemcached-0.50/docs/man/memcached_delete_by_key.3 +83 -0
- data/ext/libmemcached-0.50/docs/man/memcached_destroy_sasl_auth_data.3 +95 -0
- data/ext/libmemcached-0.50/docs/man/memcached_dump.3 +77 -0
- data/ext/libmemcached-0.50/docs/man/memcached_fetch.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_fetch_execute.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_fetch_result.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_flush_buffers.3 +72 -0
- data/ext/libmemcached-0.50/docs/man/memcached_free.3 +99 -0
- data/ext/libmemcached-0.50/docs/man/memcached_generate_hash.3 +85 -0
- data/ext/libmemcached-0.50/docs/man/memcached_generate_hash_value.3 +85 -0
- data/ext/libmemcached-0.50/docs/man/memcached_get.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_get_by_key.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_get_memory_allocators.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_get_sasl_callbacks.3 +95 -0
- data/ext/libmemcached-0.50/docs/man/memcached_get_user_data.3 +79 -0
- data/ext/libmemcached-0.50/docs/man/memcached_increment.3 +124 -0
- data/ext/libmemcached-0.50/docs/man/memcached_increment_with_initial.3 +124 -0
- data/ext/libmemcached-0.50/docs/man/memcached_lib_version.3 +76 -0
- data/ext/libmemcached-0.50/docs/man/memcached_mget.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_mget_by_key.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_mget_execute.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_mget_execute_by_key.3 +174 -0
- data/ext/libmemcached-0.50/docs/man/memcached_pool_behavior_get.3 +139 -0
- data/ext/libmemcached-0.50/docs/man/memcached_pool_behavior_set.3 +139 -0
- data/ext/libmemcached-0.50/docs/man/memcached_pool_create.3 +139 -0
- data/ext/libmemcached-0.50/docs/man/memcached_pool_destroy.3 +139 -0
- data/ext/libmemcached-0.50/docs/man/memcached_pool_pop.3 +139 -0
- data/ext/libmemcached-0.50/docs/man/memcached_pool_push.3 +139 -0
- data/ext/libmemcached-0.50/docs/man/memcached_pool_st.3 +139 -0
- data/ext/libmemcached-0.50/docs/man/memcached_prepend.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_prepend_by_key.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_quit.3 +74 -0
- data/ext/libmemcached-0.50/docs/man/memcached_replace.3 +132 -0
- data/ext/libmemcached-0.50/docs/man/memcached_replace_by_key.3 +132 -0
- data/ext/libmemcached-0.50/docs/man/memcached_sasl_set_auth_data.3 +95 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_add.3 +141 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_count.3 +141 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_cursor.3 +141 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_list.3 +141 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_list_append.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_list_count.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_list_free.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_server_push.3 +141 -0
- data/ext/libmemcached-0.50/docs/man/memcached_servers_parse.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_set.3 +132 -0
- data/ext/libmemcached-0.50/docs/man/memcached_set_by_key.3 +132 -0
- data/ext/libmemcached-0.50/docs/man/memcached_set_memory_allocators.3 +111 -0
- data/ext/libmemcached-0.50/docs/man/memcached_set_sasl_callbacks.3 +95 -0
- data/ext/libmemcached-0.50/docs/man/memcached_set_user_data.3 +79 -0
- data/ext/libmemcached-0.50/docs/man/memcached_stat.3 +116 -0
- data/ext/libmemcached-0.50/docs/man/memcached_stat_execute.3 +116 -0
- data/ext/libmemcached-0.50/docs/man/memcached_stat_get_keys.3 +116 -0
- data/ext/libmemcached-0.50/docs/man/memcached_stat_get_value.3 +116 -0
- data/ext/libmemcached-0.50/docs/man/memcached_stat_servername.3 +116 -0
- data/ext/libmemcached-0.50/docs/man/memcached_strerror.3 +69 -0
- data/ext/libmemcached-0.50/docs/man/memcached_verbosity.3 +66 -0
- data/ext/libmemcached-0.50/docs/man/memcached_version.3 +76 -0
- data/ext/libmemcached-0.50/docs/man/memcapable.1 +92 -0
- data/ext/libmemcached-0.50/docs/man/memcat.1 +71 -0
- data/ext/libmemcached-0.50/docs/man/memcp.1 +77 -0
- data/ext/libmemcached-0.50/docs/man/memdump.1 +66 -0
- data/ext/libmemcached-0.50/docs/man/memerror.1 +65 -0
- data/ext/libmemcached-0.50/docs/man/memflush.1 +73 -0
- data/ext/libmemcached-0.50/docs/man/memrm.1 +72 -0
- data/ext/libmemcached-0.50/docs/man/memslap.1 +59 -0
- data/ext/libmemcached-0.50/docs/man/memstat.1 +70 -0
- data/ext/libmemcached-0.50/example/include.am +24 -0
- data/ext/libmemcached-0.50/example/interface_v0.c +594 -0
- data/ext/libmemcached-0.50/example/interface_v1.c +411 -0
- data/ext/libmemcached-0.50/example/memcached_light.c +474 -0
- data/ext/libmemcached-0.50/example/memcached_light.h +7 -0
- data/ext/libmemcached-0.50/example/storage.c +172 -0
- data/ext/libmemcached-0.50/example/storage.h +27 -0
- data/ext/libmemcached-0.50/example/storage_innodb.c +535 -0
- data/ext/libmemcached-0.50/libhashkit/algorithm.cc +69 -0
- data/ext/libmemcached-0.50/libhashkit/algorithm.h +96 -0
- data/ext/libmemcached-0.50/libhashkit/behavior.cc +9 -0
- data/ext/libmemcached-0.50/libhashkit/behavior.h +26 -0
- data/ext/libmemcached-0.50/libhashkit/common.h +33 -0
- data/ext/libmemcached-0.50/libhashkit/configure.h.in +19 -0
- data/ext/libmemcached-0.50/libhashkit/crc32.cc +86 -0
- data/ext/libmemcached-0.50/libhashkit/digest.cc +62 -0
- data/ext/libmemcached-0.50/libhashkit/digest.h +30 -0
- data/ext/libmemcached-0.50/libhashkit/fnv.cc +75 -0
- data/ext/libmemcached-0.50/libhashkit/function.cc +156 -0
- data/ext/libmemcached-0.50/libhashkit/function.h +44 -0
- data/ext/libmemcached-0.50/libhashkit/hashkit.cc +100 -0
- data/ext/libmemcached-0.50/libhashkit/hashkit.h +95 -0
- data/ext/libmemcached-0.50/libhashkit/hashkit.hpp +97 -0
- data/ext/libmemcached-0.50/libhashkit/hsieh.cc +70 -0
- data/ext/libmemcached-0.50/libhashkit/include.am +69 -0
- data/ext/libmemcached-0.50/libhashkit/jenkins.cc +214 -0
- data/ext/libmemcached-0.50/libhashkit/ketama.cc +164 -0
- data/ext/libmemcached-0.50/libhashkit/md5.cc +367 -0
- data/ext/libmemcached-0.50/libhashkit/murmur.cc +77 -0
- data/ext/libmemcached-0.50/libhashkit/one_at_a_time.cc +34 -0
- data/ext/libmemcached-0.50/libhashkit/str_algorithm.cc +58 -0
- data/ext/libmemcached-0.50/libhashkit/str_algorithm.h +48 -0
- data/ext/libmemcached-0.50/libhashkit/strerror.cc +25 -0
- data/ext/libmemcached-0.50/libhashkit/strerror.h +23 -0
- data/ext/libmemcached-0.50/libhashkit/types.h +90 -0
- data/ext/libmemcached-0.50/libhashkit/visibility.h +48 -0
- data/ext/libmemcached-0.50/libmemcached/allocators.cc +119 -0
- data/ext/libmemcached-0.50/libmemcached/allocators.h +87 -0
- data/ext/libmemcached-0.50/libmemcached/analyze.cc +110 -0
- data/ext/libmemcached-0.50/libmemcached/analyze.h +66 -0
- data/ext/libmemcached-0.50/libmemcached/array.c +128 -0
- data/ext/libmemcached-0.50/libmemcached/array.h +75 -0
- data/ext/libmemcached-0.50/libmemcached/auto.cc +383 -0
- data/ext/libmemcached-0.50/libmemcached/auto.h +111 -0
- data/ext/libmemcached-0.50/libmemcached/basic_string.h +55 -0
- data/ext/libmemcached-0.50/libmemcached/behavior.cc +590 -0
- data/ext/libmemcached-0.50/libmemcached/behavior.h +86 -0
- data/ext/libmemcached-0.50/libmemcached/byteorder.cc +90 -0
- data/ext/libmemcached-0.50/libmemcached/byteorder.h +52 -0
- data/ext/libmemcached-0.50/libmemcached/callback.cc +160 -0
- data/ext/libmemcached-0.50/libmemcached/callback.h +61 -0
- data/ext/libmemcached-0.50/libmemcached/common.h +182 -0
- data/ext/libmemcached-0.50/libmemcached/configure.h.in +52 -0
- data/ext/libmemcached-0.50/libmemcached/connect.cc +626 -0
- data/ext/libmemcached-0.50/libmemcached/constants.h +167 -0
- data/ext/libmemcached-0.50/libmemcached/delete.cc +266 -0
- data/ext/libmemcached-0.50/libmemcached/delete.h +57 -0
- data/ext/libmemcached-0.50/libmemcached/do.cc +100 -0
- data/ext/libmemcached-0.50/libmemcached/do.hpp +49 -0
- data/ext/libmemcached-0.50/libmemcached/dump.cc +107 -0
- data/ext/libmemcached-0.50/libmemcached/dump.h +51 -0
- data/ext/libmemcached-0.50/libmemcached/error.cc +419 -0
- data/ext/libmemcached-0.50/libmemcached/error.h +61 -0
- data/ext/libmemcached-0.50/libmemcached/error.hpp +87 -0
- data/ext/libmemcached-0.50/libmemcached/exception.hpp +63 -0
- data/ext/libmemcached-0.50/libmemcached/fetch.cc +267 -0
- data/ext/libmemcached-0.50/libmemcached/fetch.h +53 -0
- data/ext/libmemcached-0.50/libmemcached/flush.cc +149 -0
- data/ext/libmemcached-0.50/libmemcached/flush.h +49 -0
- data/ext/libmemcached-0.50/libmemcached/flush_buffers.cc +66 -0
- data/ext/libmemcached-0.50/libmemcached/flush_buffers.h +49 -0
- data/ext/libmemcached-0.50/libmemcached/get.cc +842 -0
- data/ext/libmemcached-0.50/libmemcached/get.h +135 -0
- data/ext/libmemcached-0.50/libmemcached/hash.cc +178 -0
- data/ext/libmemcached-0.50/libmemcached/hash.h +68 -0
- data/ext/libmemcached-0.50/libmemcached/hosts.cc +516 -0
- data/ext/libmemcached-0.50/libmemcached/include.am +183 -0
- data/ext/libmemcached-0.50/libmemcached/initialize_query.cc +70 -0
- data/ext/libmemcached-0.50/libmemcached/initialize_query.h +51 -0
- data/ext/libmemcached-0.50/libmemcached/internal.h +46 -0
- data/ext/libmemcached-0.50/libmemcached/io.cc +920 -0
- data/ext/libmemcached-0.50/libmemcached/io.h +119 -0
- data/ext/libmemcached-0.50/libmemcached/is.h +48 -0
- data/ext/libmemcached-0.50/libmemcached/key.cc +23 -0
- data/ext/libmemcached-0.50/libmemcached/libmemcached_probes.d +30 -0
- data/ext/libmemcached-0.50/libmemcached/libmemcached_probes.h +118 -0
- data/ext/libmemcached-0.50/libmemcached/memcached.cc +437 -0
- data/ext/libmemcached-0.50/libmemcached/memcached.h +214 -0
- data/ext/libmemcached-0.50/libmemcached/memcached.hpp +799 -0
- data/ext/libmemcached-0.50/libmemcached/memcached/README.txt +7 -0
- data/ext/libmemcached-0.50/libmemcached/memcached/protocol_binary.h +726 -0
- data/ext/libmemcached-0.50/libmemcached/memcached/vbucket.h +26 -0
- data/ext/libmemcached-0.50/libmemcached/memcached_util.h +44 -0
- data/ext/libmemcached-0.50/libmemcached/memory.h +79 -0
- data/ext/libmemcached-0.50/libmemcached/options.cc +178 -0
- data/ext/libmemcached-0.50/libmemcached/options.h +49 -0
- data/ext/libmemcached-0.50/libmemcached/options.hpp +56 -0
- data/ext/libmemcached-0.50/libmemcached/options/context.h +151 -0
- data/ext/libmemcached-0.50/libmemcached/options/include.am +19 -0
- data/ext/libmemcached-0.50/libmemcached/options/parser.am +0 -0
- data/ext/libmemcached-0.50/libmemcached/options/parser.cc +2324 -0
- data/ext/libmemcached-0.50/libmemcached/options/parser.h +122 -0
- data/ext/libmemcached-0.50/libmemcached/options/scanner.cc +3203 -0
- data/ext/libmemcached-0.50/libmemcached/options/scanner.h +479 -0
- data/ext/libmemcached-0.50/libmemcached/options/server.h +60 -0
- data/ext/libmemcached-0.50/libmemcached/options/symbol.h +57 -0
- data/ext/libmemcached-0.50/libmemcached/parse.cc +110 -0
- data/ext/libmemcached-0.50/libmemcached/parse.h +23 -0
- data/ext/libmemcached-0.50/libmemcached/platform.h +56 -0
- data/ext/libmemcached-0.50/libmemcached/prefix_key.cc +65 -0
- data/ext/libmemcached-0.50/libmemcached/prefix_key.h +49 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/ascii_handler.c +963 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/ascii_handler.h +40 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/binary_handler.c +1121 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/binary_handler.h +47 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/cache.c +149 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/cache.h +116 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/callback.h +418 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/common.h +163 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/include.am +26 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/pedantic.c +202 -0
- data/ext/libmemcached-0.50/libmemcached/protocol/protocol_handler.c +365 -0
- data/ext/libmemcached-0.50/libmemcached/protocol_handler.h +215 -0
- data/ext/libmemcached-0.50/libmemcached/purge.cc +90 -0
- data/ext/libmemcached-0.50/libmemcached/quit.cc +139 -0
- data/ext/libmemcached-0.50/libmemcached/quit.h +55 -0
- data/ext/libmemcached-0.50/libmemcached/response.cc +619 -0
- data/ext/libmemcached-0.50/libmemcached/response.h +57 -0
- data/ext/libmemcached-0.50/libmemcached/result.cc +173 -0
- data/ext/libmemcached-0.50/libmemcached/result.h +100 -0
- data/ext/libmemcached-0.50/libmemcached/return.h +98 -0
- data/ext/libmemcached-0.50/libmemcached/sasl.c +408 -0
- data/ext/libmemcached-0.50/libmemcached/sasl.h +86 -0
- data/ext/libmemcached-0.50/libmemcached/server.cc +351 -0
- data/ext/libmemcached-0.50/libmemcached/server.h +169 -0
- data/ext/libmemcached-0.50/libmemcached/server_list.cc +88 -0
- data/ext/libmemcached-0.50/libmemcached/server_list.h +77 -0
- data/ext/libmemcached-0.50/libmemcached/stats.cc +623 -0
- data/ext/libmemcached-0.50/libmemcached/stats.h +96 -0
- data/ext/libmemcached-0.50/libmemcached/storage.cc +567 -0
- data/ext/libmemcached-0.50/libmemcached/storage.h +133 -0
- data/ext/libmemcached-0.50/libmemcached/strerror.cc +189 -0
- data/ext/libmemcached-0.50/libmemcached/strerror.h +50 -0
- data/ext/libmemcached-0.50/libmemcached/string.cc +253 -0
- data/ext/libmemcached-0.50/libmemcached/string.h +121 -0
- data/ext/libmemcached-0.50/libmemcached/touch.cc +106 -0
- data/ext/libmemcached-0.50/libmemcached/touch.h +59 -0
- data/ext/libmemcached-0.50/libmemcached/types.h +117 -0
- data/ext/libmemcached-0.50/libmemcached/util.h +40 -0
- data/ext/libmemcached-0.50/libmemcached/util/flush.cc +61 -0
- data/ext/libmemcached-0.50/libmemcached/util/flush.h +50 -0
- data/ext/libmemcached-0.50/libmemcached/util/include.am +34 -0
- data/ext/libmemcached-0.50/libmemcached/util/ping.cc +62 -0
- data/ext/libmemcached-0.50/libmemcached/util/ping.h +49 -0
- data/ext/libmemcached-0.50/libmemcached/util/pool.cc +392 -0
- data/ext/libmemcached-0.50/libmemcached/util/pool.h +78 -0
- data/ext/libmemcached-0.50/libmemcached/util/version.cc +87 -0
- data/ext/libmemcached-0.50/libmemcached/util/version.h +53 -0
- data/ext/libmemcached-0.50/libmemcached/verbosity.cc +97 -0
- data/ext/libmemcached-0.50/libmemcached/verbosity.h +50 -0
- data/ext/libmemcached-0.50/libmemcached/version.cc +214 -0
- data/ext/libmemcached-0.50/libmemcached/version.h +52 -0
- data/ext/libmemcached-0.50/libmemcached/virtual_bucket.c +118 -0
- data/ext/libmemcached-0.50/libmemcached/virtual_bucket.h +59 -0
- data/ext/libmemcached-0.50/libmemcached/visibility.h +51 -0
- data/ext/libmemcached-0.50/libmemcached/watchpoint.h +110 -0
- data/ext/libmemcached-0.50/libtest/callbacks.h +21 -0
- data/ext/libmemcached-0.50/libtest/collection.h +19 -0
- data/ext/libmemcached-0.50/libtest/common.h +50 -0
- data/ext/libmemcached-0.50/libtest/core.h +11 -0
- data/ext/libmemcached-0.50/libtest/error.h +18 -0
- data/ext/libmemcached-0.50/libtest/failed.h +52 -0
- data/ext/libmemcached-0.50/libtest/framework.cc +57 -0
- data/ext/libmemcached-0.50/libtest/framework.h +137 -0
- data/ext/libmemcached-0.50/libtest/get.h +22 -0
- data/ext/libmemcached-0.50/libtest/include.am +52 -0
- data/ext/libmemcached-0.50/libtest/runner.h +19 -0
- data/ext/libmemcached-0.50/libtest/server.c +355 -0
- data/ext/libmemcached-0.50/libtest/server.h +43 -0
- data/ext/libmemcached-0.50/libtest/stats.h +30 -0
- data/ext/libmemcached-0.50/libtest/strerror.h +14 -0
- data/ext/libmemcached-0.50/libtest/test.cc +319 -0
- data/ext/libmemcached-0.50/libtest/test.h +162 -0
- data/ext/libmemcached-0.50/libtest/test.hpp +46 -0
- data/ext/libmemcached-0.50/libtest/visibility.h +69 -0
- data/ext/libmemcached-0.50/m4/ac_cxx_header_stdcxx_98.m4 +83 -0
- data/ext/libmemcached-0.50/m4/acx_pthread.m4 +271 -0
- data/ext/libmemcached-0.50/m4/byteorder.m4 +19 -0
- data/ext/libmemcached-0.50/m4/deprecated.m4 +17 -0
- data/ext/libmemcached-0.50/m4/eagain.m4 +28 -0
- data/ext/libmemcached-0.50/m4/enable_utillib.m4 +16 -0
- data/ext/libmemcached-0.50/m4/gettext.m4 +379 -0
- data/ext/libmemcached-0.50/m4/hsieh.m4 +18 -0
- data/ext/libmemcached-0.50/m4/iconv.m4 +214 -0
- data/ext/libmemcached-0.50/m4/lib-ld.m4 +110 -0
- data/ext/libmemcached-0.50/m4/lib-link.m4 +767 -0
- data/ext/libmemcached-0.50/m4/lib-prefix.m4 +221 -0
- data/ext/libmemcached-0.50/m4/libtool.m4 +7851 -0
- data/ext/libmemcached-0.50/m4/ltoptions.m4 +369 -0
- data/ext/libmemcached-0.50/m4/ltsugar.m4 +123 -0
- data/ext/libmemcached-0.50/m4/ltversion.m4 +23 -0
- data/ext/libmemcached-0.50/m4/lt~obsolete.m4 +98 -0
- data/ext/libmemcached-0.50/m4/memaslap.m4 +9 -0
- data/ext/libmemcached-0.50/m4/memcached.m4 +31 -0
- data/ext/libmemcached-0.50/m4/murmur.m4 +18 -0
- data/ext/libmemcached-0.50/m4/pandora_64bit.m4 +60 -0
- data/ext/libmemcached-0.50/m4/pandora_bison.m4 +33 -0
- data/ext/libmemcached-0.50/m4/pandora_canonical.m4 +418 -0
- data/ext/libmemcached-0.50/m4/pandora_check_compiler_version.m4 +37 -0
- data/ext/libmemcached-0.50/m4/pandora_check_cxx_standard.m4 +23 -0
- data/ext/libmemcached-0.50/m4/pandora_cinttypes.m4 +39 -0
- data/ext/libmemcached-0.50/m4/pandora_clock_gettime.m4 +15 -0
- data/ext/libmemcached-0.50/m4/pandora_compile_stdcxx_0x.m4 +103 -0
- data/ext/libmemcached-0.50/m4/pandora_cstdint.m4 +38 -0
- data/ext/libmemcached-0.50/m4/pandora_cxx_demangle.m4 +27 -0
- data/ext/libmemcached-0.50/m4/pandora_enable_dtrace.m4 +60 -0
- data/ext/libmemcached-0.50/m4/pandora_ensure_gcc_version.m4 +62 -0
- data/ext/libmemcached-0.50/m4/pandora_extensions.m4 +16 -0
- data/ext/libmemcached-0.50/m4/pandora_fdatasync.m4 +25 -0
- data/ext/libmemcached-0.50/m4/pandora_flex.m4 +33 -0
- data/ext/libmemcached-0.50/m4/pandora_have_better_malloc.m4 +66 -0
- data/ext/libmemcached-0.50/m4/pandora_have_boost.m4 +93 -0
- data/ext/libmemcached-0.50/m4/pandora_have_gcc_atomics.m4 +37 -0
- data/ext/libmemcached-0.50/m4/pandora_have_innodb.m4 +41 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libaio.m4 +56 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libavahi.m4 +41 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libbdb.m4 +40 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libboost_date_time.m4 +46 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libboost_filesystem.m4 +47 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libboost_iostreams.m4 +49 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libboost_options.m4 +47 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libboost_regex.m4 +54 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libboost_test.m4 +45 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libboost_thread.m4 +54 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libcassandra.m4 +44 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libcurl.m4 +62 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libdl.m4 +51 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libdrizzle.m4 +61 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libevent.m4 +66 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libgearman.m4 +41 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libgtest.m4 +47 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libhaildb.m4 +43 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libhashkit.m4 +42 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libinnodb.m4 +64 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libldap.m4 +73 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libmemcached.m4 +106 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libmysqlclient.m4 +146 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libndbclient.m4 +80 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libpcre.m4 +73 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libpq.m4 +46 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libpqxx.m4 +44 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libsqlite3.m4 +42 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libtokyocabinet.m4 +54 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libuuid.m4 +55 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libvbucket.m4 +40 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libxml2.m4 +52 -0
- data/ext/libmemcached-0.50/m4/pandora_have_libz.m4 +51 -0
- data/ext/libmemcached-0.50/m4/pandora_have_protobuf.m4 +82 -0
- data/ext/libmemcached-0.50/m4/pandora_have_sasl.m4 +133 -0
- data/ext/libmemcached-0.50/m4/pandora_have_thrift.m4 +45 -0
- data/ext/libmemcached-0.50/m4/pandora_header_assert.m4 +23 -0
- data/ext/libmemcached-0.50/m4/pandora_header_stdcxx_98.m4 +83 -0
- data/ext/libmemcached-0.50/m4/pandora_intltool.m4 +225 -0
- data/ext/libmemcached-0.50/m4/pandora_libtool.m4 +25 -0
- data/ext/libmemcached-0.50/m4/pandora_optimize.m4 +75 -0
- data/ext/libmemcached-0.50/m4/pandora_platform.m4 +117 -0
- data/ext/libmemcached-0.50/m4/pandora_plugins.m4 +62 -0
- data/ext/libmemcached-0.50/m4/pandora_print_callstack.m4 +61 -0
- data/ext/libmemcached-0.50/m4/pandora_pthread.m4 +258 -0
- data/ext/libmemcached-0.50/m4/pandora_python3_devel.m4 +236 -0
- data/ext/libmemcached-0.50/m4/pandora_run_cpplint.m4 +8 -0
- data/ext/libmemcached-0.50/m4/pandora_sasl.m4 +133 -0
- data/ext/libmemcached-0.50/m4/pandora_shared_ptr.m4 +59 -0
- data/ext/libmemcached-0.50/m4/pandora_stack_direction.m4 +39 -0
- data/ext/libmemcached-0.50/m4/pandora_stl_hash.m4 +94 -0
- data/ext/libmemcached-0.50/m4/pandora_swig.m4 +39 -0
- data/ext/libmemcached-0.50/m4/pandora_use_pipe.m4 +36 -0
- data/ext/libmemcached-0.50/m4/pandora_vc_build.m4 +168 -0
- data/ext/libmemcached-0.50/m4/pandora_version.m4 +11 -0
- data/ext/libmemcached-0.50/m4/pandora_visibility.m4 +75 -0
- data/ext/libmemcached-0.50/m4/pandora_warnings.m4 +447 -0
- data/ext/libmemcached-0.50/m4/pandora_with_gettext.m4 +44 -0
- data/ext/libmemcached-0.50/m4/pandora_with_lua.m4 +55 -0
- data/ext/libmemcached-0.50/m4/pandora_with_memcached.m4 +41 -0
- data/ext/libmemcached-0.50/m4/pandora_with_perl.m4 +81 -0
- data/ext/libmemcached-0.50/m4/pandora_with_php.m4 +56 -0
- data/ext/libmemcached-0.50/m4/pandora_with_python.m4 +37 -0
- data/ext/libmemcached-0.50/m4/pandora_with_python3.m4 +44 -0
- data/ext/libmemcached-0.50/m4/pandora_with_r.m4 +33 -0
- data/ext/libmemcached-0.50/m4/pandora_with_ruby.m4 +79 -0
- data/ext/libmemcached-0.50/m4/pandora_with_valgrind.m4 +17 -0
- data/ext/libmemcached-0.50/m4/pkg.m4 +157 -0
- data/ext/libmemcached-0.50/m4/po.m4 +449 -0
- data/ext/libmemcached-0.50/m4/progtest.m4 +92 -0
- data/ext/libmemcached-0.50/m4/protocol_binary.m4 +36 -0
- data/ext/libmemcached-0.50/m4/setsockopt.m4 +73 -0
- data/ext/libmemcached-0.50/m4/socket_send_flags.m4 +66 -0
- data/ext/libmemcached-0.50/poll/include.am +8 -0
- data/ext/libmemcached-0.50/poll/poll.c +77 -0
- data/ext/libmemcached-0.50/poll/poll.h +45 -0
- data/ext/libmemcached-0.50/support/include.am +11 -0
- data/ext/libmemcached-0.50/support/libmemcached-fc.spec.in +105 -0
- data/ext/libmemcached-0.50/support/libmemcached.pc.in +10 -0
- data/ext/libmemcached-0.50/support/libmemcached.spec.in +281 -0
- data/ext/libmemcached-0.50/support/set_benchmark.sh +5 -0
- data/ext/libmemcached-0.50/tests/atomsmasher.cc +295 -0
- data/ext/libmemcached-0.50/tests/basic.cc +134 -0
- data/ext/libmemcached-0.50/tests/basic.h +66 -0
- data/ext/libmemcached-0.50/tests/cpp_example.cc +195 -0
- data/ext/libmemcached-0.50/tests/deprecated.cc +72 -0
- data/ext/libmemcached-0.50/tests/deprecated.h +49 -0
- data/ext/libmemcached-0.50/tests/error_conditions.cc +63 -0
- data/ext/libmemcached-0.50/tests/error_conditions.h +48 -0
- data/ext/libmemcached-0.50/tests/hash_plus.cc +225 -0
- data/ext/libmemcached-0.50/tests/hash_results.h +127 -0
- data/ext/libmemcached-0.50/tests/hashkit_functions.cc +619 -0
- data/ext/libmemcached-0.50/tests/include.am +342 -0
- data/ext/libmemcached-0.50/tests/ketama_test_cases.h +121 -0
- data/ext/libmemcached-0.50/tests/ketama_test_cases_spy.h +118 -0
- data/ext/libmemcached-0.50/tests/libmemcached_world.h +205 -0
- data/ext/libmemcached-0.50/tests/mem_functions.cc +6648 -0
- data/ext/libmemcached-0.50/tests/mem_udp.cc +510 -0
- data/ext/libmemcached-0.50/tests/output_plus.res +5 -0
- data/ext/libmemcached-0.50/tests/parser.cc +599 -0
- data/ext/libmemcached-0.50/tests/parser.h +109 -0
- data/ext/libmemcached-0.50/tests/plus.cpp +240 -0
- data/ext/libmemcached-0.50/tests/pool.cc +78 -0
- data/ext/libmemcached-0.50/tests/pool.h +49 -0
- data/ext/libmemcached-0.50/tests/print.cc +58 -0
- data/ext/libmemcached-0.50/tests/print.h +51 -0
- data/ext/libmemcached-0.50/tests/replication.cc +333 -0
- data/ext/libmemcached-0.50/tests/replication.h +64 -0
- data/ext/libmemcached-0.50/tests/start.cc +29 -0
- data/ext/libmemcached-0.50/tests/string.cc +174 -0
- data/ext/libmemcached-0.50/tests/string.h +67 -0
- data/ext/libmemcached-0.50/tests/virtual_buckets.cc +143 -0
- data/ext/libmemcached-0.50/tests/virtual_buckets.h +51 -0
- data/ext/libmemcached-0.50/win32/include.am +11 -0
- data/ext/libmemcached-0.50/win32/wrappers.h +55 -0
- data/ext/rlibmemcached.i +263 -0
- data/ext/rlibmemcached_wrap.c +16732 -0
- data/lib/memcached.rb +32 -0
- data/lib/memcached/auth.rb +16 -0
- data/lib/memcached/behaviors.rb +77 -0
- data/lib/memcached/exceptions.rb +84 -0
- data/lib/memcached/experimental.rb +48 -0
- data/lib/memcached/memcached.rb +660 -0
- data/lib/memcached/rails.rb +133 -0
- data/test/profile/benchmark.rb +245 -0
- data/test/profile/c_profiler.rb +14 -0
- data/test/profile/exercise.rb +185 -0
- data/test/profile/rb_profiler.rb +21 -0
- data/test/profile/valgrind.rb +10 -0
- data/test/setup.rb +30 -0
- data/test/teardown.rb +0 -0
- data/test/test_helper.rb +19 -0
- data/test/unit/binding_test.rb +8 -0
- data/test/unit/memcached_experimental_test.rb +274 -0
- data/test/unit/memcached_test.rb +1293 -0
- data/test/unit/rails_test.rb +122 -0
- metadata +650 -0
- metadata.gz.sig +0 -0
data/lib/memcached.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
=begin rdoc
|
3
|
+
The generated SWIG module for accessing libmemcached's C API.
|
4
|
+
|
5
|
+
Includes the full set of libmemcached static methods (as defined in <tt>$INCLUDE_PATH/libmemcached/memcached.h</tt>), and classes for the available structs:
|
6
|
+
|
7
|
+
* <b>Rlibmemcached::MemcachedResultSt</b>
|
8
|
+
* <b>Rlibmemcached::MemcachedServerSt</b>
|
9
|
+
* <b>Rlibmemcached::MemcachedSt</b>
|
10
|
+
* <b>Rlibmemcached::MemcachedStatSt</b>
|
11
|
+
* <b>Rlibmemcached::MemcachedStringSt</b>
|
12
|
+
|
13
|
+
A number of SWIG typemaps and C helper methods are also defined in <tt>ext/libmemcached.i</tt>.
|
14
|
+
|
15
|
+
=end
|
16
|
+
module Rlibmemcached
|
17
|
+
end
|
18
|
+
|
19
|
+
require 'rlibmemcached'
|
20
|
+
|
21
|
+
class Memcached
|
22
|
+
Lib = Rlibmemcached
|
23
|
+
raise "libmemcached 0.50 required; you somehow linked to #{Lib.memcached_lib_version}." unless "0.50" == Lib.memcached_lib_version
|
24
|
+
VERSION = File.read("#{File.dirname(__FILE__)}/../CHANGELOG")[/v([\d\.]+)\./, 1]
|
25
|
+
end
|
26
|
+
|
27
|
+
require 'memcached/exceptions'
|
28
|
+
require 'memcached/behaviors'
|
29
|
+
require 'memcached/auth'
|
30
|
+
require 'memcached/memcached'
|
31
|
+
require 'memcached/rails'
|
32
|
+
require 'memcached/experimental'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Memcached
|
2
|
+
def destroy_credentials
|
3
|
+
if options[:credentials] != nil
|
4
|
+
check_return_code(Lib.memcached_destroy_sasl_auth_data(@struct))
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
def set_credentials
|
9
|
+
# If credentials aren't provided, try to get them from the environment
|
10
|
+
if options[:credentials] != nil
|
11
|
+
username, password = options[:credentials]
|
12
|
+
check_return_code(Lib.memcached_set_sasl_auth_data(@struct, username, password))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,77 @@
|
|
1
|
+
|
2
|
+
class Memcached
|
3
|
+
|
4
|
+
#:stopdoc:
|
5
|
+
|
6
|
+
def self.load_constants(prefix, hash = {})
|
7
|
+
Lib.constants.grep(/^#{prefix}/).each do |const_name|
|
8
|
+
hash[const_name[prefix.length..-1].downcase.to_sym] = Lib.const_get(const_name)
|
9
|
+
end
|
10
|
+
hash
|
11
|
+
end
|
12
|
+
|
13
|
+
BEHAVIORS = load_constants("MEMCACHED_BEHAVIOR_")
|
14
|
+
|
15
|
+
BEHAVIOR_VALUES = {
|
16
|
+
false => 0,
|
17
|
+
true => 1
|
18
|
+
}
|
19
|
+
|
20
|
+
HASH_VALUES = {}
|
21
|
+
BEHAVIOR_VALUES.merge!(load_constants("MEMCACHED_HASH_", HASH_VALUES))
|
22
|
+
|
23
|
+
DISTRIBUTION_VALUES = {}
|
24
|
+
BEHAVIOR_VALUES.merge!(load_constants("MEMCACHED_DISTRIBUTION_", DISTRIBUTION_VALUES))
|
25
|
+
|
26
|
+
DIRECT_VALUE_BEHAVIORS = [:retry_timeout, :connect_timeout, :rcv_timeout, :socket_recv_size, :poll_timeout, :socket_send_size, :server_failure_limit]
|
27
|
+
|
28
|
+
CONVERSION_FACTORS = {
|
29
|
+
:rcv_timeout => 1_000_000,
|
30
|
+
:poll_timeout => 1_000,
|
31
|
+
:connect_timeout => 1_000
|
32
|
+
}
|
33
|
+
|
34
|
+
#:startdoc:
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
# Set a behavior option for this Memcached instance. Accepts a Symbol <tt>behavior</tt> and either <tt>true</tt>, <tt>false</tt>, or a Symbol for <tt>value</tt>. Arguments are validated and converted into integers for the struct setter method.
|
39
|
+
def set_behavior(behavior, value) #:doc:
|
40
|
+
raise ArgumentError, "No behavior #{behavior.inspect}" unless b_id = BEHAVIORS[behavior]
|
41
|
+
|
42
|
+
# Scoped validations; annoying
|
43
|
+
msg = "Invalid behavior value #{value.inspect} for #{behavior.inspect}"
|
44
|
+
case behavior
|
45
|
+
when :hash then raise(ArgumentError, msg) unless HASH_VALUES[value]
|
46
|
+
when :distribution then raise(ArgumentError, msg) unless DISTRIBUTION_VALUES[value]
|
47
|
+
when *DIRECT_VALUE_BEHAVIORS then raise(ArgumentError, msg) unless value.is_a?(Numeric) and value >= 0
|
48
|
+
else
|
49
|
+
raise(ArgumentError, msg) unless BEHAVIOR_VALUES[value]
|
50
|
+
end
|
51
|
+
|
52
|
+
lib_value = BEHAVIOR_VALUES[value] || (value * (CONVERSION_FACTORS[behavior] || 1)).to_i
|
53
|
+
#STDERR.puts "Setting #{behavior}:#{b_id} => #{value} (#{lib_value})"
|
54
|
+
Lib.memcached_behavior_set(@struct, b_id, lib_value)
|
55
|
+
#STDERR.puts " -> set to #{get_behavior(behavior).inspect}"
|
56
|
+
end
|
57
|
+
|
58
|
+
# Get a behavior value for this Memcached instance. Accepts a Symbol.
|
59
|
+
def get_behavior(behavior)
|
60
|
+
raise ArgumentError, "No behavior #{behavior.inspect}" unless b_id = BEHAVIORS[behavior]
|
61
|
+
value = Lib.memcached_behavior_get(@struct, b_id)
|
62
|
+
|
63
|
+
if BEHAVIOR_VALUES.invert.has_key?(value)
|
64
|
+
# False, nil are valid values so we can not rely on direct lookups
|
65
|
+
case behavior
|
66
|
+
# Scoped values; still annoying
|
67
|
+
when :hash then HASH_VALUES.invert[value]
|
68
|
+
when :distribution then DISTRIBUTION_VALUES.invert[value]
|
69
|
+
else
|
70
|
+
value
|
71
|
+
end
|
72
|
+
else
|
73
|
+
value
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
|
2
|
+
class Memcached
|
3
|
+
|
4
|
+
=begin rdoc
|
5
|
+
|
6
|
+
Superclass for all Memcached runtime exceptions.
|
7
|
+
|
8
|
+
Subclasses correspond one-to-one with server response strings or libmemcached errors. For example, raising <b>Memcached::NotFound</b> means that the server returned <tt>"NOT_FOUND\r\n"</tt>.
|
9
|
+
|
10
|
+
== Subclasses
|
11
|
+
|
12
|
+
* Memcached::ABadKeyWasProvidedOrCharactersOutOfRange
|
13
|
+
* Memcached::AKeyLengthOfZeroWasProvided
|
14
|
+
* Memcached::ATimeoutOccurred
|
15
|
+
* Memcached::ActionNotSupported
|
16
|
+
* Memcached::ActionQueued
|
17
|
+
* Memcached::ClientError
|
18
|
+
* Memcached::ConnectionBindFailure
|
19
|
+
* Memcached::ConnectionDataDoesNotExist
|
20
|
+
* Memcached::ConnectionDataExists
|
21
|
+
* Memcached::ConnectionFailure
|
22
|
+
* Memcached::ConnectionSocketCreateFailure
|
23
|
+
* Memcached::CouldNotOpenUnixSocket
|
24
|
+
* Memcached::EncounteredAnUnknownStatKey
|
25
|
+
* Memcached::Failure
|
26
|
+
* Memcached::FetchWasNotCompleted
|
27
|
+
* Memcached::HostnameLookupFailure
|
28
|
+
* Memcached::ItemValue
|
29
|
+
* Memcached::MemoryAllocationFailure
|
30
|
+
* Memcached::NoServersDefined
|
31
|
+
* Memcached::NotFound
|
32
|
+
* Memcached::NotStored
|
33
|
+
* Memcached::PartialRead
|
34
|
+
* Memcached::ProtocolError
|
35
|
+
* Memcached::ReadFailure
|
36
|
+
* Memcached::ServerDelete
|
37
|
+
* Memcached::ServerEnd
|
38
|
+
* Memcached::ServerError
|
39
|
+
* Memcached::ServerIsMarkedDead
|
40
|
+
* Memcached::ServerValue
|
41
|
+
* Memcached::SomeErrorsWereReported
|
42
|
+
* Memcached::StatValue
|
43
|
+
* Memcached::SystemError
|
44
|
+
* Memcached::TheHostTransportProtocolDoesNotMatchThatOfTheClient
|
45
|
+
* Memcached::UnknownReadFailure
|
46
|
+
* Memcached::WriteFailure
|
47
|
+
|
48
|
+
=end
|
49
|
+
class Error < RuntimeError
|
50
|
+
attr_accessor :no_backtrace
|
51
|
+
|
52
|
+
def set_backtrace(*args)
|
53
|
+
@no_backtrace ? [] : super
|
54
|
+
end
|
55
|
+
|
56
|
+
def backtrace(*args)
|
57
|
+
@no_backtrace ? [] : super
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
#:stopdoc:
|
62
|
+
|
63
|
+
class << self
|
64
|
+
private
|
65
|
+
def camelize(string)
|
66
|
+
string.downcase.gsub('/', ' or ').gsub(/[()]/, '').split(' ').map {|s| s.capitalize}.join
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
ERRNO_HASH = Hash[*Errno.constants.grep(/^E/).map{ |c| [Errno.const_get(c)::Errno, Errno.const_get(c).new.message] }.flatten]
|
71
|
+
|
72
|
+
EXCEPTIONS = []
|
73
|
+
empty_struct = Lib.memcached_create(nil)
|
74
|
+
Lib.memcached_create(empty_struct)
|
75
|
+
|
76
|
+
# Generate exception classes
|
77
|
+
Lib::MEMCACHED_MAXIMUM_RETURN.times do |index|
|
78
|
+
description = Lib.memcached_strerror(empty_struct, index).gsub("!", "")
|
79
|
+
exception_class = eval("class #{camelize(description)} < Error; self; end")
|
80
|
+
EXCEPTIONS << exception_class
|
81
|
+
end
|
82
|
+
|
83
|
+
#:startdoc:
|
84
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class Memcached
|
2
|
+
module Experimental
|
3
|
+
|
4
|
+
# TOUCH is used to set a new expiration time for an existing item
|
5
|
+
def touch(key, ttl=@default_ttl)
|
6
|
+
check_return_code(
|
7
|
+
Lib.memcached_touch(@struct, key, ttl),
|
8
|
+
key
|
9
|
+
)
|
10
|
+
rescue => e
|
11
|
+
tries ||= 0
|
12
|
+
raise unless should_retry(tries, e)
|
13
|
+
tries += 1
|
14
|
+
retry
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_len(bytes, keys)
|
18
|
+
if keys.is_a? ::Array
|
19
|
+
# Multi get
|
20
|
+
ret = Lib.memcached_mget_len(@struct, keys, bytes);
|
21
|
+
check_return_code(ret, keys)
|
22
|
+
|
23
|
+
hash = {}
|
24
|
+
loop do
|
25
|
+
value, key, flags, ret = Lib.memcached_fetch_rvalue(@struct)
|
26
|
+
break if value.nil? || ret == Lib::MEMCACHED_END
|
27
|
+
if ret == Lib::MEMCACHED_SUCCESS
|
28
|
+
hash[key] = value
|
29
|
+
elsif ret != Lib::MEMCACHED_NOTFOUND
|
30
|
+
check_return_code(ret, key)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
hash
|
34
|
+
else
|
35
|
+
# Single get_len
|
36
|
+
value, flags, ret = Lib.memcached_get_len_rvalue(@struct, keys, bytes)
|
37
|
+
check_return_code(ret, keys)
|
38
|
+
value
|
39
|
+
end
|
40
|
+
rescue => e
|
41
|
+
tries ||= 0
|
42
|
+
raise unless should_retry(tries, e)
|
43
|
+
tries += 1
|
44
|
+
retry
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,660 @@
|
|
1
|
+
|
2
|
+
=begin rdoc
|
3
|
+
The Memcached client class.
|
4
|
+
=end
|
5
|
+
class Memcached
|
6
|
+
FLAGS = 0x0
|
7
|
+
|
8
|
+
DEFAULTS = {
|
9
|
+
:hash => :fnv1_32,
|
10
|
+
:no_block => false,
|
11
|
+
:noreply => false,
|
12
|
+
:distribution => :consistent_ketama,
|
13
|
+
:ketama_weighted => true,
|
14
|
+
:buffer_requests => false,
|
15
|
+
:cache_lookups => true,
|
16
|
+
:support_cas => false,
|
17
|
+
:tcp_nodelay => false,
|
18
|
+
:show_backtraces => false,
|
19
|
+
:retry_timeout => 30,
|
20
|
+
:timeout => 0.25,
|
21
|
+
:rcv_timeout => nil,
|
22
|
+
:poll_timeout => nil,
|
23
|
+
:connect_timeout => 4,
|
24
|
+
:prefix_key => '',
|
25
|
+
:prefix_delimiter => '',
|
26
|
+
:hash_with_prefix_key => true,
|
27
|
+
:default_ttl => 604800,
|
28
|
+
:default_weight => 8,
|
29
|
+
:sort_hosts => false,
|
30
|
+
:auto_eject_hosts => true,
|
31
|
+
:server_failure_limit => 2,
|
32
|
+
:verify_key => true,
|
33
|
+
:use_udp => false,
|
34
|
+
:binary_protocol => false,
|
35
|
+
:credentials => nil,
|
36
|
+
:experimental_features => false,
|
37
|
+
:exception_retry_limit => 5,
|
38
|
+
:exceptions_to_retry => [
|
39
|
+
Memcached::ServerIsMarkedDead,
|
40
|
+
Memcached::ATimeoutOccurred,
|
41
|
+
Memcached::ConnectionBindFailure,
|
42
|
+
Memcached::ConnectionFailure,
|
43
|
+
Memcached::ConnectionSocketCreateFailure,
|
44
|
+
Memcached::Failure,
|
45
|
+
Memcached::MemoryAllocationFailure,
|
46
|
+
Memcached::ReadFailure,
|
47
|
+
Memcached::ServerError,
|
48
|
+
Memcached::SystemError,
|
49
|
+
Memcached::UnknownReadFailure,
|
50
|
+
Memcached::WriteFailure]
|
51
|
+
}
|
52
|
+
|
53
|
+
#:stopdoc:
|
54
|
+
IGNORED = 0
|
55
|
+
#:startdoc:
|
56
|
+
|
57
|
+
attr_reader :options # Return the options Hash used to configure this instance.
|
58
|
+
|
59
|
+
###### Configuration
|
60
|
+
|
61
|
+
=begin rdoc
|
62
|
+
Create a new Memcached instance. Accepts string or array of server strings, as well an an optional configuration hash.
|
63
|
+
|
64
|
+
Memcached.new('localhost', ...) # A single server
|
65
|
+
Memcached.new(['web001:11212', 'web002:11212'], ...) # Two servers with custom ports
|
66
|
+
Memcached.new(['web001:11211:2', 'web002:11211:8'], ...) # Two servers with default ports and explicit weights
|
67
|
+
|
68
|
+
Weights only affect Ketama hashing. If you use Ketama hashing and don't specify a weight, the client will poll each server's stats and use its size as the weight.
|
69
|
+
|
70
|
+
Valid option parameters are:
|
71
|
+
|
72
|
+
<tt>:prefix_key</tt>:: A string to prepend to every key, for namespacing. Max length is 127. Defaults to the empty string.
|
73
|
+
<tt>:prefix_delimiter</tt>:: A character to append to the prefix key. Defaults to the empty string.
|
74
|
+
<tt>:hash</tt>:: The name of a hash function to use. Possible values are: <tt>:crc</tt>, <tt>:default</tt>, <tt>:fnv1_32</tt>, <tt>:fnv1_64</tt>, <tt>:fnv1a_32</tt>, <tt>:fnv1a_64</tt>, <tt>:hsieh</tt>, <tt>:md5</tt>, <tt>:murmur</tt>, and <tt>:none</tt>. <tt>:fnv1_32</tt> is fast and well known, and is the default. Use <tt>:md5</tt> for compatibility with other ketama clients. <tt>:none</tt> is for use when there is a single server, and performs no actual hashing.
|
75
|
+
<tt>:distribution</tt>:: Either <tt>:modula</tt>, <tt>:consistent_ketama</tt>, <tt>:consistent_wheel</tt>, or <tt>:ketama</tt>. Defaults to <tt>:ketama</tt>.
|
76
|
+
<tt>:server_failure_limit</tt>:: How many consecutive failures to allow before marking a host as dead. Has no effect unless <tt>:retry_timeout</tt> is also set.
|
77
|
+
<tt>:retry_timeout</tt>:: How long to wait until retrying a dead server. Has no effect unless <tt>:server_failure_limit</tt> is non-zero. Defaults to <tt>30</tt>.
|
78
|
+
<tt>:auto_eject_hosts</tt>:: Whether to temporarily eject dead hosts from the pool. Defaults to <tt>true</tt>. Note that in the event of an ejection, <tt>:auto_eject_hosts</tt> will remap the entire pool unless <tt>:distribution</tt> is set to <tt>:consistent</tt>.
|
79
|
+
<tt>:exception_retry_limit</tt>:: How many times to retry before raising exceptions in <tt>:exceptions_to_retry</tt>. Defaults to <tt>5</tt>.
|
80
|
+
<tt>:exceptions_to_retry</tt>:: Which exceptions to retry. Defaults to <b>ServerIsMarkedDead</b>, <b>ATimeoutOccurred</b>, <b>ConnectionBindFailure</b>, <b>ConnectionFailure</b>, <b>ConnectionSocketCreateFailure</b>, <b>Failure</b>, <b>MemoryAllocationFailure</b>, <b>ReadFailure</b>, <b>ServerError</b>, <b>SystemError</b>, <b>UnknownReadFailure</b>, and <b>WriteFailure</b>.
|
81
|
+
<tt>:cache_lookups</tt>:: Whether to cache hostname lookups for the life of the instance. Defaults to <tt>true</tt>.
|
82
|
+
<tt>:support_cas</tt>:: Flag CAS support in the client. Accepts <tt>true</tt> or <tt>false</tt>. Defaults to <tt>false</tt> because it imposes a slight performance penalty. Note that your server must also support CAS or you will trigger <b>ProtocolError</b> exceptions.
|
83
|
+
<tt>:tcp_nodelay</tt>:: Turns on the no-delay feature for connecting sockets. Accepts <tt>true</tt> or <tt>false</tt>. Performance may or may not change, depending on your system.
|
84
|
+
<tt>:no_block</tt>:: Whether to use pipelining for writes. Defaults to <tt>false</tt>.
|
85
|
+
<tt>:buffer_requests</tt>:: Whether to use an internal write buffer. Accepts <tt>true</tt> or <tt>false</tt>. Calling <tt>get</tt> or closing the connection will force the buffer to flush. Client behavior is undefined unless <tt>:no_block</tt> is enabled. Defaults to <tt>false</tt>.
|
86
|
+
<tt>:noreply</tt>:: Ask server not to reply for storage commands. Client behavior is undefined unless <tt>:no_block</tt> and <tt>:buffer_requests</tt> are enabled. Defaults to <tt>false</tt>.
|
87
|
+
<tt>:show_backtraces</tt>:: Whether <b>NotFound</b> and <b>NotStored</b> exceptions should include backtraces. Generating backtraces is slow, so this is off by default. Turn it on to ease debugging.
|
88
|
+
<tt>:connect_timeout</tt>:: How long to wait for a connection to a server. Defaults to 2 seconds. Set to <tt>0</tt> if you want to wait forever.
|
89
|
+
<tt>:timeout</tt>:: How long to wait for a response from the server. Defaults to 0.25 seconds. Set to <tt>0</tt> if you want to wait forever.
|
90
|
+
<tt>:default_ttl</tt>:: The <tt>ttl</tt> to use on set if no <tt>ttl</tt> is specified, in seconds. Defaults to one week. Set to <tt>0</tt> if you want things to never expire.
|
91
|
+
<tt>:default_weight</tt>:: The weight to use if <tt>:ketama_weighted</tt> is <tt>true</tt>, but no weight is specified for a server.
|
92
|
+
<tt>:hash_with_prefix_key</tt>:: Whether to include the prefix when calculating which server a key falls on. Defaults to <tt>true</tt>.
|
93
|
+
<tt>:use_udp</tt>:: Use the UDP protocol to reduce connection overhead. Defaults to false.
|
94
|
+
<tt>:binary_protocol</tt>:: Use the binary protocol. Defaults to false. Please note that using the binary protocol is usually <b>slower</b> than the ASCII protocol.
|
95
|
+
<tt>:sort_hosts</tt>:: Whether to force the server list to stay sorted. This defeats consistent hashing and is rarely useful.
|
96
|
+
<tt>:verify_key</tt>:: Validate keys before accepting them. Never disable this.
|
97
|
+
|
98
|
+
Please note that when <tt>:no_block => true</tt>, update methods do not raise on errors. For example, if you try to <tt>set</tt> an invalid key, it will appear to succeed. The actual setting of the key occurs after libmemcached has returned control to your program, so there is no way to backtrack and raise the exception.
|
99
|
+
|
100
|
+
=end
|
101
|
+
|
102
|
+
def initialize(servers = nil, opts = {})
|
103
|
+
@struct = Lib.memcached_create(nil)
|
104
|
+
|
105
|
+
# Merge option defaults and discard meaningless keys
|
106
|
+
@options = DEFAULTS.merge(opts)
|
107
|
+
@options.delete_if { |k,v| not DEFAULTS.keys.include? k }
|
108
|
+
@default_ttl = options[:default_ttl]
|
109
|
+
|
110
|
+
if servers == nil || servers == []
|
111
|
+
if ENV.key?("MEMCACHE_SERVERS")
|
112
|
+
servers = ENV["MEMCACHE_SERVERS"].split(",").map do | s | s.strip end
|
113
|
+
else
|
114
|
+
servers = "127.0.0.1:11211"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
if !options[:credentials] and ENV["MEMCACHE_USERNAME"] and ENV["MEMCACHE_PASSWORD"]
|
119
|
+
options[:credentials] = [ENV["MEMCACHE_USERNAME"], ENV["MEMCACHE_PASSWORD"]]
|
120
|
+
end
|
121
|
+
|
122
|
+
instance_eval { send(:extend, Experimental) } if options[:experimental_features]
|
123
|
+
|
124
|
+
# SASL requires binary protocol
|
125
|
+
options[:binary_protocol] = true if options[:credentials]
|
126
|
+
|
127
|
+
# UDP requires noreply
|
128
|
+
options[:noreply] = true if options[:use_udp]
|
129
|
+
|
130
|
+
# Buffering requires non-blocking
|
131
|
+
# FIXME This should all be wrapped up in a single :pipeline option.
|
132
|
+
options[:no_block] = true if options[:buffer_requests]
|
133
|
+
|
134
|
+
# Disallow weights without ketama
|
135
|
+
options.delete(:ketama_weighted) if options[:distribution] != :consistent_ketama
|
136
|
+
|
137
|
+
# Disallow :sort_hosts with consistent hashing
|
138
|
+
if options[:sort_hosts] and options[:distribution] == :consistent
|
139
|
+
raise ArgumentError, ":sort_hosts defeats :consistent hashing"
|
140
|
+
end
|
141
|
+
|
142
|
+
# Read timeouts
|
143
|
+
options[:rcv_timeout] ||= options[:timeout]
|
144
|
+
options[:poll_timeout] ||= options[:timeout]
|
145
|
+
|
146
|
+
# Set the prefix key. Support the legacy name.
|
147
|
+
set_prefix_key(options[:prefix_key] || options[:namespace])
|
148
|
+
|
149
|
+
# Set the behaviors and credentials on the struct
|
150
|
+
set_behaviors
|
151
|
+
set_credentials
|
152
|
+
|
153
|
+
# Freeze the hash
|
154
|
+
options.freeze
|
155
|
+
|
156
|
+
# Set the servers on the struct
|
157
|
+
set_servers(servers)
|
158
|
+
|
159
|
+
# Not found exceptions
|
160
|
+
unless options[:show_backtraces]
|
161
|
+
@not_found = NotFound.new
|
162
|
+
@not_found.no_backtrace = true
|
163
|
+
@not_stored = NotStored.new
|
164
|
+
@not_stored.no_backtrace = true
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
# Set the server list.
|
169
|
+
# FIXME Does not necessarily free any existing server structs.
|
170
|
+
def set_servers(servers)
|
171
|
+
Array(servers).each_with_index do |server, index|
|
172
|
+
# Socket
|
173
|
+
check_return_code(
|
174
|
+
if server.is_a?(String) and File.socket?(server)
|
175
|
+
args = [@struct, server, options[:default_weight].to_i]
|
176
|
+
Lib.memcached_server_add_unix_socket_with_weight(*args)
|
177
|
+
# Network
|
178
|
+
elsif server.is_a?(String) and server =~ /^[\w\d\.-]+(:\d{1,5}){0,2}$/
|
179
|
+
host, port, weight = server.split(":")
|
180
|
+
args = [@struct, host, port.to_i, (weight || options[:default_weight]).to_i]
|
181
|
+
if options[:use_udp]
|
182
|
+
Lib.memcached_server_add_udp_with_weight(*args)
|
183
|
+
else
|
184
|
+
Lib.memcached_server_add_with_weight(*args)
|
185
|
+
end
|
186
|
+
else
|
187
|
+
raise ArgumentError, "Servers must be either in the format 'host:port[:weight]' (e.g., 'localhost:11211' or 'localhost:11211:10') for a network server, or a valid path to a Unix domain socket (e.g., /var/run/memcached)."
|
188
|
+
end
|
189
|
+
)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
# Return the array of server strings used to configure this instance.
|
194
|
+
def servers
|
195
|
+
server_structs.map do |server|
|
196
|
+
inspect_server(server)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# Set the prefix key.
|
201
|
+
def set_prefix_key(key)
|
202
|
+
check_return_code(
|
203
|
+
if key
|
204
|
+
key += options[:prefix_delimiter]
|
205
|
+
raise ArgumentError, "Max prefix key + prefix delimiter size is #{Lib::MEMCACHED_PREFIX_KEY_MAX_SIZE - 1}" unless
|
206
|
+
key.size < Lib::MEMCACHED_PREFIX_KEY_MAX_SIZE
|
207
|
+
Lib.memcached_callback_set(@struct, Lib::MEMCACHED_CALLBACK_PREFIX_KEY, key)
|
208
|
+
else
|
209
|
+
Lib.memcached_callback_set(@struct, Lib::MEMCACHED_CALLBACK_PREFIX_KEY, "")
|
210
|
+
end
|
211
|
+
)
|
212
|
+
end
|
213
|
+
alias :set_namespace :set_prefix_key
|
214
|
+
|
215
|
+
# Return the current prefix key.
|
216
|
+
def prefix_key
|
217
|
+
if Lib.memcached_array_size(@struct.prefix_key) > 0
|
218
|
+
Lib.memcached_array_string(@struct.prefix_key)[0..-1 - options[:prefix_delimiter].size]
|
219
|
+
else
|
220
|
+
""
|
221
|
+
end
|
222
|
+
end
|
223
|
+
alias :namespace :prefix_key
|
224
|
+
|
225
|
+
# Safely copy this instance. Returns a Memcached instance.
|
226
|
+
#
|
227
|
+
# <tt>clone</tt> is useful for threading, since each thread must have its own unshared Memcached
|
228
|
+
# object.
|
229
|
+
#
|
230
|
+
def clone
|
231
|
+
memcached = super
|
232
|
+
struct = Lib.memcached_clone(nil, @struct)
|
233
|
+
memcached.instance_variable_set('@struct', struct)
|
234
|
+
memcached
|
235
|
+
end
|
236
|
+
|
237
|
+
# Reset the state of the libmemcached struct. This is useful for changing the server list at runtime.
|
238
|
+
def reset(current_servers = nil)
|
239
|
+
# Store state and teardown
|
240
|
+
current_servers ||= servers
|
241
|
+
prev_prefix_key = prefix_key
|
242
|
+
quit
|
243
|
+
|
244
|
+
# Create
|
245
|
+
# FIXME Duplicates logic with initialize()
|
246
|
+
@struct = Lib.memcached_create(nil)
|
247
|
+
set_prefix_key(prev_prefix_key)
|
248
|
+
set_behaviors
|
249
|
+
set_credentials
|
250
|
+
set_servers(current_servers)
|
251
|
+
end
|
252
|
+
|
253
|
+
# Disconnect from all currently connected servers
|
254
|
+
def quit
|
255
|
+
Lib.memcached_quit(@struct)
|
256
|
+
self
|
257
|
+
end
|
258
|
+
|
259
|
+
# Should retry the exception
|
260
|
+
def should_retry(tries, e)
|
261
|
+
tries < options[:exception_retry_limit] && options[:exceptions_to_retry].include?(e.class)
|
262
|
+
end
|
263
|
+
|
264
|
+
#:stopdoc:
|
265
|
+
alias :dup :clone #:nodoc:
|
266
|
+
#:startdoc:
|
267
|
+
|
268
|
+
### Configuration helpers
|
269
|
+
|
270
|
+
private
|
271
|
+
|
272
|
+
# Return an array of raw <tt>memcached_server_st</tt> structs for this instance.
|
273
|
+
def server_structs
|
274
|
+
array = []
|
275
|
+
if @struct.servers
|
276
|
+
@struct.number_of_hosts.times do |i|
|
277
|
+
array << Lib.memcached_select_server_at(@struct, i)
|
278
|
+
end
|
279
|
+
end
|
280
|
+
array
|
281
|
+
end
|
282
|
+
|
283
|
+
###### Operations
|
284
|
+
|
285
|
+
public
|
286
|
+
|
287
|
+
### Setters
|
288
|
+
|
289
|
+
# Set a key/value pair. Accepts a String <tt>key</tt> and an arbitrary Ruby object. Overwrites any existing value on the server.
|
290
|
+
#
|
291
|
+
# Accepts an optional <tt>ttl</tt> value to specify the maximum lifetime of the key on the server, in seconds. <tt>ttl</tt> must be a <tt>FixNum</tt>. <tt>0</tt> means no ttl. Note that there is no guarantee that the key will persist as long as the <tt>ttl</tt>, but it will not persist longer.
|
292
|
+
#
|
293
|
+
# Also accepts a <tt>marshal</tt> value, which defaults to <tt>true</tt>. Set <tt>marshal</tt> to <tt>false</tt>, and pass a String as the <tt>value</tt>, if you want to set a raw byte array.
|
294
|
+
#
|
295
|
+
def set(key, value, ttl=@default_ttl, marshal=true, flags=FLAGS)
|
296
|
+
value = marshal ? Marshal.dump(value) : value
|
297
|
+
begin
|
298
|
+
check_return_code(
|
299
|
+
Lib.memcached_set(@struct, key, value, ttl, flags),
|
300
|
+
key
|
301
|
+
)
|
302
|
+
rescue => e
|
303
|
+
tries ||= 0
|
304
|
+
retry if e.instance_of?(ClientError) && !tries
|
305
|
+
raise unless should_retry(tries, e)
|
306
|
+
tries += 1
|
307
|
+
retry
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
# Add a key/value pair. Raises <b>Memcached::NotStored</b> if the key already exists on the server. The parameters are the same as <tt>set</tt>.
|
312
|
+
def add(key, value, ttl=@default_ttl, marshal=true, flags=FLAGS)
|
313
|
+
value = marshal ? Marshal.dump(value) : value
|
314
|
+
begin
|
315
|
+
check_return_code(
|
316
|
+
Lib.memcached_add(@struct, key, value, ttl, flags),
|
317
|
+
key
|
318
|
+
)
|
319
|
+
rescue => e
|
320
|
+
tries ||= 0
|
321
|
+
raise unless should_retry(tries, e)
|
322
|
+
tries += 1
|
323
|
+
retry
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
# Increment a key's value. Accepts a String <tt>key</tt>. Raises <b>Memcached::NotFound</b> if the key does not exist.
|
328
|
+
#
|
329
|
+
# Also accepts an optional <tt>offset</tt> paramater, which defaults to 1. <tt>offset</tt> must be an integer.
|
330
|
+
#
|
331
|
+
# Note that the key must be initialized to an unmarshalled integer first, via <tt>set</tt>, <tt>add</tt>, or <tt>replace</tt> with <tt>marshal</tt> set to <tt>false</tt>.
|
332
|
+
def increment(key, offset=1)
|
333
|
+
ret, value = Lib.memcached_increment(@struct, key, offset)
|
334
|
+
check_return_code(ret, key)
|
335
|
+
value
|
336
|
+
rescue => e
|
337
|
+
tries ||= 0
|
338
|
+
raise unless should_retry(tries, e)
|
339
|
+
tries += 1
|
340
|
+
retry
|
341
|
+
end
|
342
|
+
|
343
|
+
# Decrement a key's value. The parameters and exception behavior are the same as <tt>increment</tt>.
|
344
|
+
def decrement(key, offset=1)
|
345
|
+
ret, value = Lib.memcached_decrement(@struct, key, offset)
|
346
|
+
check_return_code(ret, key)
|
347
|
+
value
|
348
|
+
rescue => e
|
349
|
+
tries ||= 0
|
350
|
+
raise unless should_retry(tries, e)
|
351
|
+
tries += 1
|
352
|
+
retry
|
353
|
+
end
|
354
|
+
|
355
|
+
#:stopdoc:
|
356
|
+
alias :incr :increment
|
357
|
+
alias :decr :decrement
|
358
|
+
#:startdoc:
|
359
|
+
|
360
|
+
# Replace a key/value pair. Raises <b>Memcached::NotFound</b> if the key does not exist on the server. The parameters are the same as <tt>set</tt>.
|
361
|
+
def replace(key, value, ttl=@default_ttl, marshal=true, flags=FLAGS)
|
362
|
+
value = marshal ? Marshal.dump(value) : value
|
363
|
+
begin
|
364
|
+
check_return_code(
|
365
|
+
Lib.memcached_replace(@struct, key, value, ttl, flags),
|
366
|
+
key
|
367
|
+
)
|
368
|
+
rescue => e
|
369
|
+
tries ||= 0
|
370
|
+
raise unless should_retry(tries, e)
|
371
|
+
tries += 1
|
372
|
+
retry
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
376
|
+
# Appends a string to a key's value. Accepts a String <tt>key</tt> and a String <tt>value</tt>. Raises <b>Memcached::NotFound</b> if the key does not exist on the server.
|
377
|
+
#
|
378
|
+
# Note that the key must be initialized to an unmarshalled string first, via <tt>set</tt>, <tt>add</tt>, or <tt>replace</tt> with <tt>marshal</tt> set to <tt>false</tt>.
|
379
|
+
def append(key, value)
|
380
|
+
# Requires memcached 1.2.4
|
381
|
+
check_return_code(
|
382
|
+
Lib.memcached_append(@struct, key, value.to_s, IGNORED, IGNORED),
|
383
|
+
key
|
384
|
+
)
|
385
|
+
rescue => e
|
386
|
+
tries ||= 0
|
387
|
+
raise unless should_retry(tries, e)
|
388
|
+
tries += 1
|
389
|
+
retry
|
390
|
+
end
|
391
|
+
|
392
|
+
# Prepends a string to a key's value. The parameters and exception behavior are the same as <tt>append</tt>.
|
393
|
+
def prepend(key, value)
|
394
|
+
# Requires memcached 1.2.4
|
395
|
+
check_return_code(
|
396
|
+
Lib.memcached_prepend(@struct, key, value.to_s, IGNORED, IGNORED),
|
397
|
+
key
|
398
|
+
)
|
399
|
+
rescue => e
|
400
|
+
tries ||= 0
|
401
|
+
raise unless should_retry(tries, e)
|
402
|
+
tries += 1
|
403
|
+
retry
|
404
|
+
end
|
405
|
+
|
406
|
+
# Reads a key's value from the server and yields it to a block. Replaces the key's value with the result of the block as long as the key hasn't been updated in the meantime, otherwise raises <b>Memcached::NotStored</b>. Accepts a String <tt>key</tt> and a block.
|
407
|
+
#
|
408
|
+
# Also accepts an optional <tt>ttl</tt> value.
|
409
|
+
#
|
410
|
+
# CAS stands for "compare and swap", and avoids the need for manual key mutexing. CAS support must be enabled in Memcached.new or a <b>Memcached::ClientError</b> will be raised. Note that CAS may be buggy in memcached itself.
|
411
|
+
# :retry_on_exceptions does not apply to this method
|
412
|
+
def cas(key, ttl=@default_ttl, marshal=true, flags=FLAGS)
|
413
|
+
raise ClientError, "CAS not enabled for this Memcached instance" unless options[:support_cas]
|
414
|
+
|
415
|
+
begin
|
416
|
+
value, flags, ret = Lib.memcached_get_rvalue(@struct, key)
|
417
|
+
check_return_code(ret, key)
|
418
|
+
rescue => e
|
419
|
+
tries_for_get ||= 0
|
420
|
+
raise unless should_retry(tries_for_get, e)
|
421
|
+
tries_for_get += 1
|
422
|
+
retry
|
423
|
+
end
|
424
|
+
|
425
|
+
cas = @struct.result.item_cas
|
426
|
+
|
427
|
+
value = Marshal.load(value) if marshal
|
428
|
+
value = yield value
|
429
|
+
value = Marshal.dump(value) if marshal
|
430
|
+
|
431
|
+
begin
|
432
|
+
check_return_code(
|
433
|
+
Lib.memcached_cas(@struct, key, value, ttl, flags, cas),
|
434
|
+
key
|
435
|
+
)
|
436
|
+
rescue => e
|
437
|
+
tries_for_cas ||= 0
|
438
|
+
raise unless should_retry(tries_for_cas, e)
|
439
|
+
tries_for_cas += 1
|
440
|
+
retry
|
441
|
+
end
|
442
|
+
end
|
443
|
+
|
444
|
+
alias :compare_and_swap :cas
|
445
|
+
|
446
|
+
### Deleters
|
447
|
+
|
448
|
+
# Deletes a key/value pair from the server. Accepts a String <tt>key</tt>. Raises <b>Memcached::NotFound</b> if the key does not exist.
|
449
|
+
def delete(key)
|
450
|
+
check_return_code(
|
451
|
+
Lib.memcached_delete(@struct, key, IGNORED),
|
452
|
+
key
|
453
|
+
)
|
454
|
+
rescue => e
|
455
|
+
tries ||= 0
|
456
|
+
raise unless should_retry(tries, e)
|
457
|
+
tries += 1
|
458
|
+
retry
|
459
|
+
end
|
460
|
+
|
461
|
+
# Flushes all key/value pairs from all the servers.
|
462
|
+
def flush
|
463
|
+
check_return_code(
|
464
|
+
Lib.memcached_flush(@struct, IGNORED)
|
465
|
+
)
|
466
|
+
rescue => e
|
467
|
+
tries ||= 0
|
468
|
+
raise unless should_retry(tries, e)
|
469
|
+
tries += 1
|
470
|
+
retry
|
471
|
+
end
|
472
|
+
|
473
|
+
### Getters
|
474
|
+
|
475
|
+
# Gets a key's value from the server. Accepts a String <tt>key</tt> or array of String <tt>keys</tt>.
|
476
|
+
#
|
477
|
+
# Also accepts a <tt>marshal</tt> value, which defaults to <tt>true</tt>. Set <tt>marshal</tt> to <tt>false</tt> if you want the <tt>value</tt> to be returned directly as a String. Otherwise it will be assumed to be a marshalled Ruby object and unmarshalled.
|
478
|
+
#
|
479
|
+
# If you pass a String key, and the key does not exist on the server, <b>Memcached::NotFound</b> will be raised. If you pass an array of keys, memcached's <tt>multiget</tt> mode will be used, and a hash of key/value pairs will be returned. The hash will contain only the keys that were found.
|
480
|
+
#
|
481
|
+
# The multiget behavior is subject to change in the future; however, for multiple lookups, it is much faster than normal mode.
|
482
|
+
#
|
483
|
+
# Note that when you rescue Memcached::NotFound exceptions, you should use a the block rescue syntax instead of the inline syntax. Block rescues are very fast, but inline rescues are very slow.
|
484
|
+
#
|
485
|
+
def get(keys, marshal=true)
|
486
|
+
if keys.is_a? Array
|
487
|
+
# Multi get
|
488
|
+
ret = Lib.memcached_mget(@struct, keys);
|
489
|
+
check_return_code(ret, keys)
|
490
|
+
|
491
|
+
hash = {}
|
492
|
+
|
493
|
+
loop do
|
494
|
+
value, key, flags, ret = Lib.memcached_fetch_rvalue(@struct)
|
495
|
+
break if value.nil? || ret == Lib::MEMCACHED_END
|
496
|
+
if ret == Lib::MEMCACHED_SUCCESS
|
497
|
+
hash[key] = (marshal ? Marshal.load(value) : value)
|
498
|
+
elsif ret != Lib::MEMCACHED_NOTFOUND
|
499
|
+
check_return_code(ret, key)
|
500
|
+
end
|
501
|
+
end
|
502
|
+
|
503
|
+
hash
|
504
|
+
else
|
505
|
+
# Single get
|
506
|
+
value, flags, ret = Lib.memcached_get_rvalue(@struct, keys)
|
507
|
+
check_return_code(ret, keys)
|
508
|
+
marshal ? Marshal.load(value) : value
|
509
|
+
end
|
510
|
+
rescue => e
|
511
|
+
tries ||= 0
|
512
|
+
raise unless should_retry(tries, e)
|
513
|
+
tries += 1
|
514
|
+
retry
|
515
|
+
end
|
516
|
+
|
517
|
+
# Gets a key's value from the previous server. Only useful with random distribution.
|
518
|
+
def get_from_last(key, marshal=true)
|
519
|
+
raise ArgumentError, "get_from_last() is not useful unless :random distribution is enabled." unless options[:distribution] == :random
|
520
|
+
value, flags, ret = Lib.memcached_get_from_last_rvalue(@struct, key)
|
521
|
+
check_return_code(ret, key)
|
522
|
+
marshal ? Marshal.load(value) : value
|
523
|
+
end
|
524
|
+
|
525
|
+
### Information methods
|
526
|
+
|
527
|
+
# Return the server used by a particular key.
|
528
|
+
def server_by_key(key)
|
529
|
+
ret = Lib.memcached_server_by_key(@struct, key)
|
530
|
+
if ret.is_a?(Array)
|
531
|
+
check_return_code(ret.last)
|
532
|
+
inspect_server(ret.first)
|
533
|
+
else
|
534
|
+
check_return_code(ret)
|
535
|
+
end
|
536
|
+
end
|
537
|
+
|
538
|
+
# Return a Hash of statistics responses from the set of servers. Each value is an array with one entry for each server, in the same order the servers were defined.
|
539
|
+
def stats(subcommand = nil)
|
540
|
+
stats = Hash.new([])
|
541
|
+
|
542
|
+
stat_struct, ret = Lib.memcached_stat(@struct, subcommand)
|
543
|
+
check_return_code(ret)
|
544
|
+
|
545
|
+
keys, ret = Lib.memcached_stat_get_keys(@struct, stat_struct)
|
546
|
+
check_return_code(ret)
|
547
|
+
|
548
|
+
keys.each do |key|
|
549
|
+
server_structs.size.times do |index|
|
550
|
+
|
551
|
+
value, ret = Lib.memcached_stat_get_value(
|
552
|
+
@struct,
|
553
|
+
Lib.memcached_select_stat_at(@struct, stat_struct, index),
|
554
|
+
key)
|
555
|
+
check_return_code(ret, key)
|
556
|
+
|
557
|
+
value = case value
|
558
|
+
when /^\d+\.\d+$/ then value.to_f
|
559
|
+
when /^\d+$/ then value.to_i
|
560
|
+
else value
|
561
|
+
end
|
562
|
+
|
563
|
+
stats[key.to_sym] += [value]
|
564
|
+
end
|
565
|
+
end
|
566
|
+
|
567
|
+
Lib.memcached_stat_free(@struct, stat_struct)
|
568
|
+
stats
|
569
|
+
rescue Memcached::SomeErrorsWereReported => _
|
570
|
+
e = _.class.new("Error getting stats")
|
571
|
+
e.set_backtrace(_.backtrace)
|
572
|
+
raise e
|
573
|
+
end
|
574
|
+
|
575
|
+
### Operations helpers
|
576
|
+
|
577
|
+
private
|
578
|
+
|
579
|
+
# Checks the return code from Rlibmemcached against the exception list. Raises the corresponding exception if the return code is not Memcached::Success or Memcached::ActionQueued. Accepts an integer return code and an optional key, for exception messages.
|
580
|
+
def check_return_code(ret, key = nil) #:doc:
|
581
|
+
case ret
|
582
|
+
when Lib::MEMCACHED_SUCCESS
|
583
|
+
when Lib::MEMCACHED_BUFFERED
|
584
|
+
when Lib::MEMCACHED_NOTFOUND
|
585
|
+
raise @not_found
|
586
|
+
when Lib::MEMCACHED_NOTSTORED
|
587
|
+
raise @not_stored
|
588
|
+
else
|
589
|
+
reraise(key, ret)
|
590
|
+
end
|
591
|
+
rescue TypeError
|
592
|
+
reraise(key, ret)
|
593
|
+
end
|
594
|
+
|
595
|
+
def reraise(key, ret)
|
596
|
+
message = "Key #{inspect_keys(key, (detect_failure if ret == Lib::MEMCACHED_SERVER_MARKED_DEAD)).inspect}"
|
597
|
+
if key.is_a?(String)
|
598
|
+
if ret == Lib::MEMCACHED_ERRNO
|
599
|
+
if (server = Lib.memcached_server_by_key(@struct, key)).is_a?(Array)
|
600
|
+
errno = server.first.cached_errno
|
601
|
+
message = "Errno #{errno}: #{ERRNO_HASH[errno].inspect}. #{message}"
|
602
|
+
end
|
603
|
+
elsif ret == Lib::MEMCACHED_SERVER_ERROR
|
604
|
+
if (server = Lib.memcached_server_by_key(@struct, key)).is_a?(Array)
|
605
|
+
message = "\"#{server.first.cached_server_error}\". #{message}."
|
606
|
+
end
|
607
|
+
end
|
608
|
+
end
|
609
|
+
raise EXCEPTIONS[ret], message
|
610
|
+
end
|
611
|
+
|
612
|
+
# Turn an array of keys into a hash of keys to servers.
|
613
|
+
def inspect_keys(keys, server = nil)
|
614
|
+
Hash[*Array(keys).map do |key|
|
615
|
+
[key, server || server_by_key(key)]
|
616
|
+
end.flatten]
|
617
|
+
end
|
618
|
+
|
619
|
+
# Find which server failed most recently.
|
620
|
+
# FIXME Is this still necessary with cached_errno?
|
621
|
+
def detect_failure
|
622
|
+
time = Time.now
|
623
|
+
server = server_structs.detect do |server|
|
624
|
+
server.next_retry > time
|
625
|
+
end
|
626
|
+
inspect_server(server) if server
|
627
|
+
end
|
628
|
+
|
629
|
+
# Set the behaviors on the struct from the current options.
|
630
|
+
def set_behaviors
|
631
|
+
BEHAVIORS.keys.each do |behavior|
|
632
|
+
set_behavior(behavior, options[behavior]) if options.key?(behavior)
|
633
|
+
end
|
634
|
+
# BUG Hash must be last due to the weird Libmemcached multi-behaviors
|
635
|
+
set_behavior(:hash, options[:hash])
|
636
|
+
end
|
637
|
+
|
638
|
+
# Set the SASL credentials from the current options. If credentials aren't provided, try to get them from the environment.
|
639
|
+
def set_credentials
|
640
|
+
if options[:credentials]
|
641
|
+
check_return_code(
|
642
|
+
Lib.memcached_set_sasl_auth_data(@struct, *options[:credentials])
|
643
|
+
)
|
644
|
+
end
|
645
|
+
end
|
646
|
+
|
647
|
+
def is_unix_socket?(server)
|
648
|
+
server.type == Lib::MEMCACHED_CONNECTION_UNIX_SOCKET
|
649
|
+
end
|
650
|
+
|
651
|
+
# Stringify an opaque server struct
|
652
|
+
def inspect_server(server)
|
653
|
+
strings = [server.hostname]
|
654
|
+
if !is_unix_socket?(server)
|
655
|
+
strings << ":#{server.port}"
|
656
|
+
strings << ":#{server.weight}" if options[:ketama_weighted]
|
657
|
+
end
|
658
|
+
strings.join
|
659
|
+
end
|
660
|
+
end
|