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.
- 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
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* Copyright (C) 2010 Brian Aker All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
|
9
|
+
* modification, are permitted provided that the following conditions are
|
|
10
|
+
* met:
|
|
11
|
+
*
|
|
12
|
+
* * Redistributions of source code must retain the above copyright
|
|
13
|
+
* notice, this list of conditions and the following disclaimer.
|
|
14
|
+
*
|
|
15
|
+
* * Redistributions in binary form must reproduce the above
|
|
16
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
17
|
+
* in the documentation and/or other materials provided with the
|
|
18
|
+
* distribution.
|
|
19
|
+
*
|
|
20
|
+
* * The names of its contributors may not be used to endorse or
|
|
21
|
+
* promote products derived from this software without specific prior
|
|
22
|
+
* written permission.
|
|
23
|
+
*
|
|
24
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
25
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
27
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
28
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
29
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
30
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
31
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
32
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
33
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
34
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
#pragma once
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
#ifdef __cplusplus
|
|
42
|
+
extern "C" {
|
|
43
|
+
#endif
|
|
44
|
+
|
|
45
|
+
LIBMEMCACHED_API
|
|
46
|
+
memcached_return_t memcached_fetch_execute(memcached_st *ptr,
|
|
47
|
+
memcached_execute_fn *callback,
|
|
48
|
+
void *context,
|
|
49
|
+
uint32_t number_of_callbacks);
|
|
50
|
+
|
|
51
|
+
#ifdef __cplusplus
|
|
52
|
+
}
|
|
53
|
+
#endif
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
*
|
|
7
|
+
* Redistribution and use in source and binary forms, with or without
|
|
8
|
+
* modification, are permitted provided that the following conditions are
|
|
9
|
+
* met:
|
|
10
|
+
*
|
|
11
|
+
* * Redistributions of source code must retain the above copyright
|
|
12
|
+
* notice, this list of conditions and the following disclaimer.
|
|
13
|
+
*
|
|
14
|
+
* * Redistributions in binary form must reproduce the above
|
|
15
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
16
|
+
* in the documentation and/or other materials provided with the
|
|
17
|
+
* distribution.
|
|
18
|
+
*
|
|
19
|
+
* * The names of its contributors may not be used to endorse or
|
|
20
|
+
* promote products derived from this software without specific prior
|
|
21
|
+
* written permission.
|
|
22
|
+
*
|
|
23
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
24
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
25
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
26
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
27
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
28
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
29
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
30
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
31
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
32
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
33
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
34
|
+
*
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
#include <libmemcached/common.h>
|
|
38
|
+
|
|
39
|
+
static memcached_return_t memcached_flush_binary(memcached_st *ptr,
|
|
40
|
+
time_t expiration);
|
|
41
|
+
static memcached_return_t memcached_flush_textual(memcached_st *ptr,
|
|
42
|
+
time_t expiration);
|
|
43
|
+
|
|
44
|
+
memcached_return_t memcached_flush(memcached_st *ptr, time_t expiration)
|
|
45
|
+
{
|
|
46
|
+
memcached_return_t rc;
|
|
47
|
+
if (memcached_failed(rc= initialize_query(ptr)))
|
|
48
|
+
{
|
|
49
|
+
return rc;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
LIBMEMCACHED_MEMCACHED_FLUSH_START();
|
|
53
|
+
if (ptr->flags.binary_protocol)
|
|
54
|
+
rc= memcached_flush_binary(ptr, expiration);
|
|
55
|
+
else
|
|
56
|
+
rc= memcached_flush_textual(ptr, expiration);
|
|
57
|
+
LIBMEMCACHED_MEMCACHED_FLUSH_END();
|
|
58
|
+
return rc;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
static memcached_return_t memcached_flush_textual(memcached_st *ptr,
|
|
62
|
+
time_t expiration)
|
|
63
|
+
{
|
|
64
|
+
unlikely (memcached_server_count(ptr) == 0)
|
|
65
|
+
return MEMCACHED_NO_SERVERS;
|
|
66
|
+
|
|
67
|
+
for (unsigned int x= 0; x < memcached_server_count(ptr); x++)
|
|
68
|
+
{
|
|
69
|
+
memcached_return_t rc;
|
|
70
|
+
char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
|
|
71
|
+
|
|
72
|
+
bool no_reply= ptr->flags.no_reply;
|
|
73
|
+
memcached_server_write_instance_st instance=
|
|
74
|
+
memcached_server_instance_fetch(ptr, x);
|
|
75
|
+
|
|
76
|
+
int send_length;
|
|
77
|
+
if (expiration)
|
|
78
|
+
{
|
|
79
|
+
send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE,
|
|
80
|
+
"flush_all %llu%s\r\n",
|
|
81
|
+
(unsigned long long)expiration, no_reply ? " noreply" : "");
|
|
82
|
+
}
|
|
83
|
+
else
|
|
84
|
+
{
|
|
85
|
+
send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE,
|
|
86
|
+
"flush_all%s\r\n", no_reply ? " noreply" : "");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE || send_length < 0)
|
|
90
|
+
{
|
|
91
|
+
return MEMCACHED_FAILURE;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
rc= memcached_do(instance, buffer, (size_t)send_length, true);
|
|
95
|
+
|
|
96
|
+
if (rc == MEMCACHED_SUCCESS && !no_reply)
|
|
97
|
+
(void)memcached_response(instance, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, NULL);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return MEMCACHED_SUCCESS;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
static memcached_return_t memcached_flush_binary(memcached_st *ptr,
|
|
104
|
+
time_t expiration)
|
|
105
|
+
{
|
|
106
|
+
protocol_binary_request_flush request= {};
|
|
107
|
+
|
|
108
|
+
unlikely (memcached_server_count(ptr) == 0)
|
|
109
|
+
return MEMCACHED_NO_SERVERS;
|
|
110
|
+
|
|
111
|
+
request.message.header.request.magic= (uint8_t)PROTOCOL_BINARY_REQ;
|
|
112
|
+
request.message.header.request.opcode= PROTOCOL_BINARY_CMD_FLUSH;
|
|
113
|
+
request.message.header.request.extlen= 4;
|
|
114
|
+
request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES;
|
|
115
|
+
request.message.header.request.bodylen= htonl(request.message.header.request.extlen);
|
|
116
|
+
request.message.body.expiration= htonl((uint32_t) expiration);
|
|
117
|
+
|
|
118
|
+
for (uint32_t x= 0; x < memcached_server_count(ptr); x++)
|
|
119
|
+
{
|
|
120
|
+
memcached_server_write_instance_st instance=
|
|
121
|
+
memcached_server_instance_fetch(ptr, x);
|
|
122
|
+
|
|
123
|
+
if (ptr->flags.no_reply)
|
|
124
|
+
{
|
|
125
|
+
request.message.header.request.opcode= PROTOCOL_BINARY_CMD_FLUSHQ;
|
|
126
|
+
}
|
|
127
|
+
else
|
|
128
|
+
{
|
|
129
|
+
request.message.header.request.opcode= PROTOCOL_BINARY_CMD_FLUSH;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (memcached_do(instance, request.bytes, sizeof(request.bytes), true) != MEMCACHED_SUCCESS)
|
|
133
|
+
{
|
|
134
|
+
memcached_io_reset(instance);
|
|
135
|
+
return MEMCACHED_WRITE_FAILURE;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
for (uint32_t x= 0; x < memcached_server_count(ptr); x++)
|
|
140
|
+
{
|
|
141
|
+
memcached_server_write_instance_st instance=
|
|
142
|
+
memcached_server_instance_fetch(ptr, x);
|
|
143
|
+
|
|
144
|
+
if (memcached_server_response_count(instance) > 0)
|
|
145
|
+
(void)memcached_response(instance, NULL, 0, NULL);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return MEMCACHED_SUCCESS;
|
|
149
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* Copyright (C) 2010 Brian Aker All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
|
9
|
+
* modification, are permitted provided that the following conditions are
|
|
10
|
+
* met:
|
|
11
|
+
*
|
|
12
|
+
* * Redistributions of source code must retain the above copyright
|
|
13
|
+
* notice, this list of conditions and the following disclaimer.
|
|
14
|
+
*
|
|
15
|
+
* * Redistributions in binary form must reproduce the above
|
|
16
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
17
|
+
* in the documentation and/or other materials provided with the
|
|
18
|
+
* distribution.
|
|
19
|
+
*
|
|
20
|
+
* * The names of its contributors may not be used to endorse or
|
|
21
|
+
* promote products derived from this software without specific prior
|
|
22
|
+
* written permission.
|
|
23
|
+
*
|
|
24
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
25
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
27
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
28
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
29
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
30
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
31
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
32
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
33
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
34
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
#pragma once
|
|
39
|
+
|
|
40
|
+
#ifdef __cplusplus
|
|
41
|
+
extern "C" {
|
|
42
|
+
#endif
|
|
43
|
+
|
|
44
|
+
LIBMEMCACHED_API
|
|
45
|
+
memcached_return_t memcached_flush(memcached_st *ptr, time_t expiration);
|
|
46
|
+
|
|
47
|
+
#ifdef __cplusplus
|
|
48
|
+
}
|
|
49
|
+
#endif
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* Copyright (C) 2010 Brian Aker All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
|
9
|
+
* modification, are permitted provided that the following conditions are
|
|
10
|
+
* met:
|
|
11
|
+
*
|
|
12
|
+
* * Redistributions of source code must retain the above copyright
|
|
13
|
+
* notice, this list of conditions and the following disclaimer.
|
|
14
|
+
*
|
|
15
|
+
* * Redistributions in binary form must reproduce the above
|
|
16
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
17
|
+
* in the documentation and/or other materials provided with the
|
|
18
|
+
* distribution.
|
|
19
|
+
*
|
|
20
|
+
* * The names of its contributors may not be used to endorse or
|
|
21
|
+
* promote products derived from this software without specific prior
|
|
22
|
+
* written permission.
|
|
23
|
+
*
|
|
24
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
25
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
27
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
28
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
29
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
30
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
31
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
32
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
33
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
34
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
#include <libmemcached/common.h>
|
|
39
|
+
|
|
40
|
+
memcached_return_t memcached_flush_buffers(memcached_st *memc)
|
|
41
|
+
{
|
|
42
|
+
memcached_return_t ret= MEMCACHED_SUCCESS;
|
|
43
|
+
|
|
44
|
+
for (uint32_t x= 0; x < memcached_server_count(memc); ++x)
|
|
45
|
+
{
|
|
46
|
+
memcached_server_write_instance_st instance=
|
|
47
|
+
memcached_server_instance_fetch(memc, x);
|
|
48
|
+
|
|
49
|
+
if (instance->write_buffer_offset != 0)
|
|
50
|
+
{
|
|
51
|
+
if (instance->fd == -1 &&
|
|
52
|
+
(ret= memcached_connect(instance)) != MEMCACHED_SUCCESS)
|
|
53
|
+
{
|
|
54
|
+
WATCHPOINT_ERROR(ret);
|
|
55
|
+
return ret;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (memcached_io_write(instance, NULL, 0, true) == -1)
|
|
59
|
+
{
|
|
60
|
+
ret= MEMCACHED_SOME_ERRORS;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return ret;
|
|
66
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* Copyright (C) 2010 Brian Aker All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
|
9
|
+
* modification, are permitted provided that the following conditions are
|
|
10
|
+
* met:
|
|
11
|
+
*
|
|
12
|
+
* * Redistributions of source code must retain the above copyright
|
|
13
|
+
* notice, this list of conditions and the following disclaimer.
|
|
14
|
+
*
|
|
15
|
+
* * Redistributions in binary form must reproduce the above
|
|
16
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
17
|
+
* in the documentation and/or other materials provided with the
|
|
18
|
+
* distribution.
|
|
19
|
+
*
|
|
20
|
+
* * The names of its contributors may not be used to endorse or
|
|
21
|
+
* promote products derived from this software without specific prior
|
|
22
|
+
* written permission.
|
|
23
|
+
*
|
|
24
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
25
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
27
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
28
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
29
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
30
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
31
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
32
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
33
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
34
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
#pragma once
|
|
39
|
+
|
|
40
|
+
#ifdef __cplusplus
|
|
41
|
+
extern "C" {
|
|
42
|
+
#endif
|
|
43
|
+
|
|
44
|
+
LIBMEMCACHED_API
|
|
45
|
+
memcached_return_t memcached_flush_buffers(memcached_st *mem);
|
|
46
|
+
|
|
47
|
+
#ifdef __cplusplus
|
|
48
|
+
}
|
|
49
|
+
#endif
|
|
@@ -0,0 +1,842 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* Copyright (C) 2006-2009 Brian Aker All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
|
9
|
+
* modification, are permitted provided that the following conditions are
|
|
10
|
+
* met:
|
|
11
|
+
*
|
|
12
|
+
* * Redistributions of source code must retain the above copyright
|
|
13
|
+
* notice, this list of conditions and the following disclaimer.
|
|
14
|
+
*
|
|
15
|
+
* * Redistributions in binary form must reproduce the above
|
|
16
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
17
|
+
* in the documentation and/or other materials provided with the
|
|
18
|
+
* distribution.
|
|
19
|
+
*
|
|
20
|
+
* * The names of its contributors may not be used to endorse or
|
|
21
|
+
* promote products derived from this software without specific prior
|
|
22
|
+
* written permission.
|
|
23
|
+
*
|
|
24
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
25
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
27
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
28
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
29
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
30
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
31
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
32
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
33
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
34
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
#include <libmemcached/common.h>
|
|
39
|
+
#include <cassert>
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
What happens if no servers exist?
|
|
43
|
+
*/
|
|
44
|
+
char *memcached_get(memcached_st *ptr, const char *key,
|
|
45
|
+
size_t key_length,
|
|
46
|
+
size_t *value_length,
|
|
47
|
+
uint32_t *flags,
|
|
48
|
+
memcached_return_t *error)
|
|
49
|
+
{
|
|
50
|
+
return memcached_get_by_key(ptr, NULL, 0, key, key_length, value_length,
|
|
51
|
+
flags, error);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
static memcached_return_t memcached_mget_by_key_real(memcached_st *ptr,
|
|
55
|
+
const char *group_key,
|
|
56
|
+
size_t group_key_length,
|
|
57
|
+
const char * const *keys,
|
|
58
|
+
const size_t *key_length,
|
|
59
|
+
size_t number_of_keys,
|
|
60
|
+
bool mget_mode,
|
|
61
|
+
uint32_t user_spec_len);
|
|
62
|
+
|
|
63
|
+
static char *memcached_get_len_by_key(memcached_st *ptr,
|
|
64
|
+
const char *group_key,
|
|
65
|
+
size_t group_key_length,
|
|
66
|
+
const char *key, size_t key_length,
|
|
67
|
+
size_t *value_length,
|
|
68
|
+
uint32_t *flags,
|
|
69
|
+
uint32_t user_spec_len,
|
|
70
|
+
memcached_return_t *error)
|
|
71
|
+
{
|
|
72
|
+
unlikely (ptr->flags.use_udp)
|
|
73
|
+
{
|
|
74
|
+
if (value_length)
|
|
75
|
+
*value_length= 0;
|
|
76
|
+
|
|
77
|
+
*error= memcached_set_error(*ptr, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT);
|
|
78
|
+
return NULL;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
uint64_t query_id= ptr->query_id;
|
|
82
|
+
(void)query_id;
|
|
83
|
+
|
|
84
|
+
/* Request the key */
|
|
85
|
+
*error= memcached_mget_by_key_real(ptr, group_key, group_key_length,
|
|
86
|
+
(const char * const *)&key,
|
|
87
|
+
&key_length, 1, false, user_spec_len);
|
|
88
|
+
assert(ptr->query_id == query_id +1);
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
if (memcached_failed(*error))
|
|
92
|
+
{
|
|
93
|
+
if (memcached_has_current_error(*ptr)) // Find the most accurate error
|
|
94
|
+
{
|
|
95
|
+
*error= memcached_last_error(ptr);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (value_length)
|
|
99
|
+
*value_length= 0;
|
|
100
|
+
|
|
101
|
+
return NULL;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
char *value= memcached_fetch(ptr, NULL, NULL,
|
|
105
|
+
value_length, flags, error);
|
|
106
|
+
assert(ptr->query_id == query_id +1);
|
|
107
|
+
|
|
108
|
+
/* This is for historical reasons */
|
|
109
|
+
if (*error == MEMCACHED_END)
|
|
110
|
+
*error= MEMCACHED_NOTFOUND;
|
|
111
|
+
|
|
112
|
+
if (value == NULL)
|
|
113
|
+
{
|
|
114
|
+
if (ptr->get_key_failure && *error == MEMCACHED_NOTFOUND)
|
|
115
|
+
{
|
|
116
|
+
memcached_result_reset(&ptr->result);
|
|
117
|
+
memcached_return_t rc= ptr->get_key_failure(ptr, key, key_length, &ptr->result);
|
|
118
|
+
|
|
119
|
+
/* On all failure drop to returning NULL */
|
|
120
|
+
if (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED)
|
|
121
|
+
{
|
|
122
|
+
if (rc == MEMCACHED_BUFFERED)
|
|
123
|
+
{
|
|
124
|
+
uint64_t latch; /* We use latch to track the state of the original socket */
|
|
125
|
+
latch= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS);
|
|
126
|
+
if (latch == 0)
|
|
127
|
+
memcached_behavior_set(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 1);
|
|
128
|
+
|
|
129
|
+
rc= memcached_set(ptr, key, key_length,
|
|
130
|
+
(memcached_result_value(&ptr->result)),
|
|
131
|
+
(memcached_result_length(&ptr->result)),
|
|
132
|
+
0,
|
|
133
|
+
(memcached_result_flags(&ptr->result)));
|
|
134
|
+
|
|
135
|
+
if (rc == MEMCACHED_BUFFERED && latch == 0)
|
|
136
|
+
{
|
|
137
|
+
memcached_behavior_set(ptr, MEMCACHED_BEHAVIOR_BUFFER_REQUESTS, 0);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
else
|
|
141
|
+
{
|
|
142
|
+
rc= memcached_set(ptr, key, key_length,
|
|
143
|
+
(memcached_result_value(&ptr->result)),
|
|
144
|
+
(memcached_result_length(&ptr->result)),
|
|
145
|
+
0,
|
|
146
|
+
(memcached_result_flags(&ptr->result)));
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED)
|
|
150
|
+
{
|
|
151
|
+
*error= rc;
|
|
152
|
+
*value_length= memcached_result_length(&ptr->result);
|
|
153
|
+
*flags= memcached_result_flags(&ptr->result);
|
|
154
|
+
return memcached_string_take_value(&ptr->result.value);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
assert(ptr->query_id == query_id +1);
|
|
159
|
+
|
|
160
|
+
return NULL;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
size_t dummy_length;
|
|
164
|
+
uint32_t dummy_flags;
|
|
165
|
+
memcached_return_t dummy_error;
|
|
166
|
+
|
|
167
|
+
char *dummy_value= memcached_fetch(ptr, NULL, NULL,
|
|
168
|
+
&dummy_length, &dummy_flags,
|
|
169
|
+
&dummy_error);
|
|
170
|
+
WATCHPOINT_ASSERT(dummy_length == 0);
|
|
171
|
+
WATCHPOINT_ASSERT(dummy_value == 0);
|
|
172
|
+
assert(ptr->query_id == query_id +1);
|
|
173
|
+
|
|
174
|
+
return value;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
char *memcached_get_by_key(memcached_st *ptr,
|
|
178
|
+
const char *group_key,
|
|
179
|
+
size_t group_key_length,
|
|
180
|
+
const char *key, size_t key_length,
|
|
181
|
+
size_t *value_length,
|
|
182
|
+
uint32_t *flags,
|
|
183
|
+
memcached_return_t *error)
|
|
184
|
+
{
|
|
185
|
+
return memcached_get_len_by_key(ptr, NULL, 0, key, key_length, value_length,
|
|
186
|
+
flags, GET_LEN_ARG_UNSPECIFIED, error);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
memcached_return_t memcached_mget(memcached_st *ptr,
|
|
190
|
+
const char * const *keys,
|
|
191
|
+
const size_t *key_length,
|
|
192
|
+
size_t number_of_keys)
|
|
193
|
+
{
|
|
194
|
+
return memcached_mget_by_key(ptr, NULL, 0, keys, key_length, number_of_keys);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
static memcached_return_t binary_mget_by_key(memcached_st *ptr,
|
|
198
|
+
uint32_t master_server_key,
|
|
199
|
+
bool is_group_key_set,
|
|
200
|
+
const char * const *keys,
|
|
201
|
+
const size_t *key_length,
|
|
202
|
+
size_t number_of_keys,
|
|
203
|
+
bool mget_mode);
|
|
204
|
+
|
|
205
|
+
static memcached_return_t memcached_mget_by_key_real(memcached_st *ptr,
|
|
206
|
+
const char *group_key,
|
|
207
|
+
size_t group_key_length,
|
|
208
|
+
const char * const *keys,
|
|
209
|
+
const size_t *key_length,
|
|
210
|
+
size_t number_of_keys,
|
|
211
|
+
bool mget_mode,
|
|
212
|
+
uint32_t user_spec_len)
|
|
213
|
+
{
|
|
214
|
+
bool failures_occured_in_sending= false;
|
|
215
|
+
const char *get_command;
|
|
216
|
+
uint8_t get_command_length;
|
|
217
|
+
unsigned int master_server_key= (unsigned int)-1; /* 0 is a valid server id! */
|
|
218
|
+
bool length_specified = (user_spec_len != GET_LEN_ARG_UNSPECIFIED);
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
memcached_return_t rc;
|
|
222
|
+
if (memcached_failed(rc= initialize_query(ptr)))
|
|
223
|
+
{
|
|
224
|
+
return rc;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
unlikely (ptr->flags.use_udp)
|
|
228
|
+
{
|
|
229
|
+
return memcached_set_error(*ptr, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
LIBMEMCACHED_MEMCACHED_MGET_START();
|
|
233
|
+
|
|
234
|
+
if (number_of_keys == 0)
|
|
235
|
+
{
|
|
236
|
+
return memcached_set_error(*ptr, MEMCACHED_NOTFOUND, MEMCACHED_AT, memcached_literal_param("number_of_keys was zero"));
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
if (ptr->flags.verify_key && (memcached_key_test(keys, key_length, number_of_keys) == MEMCACHED_BAD_KEY_PROVIDED))
|
|
240
|
+
{
|
|
241
|
+
return memcached_set_error(*ptr, MEMCACHED_BAD_KEY_PROVIDED, MEMCACHED_AT, memcached_literal_param("A bad key value was provided"));
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
bool is_group_key_set= false;
|
|
245
|
+
if (group_key && group_key_length)
|
|
246
|
+
{
|
|
247
|
+
if (ptr->flags.verify_key and (memcached_key_test((const char * const *)&group_key, &group_key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED))
|
|
248
|
+
{
|
|
249
|
+
return memcached_set_error(*ptr, MEMCACHED_BAD_KEY_PROVIDED, MEMCACHED_AT, memcached_literal_param("A bad group key was provided."));
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
master_server_key= memcached_generate_hash_with_redistribution(ptr, group_key, group_key_length);
|
|
253
|
+
is_group_key_set= true;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (length_specified) {
|
|
257
|
+
if (ptr->flags.binary_protocol)
|
|
258
|
+
return memcached_set_error(*ptr, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT);
|
|
259
|
+
|
|
260
|
+
if (!(user_spec_len > 0 && user_spec_len < GET_LEN_ARG_UNSPECIFIED))
|
|
261
|
+
return memcached_set_error(*ptr, MEMCACHED_FAILURE, MEMCACHED_AT);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/*
|
|
265
|
+
Here is where we pay for the non-block API. We need to remove any data sitting
|
|
266
|
+
in the queue before we start our get.
|
|
267
|
+
|
|
268
|
+
It might be optimum to bounce the connection if count > some number.
|
|
269
|
+
*/
|
|
270
|
+
for (uint32_t x= 0; x < memcached_server_count(ptr); x++)
|
|
271
|
+
{
|
|
272
|
+
memcached_server_write_instance_st instance=
|
|
273
|
+
memcached_server_instance_fetch(ptr, x);
|
|
274
|
+
|
|
275
|
+
if (memcached_server_response_count(instance))
|
|
276
|
+
{
|
|
277
|
+
char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
|
|
278
|
+
|
|
279
|
+
if (ptr->flags.no_block)
|
|
280
|
+
(void)memcached_io_write(instance, NULL, 0, true);
|
|
281
|
+
|
|
282
|
+
while(memcached_server_response_count(instance))
|
|
283
|
+
(void)memcached_response(instance, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, &ptr->result);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
if (ptr->flags.binary_protocol)
|
|
288
|
+
{
|
|
289
|
+
return binary_mget_by_key(ptr, master_server_key, is_group_key_set, keys,
|
|
290
|
+
key_length, number_of_keys, mget_mode);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if (length_specified) {
|
|
294
|
+
if (ptr->flags.support_cas)
|
|
295
|
+
{
|
|
296
|
+
get_command= "gets_len ";
|
|
297
|
+
get_command_length= 9;
|
|
298
|
+
} else {
|
|
299
|
+
get_command= "get_len ";
|
|
300
|
+
get_command_length= 8;
|
|
301
|
+
}
|
|
302
|
+
} else {
|
|
303
|
+
if (ptr->flags.support_cas)
|
|
304
|
+
{
|
|
305
|
+
get_command= "gets ";
|
|
306
|
+
get_command_length= 5;
|
|
307
|
+
} else {
|
|
308
|
+
get_command= "get ";
|
|
309
|
+
get_command_length= 4;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/*
|
|
314
|
+
If a server fails we warn about errors and start all over with sending keys
|
|
315
|
+
to the server.
|
|
316
|
+
*/
|
|
317
|
+
WATCHPOINT_ASSERT(rc == MEMCACHED_SUCCESS);
|
|
318
|
+
size_t hosts_connected= 0;
|
|
319
|
+
for (uint32_t x= 0; x < number_of_keys; x++)
|
|
320
|
+
{
|
|
321
|
+
memcached_server_write_instance_st instance;
|
|
322
|
+
uint32_t server_key;
|
|
323
|
+
|
|
324
|
+
if (is_group_key_set)
|
|
325
|
+
{
|
|
326
|
+
server_key= master_server_key;
|
|
327
|
+
}
|
|
328
|
+
else
|
|
329
|
+
{
|
|
330
|
+
server_key= memcached_generate_hash_with_redistribution(ptr, keys[x], key_length[x]);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
instance= memcached_server_instance_fetch(ptr, server_key);
|
|
334
|
+
|
|
335
|
+
struct libmemcached_io_vector_st vector[]=
|
|
336
|
+
{
|
|
337
|
+
{ get_command_length, get_command },
|
|
338
|
+
{ memcached_array_size(ptr->prefix_key), memcached_array_string(ptr->prefix_key) },
|
|
339
|
+
{ key_length[x], keys[x] },
|
|
340
|
+
{ 1, " " }
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
if (memcached_server_response_count(instance) == 0)
|
|
345
|
+
{
|
|
346
|
+
rc= memcached_connect(instance);
|
|
347
|
+
|
|
348
|
+
if (memcached_failed(rc))
|
|
349
|
+
{
|
|
350
|
+
memcached_set_error(*instance, rc, MEMCACHED_AT);
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
hosts_connected++;
|
|
354
|
+
|
|
355
|
+
if ((memcached_io_writev(instance, vector, 4, false)) == -1)
|
|
356
|
+
{
|
|
357
|
+
failures_occured_in_sending= true;
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
WATCHPOINT_ASSERT(instance->cursor_active == 0);
|
|
362
|
+
memcached_server_response_increment(instance);
|
|
363
|
+
WATCHPOINT_ASSERT(instance->cursor_active == 1);
|
|
364
|
+
}
|
|
365
|
+
else
|
|
366
|
+
{
|
|
367
|
+
if ((memcached_io_writev(instance, (vector + 1), 3, false)) == -1)
|
|
368
|
+
{
|
|
369
|
+
memcached_server_response_reset(instance);
|
|
370
|
+
failures_occured_in_sending= true;
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
if (length_specified) {
|
|
376
|
+
char len[GET_LEN_BUFSZ];
|
|
377
|
+
if (snprintf(len, GET_LEN_BUFSZ, "%d ", user_spec_len) < 0 ||
|
|
378
|
+
(memcached_io_write(instance, len, strlen(len), 0) == -1))
|
|
379
|
+
{
|
|
380
|
+
failures_occured_in_sending= true;
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
ptr->last_server_key = server_key;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
if (hosts_connected == 0)
|
|
389
|
+
{
|
|
390
|
+
LIBMEMCACHED_MEMCACHED_MGET_END();
|
|
391
|
+
|
|
392
|
+
if (memcached_failed(rc))
|
|
393
|
+
return rc;
|
|
394
|
+
|
|
395
|
+
return memcached_set_error(*ptr, MEMCACHED_NO_SERVERS, MEMCACHED_AT);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
/*
|
|
400
|
+
Should we muddle on if some servers are dead?
|
|
401
|
+
*/
|
|
402
|
+
bool success_happened= false;
|
|
403
|
+
for (uint32_t x= 0; x < memcached_server_count(ptr); x++)
|
|
404
|
+
{
|
|
405
|
+
memcached_server_write_instance_st instance=
|
|
406
|
+
memcached_server_instance_fetch(ptr, x);
|
|
407
|
+
|
|
408
|
+
if (memcached_server_response_count(instance))
|
|
409
|
+
{
|
|
410
|
+
/* We need to do something about non-connnected hosts in the future */
|
|
411
|
+
if ((memcached_io_write(instance, "\r\n", 2, true)) == -1)
|
|
412
|
+
{
|
|
413
|
+
failures_occured_in_sending= true;
|
|
414
|
+
}
|
|
415
|
+
else
|
|
416
|
+
{
|
|
417
|
+
success_happened= true;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
LIBMEMCACHED_MEMCACHED_MGET_END();
|
|
423
|
+
|
|
424
|
+
if (failures_occured_in_sending && success_happened)
|
|
425
|
+
{
|
|
426
|
+
return MEMCACHED_SOME_ERRORS;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
if (success_happened)
|
|
430
|
+
return MEMCACHED_SUCCESS;
|
|
431
|
+
|
|
432
|
+
return MEMCACHED_FAILURE; // Complete failure occurred
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
memcached_return_t memcached_mget_by_key(memcached_st *ptr,
|
|
436
|
+
const char *group_key,
|
|
437
|
+
size_t group_key_length,
|
|
438
|
+
const char * const *keys,
|
|
439
|
+
const size_t *key_length,
|
|
440
|
+
size_t number_of_keys)
|
|
441
|
+
{
|
|
442
|
+
return memcached_mget_by_key_real(ptr, group_key, group_key_length, keys,
|
|
443
|
+
key_length, number_of_keys, true, GET_LEN_ARG_UNSPECIFIED);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
memcached_return_t memcached_mget_execute(memcached_st *ptr,
|
|
447
|
+
const char * const *keys,
|
|
448
|
+
const size_t *key_length,
|
|
449
|
+
size_t number_of_keys,
|
|
450
|
+
memcached_execute_fn *callback,
|
|
451
|
+
void *context,
|
|
452
|
+
unsigned int number_of_callbacks)
|
|
453
|
+
{
|
|
454
|
+
return memcached_mget_execute_by_key(ptr, NULL, 0, keys, key_length,
|
|
455
|
+
number_of_keys, callback,
|
|
456
|
+
context, number_of_callbacks);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
memcached_return_t memcached_mget_execute_by_key(memcached_st *ptr,
|
|
460
|
+
const char *group_key,
|
|
461
|
+
size_t group_key_length,
|
|
462
|
+
const char * const *keys,
|
|
463
|
+
const size_t *key_length,
|
|
464
|
+
size_t number_of_keys,
|
|
465
|
+
memcached_execute_fn *callback,
|
|
466
|
+
void *context,
|
|
467
|
+
unsigned int number_of_callbacks)
|
|
468
|
+
{
|
|
469
|
+
if ((ptr->flags.binary_protocol) == 0)
|
|
470
|
+
return MEMCACHED_NOT_SUPPORTED;
|
|
471
|
+
|
|
472
|
+
memcached_return_t rc;
|
|
473
|
+
memcached_callback_st *original_callbacks= ptr->callbacks;
|
|
474
|
+
memcached_callback_st cb= {
|
|
475
|
+
callback,
|
|
476
|
+
context,
|
|
477
|
+
number_of_callbacks
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
ptr->callbacks= &cb;
|
|
481
|
+
rc= memcached_mget_by_key(ptr, group_key, group_key_length, keys,
|
|
482
|
+
key_length, number_of_keys);
|
|
483
|
+
ptr->callbacks= original_callbacks;
|
|
484
|
+
return rc;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
static memcached_return_t simple_binary_mget(memcached_st *ptr,
|
|
488
|
+
uint32_t master_server_key,
|
|
489
|
+
bool is_group_key_set,
|
|
490
|
+
const char * const *keys,
|
|
491
|
+
const size_t *key_length,
|
|
492
|
+
size_t number_of_keys, bool mget_mode)
|
|
493
|
+
{
|
|
494
|
+
memcached_return_t rc= MEMCACHED_NOTFOUND;
|
|
495
|
+
|
|
496
|
+
bool flush= (number_of_keys == 1);
|
|
497
|
+
|
|
498
|
+
/*
|
|
499
|
+
If a server fails we warn about errors and start all over with sending keys
|
|
500
|
+
to the server.
|
|
501
|
+
*/
|
|
502
|
+
for (uint32_t x= 0; x < number_of_keys; ++x)
|
|
503
|
+
{
|
|
504
|
+
uint32_t server_key;
|
|
505
|
+
|
|
506
|
+
if (is_group_key_set)
|
|
507
|
+
{
|
|
508
|
+
server_key= master_server_key;
|
|
509
|
+
}
|
|
510
|
+
else
|
|
511
|
+
{
|
|
512
|
+
server_key= memcached_generate_hash_with_redistribution(ptr, keys[x], key_length[x]);
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, server_key);
|
|
516
|
+
|
|
517
|
+
if (memcached_server_response_count(instance) == 0)
|
|
518
|
+
{
|
|
519
|
+
rc= memcached_connect(instance);
|
|
520
|
+
if (memcached_failed(rc))
|
|
521
|
+
continue;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
protocol_binary_request_getk request= { }; //= {.bytes= {0}};
|
|
525
|
+
request.message.header.request.magic= PROTOCOL_BINARY_REQ;
|
|
526
|
+
if (mget_mode)
|
|
527
|
+
request.message.header.request.opcode= PROTOCOL_BINARY_CMD_GETKQ;
|
|
528
|
+
else
|
|
529
|
+
request.message.header.request.opcode= PROTOCOL_BINARY_CMD_GETK;
|
|
530
|
+
|
|
531
|
+
memcached_return_t vk;
|
|
532
|
+
vk= memcached_validate_key_length(key_length[x],
|
|
533
|
+
ptr->flags.binary_protocol);
|
|
534
|
+
unlikely (vk != MEMCACHED_SUCCESS)
|
|
535
|
+
{
|
|
536
|
+
if (x > 0)
|
|
537
|
+
{
|
|
538
|
+
memcached_io_reset(instance);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
return vk;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
request.message.header.request.keylen= htons((uint16_t)(key_length[x] + memcached_array_size(ptr->prefix_key)));
|
|
545
|
+
request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES;
|
|
546
|
+
request.message.header.request.bodylen= htonl((uint32_t)( key_length[x] + memcached_array_size(ptr->prefix_key)));
|
|
547
|
+
|
|
548
|
+
struct libmemcached_io_vector_st vector[]=
|
|
549
|
+
{
|
|
550
|
+
{ sizeof(request.bytes), request.bytes },
|
|
551
|
+
{ memcached_array_size(ptr->prefix_key), memcached_array_string(ptr->prefix_key) },
|
|
552
|
+
{ key_length[x], keys[x] }
|
|
553
|
+
};
|
|
554
|
+
|
|
555
|
+
if (memcached_io_writev(instance, vector, 3, flush) == -1)
|
|
556
|
+
{
|
|
557
|
+
memcached_server_response_reset(instance);
|
|
558
|
+
rc= MEMCACHED_SOME_ERRORS;
|
|
559
|
+
continue;
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
/* We just want one pending response per server */
|
|
563
|
+
memcached_server_response_reset(instance);
|
|
564
|
+
memcached_server_response_increment(instance);
|
|
565
|
+
if ((x > 0 && x == ptr->io_key_prefetch) && memcached_flush_buffers(ptr) != MEMCACHED_SUCCESS)
|
|
566
|
+
{
|
|
567
|
+
rc= MEMCACHED_SOME_ERRORS;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
if (mget_mode)
|
|
572
|
+
{
|
|
573
|
+
/*
|
|
574
|
+
Send a noop command to flush the buffers
|
|
575
|
+
*/
|
|
576
|
+
protocol_binary_request_noop request= {}; //= {.bytes= {0}};
|
|
577
|
+
request.message.header.request.magic= PROTOCOL_BINARY_REQ;
|
|
578
|
+
request.message.header.request.opcode= PROTOCOL_BINARY_CMD_NOOP;
|
|
579
|
+
request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES;
|
|
580
|
+
|
|
581
|
+
for (uint32_t x= 0; x < memcached_server_count(ptr); ++x)
|
|
582
|
+
{
|
|
583
|
+
memcached_server_write_instance_st instance=
|
|
584
|
+
memcached_server_instance_fetch(ptr, x);
|
|
585
|
+
|
|
586
|
+
if (memcached_server_response_count(instance))
|
|
587
|
+
{
|
|
588
|
+
if (memcached_io_write(instance, NULL, 0, true) == -1)
|
|
589
|
+
{
|
|
590
|
+
memcached_server_response_reset(instance);
|
|
591
|
+
memcached_io_reset(instance);
|
|
592
|
+
rc= MEMCACHED_SOME_ERRORS;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
if (memcached_io_write(instance, request.bytes,
|
|
596
|
+
sizeof(request.bytes), true) == -1)
|
|
597
|
+
{
|
|
598
|
+
memcached_server_response_reset(instance);
|
|
599
|
+
memcached_io_reset(instance);
|
|
600
|
+
rc= MEMCACHED_SOME_ERRORS;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
|
|
607
|
+
return rc;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
static memcached_return_t replication_binary_mget(memcached_st *ptr,
|
|
611
|
+
uint32_t* hash,
|
|
612
|
+
bool* dead_servers,
|
|
613
|
+
const char *const *keys,
|
|
614
|
+
const size_t *key_length,
|
|
615
|
+
size_t number_of_keys)
|
|
616
|
+
{
|
|
617
|
+
memcached_return_t rc= MEMCACHED_NOTFOUND;
|
|
618
|
+
uint32_t start= 0;
|
|
619
|
+
uint64_t randomize_read= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ);
|
|
620
|
+
|
|
621
|
+
if (randomize_read)
|
|
622
|
+
start= (uint32_t)random() % (uint32_t)(ptr->number_of_replicas + 1);
|
|
623
|
+
|
|
624
|
+
/* Loop for each replica */
|
|
625
|
+
for (uint32_t replica= 0; replica <= ptr->number_of_replicas; ++replica)
|
|
626
|
+
{
|
|
627
|
+
bool success= true;
|
|
628
|
+
|
|
629
|
+
for (uint32_t x= 0; x < number_of_keys; ++x)
|
|
630
|
+
{
|
|
631
|
+
if (hash[x] == memcached_server_count(ptr))
|
|
632
|
+
continue; /* Already successfully sent */
|
|
633
|
+
|
|
634
|
+
uint32_t server= hash[x] + replica;
|
|
635
|
+
|
|
636
|
+
/* In case of randomized reads */
|
|
637
|
+
if (randomize_read && ((server + start) <= (hash[x] + ptr->number_of_replicas)))
|
|
638
|
+
server += start;
|
|
639
|
+
|
|
640
|
+
while (server >= memcached_server_count(ptr))
|
|
641
|
+
server -= memcached_server_count(ptr);
|
|
642
|
+
|
|
643
|
+
if (dead_servers[server])
|
|
644
|
+
continue;
|
|
645
|
+
|
|
646
|
+
memcached_server_write_instance_st instance= memcached_server_instance_fetch(ptr, server);
|
|
647
|
+
|
|
648
|
+
if (memcached_server_response_count(instance) == 0)
|
|
649
|
+
{
|
|
650
|
+
rc= memcached_connect(instance);
|
|
651
|
+
if (memcached_failed(rc))
|
|
652
|
+
{
|
|
653
|
+
memcached_io_reset(instance);
|
|
654
|
+
dead_servers[server]= true;
|
|
655
|
+
success= false;
|
|
656
|
+
continue;
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
protocol_binary_request_getk request= {};
|
|
661
|
+
request.message.header.request.magic= PROTOCOL_BINARY_REQ;
|
|
662
|
+
request.message.header.request.opcode= PROTOCOL_BINARY_CMD_GETK;
|
|
663
|
+
request.message.header.request.keylen= htons((uint16_t)(key_length[x] + memcached_array_size(ptr->prefix_key)));
|
|
664
|
+
request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES;
|
|
665
|
+
request.message.header.request.bodylen= htonl((uint32_t)(key_length[x] + memcached_array_size(ptr->prefix_key)));
|
|
666
|
+
|
|
667
|
+
/*
|
|
668
|
+
* We need to disable buffering to actually know that the request was
|
|
669
|
+
* successfully sent to the server (so that we should expect a result
|
|
670
|
+
* back). It would be nice to do this in buffered mode, but then it
|
|
671
|
+
* would be complex to handle all error situations if we got to send
|
|
672
|
+
* some of the messages, and then we failed on writing out some others
|
|
673
|
+
* and we used the callback interface from memcached_mget_execute so
|
|
674
|
+
* that we might have processed some of the responses etc. For now,
|
|
675
|
+
* just make sure we work _correctly_
|
|
676
|
+
*/
|
|
677
|
+
struct libmemcached_io_vector_st vector[]=
|
|
678
|
+
{
|
|
679
|
+
{ sizeof(request.bytes), request.bytes },
|
|
680
|
+
{ memcached_array_size(ptr->prefix_key), memcached_array_string(ptr->prefix_key) },
|
|
681
|
+
{ key_length[x], keys[x] }
|
|
682
|
+
};
|
|
683
|
+
|
|
684
|
+
if (memcached_io_writev(instance, vector, 3, true) == -1)
|
|
685
|
+
{
|
|
686
|
+
memcached_io_reset(instance);
|
|
687
|
+
dead_servers[server]= true;
|
|
688
|
+
success= false;
|
|
689
|
+
continue;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
memcached_server_response_increment(instance);
|
|
693
|
+
hash[x]= memcached_server_count(ptr);
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
if (success)
|
|
697
|
+
break;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
return rc;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
static memcached_return_t binary_mget_by_key(memcached_st *ptr,
|
|
704
|
+
uint32_t master_server_key,
|
|
705
|
+
bool is_group_key_set,
|
|
706
|
+
const char * const *keys,
|
|
707
|
+
const size_t *key_length,
|
|
708
|
+
size_t number_of_keys,
|
|
709
|
+
bool mget_mode)
|
|
710
|
+
{
|
|
711
|
+
if (ptr->number_of_replicas == 0)
|
|
712
|
+
{
|
|
713
|
+
return simple_binary_mget(ptr, master_server_key, is_group_key_set,
|
|
714
|
+
keys, key_length, number_of_keys, mget_mode);
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
uint32_t* hash= static_cast<uint32_t*>(libmemcached_malloc(ptr, sizeof(uint32_t) * number_of_keys));
|
|
718
|
+
bool* dead_servers= static_cast<bool*>(libmemcached_calloc(ptr, memcached_server_count(ptr), sizeof(bool)));
|
|
719
|
+
|
|
720
|
+
if (hash == NULL || dead_servers == NULL)
|
|
721
|
+
{
|
|
722
|
+
libmemcached_free(ptr, hash);
|
|
723
|
+
libmemcached_free(ptr, dead_servers);
|
|
724
|
+
return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
if (is_group_key_set)
|
|
728
|
+
{
|
|
729
|
+
for (size_t x= 0; x < number_of_keys; x++)
|
|
730
|
+
{
|
|
731
|
+
hash[x]= master_server_key;
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
else
|
|
735
|
+
{
|
|
736
|
+
for (size_t x= 0; x < number_of_keys; x++)
|
|
737
|
+
{
|
|
738
|
+
hash[x]= memcached_generate_hash_with_redistribution(ptr, keys[x], key_length[x]);
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
memcached_return_t rc= replication_binary_mget(ptr, hash, dead_servers, keys,
|
|
743
|
+
key_length, number_of_keys);
|
|
744
|
+
|
|
745
|
+
WATCHPOINT_IFERROR(rc);
|
|
746
|
+
libmemcached_free(ptr, hash);
|
|
747
|
+
libmemcached_free(ptr, dead_servers);
|
|
748
|
+
|
|
749
|
+
return MEMCACHED_SUCCESS;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
char *memcached_get_from_last(memcached_st *ptr, const char *key,
|
|
753
|
+
size_t key_length,
|
|
754
|
+
size_t *value_length,
|
|
755
|
+
uint32_t *flags,
|
|
756
|
+
memcached_return *error)
|
|
757
|
+
{
|
|
758
|
+
char *value = NULL;
|
|
759
|
+
|
|
760
|
+
*error = MEMCACHED_NOTFOUND;
|
|
761
|
+
if (memcached_server_response_count(&ptr->servers[ptr->last_server_key]) == 0) {
|
|
762
|
+
*error = memcached_connect(&ptr->servers[ptr->last_server_key]);
|
|
763
|
+
|
|
764
|
+
if (*error != MEMCACHED_SUCCESS) {
|
|
765
|
+
return value;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
if ((memcached_io_write(&ptr->servers[ptr->last_server_key], "get ", 4, 0)) == -1) {
|
|
769
|
+
*error = MEMCACHED_SOME_ERRORS;
|
|
770
|
+
return value;
|
|
771
|
+
}
|
|
772
|
+
WATCHPOINT_ASSERT(ptr->servers[ptr->last_server_key].cursor_active == 0);
|
|
773
|
+
memcached_server_response_increment(&ptr->servers[ptr->last_server_key]);
|
|
774
|
+
WATCHPOINT_ASSERT(ptr->servers[ptr->last_server_key].cursor_active == 1);
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
/* Only called when we have a prefix key */
|
|
778
|
+
if (ptr->prefix_key && !memcached_array_is_null(ptr->prefix_key)) {
|
|
779
|
+
if ((memcached_io_write(&ptr->servers[ptr->last_server_key],
|
|
780
|
+
memcached_array_string(ptr->prefix_key),
|
|
781
|
+
memcached_array_size(ptr->prefix_key), false)) == -1) {
|
|
782
|
+
memcached_server_response_reset(&ptr->servers[ptr->last_server_key]);
|
|
783
|
+
*error = MEMCACHED_SOME_ERRORS;
|
|
784
|
+
return value;
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
|
|
789
|
+
if ((memcached_io_write(&ptr->servers[ptr->last_server_key], key, key_length, false)) == -1) {
|
|
790
|
+
memcached_server_response_reset(&ptr->servers[ptr->last_server_key]);
|
|
791
|
+
*error = MEMCACHED_SOME_ERRORS;
|
|
792
|
+
return value;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
if ((memcached_io_write(&ptr->servers[ptr->last_server_key], "\r\n", 2, true)) == -1) {
|
|
796
|
+
memcached_server_response_reset(&ptr->servers[ptr->last_server_key]);
|
|
797
|
+
*error = MEMCACHED_SOME_ERRORS;
|
|
798
|
+
return value;
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
value = memcached_fetch(ptr, NULL, NULL, value_length, flags, error);
|
|
802
|
+
|
|
803
|
+
/* This is for historical reasons */
|
|
804
|
+
if (*error == MEMCACHED_END)
|
|
805
|
+
*error = MEMCACHED_NOTFOUND;
|
|
806
|
+
|
|
807
|
+
if (value != NULL) {
|
|
808
|
+
size_t dummy_length;
|
|
809
|
+
uint32_t dummy_flags;
|
|
810
|
+
memcached_return dummy_error;
|
|
811
|
+
|
|
812
|
+
(void)memcached_fetch(ptr, NULL, NULL,
|
|
813
|
+
&dummy_length, &dummy_flags,
|
|
814
|
+
&dummy_error);
|
|
815
|
+
WATCHPOINT_ASSERT(dummy_length == 0);
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
return value;
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
char *memcached_get_len(memcached_st *ptr, const char *key,
|
|
822
|
+
size_t key_length,
|
|
823
|
+
size_t *value_length,
|
|
824
|
+
uint32_t *flags,
|
|
825
|
+
uint32_t user_spec_len,
|
|
826
|
+
memcached_return_t *error)
|
|
827
|
+
{
|
|
828
|
+
return memcached_get_len_by_key(ptr, NULL, 0, key, key_length, value_length,
|
|
829
|
+
flags, user_spec_len, error);
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
|
|
833
|
+
memcached_return_t memcached_mget_len(memcached_st *ptr,
|
|
834
|
+
const char * const *keys,
|
|
835
|
+
const size_t *key_length,
|
|
836
|
+
size_t number_of_keys,
|
|
837
|
+
uint32_t user_spec_len)
|
|
838
|
+
{
|
|
839
|
+
return memcached_mget_by_key_real(ptr, NULL, 0, keys, key_length,
|
|
840
|
+
number_of_keys, true, user_spec_len);
|
|
841
|
+
}
|
|
842
|
+
|