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,60 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* 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
|
+
#include <cstdlib>
|
|
41
|
+
#include <arpa/inet.h>
|
|
42
|
+
|
|
43
|
+
struct server_t
|
|
44
|
+
{
|
|
45
|
+
in_port_t port;
|
|
46
|
+
uint32_t weight;
|
|
47
|
+
const char *c_str;
|
|
48
|
+
size_t size;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
#if 0
|
|
52
|
+
#include <iostream>
|
|
53
|
+
inline std::ostream& operator<<(std::ostream& output, const server_t& arg)
|
|
54
|
+
{
|
|
55
|
+
output.write(arg.c_str, arg.size);
|
|
56
|
+
output << ':' << arg.port;
|
|
57
|
+
output << '+' << arg.weight;
|
|
58
|
+
return output;
|
|
59
|
+
}
|
|
60
|
+
#endif
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* 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
|
+
#include <libmemcached/basic_string.h>
|
|
41
|
+
#include <libmemcached/constants.h>
|
|
42
|
+
#include <libmemcached/options/server.h>
|
|
43
|
+
|
|
44
|
+
union YYSTYPE
|
|
45
|
+
{
|
|
46
|
+
long long number;
|
|
47
|
+
memcached_string_t string;
|
|
48
|
+
memcached_string_t option;
|
|
49
|
+
double double_number;
|
|
50
|
+
memcached_server_distribution_t distribution;
|
|
51
|
+
memcached_hash_t hash;
|
|
52
|
+
memcached_behavior_t behavior;
|
|
53
|
+
bool boolean;
|
|
54
|
+
server_t server;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
typedef union YYSTYPE YYSTYPE;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* Copyright (C) 2006-2009 Brian Aker All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
|
9
|
+
* modification, are permitted provided that the following conditions are
|
|
10
|
+
* met:
|
|
11
|
+
*
|
|
12
|
+
* * Redistributions of source code must retain the above copyright
|
|
13
|
+
* notice, this list of conditions and the following disclaimer.
|
|
14
|
+
*
|
|
15
|
+
* * Redistributions in binary form must reproduce the above
|
|
16
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
17
|
+
* in the documentation and/or other materials provided with the
|
|
18
|
+
* distribution.
|
|
19
|
+
*
|
|
20
|
+
* * The names of its contributors may not be used to endorse or
|
|
21
|
+
* promote products derived from this software without specific prior
|
|
22
|
+
* written permission.
|
|
23
|
+
*
|
|
24
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
25
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
27
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
28
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
29
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
30
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
31
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
32
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
33
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
34
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/*
|
|
39
|
+
I debated about putting this in the client library since it does an
|
|
40
|
+
action I don't really believe belongs in the library.
|
|
41
|
+
|
|
42
|
+
Frankly its too damn useful not to be here though.
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
#include <libmemcached/common.h>
|
|
46
|
+
|
|
47
|
+
memcached_server_list_st memcached_servers_parse(const char *server_strings)
|
|
48
|
+
{
|
|
49
|
+
char *string;
|
|
50
|
+
const char *begin_ptr;
|
|
51
|
+
const char *end_ptr;
|
|
52
|
+
memcached_server_st *servers= NULL;
|
|
53
|
+
memcached_return_t rc;
|
|
54
|
+
|
|
55
|
+
WATCHPOINT_ASSERT(server_strings);
|
|
56
|
+
|
|
57
|
+
end_ptr= server_strings + strlen(server_strings);
|
|
58
|
+
|
|
59
|
+
for (begin_ptr= server_strings, string= (char *)index(server_strings, ',');
|
|
60
|
+
begin_ptr != end_ptr;
|
|
61
|
+
string= (char *)index(begin_ptr, ','))
|
|
62
|
+
{
|
|
63
|
+
char buffer[HUGE_STRING_LEN];
|
|
64
|
+
char *ptr, *ptr2;
|
|
65
|
+
uint32_t weight= 0;
|
|
66
|
+
|
|
67
|
+
if (string)
|
|
68
|
+
{
|
|
69
|
+
memcpy(buffer, begin_ptr, (size_t) (string - begin_ptr));
|
|
70
|
+
buffer[(unsigned int)(string - begin_ptr)]= 0;
|
|
71
|
+
begin_ptr= string+1;
|
|
72
|
+
}
|
|
73
|
+
else
|
|
74
|
+
{
|
|
75
|
+
size_t length= strlen(begin_ptr);
|
|
76
|
+
memcpy(buffer, begin_ptr, length);
|
|
77
|
+
buffer[length]= 0;
|
|
78
|
+
begin_ptr= end_ptr;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
ptr= index(buffer, ':');
|
|
82
|
+
|
|
83
|
+
in_port_t port= 0;
|
|
84
|
+
if (ptr)
|
|
85
|
+
{
|
|
86
|
+
ptr[0]= 0;
|
|
87
|
+
|
|
88
|
+
ptr++;
|
|
89
|
+
|
|
90
|
+
port= (in_port_t) strtoul(ptr, (char **)NULL, 10);
|
|
91
|
+
|
|
92
|
+
ptr2= index(ptr, ' ');
|
|
93
|
+
if (! ptr2)
|
|
94
|
+
ptr2= index(ptr, ':');
|
|
95
|
+
|
|
96
|
+
if (ptr2)
|
|
97
|
+
{
|
|
98
|
+
ptr2++;
|
|
99
|
+
weight = (uint32_t) strtoul(ptr2, (char **)NULL, 10);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
servers= memcached_server_list_append_with_weight(servers, buffer, port, weight, &rc);
|
|
104
|
+
|
|
105
|
+
if (isspace(*begin_ptr))
|
|
106
|
+
begin_ptr++;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return servers;
|
|
110
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* LibMemcached
|
|
2
|
+
* Copyright (C) 2010 Brian Aker
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use and distribution licensed under the BSD license. See
|
|
6
|
+
* the COPYING file in the parent directory for full text.
|
|
7
|
+
*
|
|
8
|
+
* Summary: Work with fetching results
|
|
9
|
+
*
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
#pragma once
|
|
13
|
+
|
|
14
|
+
#ifdef __cplusplus
|
|
15
|
+
extern "C" {
|
|
16
|
+
#endif
|
|
17
|
+
|
|
18
|
+
LIBMEMCACHED_API
|
|
19
|
+
memcached_server_list_st memcached_servers_parse(const char *server_strings);
|
|
20
|
+
|
|
21
|
+
#ifdef __cplusplus
|
|
22
|
+
}
|
|
23
|
+
#endif
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* Copyright (C) 2006-2009 Brian Aker, Trond Norbye All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
|
9
|
+
* modification, are permitted provided that the following conditions are
|
|
10
|
+
* met:
|
|
11
|
+
*
|
|
12
|
+
* * Redistributions of source code must retain the above copyright
|
|
13
|
+
* notice, this list of conditions and the following disclaimer.
|
|
14
|
+
*
|
|
15
|
+
* * Redistributions in binary form must reproduce the above
|
|
16
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
17
|
+
* in the documentation and/or other materials provided with the
|
|
18
|
+
* distribution.
|
|
19
|
+
*
|
|
20
|
+
* * The names of its contributors may not be used to endorse or
|
|
21
|
+
* promote products derived from this software without specific prior
|
|
22
|
+
* written permission.
|
|
23
|
+
*
|
|
24
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
25
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
27
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
28
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
29
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
30
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
31
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
32
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
33
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
34
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
#pragma once
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
#ifdef WIN32
|
|
42
|
+
|
|
43
|
+
#include <winsock2.h>
|
|
44
|
+
#include <ws2tcpip.h>
|
|
45
|
+
typedef short in_port_t;
|
|
46
|
+
typedef SOCKET memcached_socket_t;
|
|
47
|
+
#else
|
|
48
|
+
typedef int memcached_socket_t;
|
|
49
|
+
#include <sys/socket.h>
|
|
50
|
+
#include <netinet/in.h>
|
|
51
|
+
#include <arpa/inet.h>
|
|
52
|
+
#include <netdb.h>
|
|
53
|
+
#include <sys/un.h>
|
|
54
|
+
#include <netinet/tcp.h>
|
|
55
|
+
|
|
56
|
+
#endif /* WIN32 */
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* 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_set_prefix_key(memcached_st *self, const char *key, size_t key_length)
|
|
41
|
+
{
|
|
42
|
+
WATCHPOINT_ASSERT(self);
|
|
43
|
+
|
|
44
|
+
if (key and key_length)
|
|
45
|
+
{
|
|
46
|
+
if (memcached_key_test((const char **)&key, &key_length, 1) == MEMCACHED_BAD_KEY_PROVIDED)
|
|
47
|
+
return memcached_set_error(*self, MEMCACHED_BAD_KEY_PROVIDED, MEMCACHED_AT);
|
|
48
|
+
|
|
49
|
+
if ((key_length > MEMCACHED_PREFIX_KEY_MAX_SIZE -1))
|
|
50
|
+
return memcached_set_error(*self, MEMCACHED_KEY_TOO_BIG, MEMCACHED_AT);
|
|
51
|
+
|
|
52
|
+
memcached_array_free(self->prefix_key);
|
|
53
|
+
self->prefix_key= memcached_strcpy(self, key, key_length);
|
|
54
|
+
|
|
55
|
+
if (not self->prefix_key)
|
|
56
|
+
return memcached_set_error(*self, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT);
|
|
57
|
+
}
|
|
58
|
+
else
|
|
59
|
+
{
|
|
60
|
+
memcached_array_free(self->prefix_key);
|
|
61
|
+
self->prefix_key= NULL;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return MEMCACHED_SUCCESS;
|
|
65
|
+
}
|
|
@@ -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
|
+
* 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_LOCAL
|
|
45
|
+
memcached_return_t memcached_set_prefix_key(memcached_st *self, const char *str, size_t length);
|
|
46
|
+
|
|
47
|
+
#ifdef __cplusplus
|
|
48
|
+
}
|
|
49
|
+
#endif
|
|
@@ -0,0 +1,963 @@
|
|
|
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 "config.h"
|
|
38
|
+
|
|
39
|
+
#include <libmemcached/protocol/common.h>
|
|
40
|
+
#include <libmemcached/byteorder.h>
|
|
41
|
+
|
|
42
|
+
#include <ctype.h>
|
|
43
|
+
#include <stdio.h>
|
|
44
|
+
#include <stdlib.h>
|
|
45
|
+
#include <string.h>
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Try to parse a key from the string.
|
|
49
|
+
* @pointer start pointer to a pointer to the string (IN and OUT)
|
|
50
|
+
* @return length of the string of -1 if this was an illegal key (invalid
|
|
51
|
+
* characters or invalid length)
|
|
52
|
+
* @todo add length!
|
|
53
|
+
*/
|
|
54
|
+
static uint16_t parse_ascii_key(char **start)
|
|
55
|
+
{
|
|
56
|
+
uint16_t len= 0;
|
|
57
|
+
char *c= *start;
|
|
58
|
+
/* Strip leading whitespaces */
|
|
59
|
+
while (isspace(*c))
|
|
60
|
+
{
|
|
61
|
+
++c;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
*start= c;
|
|
65
|
+
|
|
66
|
+
while (*c != '\0' && !isspace(*c) && !iscntrl(*c))
|
|
67
|
+
{
|
|
68
|
+
++c;
|
|
69
|
+
++len;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
if (len == 0 || len > 240 || (*c != '\0' && *c != '\r' && iscntrl(*c)))
|
|
74
|
+
{
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return len;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Spool a zero-terminated string
|
|
83
|
+
* @param client destination
|
|
84
|
+
* @param text the text to spool
|
|
85
|
+
* @return status of the spool operation
|
|
86
|
+
*/
|
|
87
|
+
static protocol_binary_response_status
|
|
88
|
+
spool_string(memcached_protocol_client_st *client, const char *text)
|
|
89
|
+
{
|
|
90
|
+
return client->root->spool(client, text, strlen(text));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Send a "CLIENT_ERROR" message back to the client with the correct
|
|
95
|
+
* format of the command being sent
|
|
96
|
+
* @param client the client to send the message to
|
|
97
|
+
*/
|
|
98
|
+
static void send_command_usage(memcached_protocol_client_st *client)
|
|
99
|
+
{
|
|
100
|
+
const char *errmsg[]= {
|
|
101
|
+
[GET_CMD]= "CLIENT_ERROR: Syntax error: get <key>*\r\n",
|
|
102
|
+
[GETS_CMD]= "CLIENT_ERROR: Syntax error: gets <key>*\r\n",
|
|
103
|
+
[SET_CMD]= "CLIENT_ERROR: Syntax error: set <key> <flags> <exptime> <bytes> [noreply]\r\n",
|
|
104
|
+
[ADD_CMD]= "CLIENT_ERROR: Syntax error: add <key> <flags> <exptime> <bytes> [noreply]\r\n",
|
|
105
|
+
[REPLACE_CMD]= "CLIENT_ERROR: Syntax error: replace <key> <flags> <exptime> <bytes> [noreply]\r\n",
|
|
106
|
+
[CAS_CMD]= "CLIENT_ERROR: Syntax error: cas <key> <flags> <exptime> <bytes> <casid> [noreply]\r\n",
|
|
107
|
+
[APPEND_CMD]= "CLIENT_ERROR: Syntax error: append <key> <flags> <exptime> <bytes> [noreply]\r\n",
|
|
108
|
+
[PREPEND_CMD]= "CLIENT_ERROR: Syntax error: prepend <key> <flags> <exptime> <bytes> [noreply]\r\n",
|
|
109
|
+
[DELETE_CMD]= "CLIENT_ERROR: Syntax error: delete <key> [noreply]\r\n",
|
|
110
|
+
[INCR_CMD]= "CLIENT_ERROR: Syntax error: incr <key> <value> [noreply]\r\n",
|
|
111
|
+
[DECR_CMD]= "CLIENT_ERROR: Syntax error: decr <key> <value> [noreply]\r\n",
|
|
112
|
+
[STATS_CMD]= "CLIENT_ERROR: Syntax error: stats [key]\r\n",
|
|
113
|
+
[FLUSH_ALL_CMD]= "CLIENT_ERROR: Syntax error: flush_all [timeout] [noreply]\r\n",
|
|
114
|
+
[VERSION_CMD]= "CLIENT_ERROR: Syntax error: version\r\n",
|
|
115
|
+
[QUIT_CMD]="CLIENT_ERROR: Syntax error: quit\r\n",
|
|
116
|
+
|
|
117
|
+
[VERBOSITY_CMD]= "CLIENT_ERROR: Syntax error: verbosity <num>\r\n",
|
|
118
|
+
[UNKNOWN_CMD]= "CLIENT_ERROR: Unknown command\r\n",
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
client->mute = false;
|
|
122
|
+
spool_string(client, errmsg[client->ascii_command]);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Callback for the VERSION responses
|
|
127
|
+
* @param cookie client identifier
|
|
128
|
+
* @param text the length of the body
|
|
129
|
+
* @param textlen the length of the body
|
|
130
|
+
*/
|
|
131
|
+
static protocol_binary_response_status
|
|
132
|
+
ascii_version_response_handler(const void *cookie,
|
|
133
|
+
const void *text,
|
|
134
|
+
uint32_t textlen)
|
|
135
|
+
{
|
|
136
|
+
memcached_protocol_client_st *client= (memcached_protocol_client_st*)cookie;
|
|
137
|
+
spool_string(client, "VERSION ");
|
|
138
|
+
client->root->spool(client, text, textlen);
|
|
139
|
+
spool_string(client, "\r\n");
|
|
140
|
+
return PROTOCOL_BINARY_RESPONSE_SUCCESS;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Callback for the GET/GETQ/GETK and GETKQ responses
|
|
145
|
+
* @param cookie client identifier
|
|
146
|
+
* @param key the key for the item
|
|
147
|
+
* @param keylen the length of the key
|
|
148
|
+
* @param body the length of the body
|
|
149
|
+
* @param bodylen the length of the body
|
|
150
|
+
* @param flags the flags for the item
|
|
151
|
+
* @param cas the CAS id for the item
|
|
152
|
+
*/
|
|
153
|
+
static protocol_binary_response_status
|
|
154
|
+
ascii_get_response_handler(const void *cookie,
|
|
155
|
+
const void *key,
|
|
156
|
+
uint16_t keylen,
|
|
157
|
+
const void *body,
|
|
158
|
+
uint32_t bodylen,
|
|
159
|
+
uint32_t flags,
|
|
160
|
+
uint64_t cas)
|
|
161
|
+
{
|
|
162
|
+
memcached_protocol_client_st *client= (void*)cookie;
|
|
163
|
+
char buffer[300];
|
|
164
|
+
strcpy(buffer, "VALUE ");
|
|
165
|
+
const char *source= key;
|
|
166
|
+
char *dest= buffer + 6;
|
|
167
|
+
|
|
168
|
+
for (int x= 0; x < keylen; ++x)
|
|
169
|
+
{
|
|
170
|
+
if (*source != '\0' && !isspace(*source) && !iscntrl(*source))
|
|
171
|
+
{
|
|
172
|
+
*dest= *source;
|
|
173
|
+
}
|
|
174
|
+
else
|
|
175
|
+
{
|
|
176
|
+
return PROTOCOL_BINARY_RESPONSE_EINVAL; /* key constraints in ascii */
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
++dest;
|
|
180
|
+
++source;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
size_t used= (size_t)(dest - buffer);
|
|
184
|
+
|
|
185
|
+
if (client->ascii_command == GETS_CMD)
|
|
186
|
+
{
|
|
187
|
+
snprintf(dest, sizeof(buffer) - used, " %u %u %" PRIu64 "\r\n", flags,
|
|
188
|
+
bodylen, cas);
|
|
189
|
+
}
|
|
190
|
+
else
|
|
191
|
+
{
|
|
192
|
+
snprintf(dest, sizeof(buffer) - used, " %u %u\r\n", flags, bodylen);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
client->root->spool(client, buffer, strlen(buffer));
|
|
196
|
+
client->root->spool(client, body, bodylen);
|
|
197
|
+
client->root->spool(client, "\r\n", 2);
|
|
198
|
+
|
|
199
|
+
return PROTOCOL_BINARY_RESPONSE_SUCCESS;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Callback for the STAT responses
|
|
204
|
+
* @param cookie client identifier
|
|
205
|
+
* @param key the key for the item
|
|
206
|
+
* @param keylen the length of the key
|
|
207
|
+
* @param body the length of the body
|
|
208
|
+
* @param bodylen the length of the body
|
|
209
|
+
*/
|
|
210
|
+
static protocol_binary_response_status
|
|
211
|
+
ascii_stat_response_handler(const void *cookie,
|
|
212
|
+
const void *key,
|
|
213
|
+
uint16_t keylen,
|
|
214
|
+
const void *body,
|
|
215
|
+
uint32_t bodylen)
|
|
216
|
+
{
|
|
217
|
+
|
|
218
|
+
memcached_protocol_client_st *client= (void*)cookie;
|
|
219
|
+
|
|
220
|
+
if (key != NULL)
|
|
221
|
+
{
|
|
222
|
+
spool_string(client, "STAT ");
|
|
223
|
+
client->root->spool(client, key, keylen);
|
|
224
|
+
spool_string(client, " ");
|
|
225
|
+
client->root->spool(client, body, bodylen);
|
|
226
|
+
spool_string(client, "\r\n");
|
|
227
|
+
}
|
|
228
|
+
else
|
|
229
|
+
{
|
|
230
|
+
spool_string(client, "END\r\n");
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return PROTOCOL_BINARY_RESPONSE_SUCCESS;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Process a get or a gets request.
|
|
238
|
+
* @param client the client handle
|
|
239
|
+
* @param buffer the complete get(s) command
|
|
240
|
+
* @param end the last character in the command
|
|
241
|
+
*/
|
|
242
|
+
static void ascii_process_gets(memcached_protocol_client_st *client,
|
|
243
|
+
char *buffer, char *end)
|
|
244
|
+
{
|
|
245
|
+
char *key= buffer;
|
|
246
|
+
|
|
247
|
+
/* Skip command */
|
|
248
|
+
key += (client->ascii_command == GETS_CMD) ? 5 : 4;
|
|
249
|
+
|
|
250
|
+
int num_keys= 0;
|
|
251
|
+
while (key < end)
|
|
252
|
+
{
|
|
253
|
+
uint16_t nkey= parse_ascii_key(&key);
|
|
254
|
+
if (nkey == 0) /* Invalid key... stop processing this line */
|
|
255
|
+
{
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
(void)client->root->callback->interface.v1.get(client, key, nkey,
|
|
260
|
+
ascii_get_response_handler);
|
|
261
|
+
key += nkey;
|
|
262
|
+
++num_keys;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (num_keys == 0)
|
|
266
|
+
{
|
|
267
|
+
send_command_usage(client);
|
|
268
|
+
}
|
|
269
|
+
else
|
|
270
|
+
client->root->spool(client, "END\r\n", 5);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Try to split up the command line "asdf asdf asdf asdf\n" into an
|
|
275
|
+
* argument vector for easier parsing.
|
|
276
|
+
* @param start the first character in the command line
|
|
277
|
+
* @param end the last character in the command line ("\n")
|
|
278
|
+
* @param vec the vector to insert the pointers into
|
|
279
|
+
* @size the number of elements in the vector
|
|
280
|
+
* @return the number of tokens in the vector
|
|
281
|
+
*/
|
|
282
|
+
static int ascii_tokenize_command(char *str, char *end, char **vec, int size)
|
|
283
|
+
{
|
|
284
|
+
int elem= 0;
|
|
285
|
+
|
|
286
|
+
while (str < end)
|
|
287
|
+
{
|
|
288
|
+
/* Skip leading blanks */
|
|
289
|
+
while (str < end && isspace(*str))
|
|
290
|
+
{
|
|
291
|
+
++str;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (str == end)
|
|
295
|
+
{
|
|
296
|
+
return elem;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
vec[elem++]= str;
|
|
300
|
+
/* find the next non-blank field */
|
|
301
|
+
while (str < end && !isspace(*str))
|
|
302
|
+
{
|
|
303
|
+
++str;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/* zero-terminate it for easier parsing later on */
|
|
307
|
+
*str= '\0';
|
|
308
|
+
++str;
|
|
309
|
+
|
|
310
|
+
/* Is the vector full? */
|
|
311
|
+
if (elem == size)
|
|
312
|
+
{
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return elem;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* If we for some reasons needs to push the line back to read more
|
|
322
|
+
* data we have to reverse the tokenization. Just do the brain-dead replace
|
|
323
|
+
* of all '\0' to ' ' and set the last character to '\n'. We could have used
|
|
324
|
+
* the vector we created, but then we would have to search for all of the
|
|
325
|
+
* spaces we ignored...
|
|
326
|
+
* @param start pointer to the first character in the buffer to recover
|
|
327
|
+
* @param end pointer to the last character in the buffer to recover
|
|
328
|
+
*/
|
|
329
|
+
static void recover_tokenize_command(char *start, char *end)
|
|
330
|
+
{
|
|
331
|
+
while (start < end)
|
|
332
|
+
{
|
|
333
|
+
if (*start == '\0')
|
|
334
|
+
*start= ' ';
|
|
335
|
+
++start;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
*end= '\n';
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Convert the textual command into a comcode
|
|
343
|
+
*/
|
|
344
|
+
static enum ascii_cmd ascii_to_cmd(char *start, size_t length)
|
|
345
|
+
{
|
|
346
|
+
struct {
|
|
347
|
+
const char *cmd;
|
|
348
|
+
size_t len;
|
|
349
|
+
enum ascii_cmd cc;
|
|
350
|
+
} commands[]= {
|
|
351
|
+
{ .cmd= "get", .len= 3, .cc= GET_CMD },
|
|
352
|
+
{ .cmd= "gets", .len= 4, .cc= GETS_CMD },
|
|
353
|
+
{ .cmd= "set", .len= 3, .cc= SET_CMD },
|
|
354
|
+
{ .cmd= "add", .len= 3, .cc= ADD_CMD },
|
|
355
|
+
{ .cmd= "replace", .len= 7, .cc= REPLACE_CMD },
|
|
356
|
+
{ .cmd= "cas", .len= 3, .cc= CAS_CMD },
|
|
357
|
+
{ .cmd= "append", .len= 6, .cc= APPEND_CMD },
|
|
358
|
+
{ .cmd= "prepend", .len= 7, .cc= PREPEND_CMD },
|
|
359
|
+
{ .cmd= "delete", .len= 6, .cc= DELETE_CMD },
|
|
360
|
+
{ .cmd= "incr", .len= 4, .cc= INCR_CMD },
|
|
361
|
+
{ .cmd= "decr", .len= 4, .cc= DECR_CMD },
|
|
362
|
+
{ .cmd= "stats", .len= 5, .cc= STATS_CMD },
|
|
363
|
+
{ .cmd= "flush_all", .len= 9, .cc= FLUSH_ALL_CMD },
|
|
364
|
+
{ .cmd= "version", .len= 7, .cc= VERSION_CMD },
|
|
365
|
+
{ .cmd= "quit", .len= 4, .cc= QUIT_CMD },
|
|
366
|
+
{ .cmd= "verbosity", .len= 9, .cc= VERBOSITY_CMD },
|
|
367
|
+
{ .cmd= NULL, .len= 0, .cc= UNKNOWN_CMD }};
|
|
368
|
+
|
|
369
|
+
int x= 0;
|
|
370
|
+
while (commands[x].len > 0) {
|
|
371
|
+
if (length >= commands[x].len)
|
|
372
|
+
{
|
|
373
|
+
if (strncmp(start, commands[x].cmd, commands[x].len) == 0)
|
|
374
|
+
{
|
|
375
|
+
/* Potential hit */
|
|
376
|
+
if (length == commands[x].len || isspace(*(start + commands[x].len)))
|
|
377
|
+
{
|
|
378
|
+
return commands[x].cc;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
++x;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
return UNKNOWN_CMD;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Perform a delete operation.
|
|
390
|
+
*
|
|
391
|
+
* @param client client requesting the deletion
|
|
392
|
+
* @param tokens the command as a vector
|
|
393
|
+
* @param ntokens the number of items in the vector
|
|
394
|
+
*/
|
|
395
|
+
static void process_delete(memcached_protocol_client_st *client,
|
|
396
|
+
char **tokens, int ntokens)
|
|
397
|
+
{
|
|
398
|
+
char *key= tokens[1];
|
|
399
|
+
uint16_t nkey;
|
|
400
|
+
|
|
401
|
+
if (ntokens != 2 || (nkey= parse_ascii_key(&key)) == 0)
|
|
402
|
+
{
|
|
403
|
+
send_command_usage(client);
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
if (client->root->callback->interface.v1.delete == NULL)
|
|
408
|
+
{
|
|
409
|
+
spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
protocol_binary_response_status rval;
|
|
414
|
+
rval= client->root->callback->interface.v1.delete(client, key, nkey, 0);
|
|
415
|
+
|
|
416
|
+
if (rval == PROTOCOL_BINARY_RESPONSE_SUCCESS)
|
|
417
|
+
{
|
|
418
|
+
spool_string(client, "DELETED\r\n");
|
|
419
|
+
}
|
|
420
|
+
else if (rval == PROTOCOL_BINARY_RESPONSE_KEY_ENOENT)
|
|
421
|
+
{
|
|
422
|
+
spool_string(client, "NOT_FOUND\r\n");
|
|
423
|
+
}
|
|
424
|
+
else
|
|
425
|
+
{
|
|
426
|
+
char msg[80];
|
|
427
|
+
snprintf(msg, sizeof(msg), "SERVER_ERROR: delete failed %u\r\n",(uint32_t)rval);
|
|
428
|
+
spool_string(client, msg);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
static void process_arithmetic(memcached_protocol_client_st *client,
|
|
433
|
+
char **tokens, int ntokens)
|
|
434
|
+
{
|
|
435
|
+
char *key= tokens[1];
|
|
436
|
+
uint16_t nkey;
|
|
437
|
+
|
|
438
|
+
if (ntokens != 3 || (nkey= parse_ascii_key(&key)) == 0)
|
|
439
|
+
{
|
|
440
|
+
send_command_usage(client);
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
uint64_t cas;
|
|
445
|
+
uint64_t result;
|
|
446
|
+
uint64_t delta= strtoull(tokens[2], NULL, 10);
|
|
447
|
+
|
|
448
|
+
protocol_binary_response_status rval;
|
|
449
|
+
if (client->ascii_command == INCR_CMD)
|
|
450
|
+
{
|
|
451
|
+
if (client->root->callback->interface.v1.increment == NULL)
|
|
452
|
+
{
|
|
453
|
+
spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
|
|
454
|
+
return;
|
|
455
|
+
}
|
|
456
|
+
rval= client->root->callback->interface.v1.increment(client,
|
|
457
|
+
key, nkey,
|
|
458
|
+
delta, 0,
|
|
459
|
+
0,
|
|
460
|
+
&result,
|
|
461
|
+
&cas);
|
|
462
|
+
}
|
|
463
|
+
else
|
|
464
|
+
{
|
|
465
|
+
if (client->root->callback->interface.v1.decrement == NULL)
|
|
466
|
+
{
|
|
467
|
+
spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
rval= client->root->callback->interface.v1.decrement(client,
|
|
471
|
+
key, nkey,
|
|
472
|
+
delta, 0,
|
|
473
|
+
0,
|
|
474
|
+
&result,
|
|
475
|
+
&cas);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
if (rval == PROTOCOL_BINARY_RESPONSE_SUCCESS)
|
|
479
|
+
{
|
|
480
|
+
char buffer[80];
|
|
481
|
+
snprintf(buffer, sizeof(buffer), "%"PRIu64"\r\n", result);
|
|
482
|
+
spool_string(client, buffer);
|
|
483
|
+
}
|
|
484
|
+
else
|
|
485
|
+
{
|
|
486
|
+
spool_string(client, "NOT_FOUND\r\n");
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* Process the stats command (with or without a key specified)
|
|
492
|
+
* @param key pointer to the first character after "stats"
|
|
493
|
+
* @param end pointer to the "\n"
|
|
494
|
+
*/
|
|
495
|
+
static void process_stats(memcached_protocol_client_st *client,
|
|
496
|
+
char *key, char *end)
|
|
497
|
+
{
|
|
498
|
+
if (client->root->callback->interface.v1.stat == NULL)
|
|
499
|
+
{
|
|
500
|
+
spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
while (isspace(*key))
|
|
505
|
+
key++;
|
|
506
|
+
|
|
507
|
+
uint16_t nkey= (uint16_t)(end - key);
|
|
508
|
+
(void)client->root->callback->interface.v1.stat(client, key, nkey,
|
|
509
|
+
ascii_stat_response_handler);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
static void process_version(memcached_protocol_client_st *client,
|
|
513
|
+
char **tokens, int ntokens)
|
|
514
|
+
{
|
|
515
|
+
(void)tokens;
|
|
516
|
+
if (ntokens != 1)
|
|
517
|
+
{
|
|
518
|
+
send_command_usage(client);
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
if (client->root->callback->interface.v1.version == NULL)
|
|
523
|
+
{
|
|
524
|
+
spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
|
|
525
|
+
return;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
client->root->callback->interface.v1.version(client,
|
|
529
|
+
ascii_version_response_handler);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
static void process_flush(memcached_protocol_client_st *client,
|
|
533
|
+
char **tokens, int ntokens)
|
|
534
|
+
{
|
|
535
|
+
if (ntokens > 2)
|
|
536
|
+
{
|
|
537
|
+
send_command_usage(client);
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
if (client->root->callback->interface.v1.flush == NULL)
|
|
542
|
+
{
|
|
543
|
+
spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
uint32_t timeout= 0;
|
|
548
|
+
if (ntokens == 2)
|
|
549
|
+
{
|
|
550
|
+
timeout= (uint32_t)strtoul(tokens[1], NULL, 10);
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
protocol_binary_response_status rval;
|
|
554
|
+
rval= client->root->callback->interface.v1.flush(client, timeout);
|
|
555
|
+
if (rval == PROTOCOL_BINARY_RESPONSE_SUCCESS)
|
|
556
|
+
spool_string(client, "OK\r\n");
|
|
557
|
+
else
|
|
558
|
+
spool_string(client, "SERVER_ERROR: internal error\r\n");
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/**
|
|
562
|
+
* Process one of the storage commands
|
|
563
|
+
* @param client the client performing the operation
|
|
564
|
+
* @param tokens the command tokens
|
|
565
|
+
* @param ntokens the number of tokens
|
|
566
|
+
* @param start pointer to the first character in the line
|
|
567
|
+
* @param end pointer to the pointer where the last character of this
|
|
568
|
+
* command is (IN and OUT)
|
|
569
|
+
* @param length the number of bytes available
|
|
570
|
+
* @return -1 if an error occurs (and we should just terminate the connection
|
|
571
|
+
* because we are out of sync)
|
|
572
|
+
* 0 storage command completed, continue processing
|
|
573
|
+
* 1 We need more data, so just go ahead and wait for more!
|
|
574
|
+
*/
|
|
575
|
+
static inline int process_storage_command(memcached_protocol_client_st *client,
|
|
576
|
+
char **tokens, int ntokens, char *start,
|
|
577
|
+
char **end, ssize_t length)
|
|
578
|
+
{
|
|
579
|
+
(void)ntokens; /* already checked */
|
|
580
|
+
char *key= tokens[1];
|
|
581
|
+
uint16_t nkey= parse_ascii_key(&key);
|
|
582
|
+
if (nkey == 0)
|
|
583
|
+
{
|
|
584
|
+
/* return error */
|
|
585
|
+
spool_string(client, "CLIENT_ERROR: bad key\r\n");
|
|
586
|
+
return -1;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
uint32_t flags= (uint32_t)strtoul(tokens[2], NULL, 10);
|
|
590
|
+
uint32_t timeout= (uint32_t)strtoul(tokens[3], NULL, 10);
|
|
591
|
+
unsigned long nbytes= strtoul(tokens[4], NULL, 10);
|
|
592
|
+
|
|
593
|
+
/* Do we have all data? */
|
|
594
|
+
unsigned long need= nbytes + (unsigned long)((*end - start) + 1) + 2; /* \n\r\n */
|
|
595
|
+
if ((ssize_t)need > length)
|
|
596
|
+
{
|
|
597
|
+
/* Keep on reading */
|
|
598
|
+
recover_tokenize_command(start, *end);
|
|
599
|
+
return 1;
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
void *data= (*end) + 1;
|
|
603
|
+
uint64_t cas= 0;
|
|
604
|
+
uint64_t result_cas;
|
|
605
|
+
protocol_binary_response_status rval;
|
|
606
|
+
switch (client->ascii_command)
|
|
607
|
+
{
|
|
608
|
+
case SET_CMD:
|
|
609
|
+
rval= client->root->callback->interface.v1.set(client, key,
|
|
610
|
+
(uint16_t)nkey,
|
|
611
|
+
data,
|
|
612
|
+
(uint32_t)nbytes,
|
|
613
|
+
flags,
|
|
614
|
+
timeout, cas,
|
|
615
|
+
&result_cas);
|
|
616
|
+
break;
|
|
617
|
+
case ADD_CMD:
|
|
618
|
+
rval= client->root->callback->interface.v1.add(client, key,
|
|
619
|
+
(uint16_t)nkey,
|
|
620
|
+
data,
|
|
621
|
+
(uint32_t)nbytes,
|
|
622
|
+
flags,
|
|
623
|
+
timeout, &result_cas);
|
|
624
|
+
break;
|
|
625
|
+
case CAS_CMD:
|
|
626
|
+
cas= strtoull(tokens[5], NULL, 10);
|
|
627
|
+
/* FALLTHROUGH */
|
|
628
|
+
case REPLACE_CMD:
|
|
629
|
+
rval= client->root->callback->interface.v1.replace(client, key,
|
|
630
|
+
(uint16_t)nkey,
|
|
631
|
+
data,
|
|
632
|
+
(uint32_t)nbytes,
|
|
633
|
+
flags,
|
|
634
|
+
timeout, cas,
|
|
635
|
+
&result_cas);
|
|
636
|
+
break;
|
|
637
|
+
case APPEND_CMD:
|
|
638
|
+
rval= client->root->callback->interface.v1.append(client, key,
|
|
639
|
+
(uint16_t)nkey,
|
|
640
|
+
data,
|
|
641
|
+
(uint32_t)nbytes,
|
|
642
|
+
cas,
|
|
643
|
+
&result_cas);
|
|
644
|
+
break;
|
|
645
|
+
case PREPEND_CMD:
|
|
646
|
+
rval= client->root->callback->interface.v1.prepend(client, key,
|
|
647
|
+
(uint16_t)nkey,
|
|
648
|
+
data,
|
|
649
|
+
(uint32_t)nbytes,
|
|
650
|
+
cas,
|
|
651
|
+
&result_cas);
|
|
652
|
+
break;
|
|
653
|
+
|
|
654
|
+
/* gcc complains if I don't put all of the enums in here.. */
|
|
655
|
+
case GET_CMD:
|
|
656
|
+
case GETS_CMD:
|
|
657
|
+
case DELETE_CMD:
|
|
658
|
+
case DECR_CMD:
|
|
659
|
+
case INCR_CMD:
|
|
660
|
+
case STATS_CMD:
|
|
661
|
+
case FLUSH_ALL_CMD:
|
|
662
|
+
case VERSION_CMD:
|
|
663
|
+
case QUIT_CMD:
|
|
664
|
+
case VERBOSITY_CMD:
|
|
665
|
+
case UNKNOWN_CMD:
|
|
666
|
+
default:
|
|
667
|
+
abort(); /* impossible */
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
if (rval == PROTOCOL_BINARY_RESPONSE_SUCCESS)
|
|
671
|
+
{
|
|
672
|
+
spool_string(client, "STORED\r\n");
|
|
673
|
+
}
|
|
674
|
+
else
|
|
675
|
+
{
|
|
676
|
+
if (client->ascii_command == CAS_CMD)
|
|
677
|
+
{
|
|
678
|
+
if (rval == PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS)
|
|
679
|
+
{
|
|
680
|
+
spool_string(client, "EXISTS\r\n");
|
|
681
|
+
}
|
|
682
|
+
else if (rval == PROTOCOL_BINARY_RESPONSE_KEY_ENOENT)
|
|
683
|
+
{
|
|
684
|
+
spool_string(client, "NOT_FOUND\r\n");
|
|
685
|
+
}
|
|
686
|
+
else
|
|
687
|
+
{
|
|
688
|
+
spool_string(client, "NOT_STORED\r\n");
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
else
|
|
692
|
+
{
|
|
693
|
+
spool_string(client, "NOT_STORED\r\n");
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
*end += nbytes + 2;
|
|
698
|
+
|
|
699
|
+
return 0;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
static int process_cas_command(memcached_protocol_client_st *client,
|
|
703
|
+
char **tokens, int ntokens, char *start,
|
|
704
|
+
char **end, ssize_t length)
|
|
705
|
+
{
|
|
706
|
+
if (ntokens != 6)
|
|
707
|
+
{
|
|
708
|
+
send_command_usage(client);
|
|
709
|
+
return false;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
if (client->root->callback->interface.v1.replace == NULL)
|
|
713
|
+
{
|
|
714
|
+
spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
|
|
715
|
+
return false;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
return process_storage_command(client, tokens, ntokens, start, end, length);
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
static int process_set_command(memcached_protocol_client_st *client,
|
|
722
|
+
char **tokens, int ntokens, char *start,
|
|
723
|
+
char **end, ssize_t length)
|
|
724
|
+
{
|
|
725
|
+
if (ntokens != 5)
|
|
726
|
+
{
|
|
727
|
+
send_command_usage(client);
|
|
728
|
+
return false;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
if (client->root->callback->interface.v1.set == NULL)
|
|
732
|
+
{
|
|
733
|
+
spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
|
|
734
|
+
return false;
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
return process_storage_command(client, tokens, ntokens, start, end, length);
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
static int process_add_command(memcached_protocol_client_st *client,
|
|
741
|
+
char **tokens, int ntokens, char *start,
|
|
742
|
+
char **end, ssize_t length)
|
|
743
|
+
{
|
|
744
|
+
if (ntokens != 5)
|
|
745
|
+
{
|
|
746
|
+
send_command_usage(client);
|
|
747
|
+
return false;
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
if (client->root->callback->interface.v1.add == NULL)
|
|
751
|
+
{
|
|
752
|
+
spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
|
|
753
|
+
return false;
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
return process_storage_command(client, tokens, ntokens, start, end, length);
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
static int process_replace_command(memcached_protocol_client_st *client,
|
|
760
|
+
char **tokens, int ntokens, char *start,
|
|
761
|
+
char **end, ssize_t length)
|
|
762
|
+
{
|
|
763
|
+
if (ntokens != 5)
|
|
764
|
+
{
|
|
765
|
+
send_command_usage(client);
|
|
766
|
+
return false;
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
if (client->root->callback->interface.v1.replace == NULL)
|
|
770
|
+
{
|
|
771
|
+
spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
|
|
772
|
+
return false;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
return process_storage_command(client, tokens, ntokens, start, end, length);
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
static int process_append_command(memcached_protocol_client_st *client,
|
|
779
|
+
char **tokens, int ntokens, char *start,
|
|
780
|
+
char **end, ssize_t length)
|
|
781
|
+
{
|
|
782
|
+
if (ntokens != 5)
|
|
783
|
+
{
|
|
784
|
+
send_command_usage(client);
|
|
785
|
+
return false;
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
if (client->root->callback->interface.v1.append == NULL)
|
|
789
|
+
{
|
|
790
|
+
spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
|
|
791
|
+
return false;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
return process_storage_command(client, tokens, ntokens, start, end, length);
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
static int process_prepend_command(memcached_protocol_client_st *client,
|
|
798
|
+
char **tokens, int ntokens, char *start,
|
|
799
|
+
char **end, ssize_t length)
|
|
800
|
+
{
|
|
801
|
+
if (ntokens != 5)
|
|
802
|
+
{
|
|
803
|
+
send_command_usage(client);
|
|
804
|
+
return false;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
if (client->root->callback->interface.v1.prepend == NULL)
|
|
808
|
+
{
|
|
809
|
+
spool_string(client, "SERVER_ERROR: callback not implemented\r\n");
|
|
810
|
+
return false;
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
return process_storage_command(client, tokens, ntokens, start, end, length);
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
/**
|
|
817
|
+
* The ASCII protocol support is just one giant big hack. Instead of adding
|
|
818
|
+
* a optimal ascii support, I just convert the ASCII commands to the binary
|
|
819
|
+
* protocol and calls back into the command handlers for the binary protocol ;)
|
|
820
|
+
*/
|
|
821
|
+
memcached_protocol_event_t memcached_ascii_protocol_process_data(memcached_protocol_client_st *client, ssize_t *length, void **endptr)
|
|
822
|
+
{
|
|
823
|
+
char *ptr= (char*)client->root->input_buffer;
|
|
824
|
+
*endptr= ptr;
|
|
825
|
+
|
|
826
|
+
do {
|
|
827
|
+
/* Do we have \n (indicating the command preamble)*/
|
|
828
|
+
char *end= memchr(ptr, '\n', (size_t)*length);
|
|
829
|
+
if (end == NULL)
|
|
830
|
+
{
|
|
831
|
+
*endptr= ptr;
|
|
832
|
+
return MEMCACHED_PROTOCOL_READ_EVENT;
|
|
833
|
+
}
|
|
834
|
+
|
|
835
|
+
client->ascii_command= ascii_to_cmd(ptr, (size_t)(*length));
|
|
836
|
+
|
|
837
|
+
/* A multiget lists all of the keys, and I don't want to have an
|
|
838
|
+
* avector of let's say 512 pointers to tokenize all of them, so let's
|
|
839
|
+
* just handle them immediately
|
|
840
|
+
*/
|
|
841
|
+
if (client->ascii_command == GET_CMD ||
|
|
842
|
+
client->ascii_command == GETS_CMD) {
|
|
843
|
+
if (client->root->callback->interface.v1.get != NULL)
|
|
844
|
+
ascii_process_gets(client, ptr, end);
|
|
845
|
+
else
|
|
846
|
+
spool_string(client, "SERVER_ERROR: Command not implemented\n");
|
|
847
|
+
} else {
|
|
848
|
+
/* None of the defined commands takes 10 parameters, so lets just use
|
|
849
|
+
* that as a maximum limit.
|
|
850
|
+
*/
|
|
851
|
+
char *tokens[10];
|
|
852
|
+
int ntokens= ascii_tokenize_command(ptr, end, tokens, 10);
|
|
853
|
+
|
|
854
|
+
if (ntokens < 10)
|
|
855
|
+
{
|
|
856
|
+
client->mute= strcmp(tokens[ntokens - 1], "noreply") == 0;
|
|
857
|
+
if (client->mute)
|
|
858
|
+
--ntokens; /* processed noreply token*/
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
int error= 0;
|
|
862
|
+
|
|
863
|
+
switch (client->ascii_command) {
|
|
864
|
+
case SET_CMD:
|
|
865
|
+
error= process_set_command(client, tokens, ntokens, ptr, &end, *length);
|
|
866
|
+
break;
|
|
867
|
+
case ADD_CMD:
|
|
868
|
+
error= process_add_command(client, tokens, ntokens, ptr, &end, *length);
|
|
869
|
+
break;
|
|
870
|
+
case REPLACE_CMD:
|
|
871
|
+
error= process_replace_command(client, tokens, ntokens,
|
|
872
|
+
ptr, &end, *length);
|
|
873
|
+
break;
|
|
874
|
+
case CAS_CMD:
|
|
875
|
+
error= process_cas_command(client, tokens, ntokens, ptr, &end, *length);
|
|
876
|
+
break;
|
|
877
|
+
case APPEND_CMD:
|
|
878
|
+
error= process_append_command(client, tokens, ntokens,
|
|
879
|
+
ptr, &end, *length);
|
|
880
|
+
break;
|
|
881
|
+
case PREPEND_CMD:
|
|
882
|
+
error= process_prepend_command(client, tokens, ntokens,
|
|
883
|
+
ptr, &end, *length);
|
|
884
|
+
break;
|
|
885
|
+
case DELETE_CMD:
|
|
886
|
+
process_delete(client, tokens, ntokens);
|
|
887
|
+
break;
|
|
888
|
+
|
|
889
|
+
case INCR_CMD: /* FALLTHROUGH */
|
|
890
|
+
case DECR_CMD:
|
|
891
|
+
process_arithmetic(client, tokens, ntokens);
|
|
892
|
+
break;
|
|
893
|
+
case STATS_CMD:
|
|
894
|
+
if (client->mute)
|
|
895
|
+
{
|
|
896
|
+
send_command_usage(client);
|
|
897
|
+
}
|
|
898
|
+
else
|
|
899
|
+
{
|
|
900
|
+
recover_tokenize_command(ptr, end);
|
|
901
|
+
process_stats(client, ptr + 6, end);
|
|
902
|
+
}
|
|
903
|
+
break;
|
|
904
|
+
case FLUSH_ALL_CMD:
|
|
905
|
+
process_flush(client, tokens, ntokens);
|
|
906
|
+
break;
|
|
907
|
+
case VERSION_CMD:
|
|
908
|
+
if (client->mute)
|
|
909
|
+
{
|
|
910
|
+
send_command_usage(client);
|
|
911
|
+
}
|
|
912
|
+
else
|
|
913
|
+
{
|
|
914
|
+
process_version(client, tokens, ntokens);
|
|
915
|
+
}
|
|
916
|
+
break;
|
|
917
|
+
case QUIT_CMD:
|
|
918
|
+
if (ntokens != 1 || client->mute)
|
|
919
|
+
{
|
|
920
|
+
send_command_usage(client);
|
|
921
|
+
}
|
|
922
|
+
else
|
|
923
|
+
{
|
|
924
|
+
if (client->root->callback->interface.v1.quit != NULL)
|
|
925
|
+
client->root->callback->interface.v1.quit(client);
|
|
926
|
+
|
|
927
|
+
return MEMCACHED_PROTOCOL_ERROR_EVENT;
|
|
928
|
+
}
|
|
929
|
+
break;
|
|
930
|
+
|
|
931
|
+
case VERBOSITY_CMD:
|
|
932
|
+
if (ntokens != 2)
|
|
933
|
+
send_command_usage(client);
|
|
934
|
+
else
|
|
935
|
+
spool_string(client, "OK\r\n");
|
|
936
|
+
break;
|
|
937
|
+
|
|
938
|
+
case UNKNOWN_CMD:
|
|
939
|
+
send_command_usage(client);
|
|
940
|
+
break;
|
|
941
|
+
|
|
942
|
+
case GET_CMD:
|
|
943
|
+
case GETS_CMD:
|
|
944
|
+
default:
|
|
945
|
+
/* Should already be handled */
|
|
946
|
+
abort();
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
if (error == -1)
|
|
950
|
+
return MEMCACHED_PROTOCOL_ERROR_EVENT;
|
|
951
|
+
else if (error == 1)
|
|
952
|
+
return MEMCACHED_PROTOCOL_READ_EVENT;
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
/* Move past \n */
|
|
956
|
+
++end;
|
|
957
|
+
*length -= end - ptr;
|
|
958
|
+
ptr= end;
|
|
959
|
+
} while (*length > 0);
|
|
960
|
+
|
|
961
|
+
*endptr= ptr;
|
|
962
|
+
return MEMCACHED_PROTOCOL_READ_EVENT;
|
|
963
|
+
}
|