X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/6eaad66373982aa9c1c0ff6b584c542670548d0e..0d916763afa44c2c6d5e28a4fe0f167197b00fc7:/src/redis-cli.c diff --git a/src/redis-cli.c b/src/redis-cli.c index 08b3a713..b53a4c82 100644 --- a/src/redis-cli.c +++ b/src/redis-cli.c @@ -62,9 +62,9 @@ static struct config { int pubsub_mode; int stdinarg; /* get last arg from stdin. (-x option) */ char *auth; - char *historyfile; int raw_output; /* output mode per command */ sds mb_delim; + char prompt[32]; } config; static void usage(); @@ -85,6 +85,13 @@ static long long mstime(void) { return mst; } +static void cliRefreshPrompt(void) { + if (config.dbnum == 0) + snprintf(config.prompt,sizeof(config.prompt),"redis> "); + else + snprintf(config.prompt,sizeof(config.prompt),"redis:%d> ",config.dbnum); +} + /*------------------------------------------------------------------------------ * Help functions *--------------------------------------------------------------------------- */ @@ -264,11 +271,9 @@ static int cliAuth() { /* Send SELECT dbnum to the server */ static int cliSelect() { redisReply *reply; - char dbnum[16]; if (config.dbnum == 0) return REDIS_OK; - snprintf(dbnum,sizeof(dbnum),"%d",config.dbnum); - reply = redisCommand(context,"SELECT %s",dbnum); + reply = redisCommand(context,"SELECT %d",config.dbnum); if (reply != NULL) { freeReplyObject(reply); return REDIS_OK; @@ -389,15 +394,18 @@ static sds cliFormatReplyRaw(redisReply *r) { switch (r->type) { case REDIS_REPLY_NIL: /* Nothing... */ - break; + break; case REDIS_REPLY_ERROR: + out = sdscatlen(out,r->str,r->len); + out = sdscatlen(out,"\n",1); + break; case REDIS_REPLY_STATUS: case REDIS_REPLY_STRING: out = sdscatlen(out,r->str,r->len); - break; + break; case REDIS_REPLY_INTEGER: out = sdscatprintf(out,"%lld",r->integer); - break; + break; case REDIS_REPLY_ARRAY: for (i = 0; i < r->elements; i++) { if (i > 0) out = sdscat(out,config.mb_delim); @@ -405,7 +413,7 @@ static sds cliFormatReplyRaw(redisReply *r) { out = sdscatlen(out,tmp,sdslen(tmp)); sdsfree(tmp); } - break; + break; default: fprintf(stderr,"Unknown reply type: %d\n", r->type); exit(1); @@ -459,7 +467,18 @@ static int cliSendCommand(int argc, char **argv, int repeat) { return REDIS_OK; } - output_raw = !strcasecmp(command,"info"); + output_raw = 0; + if (!strcasecmp(command,"info") || + (argc == 2 && !strcasecmp(command,"cluster") && + (!strcasecmp(argv[1],"nodes") || + !strcasecmp(argv[1],"info"))) || + (argc == 2 && !strcasecmp(command,"client") && + !strcasecmp(argv[1],"list"))) + + { + output_raw = 1; + } + if (!strcasecmp(command,"help") || !strcasecmp(command,"?")) { cliOutputHelp(--argc, ++argv); return REDIS_OK; @@ -489,9 +508,19 @@ static int cliSendCommand(int argc, char **argv, int repeat) { } } - if (cliReadReply(output_raw) != REDIS_OK) + if (cliReadReply(output_raw) != REDIS_OK) { + free(argvlen); return REDIS_ERR; + } else { + /* Store database number when SELECT was successfully executed. */ + if (!strcasecmp(command,"select") && argc == 2) { + config.dbnum = atoi(argv[1]); + cliRefreshPrompt(); + } + } } + + free(argvlen); return REDIS_OK; } @@ -609,18 +638,32 @@ static char **convertToSds(int count, char** args) { #define LINE_BUFLEN 4096 static void repl() { - int argc, j; + sds historyfile = NULL; + int history = 0; char *line; + int argc; sds *argv; config.interactive = 1; linenoiseSetCompletionCallback(completionCallback); - while((line = linenoise(context ? "redis> " : "not connected> ")) != NULL) { + /* Only use history when stdin is a tty. */ + if (isatty(fileno(stdin))) { + history = 1; + + if (getenv("HOME") != NULL) { + historyfile = sdscatprintf(sdsempty(),"%s/.rediscli_history",getenv("HOME")); + linenoiseHistoryLoad(historyfile); + } + } + + cliRefreshPrompt(); + while((line = linenoise(context ? config.prompt : "not connected> ")) != NULL) { if (line[0] != '\0') { argv = sdssplitargs(line,&argc); - linenoiseHistoryAdd(line); - if (config.historyfile) linenoiseHistorySave(config.historyfile); + if (history) linenoiseHistoryAdd(line); + if (historyfile) linenoiseHistorySave(historyfile); + if (argv == NULL) { printf("Invalid argument(s)\n"); continue; @@ -654,8 +697,7 @@ static void repl() { } } /* Free the argument vector */ - for (j = 0; j < argc; j++) - sdsfree(argv[j]); + while(argc--) sdsfree(argv[argc]); zfree(argv); } /* linenoise() returns malloc-ed lines like readline() */ @@ -691,17 +733,10 @@ int main(int argc, char **argv) { config.pubsub_mode = 0; config.stdinarg = 0; config.auth = NULL; - config.historyfile = NULL; config.raw_output = !isatty(fileno(stdout)) && (getenv("FAKETTY") == NULL); config.mb_delim = sdsnew("\n"); cliInitHelp(); - if (getenv("HOME") != NULL) { - config.historyfile = malloc(256); - snprintf(config.historyfile,256,"%s/.rediscli_history",getenv("HOME")); - linenoiseHistoryLoad(config.historyfile); - } - firstarg = parseOptions(argc,argv); argc -= firstarg; argv += firstarg;