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,163 @@
|
|
|
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
|
+
#pragma once
|
|
38
|
+
|
|
39
|
+
#include "config.h"
|
|
40
|
+
#if !defined(__cplusplus)
|
|
41
|
+
# include <stdbool.h>
|
|
42
|
+
#endif
|
|
43
|
+
#include <assert.h>
|
|
44
|
+
|
|
45
|
+
#include <libmemcached/visibility.h>
|
|
46
|
+
#include <libmemcached/protocol_handler.h>
|
|
47
|
+
#include <libmemcached/protocol/cache.h>
|
|
48
|
+
|
|
49
|
+
/*
|
|
50
|
+
* I don't really need the following two functions as function pointers
|
|
51
|
+
* in the instance handle, but I don't want to put them in the global
|
|
52
|
+
* namespace for those linking statically (personally I don't like that,
|
|
53
|
+
* but some people still do). If it ever shows up as a performance thing
|
|
54
|
+
* I'll look into optimizing this ;-)
|
|
55
|
+
*/
|
|
56
|
+
typedef bool (*drain_func)(memcached_protocol_client_st *client);
|
|
57
|
+
typedef protocol_binary_response_status (*spool_func)(memcached_protocol_client_st *client,
|
|
58
|
+
const void *data,
|
|
59
|
+
size_t length);
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Definition of the per instance structure.
|
|
63
|
+
*/
|
|
64
|
+
struct memcached_protocol_st {
|
|
65
|
+
memcached_binary_protocol_callback_st *callback;
|
|
66
|
+
memcached_protocol_recv_func recv;
|
|
67
|
+
memcached_protocol_send_func send;
|
|
68
|
+
|
|
69
|
+
/*
|
|
70
|
+
* I really don't need these as funciton pointers, but I don't want
|
|
71
|
+
* to clutter the namespace if someone links statically.
|
|
72
|
+
*/
|
|
73
|
+
drain_func drain;
|
|
74
|
+
spool_func spool;
|
|
75
|
+
|
|
76
|
+
/*
|
|
77
|
+
* To avoid keeping a buffer in each client all the time I have a
|
|
78
|
+
* bigger buffer in the instance that I read to initially, and then
|
|
79
|
+
* I try to parse and execute as much from the buffer. If I wasn't able
|
|
80
|
+
* to process all data I'll keep that in a per-connection buffer until
|
|
81
|
+
* the next time I can read from the socket.
|
|
82
|
+
*/
|
|
83
|
+
uint8_t *input_buffer;
|
|
84
|
+
size_t input_buffer_size;
|
|
85
|
+
|
|
86
|
+
bool pedantic;
|
|
87
|
+
/* @todo use multiple sized buffers */
|
|
88
|
+
cache_t *buffer_cache;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
struct chunk_st {
|
|
92
|
+
/* Pointer to the data */
|
|
93
|
+
char *data;
|
|
94
|
+
/* The offset to the first byte into the buffer that is used */
|
|
95
|
+
size_t offset;
|
|
96
|
+
/* The offset into the buffer for the first free byte */
|
|
97
|
+
size_t nbytes;
|
|
98
|
+
/* The number of bytes in the buffer */
|
|
99
|
+
size_t size;
|
|
100
|
+
/* Pointer to the next buffer in the chain */
|
|
101
|
+
struct chunk_st *next;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
#define CHUNK_BUFFERSIZE 2048
|
|
105
|
+
|
|
106
|
+
typedef memcached_protocol_event_t (*process_data)(struct memcached_protocol_client_st *client, ssize_t *length, void **endptr);
|
|
107
|
+
|
|
108
|
+
enum ascii_cmd {
|
|
109
|
+
GET_CMD,
|
|
110
|
+
GETS_CMD,
|
|
111
|
+
SET_CMD,
|
|
112
|
+
ADD_CMD,
|
|
113
|
+
REPLACE_CMD,
|
|
114
|
+
CAS_CMD,
|
|
115
|
+
APPEND_CMD,
|
|
116
|
+
PREPEND_CMD,
|
|
117
|
+
DELETE_CMD,
|
|
118
|
+
INCR_CMD,
|
|
119
|
+
DECR_CMD,
|
|
120
|
+
STATS_CMD,
|
|
121
|
+
FLUSH_ALL_CMD,
|
|
122
|
+
VERSION_CMD,
|
|
123
|
+
QUIT_CMD,
|
|
124
|
+
VERBOSITY_CMD,
|
|
125
|
+
UNKNOWN_CMD
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
struct memcached_protocol_client_st {
|
|
129
|
+
memcached_protocol_st *root;
|
|
130
|
+
memcached_socket_t sock;
|
|
131
|
+
int error;
|
|
132
|
+
|
|
133
|
+
/* Linked list of data to send */
|
|
134
|
+
struct chunk_st *output;
|
|
135
|
+
struct chunk_st *output_tail;
|
|
136
|
+
|
|
137
|
+
/*
|
|
138
|
+
* While we process input data, this is where we spool incomplete commands
|
|
139
|
+
* if we need to receive more data....
|
|
140
|
+
* @todo use the buffercace
|
|
141
|
+
*/
|
|
142
|
+
uint8_t *input_buffer;
|
|
143
|
+
size_t input_buffer_size;
|
|
144
|
+
size_t input_buffer_offset;
|
|
145
|
+
|
|
146
|
+
/* The callback to the protocol handler to use (ascii or binary) */
|
|
147
|
+
process_data work;
|
|
148
|
+
|
|
149
|
+
/*
|
|
150
|
+
* Should the spool data discard the data to send or not? (aka noreply in
|
|
151
|
+
* the ascii protocol..
|
|
152
|
+
*/
|
|
153
|
+
bool mute;
|
|
154
|
+
|
|
155
|
+
/* Members used by the binary protocol */
|
|
156
|
+
protocol_binary_request_header *current_command;
|
|
157
|
+
|
|
158
|
+
/* Members used by the ascii protocol */
|
|
159
|
+
enum ascii_cmd ascii_command;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
#include "ascii_handler.h"
|
|
163
|
+
#include "binary_handler.h"
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# vim:ft=automake
|
|
2
|
+
# included from Top Level Makefile.am
|
|
3
|
+
# All paths should be given relative to the root
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
lib_LTLIBRARIES+= libmemcached/libmemcachedprotocol.la
|
|
7
|
+
libmemcached_libmemcachedprotocol_la_SOURCES= \
|
|
8
|
+
libmemcached/byteorder.cc \
|
|
9
|
+
libmemcached/protocol/ascii_handler.c \
|
|
10
|
+
libmemcached/protocol/binary_handler.c \
|
|
11
|
+
libmemcached/protocol/cache.c \
|
|
12
|
+
libmemcached/protocol/pedantic.c \
|
|
13
|
+
libmemcached/protocol/protocol_handler.c
|
|
14
|
+
|
|
15
|
+
libmemcached_libmemcachedprotocol_la_CFLAGS= \
|
|
16
|
+
${AM_CFLAGS} \
|
|
17
|
+
${NO_CONVERSION} \
|
|
18
|
+
${PTHREAD_CFLAGS} \
|
|
19
|
+
-DBUILDING_LIBMEMCACHED
|
|
20
|
+
|
|
21
|
+
libmemcached_libmemcachedprotocol_la_CXXFLAGS= \
|
|
22
|
+
${AM_CXXFLAGS} \
|
|
23
|
+
${PTHREAD_CFLAGS} \
|
|
24
|
+
-DBUILDING_LIBMEMCACHED
|
|
25
|
+
|
|
26
|
+
libmemcached_libmemcachedprotocol_la_LDFLAGS= ${AM_LDFLAGS} ${PTHREAD_LIBS} -version-info ${MEMCACHED_PROTOCAL_LIBRARY_VERSION}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 2; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
|
2
|
+
#include "libmemcached/protocol/common.h"
|
|
3
|
+
|
|
4
|
+
#include <sys/types.h>
|
|
5
|
+
#include <inttypes.h>
|
|
6
|
+
|
|
7
|
+
#define ensure(a) if (!(a)) { return false; }
|
|
8
|
+
|
|
9
|
+
bool memcached_binary_protocol_pedantic_check_request(const protocol_binary_request_header *request)
|
|
10
|
+
{
|
|
11
|
+
ensure(request->request.magic == PROTOCOL_BINARY_REQ);
|
|
12
|
+
ensure(request->request.datatype == PROTOCOL_BINARY_RAW_BYTES);
|
|
13
|
+
|
|
14
|
+
ensure(request->bytes[6] == 0);
|
|
15
|
+
ensure(request->bytes[7] == 0);
|
|
16
|
+
|
|
17
|
+
uint8_t opcode= request->request.opcode;
|
|
18
|
+
uint16_t keylen= ntohs(request->request.keylen);
|
|
19
|
+
uint8_t extlen= request->request.extlen;
|
|
20
|
+
uint32_t bodylen= ntohl(request->request.bodylen);
|
|
21
|
+
|
|
22
|
+
ensure(bodylen >= (keylen + extlen));
|
|
23
|
+
|
|
24
|
+
switch (opcode) {
|
|
25
|
+
case PROTOCOL_BINARY_CMD_GET:
|
|
26
|
+
case PROTOCOL_BINARY_CMD_GETK:
|
|
27
|
+
case PROTOCOL_BINARY_CMD_GETKQ:
|
|
28
|
+
case PROTOCOL_BINARY_CMD_GETQ:
|
|
29
|
+
ensure(extlen == 0);
|
|
30
|
+
ensure(keylen > 0);
|
|
31
|
+
ensure(keylen == bodylen);
|
|
32
|
+
ensure(request->request.cas == 0);
|
|
33
|
+
break;
|
|
34
|
+
|
|
35
|
+
case PROTOCOL_BINARY_CMD_ADD:
|
|
36
|
+
case PROTOCOL_BINARY_CMD_ADDQ:
|
|
37
|
+
/* it makes no sense to run add with a cas value */
|
|
38
|
+
ensure(request->request.cas == 0);
|
|
39
|
+
/* FALLTHROUGH */
|
|
40
|
+
case PROTOCOL_BINARY_CMD_SET:
|
|
41
|
+
case PROTOCOL_BINARY_CMD_SETQ:
|
|
42
|
+
case PROTOCOL_BINARY_CMD_REPLACE:
|
|
43
|
+
case PROTOCOL_BINARY_CMD_REPLACEQ:
|
|
44
|
+
ensure(keylen > 0);
|
|
45
|
+
ensure(extlen == 8);
|
|
46
|
+
break;
|
|
47
|
+
|
|
48
|
+
case PROTOCOL_BINARY_CMD_DELETE:
|
|
49
|
+
case PROTOCOL_BINARY_CMD_DELETEQ:
|
|
50
|
+
ensure(extlen == 0);
|
|
51
|
+
ensure(keylen > 0);
|
|
52
|
+
ensure(keylen == bodylen);
|
|
53
|
+
break;
|
|
54
|
+
|
|
55
|
+
case PROTOCOL_BINARY_CMD_INCREMENT:
|
|
56
|
+
case PROTOCOL_BINARY_CMD_INCREMENTQ:
|
|
57
|
+
case PROTOCOL_BINARY_CMD_DECREMENT:
|
|
58
|
+
case PROTOCOL_BINARY_CMD_DECREMENTQ:
|
|
59
|
+
ensure(extlen == 20);
|
|
60
|
+
ensure(keylen > 0);
|
|
61
|
+
ensure(keylen + extlen == bodylen);
|
|
62
|
+
break;
|
|
63
|
+
|
|
64
|
+
case PROTOCOL_BINARY_CMD_QUIT:
|
|
65
|
+
case PROTOCOL_BINARY_CMD_QUITQ:
|
|
66
|
+
case PROTOCOL_BINARY_CMD_NOOP:
|
|
67
|
+
case PROTOCOL_BINARY_CMD_VERSION:
|
|
68
|
+
ensure(extlen == 0);
|
|
69
|
+
ensure(keylen == 0);
|
|
70
|
+
ensure(bodylen == 0);
|
|
71
|
+
break;
|
|
72
|
+
|
|
73
|
+
case PROTOCOL_BINARY_CMD_FLUSH:
|
|
74
|
+
case PROTOCOL_BINARY_CMD_FLUSHQ:
|
|
75
|
+
ensure(extlen == 0 || extlen == 4);
|
|
76
|
+
ensure(keylen == 0);
|
|
77
|
+
ensure(bodylen == extlen);
|
|
78
|
+
break;
|
|
79
|
+
|
|
80
|
+
case PROTOCOL_BINARY_CMD_STAT:
|
|
81
|
+
ensure(extlen == 0);
|
|
82
|
+
/* May have key, but not value */
|
|
83
|
+
ensure(keylen == bodylen);
|
|
84
|
+
break;
|
|
85
|
+
|
|
86
|
+
case PROTOCOL_BINARY_CMD_APPEND:
|
|
87
|
+
case PROTOCOL_BINARY_CMD_APPENDQ:
|
|
88
|
+
case PROTOCOL_BINARY_CMD_PREPEND:
|
|
89
|
+
case PROTOCOL_BINARY_CMD_PREPENDQ:
|
|
90
|
+
ensure(extlen == 0);
|
|
91
|
+
ensure(keylen > 0);
|
|
92
|
+
break;
|
|
93
|
+
default:
|
|
94
|
+
/* Unknown command */
|
|
95
|
+
;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
bool memcached_binary_protocol_pedantic_check_response(const protocol_binary_request_header *request,
|
|
102
|
+
const protocol_binary_response_header *response)
|
|
103
|
+
{
|
|
104
|
+
ensure(response->response.magic == PROTOCOL_BINARY_RES);
|
|
105
|
+
ensure(response->response.datatype == PROTOCOL_BINARY_RAW_BYTES);
|
|
106
|
+
ensure(response->response.opaque == request->request.opaque);
|
|
107
|
+
|
|
108
|
+
uint16_t status= ntohs(response->response.status);
|
|
109
|
+
uint8_t opcode= response->response.opcode;
|
|
110
|
+
|
|
111
|
+
if (status == PROTOCOL_BINARY_RESPONSE_SUCCESS)
|
|
112
|
+
{
|
|
113
|
+
switch (opcode) {
|
|
114
|
+
case PROTOCOL_BINARY_CMD_ADDQ:
|
|
115
|
+
case PROTOCOL_BINARY_CMD_APPENDQ:
|
|
116
|
+
case PROTOCOL_BINARY_CMD_DECREMENTQ:
|
|
117
|
+
case PROTOCOL_BINARY_CMD_DELETEQ:
|
|
118
|
+
case PROTOCOL_BINARY_CMD_FLUSHQ:
|
|
119
|
+
case PROTOCOL_BINARY_CMD_INCREMENTQ:
|
|
120
|
+
case PROTOCOL_BINARY_CMD_PREPENDQ:
|
|
121
|
+
case PROTOCOL_BINARY_CMD_QUITQ:
|
|
122
|
+
case PROTOCOL_BINARY_CMD_REPLACEQ:
|
|
123
|
+
case PROTOCOL_BINARY_CMD_SETQ:
|
|
124
|
+
/* Quiet command shouldn't return on success */
|
|
125
|
+
return false;
|
|
126
|
+
default:
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
switch (opcode) {
|
|
131
|
+
case PROTOCOL_BINARY_CMD_ADD:
|
|
132
|
+
case PROTOCOL_BINARY_CMD_REPLACE:
|
|
133
|
+
case PROTOCOL_BINARY_CMD_SET:
|
|
134
|
+
case PROTOCOL_BINARY_CMD_APPEND:
|
|
135
|
+
case PROTOCOL_BINARY_CMD_PREPEND:
|
|
136
|
+
ensure(response->response.keylen == 0);
|
|
137
|
+
ensure(response->response.extlen == 0);
|
|
138
|
+
ensure(response->response.bodylen == 0);
|
|
139
|
+
ensure(response->response.cas != 0);
|
|
140
|
+
break;
|
|
141
|
+
case PROTOCOL_BINARY_CMD_FLUSH:
|
|
142
|
+
case PROTOCOL_BINARY_CMD_NOOP:
|
|
143
|
+
case PROTOCOL_BINARY_CMD_QUIT:
|
|
144
|
+
case PROTOCOL_BINARY_CMD_DELETE:
|
|
145
|
+
ensure(response->response.keylen == 0);
|
|
146
|
+
ensure(response->response.extlen == 0);
|
|
147
|
+
ensure(response->response.bodylen == 0);
|
|
148
|
+
ensure(response->response.cas == 0);
|
|
149
|
+
break;
|
|
150
|
+
|
|
151
|
+
case PROTOCOL_BINARY_CMD_DECREMENT:
|
|
152
|
+
case PROTOCOL_BINARY_CMD_INCREMENT:
|
|
153
|
+
ensure(response->response.keylen == 0);
|
|
154
|
+
ensure(response->response.extlen == 0);
|
|
155
|
+
ensure(ntohl(response->response.bodylen) == 8);
|
|
156
|
+
ensure(response->response.cas != 0);
|
|
157
|
+
break;
|
|
158
|
+
|
|
159
|
+
case PROTOCOL_BINARY_CMD_STAT:
|
|
160
|
+
ensure(response->response.extlen == 0);
|
|
161
|
+
/* key and value exists in all packets except in the terminating */
|
|
162
|
+
ensure(response->response.cas == 0);
|
|
163
|
+
break;
|
|
164
|
+
|
|
165
|
+
case PROTOCOL_BINARY_CMD_VERSION:
|
|
166
|
+
ensure(response->response.keylen == 0);
|
|
167
|
+
ensure(response->response.extlen == 0);
|
|
168
|
+
ensure(response->response.bodylen != 0);
|
|
169
|
+
ensure(response->response.cas == 0);
|
|
170
|
+
break;
|
|
171
|
+
|
|
172
|
+
case PROTOCOL_BINARY_CMD_GET:
|
|
173
|
+
case PROTOCOL_BINARY_CMD_GETQ:
|
|
174
|
+
ensure(response->response.keylen == 0);
|
|
175
|
+
ensure(response->response.extlen == 4);
|
|
176
|
+
ensure(response->response.cas != 0);
|
|
177
|
+
break;
|
|
178
|
+
|
|
179
|
+
case PROTOCOL_BINARY_CMD_GETK:
|
|
180
|
+
case PROTOCOL_BINARY_CMD_GETKQ:
|
|
181
|
+
ensure(response->response.keylen != 0);
|
|
182
|
+
ensure(response->response.extlen == 4);
|
|
183
|
+
ensure(response->response.cas != 0);
|
|
184
|
+
break;
|
|
185
|
+
|
|
186
|
+
default:
|
|
187
|
+
/* Undefined command code */
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
else
|
|
192
|
+
{
|
|
193
|
+
ensure(response->response.cas == 0);
|
|
194
|
+
ensure(response->response.extlen == 0);
|
|
195
|
+
if (opcode != PROTOCOL_BINARY_CMD_GETK)
|
|
196
|
+
{
|
|
197
|
+
ensure(response->response.keylen == 0);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 2; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
|
2
|
+
#include "libmemcached/protocol/common.h"
|
|
3
|
+
|
|
4
|
+
#include <stdlib.h>
|
|
5
|
+
#include <sys/types.h>
|
|
6
|
+
#include <errno.h>
|
|
7
|
+
#include <stdbool.h>
|
|
8
|
+
#include <string.h>
|
|
9
|
+
#include <strings.h>
|
|
10
|
+
#include <ctype.h>
|
|
11
|
+
#include <stdio.h>
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
** **********************************************************************
|
|
15
|
+
** INTERNAL INTERFACE
|
|
16
|
+
** **********************************************************************
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The default function to receive data from the client. This function
|
|
21
|
+
* just wraps the recv function to receive from a socket.
|
|
22
|
+
* See man -s3socket recv for more information.
|
|
23
|
+
*
|
|
24
|
+
* @param cookie cookie indentifying a client, not used
|
|
25
|
+
* @param sock socket to read from
|
|
26
|
+
* @param buf the destination buffer
|
|
27
|
+
* @param nbytes the number of bytes to read
|
|
28
|
+
* @return the number of bytes transferred of -1 upon error
|
|
29
|
+
*/
|
|
30
|
+
static ssize_t default_recv(const void *cookie,
|
|
31
|
+
memcached_socket_t sock,
|
|
32
|
+
void *buf,
|
|
33
|
+
size_t nbytes)
|
|
34
|
+
{
|
|
35
|
+
(void)cookie;
|
|
36
|
+
return recv(sock, buf, nbytes, 0);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The default function to send data to the server. This function
|
|
41
|
+
* just wraps the send function to send through a socket.
|
|
42
|
+
* See man -s3socket send for more information.
|
|
43
|
+
*
|
|
44
|
+
* @param cookie cookie indentifying a client, not used
|
|
45
|
+
* @param sock socket to send to
|
|
46
|
+
* @param buf the source buffer
|
|
47
|
+
* @param nbytes the number of bytes to send
|
|
48
|
+
* @return the number of bytes transferred of -1 upon error
|
|
49
|
+
*/
|
|
50
|
+
static ssize_t default_send(const void *cookie,
|
|
51
|
+
memcached_socket_t fd,
|
|
52
|
+
const void *buf,
|
|
53
|
+
size_t nbytes)
|
|
54
|
+
{
|
|
55
|
+
(void)cookie;
|
|
56
|
+
return send(fd, buf, nbytes, 0);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Try to drain the output buffers without blocking
|
|
61
|
+
*
|
|
62
|
+
* @param client the client to drain
|
|
63
|
+
* @return false if an error occured (connection should be shut down)
|
|
64
|
+
* true otherwise (please note that there may be more data to
|
|
65
|
+
* left in the buffer to send)
|
|
66
|
+
*/
|
|
67
|
+
static bool drain_output(struct memcached_protocol_client_st *client)
|
|
68
|
+
{
|
|
69
|
+
ssize_t len;
|
|
70
|
+
|
|
71
|
+
/* Do we have pending data to send? */
|
|
72
|
+
while (client->output != NULL)
|
|
73
|
+
{
|
|
74
|
+
len= client->root->send(client,
|
|
75
|
+
client->sock,
|
|
76
|
+
client->output->data + client->output->offset,
|
|
77
|
+
client->output->nbytes - client->output->offset);
|
|
78
|
+
|
|
79
|
+
if (len == -1)
|
|
80
|
+
{
|
|
81
|
+
if (get_socket_errno() == EWOULDBLOCK)
|
|
82
|
+
{
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
else if (get_socket_errno() != EINTR)
|
|
86
|
+
{
|
|
87
|
+
client->error= get_socket_errno();
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else
|
|
92
|
+
{
|
|
93
|
+
client->output->offset += (size_t)len;
|
|
94
|
+
if (client->output->offset == client->output->nbytes)
|
|
95
|
+
{
|
|
96
|
+
/* This was the complete buffer */
|
|
97
|
+
struct chunk_st *old= client->output;
|
|
98
|
+
client->output= client->output->next;
|
|
99
|
+
if (client->output == NULL)
|
|
100
|
+
{
|
|
101
|
+
client->output_tail= NULL;
|
|
102
|
+
}
|
|
103
|
+
cache_free(client->root->buffer_cache, old);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Allocate an output buffer and chain it into the output list
|
|
113
|
+
*
|
|
114
|
+
* @param client the client that needs the buffer
|
|
115
|
+
* @return pointer to the new chunk if the allocation succeeds, NULL otherwise
|
|
116
|
+
*/
|
|
117
|
+
static struct chunk_st *allocate_output_chunk(struct memcached_protocol_client_st *client)
|
|
118
|
+
{
|
|
119
|
+
struct chunk_st *ret= cache_alloc(client->root->buffer_cache);
|
|
120
|
+
|
|
121
|
+
if (ret == NULL)
|
|
122
|
+
{
|
|
123
|
+
return NULL;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
ret->offset= ret->nbytes= 0;
|
|
127
|
+
ret->next= NULL;
|
|
128
|
+
ret->size= CHUNK_BUFFERSIZE;
|
|
129
|
+
ret->data= (void*)(ret + 1);
|
|
130
|
+
if (client->output == NULL)
|
|
131
|
+
{
|
|
132
|
+
client->output= client->output_tail= ret;
|
|
133
|
+
}
|
|
134
|
+
else
|
|
135
|
+
{
|
|
136
|
+
client->output_tail->next= ret;
|
|
137
|
+
client->output_tail= ret;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return ret;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Spool data into the send-buffer for a client.
|
|
145
|
+
*
|
|
146
|
+
* @param client the client to spool the data for
|
|
147
|
+
* @param data the data to spool
|
|
148
|
+
* @param length the number of bytes of data to spool
|
|
149
|
+
* @return PROTOCOL_BINARY_RESPONSE_SUCCESS if success,
|
|
150
|
+
* PROTOCOL_BINARY_RESPONSE_ENOMEM if we failed to allocate memory
|
|
151
|
+
*/
|
|
152
|
+
static protocol_binary_response_status spool_output(struct memcached_protocol_client_st *client,
|
|
153
|
+
const void *data,
|
|
154
|
+
size_t length)
|
|
155
|
+
{
|
|
156
|
+
if (client->mute)
|
|
157
|
+
{
|
|
158
|
+
return PROTOCOL_BINARY_RESPONSE_SUCCESS;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
size_t offset= 0;
|
|
162
|
+
|
|
163
|
+
struct chunk_st *chunk= client->output;
|
|
164
|
+
while (offset < length)
|
|
165
|
+
{
|
|
166
|
+
if (chunk == NULL || (chunk->size - chunk->nbytes) == 0)
|
|
167
|
+
{
|
|
168
|
+
if ((chunk= allocate_output_chunk(client)) == NULL)
|
|
169
|
+
{
|
|
170
|
+
return PROTOCOL_BINARY_RESPONSE_ENOMEM;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
size_t bulk= length - offset;
|
|
175
|
+
if (bulk > chunk->size - chunk->nbytes)
|
|
176
|
+
{
|
|
177
|
+
bulk= chunk->size - chunk->nbytes;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
memcpy(chunk->data + chunk->nbytes, data, bulk);
|
|
181
|
+
chunk->nbytes += bulk;
|
|
182
|
+
offset += bulk;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return PROTOCOL_BINARY_RESPONSE_SUCCESS;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Try to determine the protocol used on this connection.
|
|
190
|
+
* If the first byte contains the magic byte PROTOCOL_BINARY_REQ we should
|
|
191
|
+
* be using the binary protocol on the connection. I implemented the support
|
|
192
|
+
* for the ASCII protocol by wrapping into the simple interface (aka v1),
|
|
193
|
+
* so the implementors needs to provide an implementation of that interface
|
|
194
|
+
*
|
|
195
|
+
*/
|
|
196
|
+
static memcached_protocol_event_t determine_protocol(struct memcached_protocol_client_st *client, ssize_t *length, void **endptr)
|
|
197
|
+
{
|
|
198
|
+
if (*client->root->input_buffer == (uint8_t)PROTOCOL_BINARY_REQ)
|
|
199
|
+
{
|
|
200
|
+
client->work= memcached_binary_protocol_process_data;
|
|
201
|
+
}
|
|
202
|
+
else if (client->root->callback->interface_version == 1)
|
|
203
|
+
{
|
|
204
|
+
/*
|
|
205
|
+
* The ASCII protocol can only be used if the implementors provide
|
|
206
|
+
* an implementation for the version 1 of the interface..
|
|
207
|
+
*
|
|
208
|
+
* @todo I should allow the implementors to provide an implementation
|
|
209
|
+
* for version 0 and 1 at the same time and set the preferred
|
|
210
|
+
* interface to use...
|
|
211
|
+
*/
|
|
212
|
+
client->work= memcached_ascii_protocol_process_data;
|
|
213
|
+
}
|
|
214
|
+
else
|
|
215
|
+
{
|
|
216
|
+
/* Let's just output a warning the way it is supposed to look like
|
|
217
|
+
* in the ASCII protocol...
|
|
218
|
+
*/
|
|
219
|
+
const char *err= "CLIENT_ERROR: Unsupported protocol\r\n";
|
|
220
|
+
client->root->spool(client, err, strlen(err));
|
|
221
|
+
client->root->drain(client);
|
|
222
|
+
return MEMCACHED_PROTOCOL_ERROR_EVENT; /* Unsupported protocol */
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return client->work(client, length, endptr);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/*
|
|
229
|
+
** **********************************************************************
|
|
230
|
+
** * PUBLIC INTERFACE
|
|
231
|
+
** * See protocol_handler.h for function description
|
|
232
|
+
** **********************************************************************
|
|
233
|
+
*/
|
|
234
|
+
struct memcached_protocol_st *memcached_protocol_create_instance(void)
|
|
235
|
+
{
|
|
236
|
+
struct memcached_protocol_st *ret= calloc(1, sizeof(*ret));
|
|
237
|
+
if (ret != NULL)
|
|
238
|
+
{
|
|
239
|
+
ret->recv= default_recv;
|
|
240
|
+
ret->send= default_send;
|
|
241
|
+
ret->drain= drain_output;
|
|
242
|
+
ret->spool= spool_output;
|
|
243
|
+
ret->input_buffer_size= 1 * 1024 * 1024;
|
|
244
|
+
ret->input_buffer= malloc(ret->input_buffer_size);
|
|
245
|
+
if (ret->input_buffer == NULL)
|
|
246
|
+
{
|
|
247
|
+
free(ret);
|
|
248
|
+
ret= NULL;
|
|
249
|
+
return NULL;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
ret->buffer_cache= cache_create("protocol_handler",
|
|
253
|
+
CHUNK_BUFFERSIZE + sizeof(struct chunk_st),
|
|
254
|
+
0, NULL, NULL);
|
|
255
|
+
if (ret->buffer_cache == NULL)
|
|
256
|
+
{
|
|
257
|
+
free(ret->input_buffer);
|
|
258
|
+
free(ret);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return ret;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
void memcached_protocol_destroy_instance(struct memcached_protocol_st *instance)
|
|
266
|
+
{
|
|
267
|
+
cache_destroy(instance->buffer_cache);
|
|
268
|
+
free(instance->input_buffer);
|
|
269
|
+
free(instance);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
struct memcached_protocol_client_st *memcached_protocol_create_client(struct memcached_protocol_st *instance, memcached_socket_t sock)
|
|
273
|
+
{
|
|
274
|
+
struct memcached_protocol_client_st *ret= calloc(1, sizeof(*ret));
|
|
275
|
+
if (ret != NULL)
|
|
276
|
+
{
|
|
277
|
+
ret->root= instance;
|
|
278
|
+
ret->sock= sock;
|
|
279
|
+
ret->work= determine_protocol;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
return ret;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
void memcached_protocol_client_destroy(struct memcached_protocol_client_st *client)
|
|
286
|
+
{
|
|
287
|
+
free(client);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
memcached_protocol_event_t memcached_protocol_client_work(struct memcached_protocol_client_st *client)
|
|
291
|
+
{
|
|
292
|
+
/* Try to send data and read from the socket */
|
|
293
|
+
bool more_data= true;
|
|
294
|
+
do
|
|
295
|
+
{
|
|
296
|
+
ssize_t len= client->root->recv(client,
|
|
297
|
+
client->sock,
|
|
298
|
+
client->root->input_buffer + client->input_buffer_offset,
|
|
299
|
+
client->root->input_buffer_size - client->input_buffer_offset);
|
|
300
|
+
|
|
301
|
+
if (len > 0)
|
|
302
|
+
{
|
|
303
|
+
/* Do we have the complete packet? */
|
|
304
|
+
if (client->input_buffer_offset > 0)
|
|
305
|
+
{
|
|
306
|
+
memcpy(client->root->input_buffer, client->input_buffer,
|
|
307
|
+
client->input_buffer_offset);
|
|
308
|
+
len += (ssize_t)client->input_buffer_offset;
|
|
309
|
+
|
|
310
|
+
/* @todo use buffer-cache! */
|
|
311
|
+
free(client->input_buffer);
|
|
312
|
+
client->input_buffer_offset= 0;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
void *endptr;
|
|
316
|
+
memcached_protocol_event_t events= client->work(client, &len, &endptr);
|
|
317
|
+
if (events == MEMCACHED_PROTOCOL_ERROR_EVENT)
|
|
318
|
+
{
|
|
319
|
+
return MEMCACHED_PROTOCOL_ERROR_EVENT;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
if (len > 0)
|
|
323
|
+
{
|
|
324
|
+
/* save the data for later on */
|
|
325
|
+
/* @todo use buffer-cache */
|
|
326
|
+
client->input_buffer= malloc((size_t)len);
|
|
327
|
+
if (client->input_buffer == NULL)
|
|
328
|
+
{
|
|
329
|
+
client->error= ENOMEM;
|
|
330
|
+
return MEMCACHED_PROTOCOL_ERROR_EVENT;
|
|
331
|
+
}
|
|
332
|
+
memcpy(client->input_buffer, endptr, (size_t)len);
|
|
333
|
+
client->input_buffer_offset= (size_t)len;
|
|
334
|
+
more_data= false;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
else if (len == 0)
|
|
338
|
+
{
|
|
339
|
+
/* Connection closed */
|
|
340
|
+
drain_output(client);
|
|
341
|
+
return MEMCACHED_PROTOCOL_ERROR_EVENT;
|
|
342
|
+
}
|
|
343
|
+
else
|
|
344
|
+
{
|
|
345
|
+
if (get_socket_errno() != EWOULDBLOCK)
|
|
346
|
+
{
|
|
347
|
+
client->error= get_socket_errno();
|
|
348
|
+
/* mark this client as terminated! */
|
|
349
|
+
return MEMCACHED_PROTOCOL_ERROR_EVENT;
|
|
350
|
+
}
|
|
351
|
+
more_data= false;
|
|
352
|
+
}
|
|
353
|
+
} while (more_data);
|
|
354
|
+
|
|
355
|
+
if (!drain_output(client))
|
|
356
|
+
{
|
|
357
|
+
return MEMCACHED_PROTOCOL_ERROR_EVENT;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
memcached_protocol_event_t ret= MEMCACHED_PROTOCOL_READ_EVENT;
|
|
361
|
+
if (client->output)
|
|
362
|
+
ret|= MEMCACHED_PROTOCOL_READ_EVENT;
|
|
363
|
+
|
|
364
|
+
return ret;
|
|
365
|
+
}
|