From: Date: Wed, 9 Jan 2008 16:08:44 +0000 (-0800) Subject: Patch by Marc Rossi to add --hash to command line tools. X-Git-Tag: 0.13~5^2 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=09ee2606fece278264ef65660e12c606f5936347;p=m6w6%2Flibmemcached Patch by Marc Rossi to add --hash to command line tools. Fixed bug in freeing of memory on exit (it could be causing crashes on end of program). --- diff --git a/ChangeLog b/ChangeLog index 75f3362c..2de07f39 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,4 @@ + * Patch from Marc Rossi to add --hash option for memcp, memrm, and memcat. * Toru Maesaka patch for stats mismatch * Fix for when CRC return 0 * Fixed uint16_t issues around flags. Turns out the documentation on the diff --git a/src/client_options.h b/src/client_options.h index 9242884e..b7ba5a96 100644 --- a/src/client_options.h +++ b/src/client_options.h @@ -21,6 +21,7 @@ typedef enum { OPT_SLAP_NON_BLOCK, OPT_SLAP_TCP_NODELAY, OPT_FLUSH, + OPT_HASH, } memcached_options; #endif /* CLIENT_OPTIONS */ diff --git a/src/memcat.c b/src/memcat.c index 4aaffb95..2db0c8ee 100644 --- a/src/memcat.c +++ b/src/memcat.c @@ -16,7 +16,8 @@ void options_parse(int argc, char *argv[]); static int opt_verbose= 0; static int opt_displayflag= 0; -static char *opt_servers; +static char *opt_servers= NULL; +static char *opt_hash= NULL; int main(int argc, char *argv[]) { @@ -40,6 +41,7 @@ int main(int argc, char *argv[]) } memc= memcached_create(NULL); + process_hash_option(memc, opt_hash); servers= memcached_servers_parse(opt_servers); @@ -80,7 +82,10 @@ int main(int argc, char *argv[]) memcached_free(memc); - free(opt_servers); + if (opt_servers) + free(opt_servers); + if (opt_hash) + free(opt_hash); return 0; } @@ -104,6 +109,7 @@ void options_parse(int argc, char *argv[]) {"debug", no_argument, &opt_verbose, OPT_DEBUG}, {"servers", required_argument, NULL, OPT_SERVERS}, {"flag", no_argument, &opt_displayflag, OPT_FLAG}, + {"hash", required_argument, NULL, OPT_HASH}, {0, 0, 0, 0}, }; @@ -130,6 +136,9 @@ void options_parse(int argc, char *argv[]) case OPT_SERVERS: /* --servers or -s */ opt_servers= strdup(optarg); break; + case OPT_HASH: + opt_hash= strdup(optarg); + break; case '?': /* getopt_long already printed an error message. */ exit(1); diff --git a/src/memcp.c b/src/memcp.c index f1054ea9..57d0a70d 100644 --- a/src/memcp.c +++ b/src/memcp.c @@ -24,6 +24,7 @@ void options_parse(int argc, char *argv[]); static int opt_verbose= 0; static char *opt_servers= NULL; +static char *opt_hash= NULL; static int opt_method= OPT_SET; static uint32_t opt_flags= 0; static time_t opt_expires= 0; @@ -37,6 +38,7 @@ int main(int argc, char *argv[]) options_parse(argc, argv); memc= memcached_create(NULL); + process_hash_option(memc, opt_hash); if (!opt_servers) { @@ -131,7 +133,10 @@ int main(int argc, char *argv[]) memcached_free(memc); - free(opt_servers); + if (opt_servers) + free(opt_servers); + if (opt_hash) + free(opt_hash); return 0; } @@ -158,6 +163,7 @@ void options_parse(int argc, char *argv[]) {"set", no_argument, NULL, OPT_SET}, {"add", no_argument, NULL, OPT_ADD}, {"replace", no_argument, NULL, OPT_REPLACE}, + {"hash", required_argument, NULL, OPT_HASH}, {0, 0, 0, 0}, }; @@ -200,6 +206,8 @@ void options_parse(int argc, char *argv[]) break; case OPT_ADD: opt_method= OPT_ADD; + case OPT_HASH: + opt_hash= strdup(optarg); break; case '?': /* getopt_long already printed an error message. */ diff --git a/src/memrm.c b/src/memrm.c index 09f58ea4..2a79933a 100644 --- a/src/memrm.c +++ b/src/memrm.c @@ -9,6 +9,7 @@ static int opt_verbose= 0; static time_t opt_expire= 0; static char *opt_servers= NULL; +static char *opt_hash= NULL; #define PROGRAM_NAME "memrm" #define PROGRAM_DESCRIPTION "Erase a key or set of keys from a memcached cluster." @@ -35,6 +36,7 @@ int main(int argc, char *argv[]) } memc= memcached_create(NULL); + process_hash_option(memc, opt_hash); servers= memcached_servers_parse(opt_servers); memcached_server_push(memc, servers); @@ -60,7 +62,10 @@ int main(int argc, char *argv[]) memcached_free(memc); - free(opt_servers); + if (opt_servers) + free(opt_servers); + if (opt_hash) + free(opt_hash); return 0; } @@ -81,6 +86,7 @@ void options_parse(int argc, char *argv[]) {"debug", no_argument, &opt_verbose, OPT_DEBUG}, {"servers", required_argument, NULL, OPT_SERVERS}, {"expire", required_argument, NULL, OPT_EXPIRE}, + {"hash", required_argument, NULL, OPT_HASH}, {0, 0, 0, 0}, }; int option_index= 0; @@ -112,6 +118,9 @@ void options_parse(int argc, char *argv[]) case OPT_EXPIRE: /* --expire */ opt_expire= (time_t)strtoll(optarg, (char **)NULL, 10); break; + case OPT_HASH: + opt_hash= strdup(optarg); + break; case '?': /* getopt_long already printed an error message. */ exit(1); diff --git a/src/utilities.c b/src/utilities.c index 1dfd60b2..2094d218 100644 --- a/src/utilities.c +++ b/src/utilities.c @@ -42,9 +42,11 @@ char *lookup_help(memcached_options option) case OPT_SLAP_NON_BLOCK: return("Set TCP up to use non-blocking IO."); case OPT_SLAP_TCP_NODELAY: return("Set TCP socket up to use nodelay."); case OPT_FLUSH: return("Flush servers before running tests."); + case OPT_HASH: return("Select hash type."); }; - return "forgot to document this one :)"; + WATCHPOINT_ASSERT(0); + return "forgot to document this function :)"; } void help_command(char *command_name, char *description, @@ -70,3 +72,38 @@ void help_command(char *command_name, char *description, printf("\n"); exit(0); } + +void process_hash_option(memcached_st *memc, char *opt_hash) +{ + unsigned int set; + memcached_return rc; + + if (opt_hash == NULL) + return; + + if (!strcasecmp(opt_hash, "CRC")) + set= MEMCACHED_HASH_CRC; + else if (!strcasecmp(opt_hash, "FNV1_64")) + set= MEMCACHED_HASH_FNV1_64; + else if (!strcasecmp(opt_hash, "FNV1A_64")) + set= MEMCACHED_HASH_FNV1A_64; + else if (!strcasecmp(opt_hash, "FNV1_32")) + set= MEMCACHED_HASH_FNV1_32; + else if (!strcasecmp(opt_hash, "FNV1A_32")) + set= MEMCACHED_HASH_FNV1A_32; + else if (!strcasecmp(opt_hash, "KETAMA")) + set= MEMCACHED_HASH_KETAMA; + else + { + fprintf(stderr, "hash: type not recognized %s\n", opt_hash); + exit(1); + } + + rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &set); + if (rc != MEMCACHED_SUCCESS) + { + fprintf(stderr, "hash: memcache error %s\n", memcached_strerror(memc, rc)); + exit(1); + } +} + diff --git a/src/utilities.h b/src/utilities.h index 1fba99bf..cdec1ae6 100644 --- a/src/utilities.h +++ b/src/utilities.h @@ -28,3 +28,4 @@ void version_command(char *command_name); void help_command(char *command_name, char *description, const struct option *long_options, memcached_programs_help_st *options); +void process_hash_option(memcached_st *memc, char *opt_hash);