mirror of
https://github.com/fluencelabs/redis
synced 2025-05-04 23:12:18 +00:00
redis-cli --eval implemented
This commit is contained in:
parent
da33edbc58
commit
e2f313899b
@ -69,6 +69,7 @@ static struct config {
|
|||||||
int raw_output; /* output mode per command */
|
int raw_output; /* output mode per command */
|
||||||
sds mb_delim;
|
sds mb_delim;
|
||||||
char prompt[32];
|
char prompt[32];
|
||||||
|
char *eval;
|
||||||
} config;
|
} config;
|
||||||
|
|
||||||
static void usage();
|
static void usage();
|
||||||
@ -573,8 +574,7 @@ static int parseOptions(int argc, char **argv) {
|
|||||||
|
|
||||||
if (!strcmp(argv[i],"-h") && !lastarg) {
|
if (!strcmp(argv[i],"-h") && !lastarg) {
|
||||||
sdsfree(config.hostip);
|
sdsfree(config.hostip);
|
||||||
config.hostip = sdsnew(argv[i+1]);
|
config.hostip = sdsnew(argv[++i]);
|
||||||
i++;
|
|
||||||
} else if (!strcmp(argv[i],"-h") && lastarg) {
|
} else if (!strcmp(argv[i],"-h") && lastarg) {
|
||||||
usage();
|
usage();
|
||||||
} else if (!strcmp(argv[i],"--help")) {
|
} else if (!strcmp(argv[i],"--help")) {
|
||||||
@ -582,34 +582,29 @@ static int parseOptions(int argc, char **argv) {
|
|||||||
} else if (!strcmp(argv[i],"-x")) {
|
} else if (!strcmp(argv[i],"-x")) {
|
||||||
config.stdinarg = 1;
|
config.stdinarg = 1;
|
||||||
} else if (!strcmp(argv[i],"-p") && !lastarg) {
|
} else if (!strcmp(argv[i],"-p") && !lastarg) {
|
||||||
config.hostport = atoi(argv[i+1]);
|
config.hostport = atoi(argv[++i]);
|
||||||
i++;
|
|
||||||
} else if (!strcmp(argv[i],"-s") && !lastarg) {
|
} else if (!strcmp(argv[i],"-s") && !lastarg) {
|
||||||
config.hostsocket = argv[i+1];
|
config.hostsocket = argv[++i];
|
||||||
i++;
|
|
||||||
} else if (!strcmp(argv[i],"-r") && !lastarg) {
|
} else if (!strcmp(argv[i],"-r") && !lastarg) {
|
||||||
config.repeat = strtoll(argv[i+1],NULL,10);
|
config.repeat = strtoll(argv[++i],NULL,10);
|
||||||
i++;
|
|
||||||
} else if (!strcmp(argv[i],"-i") && !lastarg) {
|
} else if (!strcmp(argv[i],"-i") && !lastarg) {
|
||||||
double seconds = atof(argv[i+1]);
|
double seconds = atof(argv[++i]);
|
||||||
config.interval = seconds*1000000;
|
config.interval = seconds*1000000;
|
||||||
i++;
|
|
||||||
} else if (!strcmp(argv[i],"-n") && !lastarg) {
|
} else if (!strcmp(argv[i],"-n") && !lastarg) {
|
||||||
config.dbnum = atoi(argv[i+1]);
|
config.dbnum = atoi(argv[++i]);
|
||||||
i++;
|
|
||||||
} else if (!strcmp(argv[i],"-a") && !lastarg) {
|
} else if (!strcmp(argv[i],"-a") && !lastarg) {
|
||||||
config.auth = argv[i+1];
|
config.auth = argv[++i];
|
||||||
i++;
|
|
||||||
} else if (!strcmp(argv[i],"--raw")) {
|
} else if (!strcmp(argv[i],"--raw")) {
|
||||||
config.raw_output = 1;
|
config.raw_output = 1;
|
||||||
} else if (!strcmp(argv[i],"--latency")) {
|
} else if (!strcmp(argv[i],"--latency")) {
|
||||||
config.latency_mode = 1;
|
config.latency_mode = 1;
|
||||||
|
} else if (!strcmp(argv[i],"--eval") && !lastarg) {
|
||||||
|
config.eval = argv[++i];
|
||||||
} else if (!strcmp(argv[i],"-c")) {
|
} else if (!strcmp(argv[i],"-c")) {
|
||||||
config.cluster_mode = 1;
|
config.cluster_mode = 1;
|
||||||
} else if (!strcmp(argv[i],"-d") && !lastarg) {
|
} else if (!strcmp(argv[i],"-d") && !lastarg) {
|
||||||
sdsfree(config.mb_delim);
|
sdsfree(config.mb_delim);
|
||||||
config.mb_delim = sdsnew(argv[i+1]);
|
config.mb_delim = sdsnew(argv[++i]);
|
||||||
i++;
|
|
||||||
} else if (!strcmp(argv[i],"-v") || !strcmp(argv[i], "--version")) {
|
} else if (!strcmp(argv[i],"-v") || !strcmp(argv[i], "--version")) {
|
||||||
sds version = cliVersion();
|
sds version = cliVersion();
|
||||||
printf("redis-cli %s\n", version);
|
printf("redis-cli %s\n", version);
|
||||||
@ -658,6 +653,7 @@ static void usage() {
|
|||||||
" -c Enable cluster mode (follow -ASK and -MOVED redirections)\n"
|
" -c Enable cluster mode (follow -ASK and -MOVED redirections)\n"
|
||||||
" --raw Use raw formatting for replies (default when STDOUT is not a tty)\n"
|
" --raw Use raw formatting for replies (default when STDOUT is not a tty)\n"
|
||||||
" --latency Enter a special mode continuously sampling latency.\n"
|
" --latency Enter a special mode continuously sampling latency.\n"
|
||||||
|
" --eval <file> Send an EVAL command using the Lua script at <file>.\n"
|
||||||
" --help Output this help and exit\n"
|
" --help Output this help and exit\n"
|
||||||
" --version Output version and exit\n"
|
" --version Output version and exit\n"
|
||||||
"\n"
|
"\n"
|
||||||
@ -666,6 +662,8 @@ static void usage() {
|
|||||||
" redis-cli get mypasswd\n"
|
" redis-cli get mypasswd\n"
|
||||||
" redis-cli -r 100 lpush mylist x\n"
|
" redis-cli -r 100 lpush mylist x\n"
|
||||||
" redis-cli -r 100 -i 1 info | grep used_memory_human:\n"
|
" redis-cli -r 100 -i 1 info | grep used_memory_human:\n"
|
||||||
|
" redis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3\n"
|
||||||
|
" (Note: when using --eval the comma separates KEYS[] from ARGV[] items)\n"
|
||||||
"\n"
|
"\n"
|
||||||
"When no command is given, redis-cli starts in interactive mode.\n"
|
"When no command is given, redis-cli starts in interactive mode.\n"
|
||||||
"Type \"help\" in interactive mode for information on available commands.\n"
|
"Type \"help\" in interactive mode for information on available commands.\n"
|
||||||
@ -790,6 +788,44 @@ static int noninteractive(int argc, char **argv) {
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int evalMode(int argc, char **argv) {
|
||||||
|
sds script = sdsempty();
|
||||||
|
FILE *fp;
|
||||||
|
char buf[1024];
|
||||||
|
size_t nread;
|
||||||
|
char **argv2;
|
||||||
|
int j, got_comma = 0, keys = 0;
|
||||||
|
|
||||||
|
/* Load the script from the file, as an sds string. */
|
||||||
|
fp = fopen(config.eval,"r");
|
||||||
|
if (!fp) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"Can't open file '%s': %s\n", config.eval, strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
while((nread = fread(buf,1,sizeof(buf),fp)) != 0) {
|
||||||
|
script = sdscatlen(script,buf,nread);
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
/* Create our argument vector */
|
||||||
|
argv2 = zmalloc(sizeof(sds)*(argc+3));
|
||||||
|
argv2[0] = sdsnew("EVAL");
|
||||||
|
argv2[1] = script;
|
||||||
|
for (j = 0; j < argc; j++) {
|
||||||
|
if (!got_comma && argv[j][0] == ',' && argv[j][1] == 0) {
|
||||||
|
got_comma = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
argv2[j+3-got_comma] = sdsnew(argv[j]);
|
||||||
|
if (!got_comma) keys++;
|
||||||
|
}
|
||||||
|
argv2[2] = sdscatprintf(sdsempty(),"%d",keys);
|
||||||
|
|
||||||
|
/* Call it */
|
||||||
|
return cliSendCommand(argc+3-got_comma, argv2, config.repeat);
|
||||||
|
}
|
||||||
|
|
||||||
static void latencyMode(void) {
|
static void latencyMode(void) {
|
||||||
redisReply *reply;
|
redisReply *reply;
|
||||||
long long start, latency, min, max, tot, count = 0;
|
long long start, latency, min, max, tot, count = 0;
|
||||||
@ -839,6 +875,7 @@ int main(int argc, char **argv) {
|
|||||||
config.cluster_mode = 0;
|
config.cluster_mode = 0;
|
||||||
config.stdinarg = 0;
|
config.stdinarg = 0;
|
||||||
config.auth = NULL;
|
config.auth = NULL;
|
||||||
|
config.eval = NULL;
|
||||||
config.raw_output = !isatty(fileno(stdout)) && (getenv("FAKETTY") == NULL);
|
config.raw_output = !isatty(fileno(stdout)) && (getenv("FAKETTY") == NULL);
|
||||||
config.mb_delim = sdsnew("\n");
|
config.mb_delim = sdsnew("\n");
|
||||||
cliInitHelp();
|
cliInitHelp();
|
||||||
@ -854,7 +891,7 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Start interactive mode when no command is provided */
|
/* Start interactive mode when no command is provided */
|
||||||
if (argc == 0) {
|
if (argc == 0 && !config.eval) {
|
||||||
/* Note that in repl mode we don't abort on connection error.
|
/* Note that in repl mode we don't abort on connection error.
|
||||||
* A new attempt will be performed for every command send. */
|
* A new attempt will be performed for every command send. */
|
||||||
cliConnect(0);
|
cliConnect(0);
|
||||||
@ -863,5 +900,9 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
/* Otherwise, we have some arguments to execute */
|
/* Otherwise, we have some arguments to execute */
|
||||||
if (cliConnect(0) != REDIS_OK) exit(1);
|
if (cliConnect(0) != REDIS_OK) exit(1);
|
||||||
|
if (config.eval) {
|
||||||
|
return evalMode(argc,argv);
|
||||||
|
} else {
|
||||||
return noninteractive(argc,convertToSds(argc,argv));
|
return noninteractive(argc,convertToSds(argc,argv));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user