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,172 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 2; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
|
2
|
+
#include "config.h"
|
|
3
|
+
#include <stdlib.h>
|
|
4
|
+
#include <inttypes.h>
|
|
5
|
+
#include <time.h>
|
|
6
|
+
#include <stdbool.h>
|
|
7
|
+
#include <string.h>
|
|
8
|
+
#include "storage.h"
|
|
9
|
+
|
|
10
|
+
struct list_entry {
|
|
11
|
+
struct item item;
|
|
12
|
+
struct list_entry *next;
|
|
13
|
+
struct list_entry *prev;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
static struct list_entry *root;
|
|
17
|
+
static uint64_t cas;
|
|
18
|
+
|
|
19
|
+
bool initialize_storage(void)
|
|
20
|
+
{
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
void shutdown_storage(void)
|
|
25
|
+
{
|
|
26
|
+
/* Do nothing */
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
void put_item(struct item* item)
|
|
30
|
+
{
|
|
31
|
+
struct list_entry* entry= (void*)item;
|
|
32
|
+
|
|
33
|
+
update_cas(item);
|
|
34
|
+
|
|
35
|
+
if (root == NULL)
|
|
36
|
+
{
|
|
37
|
+
entry->next= entry->prev= entry;
|
|
38
|
+
}
|
|
39
|
+
else
|
|
40
|
+
{
|
|
41
|
+
entry->prev= root->prev;
|
|
42
|
+
entry->next= root;
|
|
43
|
+
entry->prev->next= entry;
|
|
44
|
+
entry->next->prev= entry;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
root= entry;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
struct item* get_item(const void* key, size_t nkey)
|
|
51
|
+
{
|
|
52
|
+
struct list_entry *walker= root;
|
|
53
|
+
|
|
54
|
+
if (root == NULL)
|
|
55
|
+
{
|
|
56
|
+
return NULL;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
do
|
|
60
|
+
{
|
|
61
|
+
if (((struct item*)walker)->nkey == nkey &&
|
|
62
|
+
memcmp(((struct item*)walker)->key, key, nkey) == 0)
|
|
63
|
+
{
|
|
64
|
+
return (struct item*)walker;
|
|
65
|
+
}
|
|
66
|
+
walker= walker->next;
|
|
67
|
+
} while (walker != root);
|
|
68
|
+
|
|
69
|
+
return NULL;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
struct item* create_item(const void* key, size_t nkey, const void* data,
|
|
73
|
+
size_t size, uint32_t flags, time_t exp)
|
|
74
|
+
{
|
|
75
|
+
struct item* ret= calloc(1, sizeof(struct list_entry));
|
|
76
|
+
|
|
77
|
+
if (ret != NULL)
|
|
78
|
+
{
|
|
79
|
+
ret->key= malloc(nkey);
|
|
80
|
+
if (size > 0)
|
|
81
|
+
{
|
|
82
|
+
ret->data= malloc(size);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (ret->key == NULL || (size > 0 && ret->data == NULL))
|
|
86
|
+
{
|
|
87
|
+
free(ret->key);
|
|
88
|
+
free(ret->data);
|
|
89
|
+
free(ret);
|
|
90
|
+
return NULL;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
memcpy(ret->key, key, nkey);
|
|
94
|
+
if (data != NULL)
|
|
95
|
+
{
|
|
96
|
+
memcpy(ret->data, data, size);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
ret->nkey= nkey;
|
|
100
|
+
ret->size= size;
|
|
101
|
+
ret->flags= flags;
|
|
102
|
+
ret->exp= exp;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return ret;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
bool delete_item(const void* key, size_t nkey)
|
|
109
|
+
{
|
|
110
|
+
struct item* item= get_item(key, nkey);
|
|
111
|
+
bool ret= false;
|
|
112
|
+
|
|
113
|
+
if (item)
|
|
114
|
+
{
|
|
115
|
+
/* remove from linked list */
|
|
116
|
+
struct list_entry *entry= (void*)item;
|
|
117
|
+
|
|
118
|
+
if (entry->next == entry)
|
|
119
|
+
{
|
|
120
|
+
/* Only one object in the list */
|
|
121
|
+
root= NULL;
|
|
122
|
+
}
|
|
123
|
+
else
|
|
124
|
+
{
|
|
125
|
+
/* ensure that we don't loose track of the root, and this will
|
|
126
|
+
* change the start position for the next search ;-) */
|
|
127
|
+
root= entry->next;
|
|
128
|
+
entry->prev->next= entry->next;
|
|
129
|
+
entry->next->prev= entry->prev;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
free(item->key);
|
|
133
|
+
free(item->data);
|
|
134
|
+
free(item);
|
|
135
|
+
ret= true;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return ret;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
void flush(uint32_t when)
|
|
142
|
+
{
|
|
143
|
+
/* FIXME */
|
|
144
|
+
(void)when;
|
|
145
|
+
/* remove the complete linked list */
|
|
146
|
+
if (root == NULL)
|
|
147
|
+
{
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
root->prev->next= NULL;
|
|
152
|
+
while (root != NULL)
|
|
153
|
+
{
|
|
154
|
+
struct item* tmp= (void*)root;
|
|
155
|
+
root= root->next;
|
|
156
|
+
|
|
157
|
+
free(tmp->key);
|
|
158
|
+
free(tmp->data);
|
|
159
|
+
free(tmp);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
void update_cas(struct item* item)
|
|
164
|
+
{
|
|
165
|
+
item->cas= ++cas;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
void release_item(struct item* item)
|
|
169
|
+
{
|
|
170
|
+
(void)item;
|
|
171
|
+
/* EMPTY */
|
|
172
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 2; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
|
2
|
+
#ifndef STORAGE_H
|
|
3
|
+
#define STORAGE_H
|
|
4
|
+
|
|
5
|
+
struct item {
|
|
6
|
+
uint64_t cas;
|
|
7
|
+
void* key;
|
|
8
|
+
size_t nkey;
|
|
9
|
+
void* data;
|
|
10
|
+
size_t size;
|
|
11
|
+
uint32_t flags;
|
|
12
|
+
time_t exp;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
bool initialize_storage(void);
|
|
16
|
+
void shutdown_storage(void);
|
|
17
|
+
|
|
18
|
+
void update_cas(struct item* item);
|
|
19
|
+
void put_item(struct item* item);
|
|
20
|
+
struct item* get_item(const void* key, size_t nkey);
|
|
21
|
+
struct item* create_item(const void* key, size_t nkey, const void *data,
|
|
22
|
+
size_t size, uint32_t flags, time_t exp);
|
|
23
|
+
bool delete_item(const void* key, size_t nkey);
|
|
24
|
+
void flush(uint32_t when);
|
|
25
|
+
void release_item(struct item* item);
|
|
26
|
+
|
|
27
|
+
#endif
|
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 2; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
|
2
|
+
#include <stdlib.h>
|
|
3
|
+
#include <inttypes.h>
|
|
4
|
+
#include <time.h>
|
|
5
|
+
#include <stdbool.h>
|
|
6
|
+
#include <string.h>
|
|
7
|
+
#include <unistd.h>
|
|
8
|
+
#include <assert.h>
|
|
9
|
+
#include <embedded_innodb-1.0/innodb.h>
|
|
10
|
+
|
|
11
|
+
#include "storage.h"
|
|
12
|
+
|
|
13
|
+
const char *tablename= "memcached/items";
|
|
14
|
+
|
|
15
|
+
#define key_col_idx 0
|
|
16
|
+
#define data_col_idx 1
|
|
17
|
+
#define flags_col_idx 2
|
|
18
|
+
#define cas_col_idx 3
|
|
19
|
+
#define exp_col_idx 4
|
|
20
|
+
|
|
21
|
+
static uint64_t cas;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* To avoid cluttering down all the code with error checking I use the
|
|
25
|
+
* following macro. It will execute the statement and verify that the
|
|
26
|
+
* result of the operation is DB_SUCCESS. If any other error code is
|
|
27
|
+
* returned it will print an "assert-like" output and jump to the
|
|
28
|
+
* label error_exit. There I release resources before returning out of
|
|
29
|
+
* the function.
|
|
30
|
+
*
|
|
31
|
+
* @param a the expression to execute
|
|
32
|
+
*
|
|
33
|
+
*/
|
|
34
|
+
#define checked(expression) \
|
|
35
|
+
do { \
|
|
36
|
+
ib_err_t checked_err= expression; \
|
|
37
|
+
if (checked_err != DB_SUCCESS) \
|
|
38
|
+
{ \
|
|
39
|
+
fprintf(stderr, "ERROR: %s at %u: Failed: <%s>\n\t%s\n", \
|
|
40
|
+
__FILE__, __LINE__, #expression, \
|
|
41
|
+
ib_strerror(checked_err)); \
|
|
42
|
+
goto error_exit; \
|
|
43
|
+
} \
|
|
44
|
+
} while (0);
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Create the database schema.
|
|
48
|
+
* @return true if the database schema was created without any problems
|
|
49
|
+
* false otherwise.
|
|
50
|
+
*/
|
|
51
|
+
static bool create_schema(void)
|
|
52
|
+
{
|
|
53
|
+
ib_tbl_sch_t schema= NULL;
|
|
54
|
+
ib_idx_sch_t dbindex= NULL;
|
|
55
|
+
|
|
56
|
+
if (ib_database_create("memcached") != IB_TRUE)
|
|
57
|
+
{
|
|
58
|
+
fprintf(stderr, "Failed to create database\n");
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
ib_trx_t transaction= ib_trx_begin(IB_TRX_SERIALIZABLE);
|
|
63
|
+
ib_id_t table_id;
|
|
64
|
+
|
|
65
|
+
checked(ib_table_schema_create(tablename, &schema, IB_TBL_COMPACT, 0));
|
|
66
|
+
checked(ib_table_schema_add_col(schema, "key", IB_BLOB,
|
|
67
|
+
IB_COL_NOT_NULL, 0, 32767));
|
|
68
|
+
checked(ib_table_schema_add_col(schema, "data", IB_BLOB,
|
|
69
|
+
IB_COL_NONE, 0, 1024*1024));
|
|
70
|
+
checked(ib_table_schema_add_col(schema, "flags", IB_INT,
|
|
71
|
+
IB_COL_UNSIGNED, 0, 4));
|
|
72
|
+
checked(ib_table_schema_add_col(schema, "cas", IB_INT,
|
|
73
|
+
IB_COL_UNSIGNED, 0, 8));
|
|
74
|
+
checked(ib_table_schema_add_col(schema, "exp", IB_INT,
|
|
75
|
+
IB_COL_UNSIGNED, 0, 4));
|
|
76
|
+
checked(ib_table_schema_add_index(schema, "PRIMARY_KEY", &dbindex));
|
|
77
|
+
checked(ib_index_schema_add_col(dbindex, "key", 0));
|
|
78
|
+
checked(ib_index_schema_set_clustered(dbindex));
|
|
79
|
+
checked(ib_schema_lock_exclusive(transaction));
|
|
80
|
+
checked(ib_table_create(transaction, schema, &table_id));
|
|
81
|
+
checked(ib_trx_commit(transaction));
|
|
82
|
+
ib_table_schema_delete(schema);
|
|
83
|
+
|
|
84
|
+
return true;
|
|
85
|
+
|
|
86
|
+
error_exit:
|
|
87
|
+
/* @todo release resources! */
|
|
88
|
+
{
|
|
89
|
+
ib_err_t error= ib_trx_rollback(transaction);
|
|
90
|
+
if (error != DB_SUCCESS)
|
|
91
|
+
fprintf(stderr, "Failed to roll back the transaction:\n\t%s\n",
|
|
92
|
+
ib_strerror(error));
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Store an item into the database. Update the CAS id on the item before
|
|
99
|
+
* storing it in the database.
|
|
100
|
+
*
|
|
101
|
+
* @param trx the transaction to use
|
|
102
|
+
* @param item the item to store
|
|
103
|
+
* @return true if we can go ahead and commit the transaction, false otherwise
|
|
104
|
+
*/
|
|
105
|
+
static bool do_put_item(ib_trx_t trx, struct item* item)
|
|
106
|
+
{
|
|
107
|
+
update_cas(item);
|
|
108
|
+
|
|
109
|
+
ib_crsr_t cursor= NULL;
|
|
110
|
+
ib_tpl_t tuple= NULL;
|
|
111
|
+
bool retval= false;
|
|
112
|
+
|
|
113
|
+
checked(ib_cursor_open_table(tablename, trx, &cursor));
|
|
114
|
+
checked(ib_cursor_lock(cursor, IB_LOCK_X));
|
|
115
|
+
tuple= ib_clust_read_tuple_create(cursor);
|
|
116
|
+
|
|
117
|
+
checked(ib_col_set_value(tuple, key_col_idx, item->key, item->nkey));
|
|
118
|
+
checked(ib_col_set_value(tuple, data_col_idx, item->data, item->size));
|
|
119
|
+
checked(ib_tuple_write_u32(tuple, flags_col_idx, item->flags));
|
|
120
|
+
checked(ib_tuple_write_u64(tuple, cas_col_idx, item->cas));
|
|
121
|
+
checked(ib_tuple_write_u32(tuple, exp_col_idx, (ib_u32_t)item->exp));
|
|
122
|
+
checked(ib_cursor_insert_row(cursor, tuple));
|
|
123
|
+
|
|
124
|
+
retval= true;
|
|
125
|
+
/* Release resources: */
|
|
126
|
+
/* FALLTHROUGH */
|
|
127
|
+
|
|
128
|
+
error_exit:
|
|
129
|
+
if (tuple != NULL)
|
|
130
|
+
ib_tuple_delete(tuple);
|
|
131
|
+
|
|
132
|
+
ib_err_t currsor_error;
|
|
133
|
+
if (cursor != NULL)
|
|
134
|
+
currsor_error= ib_cursor_close(cursor);
|
|
135
|
+
|
|
136
|
+
return retval;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Try to locate an item in the database. Return a cursor and the tuple to
|
|
141
|
+
* the item if I found it in the database.
|
|
142
|
+
*
|
|
143
|
+
* @param trx the transaction to use
|
|
144
|
+
* @param key the key of the item to look up
|
|
145
|
+
* @param nkey the size of the key
|
|
146
|
+
* @param cursor where to store the cursor (OUT)
|
|
147
|
+
* @param tuple where to store the tuple (OUT)
|
|
148
|
+
* @return true if I found the object, false otherwise
|
|
149
|
+
*/
|
|
150
|
+
static bool do_locate_item(ib_trx_t trx,
|
|
151
|
+
const void* key,
|
|
152
|
+
size_t nkey,
|
|
153
|
+
ib_crsr_t *cursor)
|
|
154
|
+
{
|
|
155
|
+
int res;
|
|
156
|
+
ib_tpl_t tuple= NULL;
|
|
157
|
+
|
|
158
|
+
*cursor= NULL;
|
|
159
|
+
|
|
160
|
+
checked(ib_cursor_open_table(tablename, trx, cursor));
|
|
161
|
+
tuple= ib_clust_search_tuple_create(*cursor);
|
|
162
|
+
if (tuple == NULL)
|
|
163
|
+
{
|
|
164
|
+
fprintf(stderr, "Failed to allocate tuple object\n");
|
|
165
|
+
goto error_exit;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
checked(ib_col_set_value(tuple, key_col_idx, key, nkey));
|
|
169
|
+
ib_err_t err= ib_cursor_moveto(*cursor, tuple, IB_CUR_GE, &res);
|
|
170
|
+
|
|
171
|
+
if (err == DB_SUCCESS && res == 0)
|
|
172
|
+
{
|
|
173
|
+
ib_tuple_delete(tuple);
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
else if (err != DB_SUCCESS &&
|
|
177
|
+
err != DB_RECORD_NOT_FOUND &&
|
|
178
|
+
err != DB_END_OF_INDEX)
|
|
179
|
+
{
|
|
180
|
+
fprintf(stderr, "ERROR: ib_cursor_moveto(): %s\n", ib_strerror(err));
|
|
181
|
+
}
|
|
182
|
+
/* FALLTHROUGH */
|
|
183
|
+
error_exit:
|
|
184
|
+
if (tuple != NULL)
|
|
185
|
+
ib_tuple_delete(tuple);
|
|
186
|
+
|
|
187
|
+
ib_err_t cursor_error;
|
|
188
|
+
if (*cursor != NULL)
|
|
189
|
+
cursor_error= ib_cursor_close(*cursor);
|
|
190
|
+
|
|
191
|
+
*cursor= NULL;
|
|
192
|
+
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Try to get an item from the database
|
|
198
|
+
*
|
|
199
|
+
* @param trx the transaction to use
|
|
200
|
+
* @param key the key to get
|
|
201
|
+
* @param nkey the lenght of the key
|
|
202
|
+
* @return a pointer to the item if I found it in the database
|
|
203
|
+
*/
|
|
204
|
+
static struct item* do_get_item(ib_trx_t trx, const void* key, size_t nkey)
|
|
205
|
+
{
|
|
206
|
+
ib_crsr_t cursor= NULL;
|
|
207
|
+
ib_tpl_t tuple= NULL;
|
|
208
|
+
struct item* retval= NULL;
|
|
209
|
+
|
|
210
|
+
if (do_locate_item(trx, key, nkey, &cursor))
|
|
211
|
+
{
|
|
212
|
+
tuple= ib_clust_read_tuple_create(cursor);
|
|
213
|
+
if (tuple == NULL)
|
|
214
|
+
{
|
|
215
|
+
fprintf(stderr, "Failed to create read tuple\n");
|
|
216
|
+
goto error_exit;
|
|
217
|
+
}
|
|
218
|
+
checked(ib_cursor_read_row(cursor, tuple));
|
|
219
|
+
ib_col_meta_t meta;
|
|
220
|
+
ib_ulint_t datalen= ib_col_get_meta(tuple, data_col_idx, &meta);
|
|
221
|
+
ib_ulint_t flaglen= ib_col_get_meta(tuple, flags_col_idx, &meta);
|
|
222
|
+
ib_ulint_t caslen= ib_col_get_meta(tuple, cas_col_idx, &meta);
|
|
223
|
+
ib_ulint_t explen= ib_col_get_meta(tuple, exp_col_idx, &meta);
|
|
224
|
+
const void *dataptr= ib_col_get_value(tuple, data_col_idx);
|
|
225
|
+
|
|
226
|
+
retval= create_item(key, nkey, dataptr, datalen, 0, 0);
|
|
227
|
+
if (retval == NULL)
|
|
228
|
+
{
|
|
229
|
+
fprintf(stderr, "Failed to allocate memory\n");
|
|
230
|
+
goto error_exit;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (flaglen != 0)
|
|
234
|
+
{
|
|
235
|
+
ib_u32_t val;
|
|
236
|
+
checked(ib_tuple_read_u32(tuple, flags_col_idx, &val));
|
|
237
|
+
retval->flags= (uint32_t)val;
|
|
238
|
+
}
|
|
239
|
+
if (caslen != 0)
|
|
240
|
+
{
|
|
241
|
+
ib_u64_t val;
|
|
242
|
+
checked(ib_tuple_read_u64(tuple, cas_col_idx, &val));
|
|
243
|
+
retval->cas= (uint64_t)val;
|
|
244
|
+
}
|
|
245
|
+
if (explen != 0)
|
|
246
|
+
{
|
|
247
|
+
ib_u32_t val;
|
|
248
|
+
checked(ib_tuple_read_u32(tuple, exp_col_idx, &val));
|
|
249
|
+
retval->exp= (time_t)val;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/* Release resources */
|
|
254
|
+
/* FALLTHROUGH */
|
|
255
|
+
|
|
256
|
+
error_exit:
|
|
257
|
+
if (tuple != NULL)
|
|
258
|
+
ib_tuple_delete(tuple);
|
|
259
|
+
|
|
260
|
+
ib_err_t cursor_error;
|
|
261
|
+
if (cursor != NULL)
|
|
262
|
+
cursor_error= ib_cursor_close(cursor);
|
|
263
|
+
|
|
264
|
+
return retval;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Delete an item from the cache
|
|
269
|
+
* @param trx the transaction to use
|
|
270
|
+
* @param key the key of the item to delete
|
|
271
|
+
* @param nkey the length of the key
|
|
272
|
+
* @return true if we should go ahead and commit the transaction
|
|
273
|
+
* or false if we should roll back (if the key didn't exists)
|
|
274
|
+
*/
|
|
275
|
+
static bool do_delete_item(ib_trx_t trx, const void* key, size_t nkey) {
|
|
276
|
+
ib_crsr_t cursor= NULL;
|
|
277
|
+
bool retval= false;
|
|
278
|
+
|
|
279
|
+
if (do_locate_item(trx, key, nkey, &cursor))
|
|
280
|
+
{
|
|
281
|
+
checked(ib_cursor_lock(cursor, IB_LOCK_X));
|
|
282
|
+
checked(ib_cursor_delete_row(cursor));
|
|
283
|
+
retval= true;
|
|
284
|
+
}
|
|
285
|
+
/* Release resources */
|
|
286
|
+
/* FALLTHROUGH */
|
|
287
|
+
|
|
288
|
+
error_exit:
|
|
289
|
+
if (cursor != NULL)
|
|
290
|
+
{
|
|
291
|
+
ib_err_t cursor_error;
|
|
292
|
+
cursor_error= ib_cursor_close(cursor);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return retval;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
/****************************************************************************
|
|
300
|
+
* External interface
|
|
301
|
+
***************************************************************************/
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Initialize the database storage
|
|
305
|
+
* @return true if the database was initialized successfully, false otherwise
|
|
306
|
+
*/
|
|
307
|
+
bool initialize_storage(void)
|
|
308
|
+
{
|
|
309
|
+
ib_err_t error;
|
|
310
|
+
ib_id_t tid;
|
|
311
|
+
|
|
312
|
+
checked(ib_init());
|
|
313
|
+
checked(ib_cfg_set_text("data_home_dir", "/tmp/memcached_light"));
|
|
314
|
+
checked(ib_cfg_set_text("log_group_home_dir", "/tmp/memcached_light"));
|
|
315
|
+
checked(ib_cfg_set_bool_on("file_per_table"));
|
|
316
|
+
checked(ib_startup("barracuda"));
|
|
317
|
+
|
|
318
|
+
/* check to see if the table exists or if we should create the schema */
|
|
319
|
+
error= ib_table_get_id(tablename, &tid);
|
|
320
|
+
if (error == DB_TABLE_NOT_FOUND)
|
|
321
|
+
{
|
|
322
|
+
if (!create_schema())
|
|
323
|
+
{
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else if (error != DB_SUCCESS)
|
|
328
|
+
{
|
|
329
|
+
fprintf(stderr, "Failed to get table id: %s\n", ib_strerror(error));
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return true;
|
|
334
|
+
|
|
335
|
+
error_exit:
|
|
336
|
+
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Shut down this storage engine
|
|
342
|
+
*/
|
|
343
|
+
void shutdown_storage(void)
|
|
344
|
+
{
|
|
345
|
+
checked(ib_shutdown(IB_SHUTDOWN_NORMAL));
|
|
346
|
+
error_exit:
|
|
347
|
+
;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Store an item in the databse
|
|
352
|
+
*
|
|
353
|
+
* @param item the item to store
|
|
354
|
+
*/
|
|
355
|
+
void put_item(struct item* item)
|
|
356
|
+
{
|
|
357
|
+
ib_trx_t transaction= ib_trx_begin(IB_TRX_SERIALIZABLE);
|
|
358
|
+
if (do_put_item(transaction, item))
|
|
359
|
+
{
|
|
360
|
+
ib_err_t error= ib_trx_commit(transaction);
|
|
361
|
+
if (error != DB_SUCCESS)
|
|
362
|
+
{
|
|
363
|
+
fprintf(stderr, "Failed to store key:\n\t%s\n",
|
|
364
|
+
ib_strerror(error));
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
else
|
|
368
|
+
{
|
|
369
|
+
ib_err_t error= ib_trx_rollback(transaction);
|
|
370
|
+
if (error != DB_SUCCESS)
|
|
371
|
+
fprintf(stderr, "Failed to roll back the transaction:\n\t%s\n",
|
|
372
|
+
ib_strerror(error));
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Get an item from the engine
|
|
378
|
+
* @param key the key to grab
|
|
379
|
+
* @param nkey number of bytes in the key
|
|
380
|
+
* @return pointer to the item if found
|
|
381
|
+
*/
|
|
382
|
+
struct item* get_item(const void* key, size_t nkey)
|
|
383
|
+
{
|
|
384
|
+
ib_trx_t transaction= ib_trx_begin(IB_TRX_SERIALIZABLE);
|
|
385
|
+
struct item* ret= do_get_item(transaction, key, nkey);
|
|
386
|
+
ib_err_t error= ib_trx_rollback(transaction);
|
|
387
|
+
|
|
388
|
+
if (error != DB_SUCCESS)
|
|
389
|
+
fprintf(stderr, "Failed to roll back the transaction:\n\t%s\n",
|
|
390
|
+
ib_strerror(error));
|
|
391
|
+
|
|
392
|
+
return ret;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* Create an item structure and initialize it with the content
|
|
397
|
+
*
|
|
398
|
+
* @param key the key for the item
|
|
399
|
+
* @param nkey the number of bytes in the key
|
|
400
|
+
* @param data pointer to the value for the item (may be NULL)
|
|
401
|
+
* @param size the size of the data
|
|
402
|
+
* @param flags the flags to store with the data
|
|
403
|
+
* @param exp the expiry time for the item
|
|
404
|
+
* @return pointer to an initialized item object or NULL if allocation failed
|
|
405
|
+
*/
|
|
406
|
+
struct item* create_item(const void* key, size_t nkey, const void* data,
|
|
407
|
+
size_t size, uint32_t flags, time_t exp)
|
|
408
|
+
{
|
|
409
|
+
struct item* ret= calloc(1, sizeof(*ret));
|
|
410
|
+
if (ret != NULL)
|
|
411
|
+
{
|
|
412
|
+
ret->key= malloc(nkey);
|
|
413
|
+
if (size > 0)
|
|
414
|
+
{
|
|
415
|
+
ret->data= malloc(size);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
if (ret->key == NULL || (size > 0 && ret->data == NULL))
|
|
419
|
+
{
|
|
420
|
+
free(ret->key);
|
|
421
|
+
free(ret->data);
|
|
422
|
+
free(ret);
|
|
423
|
+
return NULL;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
memcpy(ret->key, key, nkey);
|
|
427
|
+
if (data != NULL)
|
|
428
|
+
{
|
|
429
|
+
memcpy(ret->data, data, size);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
ret->nkey= nkey;
|
|
433
|
+
ret->size= size;
|
|
434
|
+
ret->flags= flags;
|
|
435
|
+
ret->exp= exp;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
return ret;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* Delete an item from the cache
|
|
443
|
+
* @param key the key of the item to delete
|
|
444
|
+
* @param nkey the length of the key
|
|
445
|
+
* @return true if the item was deleted from the cache
|
|
446
|
+
*/
|
|
447
|
+
bool delete_item(const void* key, size_t nkey) {
|
|
448
|
+
ib_trx_t transaction= ib_trx_begin(IB_TRX_REPEATABLE_READ);
|
|
449
|
+
|
|
450
|
+
bool ret= do_delete_item(transaction, key, nkey);
|
|
451
|
+
|
|
452
|
+
if (ret)
|
|
453
|
+
{
|
|
454
|
+
/* object found. commit transaction */
|
|
455
|
+
ib_err_t error= ib_trx_commit(transaction);
|
|
456
|
+
if (error != DB_SUCCESS)
|
|
457
|
+
{
|
|
458
|
+
fprintf(stderr, "Failed to delete key:\n\t%s\n",
|
|
459
|
+
ib_strerror(error));
|
|
460
|
+
ret= false;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
else
|
|
464
|
+
{
|
|
465
|
+
ib_err_t error= ib_trx_rollback(transaction);
|
|
466
|
+
if (error != DB_SUCCESS)
|
|
467
|
+
fprintf(stderr, "Failed to roll back the transaction:\n\t%s\n",
|
|
468
|
+
ib_strerror(error));
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
return ret;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
/**
|
|
475
|
+
* Flush the entire cache
|
|
476
|
+
* @param when when the cache should be flushed (0 == immediately)
|
|
477
|
+
*/
|
|
478
|
+
void flush(uint32_t when __attribute__((unused)))
|
|
479
|
+
{
|
|
480
|
+
/* @TODO implement support for when != 0 */
|
|
481
|
+
ib_trx_t transaction= ib_trx_begin(IB_TRX_REPEATABLE_READ);
|
|
482
|
+
ib_crsr_t cursor= NULL;
|
|
483
|
+
ib_err_t err= DB_SUCCESS;
|
|
484
|
+
|
|
485
|
+
checked(ib_cursor_open_table(tablename, transaction, &cursor));
|
|
486
|
+
checked(ib_cursor_first(cursor));
|
|
487
|
+
checked(ib_cursor_lock(cursor, IB_LOCK_X));
|
|
488
|
+
|
|
489
|
+
do
|
|
490
|
+
{
|
|
491
|
+
checked(ib_cursor_delete_row(cursor));
|
|
492
|
+
} while ((err= ib_cursor_next(cursor)) == DB_SUCCESS);
|
|
493
|
+
|
|
494
|
+
if (err != DB_END_OF_INDEX)
|
|
495
|
+
{
|
|
496
|
+
fprintf(stderr, "Failed to flush the cache: %s\n", ib_strerror(err));
|
|
497
|
+
goto error_exit;
|
|
498
|
+
}
|
|
499
|
+
ib_err_t cursor_error;
|
|
500
|
+
cursor_error= ib_cursor_close(cursor);
|
|
501
|
+
cursor= NULL;
|
|
502
|
+
checked(ib_trx_commit(transaction));
|
|
503
|
+
return;
|
|
504
|
+
|
|
505
|
+
error_exit:
|
|
506
|
+
if (cursor != NULL)
|
|
507
|
+
{
|
|
508
|
+
cursor_error= ib_cursor_close(cursor);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
ib_err_t error= ib_trx_rollback(transaction);
|
|
512
|
+
if (error != DB_SUCCESS)
|
|
513
|
+
fprintf(stderr, "Failed to roll back the transaction:\n\t%s\n",
|
|
514
|
+
ib_strerror(error));
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
/**
|
|
518
|
+
* Update the cas ID in the item structure
|
|
519
|
+
* @param item the item to update
|
|
520
|
+
*/
|
|
521
|
+
void update_cas(struct item* item)
|
|
522
|
+
{
|
|
523
|
+
item->cas= ++cas;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* Release all the resources allocated by the item
|
|
528
|
+
* @param item the item to release
|
|
529
|
+
*/
|
|
530
|
+
void release_item(struct item* item)
|
|
531
|
+
{
|
|
532
|
+
free(item->key);
|
|
533
|
+
free(item->data);
|
|
534
|
+
free(item);
|
|
535
|
+
}
|