+ * 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
OPT_SLAP_NON_BLOCK,
OPT_SLAP_TCP_NODELAY,
OPT_FLUSH,
+ OPT_HASH,
} memcached_options;
#endif /* CLIENT_OPTIONS */
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[])
{
}
memc= memcached_create(NULL);
+ process_hash_option(memc, opt_hash);
servers= memcached_servers_parse(opt_servers);
memcached_free(memc);
- free(opt_servers);
+ if (opt_servers)
+ free(opt_servers);
+ if (opt_hash)
+ free(opt_hash);
return 0;
}
{"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},
};
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);
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;
options_parse(argc, argv);
memc= memcached_create(NULL);
+ process_hash_option(memc, opt_hash);
if (!opt_servers)
{
memcached_free(memc);
- free(opt_servers);
+ if (opt_servers)
+ free(opt_servers);
+ if (opt_hash)
+ free(opt_hash);
return 0;
}
{"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},
};
break;
case OPT_ADD:
opt_method= OPT_ADD;
+ case OPT_HASH:
+ opt_hash= strdup(optarg);
break;
case '?':
/* getopt_long already printed an error message. */
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."
}
memc= memcached_create(NULL);
+ process_hash_option(memc, opt_hash);
servers= memcached_servers_parse(opt_servers);
memcached_server_push(memc, servers);
memcached_free(memc);
- free(opt_servers);
+ if (opt_servers)
+ free(opt_servers);
+ if (opt_hash)
+ free(opt_hash);
return 0;
}
{"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;
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);
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,
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);
+ }
+}
+
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);