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,57 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* Copyright (C) 2010 Brian Aker All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
|
9
|
+
* modification, are permitted provided that the following conditions are
|
|
10
|
+
* met:
|
|
11
|
+
*
|
|
12
|
+
* * Redistributions of source code must retain the above copyright
|
|
13
|
+
* notice, this list of conditions and the following disclaimer.
|
|
14
|
+
*
|
|
15
|
+
* * Redistributions in binary form must reproduce the above
|
|
16
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
17
|
+
* in the documentation and/or other materials provided with the
|
|
18
|
+
* distribution.
|
|
19
|
+
*
|
|
20
|
+
* * The names of its contributors may not be used to endorse or
|
|
21
|
+
* promote products derived from this software without specific prior
|
|
22
|
+
* written permission.
|
|
23
|
+
*
|
|
24
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
25
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
27
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
28
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
29
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
30
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
31
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
32
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
33
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
34
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
#pragma once
|
|
39
|
+
|
|
40
|
+
#ifdef __cplusplus
|
|
41
|
+
extern "C" {
|
|
42
|
+
#endif
|
|
43
|
+
|
|
44
|
+
/* Read a single response from the server */
|
|
45
|
+
LIBMEMCACHED_LOCAL
|
|
46
|
+
memcached_return_t memcached_read_one_response(memcached_server_write_instance_st ptr,
|
|
47
|
+
char *buffer, size_t buffer_length,
|
|
48
|
+
memcached_result_st *result);
|
|
49
|
+
|
|
50
|
+
LIBMEMCACHED_LOCAL
|
|
51
|
+
memcached_return_t memcached_response(memcached_server_write_instance_st ptr,
|
|
52
|
+
char *buffer, size_t buffer_length,
|
|
53
|
+
memcached_result_st *result);
|
|
54
|
+
|
|
55
|
+
#ifdef __cplusplus
|
|
56
|
+
}
|
|
57
|
+
#endif
|
|
@@ -0,0 +1,173 @@
|
|
|
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
|
+
/*
|
|
40
|
+
memcached_result_st are used to internally represent the return values from
|
|
41
|
+
memcached. We use a structure so that long term as identifiers are added
|
|
42
|
+
to memcached we will be able to absorb new attributes without having
|
|
43
|
+
to addjust the entire API.
|
|
44
|
+
*/
|
|
45
|
+
#include <libmemcached/common.h>
|
|
46
|
+
|
|
47
|
+
static inline void _result_init(memcached_result_st *self,
|
|
48
|
+
memcached_st *memc)
|
|
49
|
+
{
|
|
50
|
+
self->item_flags= 0;
|
|
51
|
+
self->item_expiration= 0;
|
|
52
|
+
self->key_length= 0;
|
|
53
|
+
self->item_cas= 0;
|
|
54
|
+
self->root= memc;
|
|
55
|
+
self->count= 0;
|
|
56
|
+
self->item_key[0]= 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
memcached_result_st *memcached_result_create(const memcached_st *memc,
|
|
60
|
+
memcached_result_st *ptr)
|
|
61
|
+
{
|
|
62
|
+
WATCHPOINT_ASSERT(memc);
|
|
63
|
+
|
|
64
|
+
/* Saving malloc calls :) */
|
|
65
|
+
if (ptr)
|
|
66
|
+
{
|
|
67
|
+
ptr->options.is_allocated= false;
|
|
68
|
+
}
|
|
69
|
+
else
|
|
70
|
+
{
|
|
71
|
+
ptr= static_cast<memcached_result_st *>(libmemcached_malloc(memc, sizeof(memcached_result_st)));
|
|
72
|
+
|
|
73
|
+
if (not ptr)
|
|
74
|
+
{
|
|
75
|
+
return NULL;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
ptr->options.is_allocated= true;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
ptr->options.is_initialized= true;
|
|
82
|
+
|
|
83
|
+
_result_init(ptr, (memcached_st *)memc);
|
|
84
|
+
|
|
85
|
+
WATCHPOINT_SET(ptr->value.options.is_initialized= false);
|
|
86
|
+
memcached_string_create((memcached_st*)memc, &ptr->value, 0);
|
|
87
|
+
WATCHPOINT_ASSERT_INITIALIZED(&ptr->value);
|
|
88
|
+
WATCHPOINT_ASSERT(ptr->value.string == NULL);
|
|
89
|
+
|
|
90
|
+
return ptr;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
void memcached_result_reset(memcached_result_st *ptr)
|
|
94
|
+
{
|
|
95
|
+
ptr->key_length= 0;
|
|
96
|
+
memcached_string_reset(&ptr->value);
|
|
97
|
+
ptr->item_flags= 0;
|
|
98
|
+
ptr->item_cas= 0;
|
|
99
|
+
ptr->item_expiration= 0;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
void memcached_result_free(memcached_result_st *ptr)
|
|
103
|
+
{
|
|
104
|
+
if (not ptr)
|
|
105
|
+
return;
|
|
106
|
+
|
|
107
|
+
memcached_string_free(&ptr->value);
|
|
108
|
+
|
|
109
|
+
if (memcached_is_allocated(ptr))
|
|
110
|
+
{
|
|
111
|
+
WATCHPOINT_ASSERT(ptr->root); // Without a root, that means that result was not properly initialized.
|
|
112
|
+
libmemcached_free(ptr->root, ptr);
|
|
113
|
+
}
|
|
114
|
+
else
|
|
115
|
+
{
|
|
116
|
+
ptr->count= 0;
|
|
117
|
+
ptr->options.is_initialized= false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
memcached_return_t memcached_result_set_value(memcached_result_st *ptr,
|
|
122
|
+
const char *value,
|
|
123
|
+
size_t length)
|
|
124
|
+
{
|
|
125
|
+
if (memcached_failed(memcached_string_append(&ptr->value, value, length)))
|
|
126
|
+
{
|
|
127
|
+
return memcached_set_errno(*ptr->root, errno, MEMCACHED_AT);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return MEMCACHED_SUCCESS;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const char *memcached_result_key_value(const memcached_result_st *self)
|
|
134
|
+
{
|
|
135
|
+
return self->key_length ? self->item_key : NULL;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
size_t memcached_result_key_length(const memcached_result_st *self)
|
|
139
|
+
{
|
|
140
|
+
return self->key_length;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const char *memcached_result_value(const memcached_result_st *self)
|
|
144
|
+
{
|
|
145
|
+
const memcached_string_st *sptr= &self->value;
|
|
146
|
+
return memcached_string_value(sptr);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
size_t memcached_result_length(const memcached_result_st *self)
|
|
150
|
+
{
|
|
151
|
+
const memcached_string_st *sptr= &self->value;
|
|
152
|
+
return memcached_string_length(sptr);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
uint32_t memcached_result_flags(const memcached_result_st *self)
|
|
156
|
+
{
|
|
157
|
+
return self->item_flags;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
uint64_t memcached_result_cas(const memcached_result_st *self)
|
|
161
|
+
{
|
|
162
|
+
return self->item_cas;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
void memcached_result_set_flags(memcached_result_st *self, uint32_t flags)
|
|
166
|
+
{
|
|
167
|
+
self->item_flags= flags;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
void memcached_result_set_expiration(memcached_result_st *self, time_t expiration)
|
|
171
|
+
{
|
|
172
|
+
self->item_expiration= expiration;
|
|
173
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
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
|
+
#pragma once
|
|
39
|
+
|
|
40
|
+
struct memcached_result_st {
|
|
41
|
+
uint32_t item_flags;
|
|
42
|
+
time_t item_expiration;
|
|
43
|
+
size_t key_length;
|
|
44
|
+
uint64_t item_cas;
|
|
45
|
+
memcached_st *root;
|
|
46
|
+
memcached_string_st value;
|
|
47
|
+
uint64_t count;
|
|
48
|
+
char item_key[MEMCACHED_MAX_KEY];
|
|
49
|
+
struct {
|
|
50
|
+
bool is_allocated:1;
|
|
51
|
+
bool is_initialized:1;
|
|
52
|
+
} options;
|
|
53
|
+
/* Add result callback function */
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
#ifdef __cplusplus
|
|
57
|
+
extern "C" {
|
|
58
|
+
#endif
|
|
59
|
+
|
|
60
|
+
/* Result Struct */
|
|
61
|
+
LIBMEMCACHED_API
|
|
62
|
+
void memcached_result_free(memcached_result_st *result);
|
|
63
|
+
|
|
64
|
+
LIBMEMCACHED_API
|
|
65
|
+
void memcached_result_reset(memcached_result_st *ptr);
|
|
66
|
+
|
|
67
|
+
LIBMEMCACHED_API
|
|
68
|
+
memcached_result_st *memcached_result_create(const memcached_st *ptr,
|
|
69
|
+
memcached_result_st *result);
|
|
70
|
+
|
|
71
|
+
LIBMEMCACHED_API
|
|
72
|
+
const char *memcached_result_key_value(const memcached_result_st *self);
|
|
73
|
+
|
|
74
|
+
LIBMEMCACHED_API
|
|
75
|
+
size_t memcached_result_key_length(const memcached_result_st *self);
|
|
76
|
+
|
|
77
|
+
LIBMEMCACHED_API
|
|
78
|
+
const char *memcached_result_value(const memcached_result_st *self);
|
|
79
|
+
|
|
80
|
+
LIBMEMCACHED_API
|
|
81
|
+
size_t memcached_result_length(const memcached_result_st *self);
|
|
82
|
+
|
|
83
|
+
LIBMEMCACHED_API
|
|
84
|
+
uint32_t memcached_result_flags(const memcached_result_st *self);
|
|
85
|
+
|
|
86
|
+
LIBMEMCACHED_API
|
|
87
|
+
uint64_t memcached_result_cas(const memcached_result_st *self);
|
|
88
|
+
|
|
89
|
+
LIBMEMCACHED_API
|
|
90
|
+
memcached_return_t memcached_result_set_value(memcached_result_st *ptr, const char *value, size_t length);
|
|
91
|
+
|
|
92
|
+
LIBMEMCACHED_API
|
|
93
|
+
void memcached_result_set_flags(memcached_result_st *self, uint32_t flags);
|
|
94
|
+
|
|
95
|
+
LIBMEMCACHED_API
|
|
96
|
+
void memcached_result_set_expiration(memcached_result_st *self, time_t expiration);
|
|
97
|
+
|
|
98
|
+
#ifdef __cplusplus
|
|
99
|
+
} // extern "C"
|
|
100
|
+
#endif
|
|
@@ -0,0 +1,98 @@
|
|
|
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
|
+
enum memcached_return_t {
|
|
40
|
+
MEMCACHED_SUCCESS,
|
|
41
|
+
MEMCACHED_FAILURE,
|
|
42
|
+
MEMCACHED_HOST_LOOKUP_FAILURE, // getaddrinfo() and getnameinfo() only
|
|
43
|
+
MEMCACHED_CONNECTION_FAILURE,
|
|
44
|
+
MEMCACHED_CONNECTION_BIND_FAILURE, // DEPRECATED, see MEMCACHED_HOST_LOOKUP_FAILURE
|
|
45
|
+
MEMCACHED_WRITE_FAILURE,
|
|
46
|
+
MEMCACHED_READ_FAILURE,
|
|
47
|
+
MEMCACHED_UNKNOWN_READ_FAILURE,
|
|
48
|
+
MEMCACHED_PROTOCOL_ERROR,
|
|
49
|
+
MEMCACHED_CLIENT_ERROR,
|
|
50
|
+
MEMCACHED_SERVER_ERROR,
|
|
51
|
+
MEMCACHED_CONNECTION_SOCKET_CREATE_FAILURE, // DEPRECATED
|
|
52
|
+
MEMCACHED_DATA_EXISTS,
|
|
53
|
+
MEMCACHED_DATA_DOES_NOT_EXIST,
|
|
54
|
+
MEMCACHED_NOTSTORED,
|
|
55
|
+
MEMCACHED_STORED,
|
|
56
|
+
MEMCACHED_NOTFOUND,
|
|
57
|
+
MEMCACHED_MEMORY_ALLOCATION_FAILURE,
|
|
58
|
+
MEMCACHED_PARTIAL_READ,
|
|
59
|
+
MEMCACHED_SOME_ERRORS,
|
|
60
|
+
MEMCACHED_NO_SERVERS,
|
|
61
|
+
MEMCACHED_END,
|
|
62
|
+
MEMCACHED_DELETED,
|
|
63
|
+
MEMCACHED_VALUE,
|
|
64
|
+
MEMCACHED_STAT,
|
|
65
|
+
MEMCACHED_ITEM,
|
|
66
|
+
MEMCACHED_ERRNO,
|
|
67
|
+
MEMCACHED_FAIL_UNIX_SOCKET, // DEPRECATED
|
|
68
|
+
MEMCACHED_NOT_SUPPORTED,
|
|
69
|
+
MEMCACHED_NO_KEY_PROVIDED, /* Deprecated. Use MEMCACHED_BAD_KEY_PROVIDED! */
|
|
70
|
+
MEMCACHED_FETCH_NOTFINISHED,
|
|
71
|
+
MEMCACHED_TIMEOUT,
|
|
72
|
+
MEMCACHED_BUFFERED,
|
|
73
|
+
MEMCACHED_BAD_KEY_PROVIDED,
|
|
74
|
+
MEMCACHED_INVALID_HOST_PROTOCOL,
|
|
75
|
+
MEMCACHED_SERVER_MARKED_DEAD,
|
|
76
|
+
MEMCACHED_UNKNOWN_STAT_KEY,
|
|
77
|
+
MEMCACHED_E2BIG,
|
|
78
|
+
MEMCACHED_INVALID_ARGUMENTS,
|
|
79
|
+
MEMCACHED_KEY_TOO_BIG,
|
|
80
|
+
MEMCACHED_AUTH_PROBLEM,
|
|
81
|
+
MEMCACHED_AUTH_FAILURE,
|
|
82
|
+
MEMCACHED_AUTH_CONTINUE,
|
|
83
|
+
MEMCACHED_PARSE_ERROR,
|
|
84
|
+
MEMCACHED_PARSE_USER_ERROR,
|
|
85
|
+
MEMCACHED_DEPRECATED,
|
|
86
|
+
MEMCACHED_IN_PROGRESS,
|
|
87
|
+
MEMCACHED_MAXIMUM_RETURN /* Always add new error code before */
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
#ifndef __cplusplus
|
|
91
|
+
typedef enum memcached_return_t memcached_return_t;
|
|
92
|
+
#endif
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
#define memcached_success(__memcached_return_t) ((__memcached_return_t) == MEMCACHED_SUCCESS or (__memcached_return_t) == MEMCACHED_END)
|
|
96
|
+
#define memcached_failed(__memcached_return_t) ((__memcached_return_t) != MEMCACHED_SUCCESS and (__memcached_return_t) != MEMCACHED_END)
|
|
97
|
+
#define memcached_continue(__memcached_return_t) ((__memcached_return_t) == MEMCACHED_IN_PROGRESS)
|
|
98
|
+
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
|
|
2
|
+
*
|
|
3
|
+
* Libmemcached library
|
|
4
|
+
*
|
|
5
|
+
* Copyright (C) 2011 Data Differential, http://datadifferential.com/
|
|
6
|
+
* Copyright (C) 2006-2009 Brian Aker All rights reserved.
|
|
7
|
+
*
|
|
8
|
+
* Redistribution and use in source and binary forms, with or without
|
|
9
|
+
* modification, are permitted provided that the following conditions are
|
|
10
|
+
* met:
|
|
11
|
+
*
|
|
12
|
+
* * Redistributions of source code must retain the above copyright
|
|
13
|
+
* notice, this list of conditions and the following disclaimer.
|
|
14
|
+
*
|
|
15
|
+
* * Redistributions in binary form must reproduce the above
|
|
16
|
+
* copyright notice, this list of conditions and the following disclaimer
|
|
17
|
+
* in the documentation and/or other materials provided with the
|
|
18
|
+
* distribution.
|
|
19
|
+
*
|
|
20
|
+
* * The names of its contributors may not be used to endorse or
|
|
21
|
+
* promote products derived from this software without specific prior
|
|
22
|
+
* written permission.
|
|
23
|
+
*
|
|
24
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
25
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
26
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
27
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
28
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
29
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
30
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
31
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
32
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
33
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
34
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
#include <libmemcached/common.h>
|
|
39
|
+
#include <iso646.h>
|
|
40
|
+
|
|
41
|
+
void memcached_set_sasl_callbacks(memcached_st *ptr,
|
|
42
|
+
const sasl_callback_t *callbacks)
|
|
43
|
+
{
|
|
44
|
+
ptr->sasl.callbacks= callbacks;
|
|
45
|
+
ptr->sasl.is_allocated= false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const sasl_callback_t *memcached_get_sasl_callbacks(memcached_st *ptr)
|
|
49
|
+
{
|
|
50
|
+
return ptr->sasl.callbacks;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Resolve the names for both ends of a connection
|
|
55
|
+
* @param fd socket to check
|
|
56
|
+
* @param laddr local address (out)
|
|
57
|
+
* @param raddr remote address (out)
|
|
58
|
+
* @return true on success false otherwise (errno contains more info)
|
|
59
|
+
*/
|
|
60
|
+
static memcached_return_t resolve_names(int fd, char *laddr, size_t laddr_length, char *raddr, size_t raddr_length)
|
|
61
|
+
{
|
|
62
|
+
char host[NI_MAXHOST];
|
|
63
|
+
char port[NI_MAXSERV];
|
|
64
|
+
struct sockaddr_storage saddr;
|
|
65
|
+
socklen_t salen= sizeof(saddr);
|
|
66
|
+
|
|
67
|
+
if (getsockname(fd, (struct sockaddr *)&saddr, &salen) < 0)
|
|
68
|
+
{
|
|
69
|
+
return MEMCACHED_ERRNO;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (getnameinfo((struct sockaddr *)&saddr, salen, host, sizeof(host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV) < 0)
|
|
73
|
+
{
|
|
74
|
+
return MEMCACHED_HOST_LOOKUP_FAILURE;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
(void)snprintf(laddr, laddr_length, "%s;%s", host, port);
|
|
78
|
+
salen= sizeof(saddr);
|
|
79
|
+
|
|
80
|
+
if (getpeername(fd, (struct sockaddr *)&saddr, &salen) < 0)
|
|
81
|
+
{
|
|
82
|
+
return MEMCACHED_ERRNO;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (getnameinfo((struct sockaddr *)&saddr, salen, host, sizeof(host),
|
|
86
|
+
port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV) < 0)
|
|
87
|
+
{
|
|
88
|
+
return MEMCACHED_HOST_LOOKUP_FAILURE;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
(void)snprintf(raddr, raddr_length, "%s;%s", host, port);
|
|
92
|
+
|
|
93
|
+
return MEMCACHED_SUCCESS;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
memcached_return_t memcached_sasl_authenticate_connection(memcached_server_st *server)
|
|
97
|
+
{
|
|
98
|
+
/* SANITY CHECK: SASL can only be used with the binary protocol */
|
|
99
|
+
if (!server->root->flags.binary_protocol)
|
|
100
|
+
return MEMCACHED_FAILURE;
|
|
101
|
+
|
|
102
|
+
/* Try to get the supported mech from the server. Servers without SASL
|
|
103
|
+
* support will return UNKNOWN COMMAND, so we can just treat that
|
|
104
|
+
* as authenticated
|
|
105
|
+
*/
|
|
106
|
+
protocol_binary_request_no_extras request= {
|
|
107
|
+
.message.header.request= {
|
|
108
|
+
.magic= PROTOCOL_BINARY_REQ,
|
|
109
|
+
.opcode= PROTOCOL_BINARY_CMD_SASL_LIST_MECHS
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
if (memcached_io_write(server, request.bytes,
|
|
114
|
+
sizeof(request.bytes), 1) != sizeof(request.bytes))
|
|
115
|
+
{
|
|
116
|
+
return MEMCACHED_WRITE_FAILURE;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
memcached_server_response_increment(server);
|
|
120
|
+
|
|
121
|
+
char mech[MEMCACHED_MAX_BUFFER];
|
|
122
|
+
memcached_return_t rc= memcached_response(server, mech, sizeof(mech), NULL);
|
|
123
|
+
if (memcached_failed(rc))
|
|
124
|
+
{
|
|
125
|
+
if (rc == MEMCACHED_PROTOCOL_ERROR)
|
|
126
|
+
{
|
|
127
|
+
/* If the server doesn't support SASL it will return PROTOCOL_ERROR.
|
|
128
|
+
* This error may also be returned for other errors, but let's assume
|
|
129
|
+
* that the server don't support SASL and treat it as success and
|
|
130
|
+
* let the client fail with the next operation if the error was
|
|
131
|
+
* caused by another problem....
|
|
132
|
+
*/
|
|
133
|
+
rc= MEMCACHED_SUCCESS;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return rc;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* set ip addresses */
|
|
140
|
+
char laddr[NI_MAXHOST + NI_MAXSERV];
|
|
141
|
+
char raddr[NI_MAXHOST + NI_MAXSERV];
|
|
142
|
+
|
|
143
|
+
if (memcached_failed(rc= resolve_names(server->fd, laddr, sizeof(laddr), raddr, sizeof(raddr))))
|
|
144
|
+
{
|
|
145
|
+
return rc;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
sasl_conn_t *conn;
|
|
149
|
+
int ret= sasl_client_new("memcached", server->hostname, laddr, raddr, server->root->sasl.callbacks, 0, &conn);
|
|
150
|
+
if (ret != SASL_OK)
|
|
151
|
+
{
|
|
152
|
+
return MEMCACHED_AUTH_PROBLEM;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const char *data;
|
|
156
|
+
const char *chosenmech;
|
|
157
|
+
unsigned int len;
|
|
158
|
+
ret= sasl_client_start(conn, mech, NULL, &data, &len, &chosenmech);
|
|
159
|
+
|
|
160
|
+
if (ret != SASL_OK && ret != SASL_CONTINUE)
|
|
161
|
+
{
|
|
162
|
+
rc= MEMCACHED_AUTH_PROBLEM;
|
|
163
|
+
goto end;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
uint16_t keylen= (uint16_t)strlen(chosenmech);
|
|
167
|
+
request.message.header.request.opcode= PROTOCOL_BINARY_CMD_SASL_AUTH;
|
|
168
|
+
request.message.header.request.keylen= htons(keylen);
|
|
169
|
+
request.message.header.request.bodylen= htonl(len + keylen);
|
|
170
|
+
|
|
171
|
+
do {
|
|
172
|
+
/* send the packet */
|
|
173
|
+
|
|
174
|
+
struct libmemcached_io_vector_st vector[]=
|
|
175
|
+
{
|
|
176
|
+
{ .length= sizeof(request.bytes), .buffer= request.bytes },
|
|
177
|
+
{ .length= keylen, .buffer= chosenmech },
|
|
178
|
+
{ .length= len, .buffer= data }
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
if (memcached_io_writev(server, vector, 3, true) == -1)
|
|
182
|
+
{
|
|
183
|
+
rc= MEMCACHED_WRITE_FAILURE;
|
|
184
|
+
goto end;
|
|
185
|
+
}
|
|
186
|
+
memcached_server_response_increment(server);
|
|
187
|
+
|
|
188
|
+
/* read the response */
|
|
189
|
+
rc= memcached_response(server, NULL, 0, NULL);
|
|
190
|
+
if (rc != MEMCACHED_AUTH_CONTINUE)
|
|
191
|
+
{
|
|
192
|
+
goto end;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
ret= sasl_client_step(conn, memcached_result_value(&server->root->result),
|
|
196
|
+
(unsigned int)memcached_result_length(&server->root->result),
|
|
197
|
+
NULL, &data, &len);
|
|
198
|
+
|
|
199
|
+
if (ret != SASL_OK && ret != SASL_CONTINUE)
|
|
200
|
+
{
|
|
201
|
+
rc= MEMCACHED_AUTH_PROBLEM;
|
|
202
|
+
goto end;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
request.message.header.request.opcode= PROTOCOL_BINARY_CMD_SASL_STEP;
|
|
206
|
+
request.message.header.request.bodylen= htonl(len + keylen);
|
|
207
|
+
} while (true);
|
|
208
|
+
|
|
209
|
+
end:
|
|
210
|
+
/* Release resources */
|
|
211
|
+
sasl_dispose(&conn);
|
|
212
|
+
|
|
213
|
+
return rc;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
static int get_username(void *context, int id, const char **result,
|
|
217
|
+
unsigned int *len)
|
|
218
|
+
{
|
|
219
|
+
if (!context || !result || (id != SASL_CB_USER && id != SASL_CB_AUTHNAME))
|
|
220
|
+
{
|
|
221
|
+
return SASL_BADPARAM;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
*result= context;
|
|
225
|
+
if (len)
|
|
226
|
+
{
|
|
227
|
+
*len= (unsigned int)strlen(*result);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return SASL_OK;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
static int get_password(sasl_conn_t *conn, void *context, int id,
|
|
234
|
+
sasl_secret_t **psecret)
|
|
235
|
+
{
|
|
236
|
+
if (!conn || ! psecret || id != SASL_CB_PASS)
|
|
237
|
+
{
|
|
238
|
+
return SASL_BADPARAM;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
*psecret= context;
|
|
242
|
+
|
|
243
|
+
return SASL_OK;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
memcached_return_t memcached_set_sasl_auth_data(memcached_st *ptr,
|
|
247
|
+
const char *username,
|
|
248
|
+
const char *password)
|
|
249
|
+
{
|
|
250
|
+
if (ptr == NULL || username == NULL ||
|
|
251
|
+
password == NULL || ptr->sasl.callbacks != NULL)
|
|
252
|
+
{
|
|
253
|
+
return MEMCACHED_FAILURE;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
sasl_callback_t *callbacks= libmemcached_calloc(ptr, 4, sizeof(sasl_callback_t));
|
|
257
|
+
size_t password_length= strlen(password);
|
|
258
|
+
size_t username_length= strlen(username);
|
|
259
|
+
char *name= libmemcached_malloc(ptr, username_length +1);
|
|
260
|
+
sasl_secret_t *secret= libmemcached_malloc(ptr, password_length +1 + sizeof(sasl_secret_t));
|
|
261
|
+
|
|
262
|
+
if (callbacks == NULL || name == NULL || secret == NULL)
|
|
263
|
+
{
|
|
264
|
+
libmemcached_free(ptr, callbacks);
|
|
265
|
+
libmemcached_free(ptr, name);
|
|
266
|
+
libmemcached_free(ptr, secret);
|
|
267
|
+
return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
secret->len= password_length;
|
|
271
|
+
memcpy(secret->data, password, password_length);
|
|
272
|
+
secret->data[password_length]= 0;
|
|
273
|
+
|
|
274
|
+
callbacks[0].id= SASL_CB_USER;
|
|
275
|
+
callbacks[0].proc= get_username;
|
|
276
|
+
callbacks[0].context= strncpy(name, username, username_length +1);
|
|
277
|
+
callbacks[1].id= SASL_CB_AUTHNAME;
|
|
278
|
+
callbacks[1].proc= get_username;
|
|
279
|
+
callbacks[1].context= name;
|
|
280
|
+
callbacks[2].id= SASL_CB_PASS;
|
|
281
|
+
callbacks[2].proc= get_password;
|
|
282
|
+
callbacks[2].context= secret;
|
|
283
|
+
callbacks[3].id= SASL_CB_LIST_END;
|
|
284
|
+
|
|
285
|
+
ptr->sasl.callbacks= callbacks;
|
|
286
|
+
ptr->sasl.is_allocated= true;
|
|
287
|
+
|
|
288
|
+
return MEMCACHED_SUCCESS;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
memcached_return_t memcached_destroy_sasl_auth_data(memcached_st *ptr)
|
|
292
|
+
{
|
|
293
|
+
if (ptr == NULL || ptr->sasl.callbacks == NULL)
|
|
294
|
+
{
|
|
295
|
+
return MEMCACHED_FAILURE;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
if (ptr->sasl.is_allocated)
|
|
299
|
+
{
|
|
300
|
+
libmemcached_free(ptr, ptr->sasl.callbacks[0].context);
|
|
301
|
+
libmemcached_free(ptr, ptr->sasl.callbacks[2].context);
|
|
302
|
+
libmemcached_free(ptr, (void*)ptr->sasl.callbacks);
|
|
303
|
+
ptr->sasl.is_allocated= false;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
ptr->sasl.callbacks= NULL;
|
|
307
|
+
|
|
308
|
+
return MEMCACHED_SUCCESS;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
memcached_return_t memcached_clone_sasl(memcached_st *clone, const memcached_st *source)
|
|
312
|
+
{
|
|
313
|
+
|
|
314
|
+
if (source->sasl.callbacks == NULL)
|
|
315
|
+
{
|
|
316
|
+
return MEMCACHED_SUCCESS;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/* Hopefully we are using our own callback mechanisms.. */
|
|
320
|
+
if (source->sasl.callbacks[0].id == SASL_CB_USER &&
|
|
321
|
+
source->sasl.callbacks[0].proc == get_username &&
|
|
322
|
+
source->sasl.callbacks[1].id == SASL_CB_AUTHNAME &&
|
|
323
|
+
source->sasl.callbacks[1].proc == get_username &&
|
|
324
|
+
source->sasl.callbacks[2].id == SASL_CB_PASS &&
|
|
325
|
+
source->sasl.callbacks[2].proc == get_password &&
|
|
326
|
+
source->sasl.callbacks[3].id == SASL_CB_LIST_END)
|
|
327
|
+
{
|
|
328
|
+
sasl_secret_t *secret= source->sasl.callbacks[2].context;
|
|
329
|
+
return memcached_set_sasl_auth_data(clone,
|
|
330
|
+
source->sasl.callbacks[0].context,
|
|
331
|
+
(const char*)secret->data);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/*
|
|
335
|
+
* But we're not. It may work if we know what the user tries to pass
|
|
336
|
+
* into the list, but if we don't know the ID we don't know how to handle
|
|
337
|
+
* the context...
|
|
338
|
+
*/
|
|
339
|
+
size_t total= 0;
|
|
340
|
+
|
|
341
|
+
while (source->sasl.callbacks[total].id != SASL_CB_LIST_END)
|
|
342
|
+
{
|
|
343
|
+
switch (source->sasl.callbacks[total].id)
|
|
344
|
+
{
|
|
345
|
+
case SASL_CB_USER:
|
|
346
|
+
case SASL_CB_AUTHNAME:
|
|
347
|
+
case SASL_CB_PASS:
|
|
348
|
+
break;
|
|
349
|
+
default:
|
|
350
|
+
/* I don't know how to deal with this... */
|
|
351
|
+
return MEMCACHED_NOT_SUPPORTED;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
++total;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
sasl_callback_t *callbacks= libmemcached_calloc(clone, total + 1, sizeof(sasl_callback_t));
|
|
358
|
+
if (callbacks == NULL)
|
|
359
|
+
{
|
|
360
|
+
return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
|
|
361
|
+
}
|
|
362
|
+
memcpy(callbacks, source->sasl.callbacks, (total + 1) * sizeof(sasl_callback_t));
|
|
363
|
+
|
|
364
|
+
/* Now update the context... */
|
|
365
|
+
for (size_t x= 0; x < total; ++x)
|
|
366
|
+
{
|
|
367
|
+
if (callbacks[x].id == SASL_CB_USER || callbacks[x].id == SASL_CB_AUTHNAME)
|
|
368
|
+
{
|
|
369
|
+
callbacks[x].context= libmemcached_malloc(clone, strlen(source->sasl.callbacks[x].context));
|
|
370
|
+
|
|
371
|
+
if (callbacks[x].context == NULL)
|
|
372
|
+
{
|
|
373
|
+
/* Failed to allocate memory, clean up previously allocated memory */
|
|
374
|
+
for (size_t y= 0; y < x; ++y)
|
|
375
|
+
{
|
|
376
|
+
libmemcached_free(clone, clone->sasl.callbacks[y].context);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
libmemcached_free(clone, callbacks);
|
|
380
|
+
return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
|
|
381
|
+
}
|
|
382
|
+
strncpy(callbacks[x].context, source->sasl.callbacks[x].context, sizeof(callbacks[x].context));
|
|
383
|
+
}
|
|
384
|
+
else
|
|
385
|
+
{
|
|
386
|
+
sasl_secret_t *src = source->sasl.callbacks[x].context;
|
|
387
|
+
sasl_secret_t *n = libmemcached_malloc(clone, src->len + 1 + sizeof(*n));
|
|
388
|
+
if (n == NULL)
|
|
389
|
+
{
|
|
390
|
+
/* Failed to allocate memory, clean up previously allocated memory */
|
|
391
|
+
for (size_t y= 0; y < x; ++y)
|
|
392
|
+
{
|
|
393
|
+
libmemcached_free(clone, clone->sasl.callbacks[y].context);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
libmemcached_free(clone, callbacks);
|
|
397
|
+
return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
|
|
398
|
+
}
|
|
399
|
+
memcpy(n, src, src->len + 1 + sizeof(*n));
|
|
400
|
+
callbacks[x].context= n;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
clone->sasl.callbacks= callbacks;
|
|
405
|
+
clone->sasl.is_allocated= true;
|
|
406
|
+
|
|
407
|
+
return MEMCACHED_SUCCESS;
|
|
408
|
+
}
|