static void repl() { int argc, j; char *line; sds *argv; config.interactive = 1; linenoiseSetCompletionCallback(completionCallback); 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 (argv == NULL) { printf("Invalid argument(s)\n"); continue; } else if (argc > 0) { if (strcasecmp(argv[0],"quit") == 0 || strcasecmp(argv[0],"exit") == 0) { exit(0); } else if (argc == 3 && !strcasecmp(argv[0],"connect")) { sdsfree(config.hostip); config.hostip = sdsnew(argv[1]); config.hostport = atoi(argv[2]); cliConnect(1); } else if (argc == 1 && !strcasecmp(argv[0],"clear")) { linenoiseClearScreen(); } else { long long start_time = mstime(), elapsed; if (cliSendCommand(argc,argv,1) != REDIS_OK) { cliConnect(1); /* If we still cannot send the command, * print error and abort. */ if (cliSendCommand(argc,argv,1) != REDIS_OK) cliPrintContextErrorAndExit(); } elapsed = mstime()-start_time; if (elapsed >= 500) { printf("(%.2fs)\n",(double)elapsed/1000); } } } /* Free the argument vector */ for (j = 0; j < argc; j++) sdsfree(argv[j]); zfree(argv); } /* linenoise() returns malloc-ed lines like readline() */ free(line); } exit(0); }
int main(int argc, char **argv) { int firstarg; config.hostip = sdsnew("127.0.0.1"); config.hostport = 6379; config.hostsocket = NULL; config.repeat = 1; config.interval = 0; config.dbnum = 0; config.interactive = 0; config.shutdown = 0; config.monitor_mode = 0; config.pubsub_mode = 0; config.latency_mode = 0; config.stdinarg = 0; config.auth = NULL; config.raw_output = !isatty(fileno(stdout)) && (getenv("FAKETTY") == NULL); config.mb_delim = sdsnew("\n"); cliInitHelp(); #ifdef _WIN32 _fmode = _O_BINARY; _setmode(_fileno(stdin), _O_BINARY); _setmode(_fileno(stdout), _O_BINARY); _setmode(_fileno(stderr), _O_BINARY); if (!w32initWinSock()) { printf("Winsock init error %d", WSAGetLastError()); exit(1); }; atexit((void(*)(void)) WSACleanup); #endif firstarg = parseOptions(argc,argv); argc -= firstarg; argv += firstarg; /* Start in latency mode if appropriate */ if (config.latency_mode) { cliConnect(0); latencyMode(); } /* Start interactive mode when no command is provided */ if (argc == 0) { /* Note that in repl mode we don't abort on connection error. * A new attempt will be performed for every command send. */ cliConnect(0); repl(); } /* Otherwise, we have some arguments to execute */ if (cliConnect(0) != REDIS_OK) exit(1); return noninteractive(argc,convertToSds(argc,argv)); }
static int cliSendCommand(int argc, char **argv) { struct redisCommand *rc = lookupCommand(argv[0]); int fd, j, retval = 0; sds cmd; if (!rc) { fprintf(stderr,"Unknown command '%s'\n",argv[0]); return 1; } if ((rc->arity > 0 && argc != rc->arity) || (rc->arity < 0 && argc < -rc->arity)) { fprintf(stderr,"Wrong number of arguments for '%s'\n",rc->name); return 1; } if ((fd = cliConnect()) == -1) return 1; while(config.repeat--) { /* Build the command to send */ cmd = sdsempty(); if (rc->flags & REDIS_CMD_MULTIBULK) { cmd = sdscatprintf(cmd,"*%d\r\n",argc); for (j = 0; j < argc; j++) { cmd = sdscatprintf(cmd,"$%d\r\n",sdslen(argv[j])); cmd = sdscatlen(cmd,argv[j],sdslen(argv[j])); cmd = sdscatlen(cmd,"\r\n",2); } } else { for (j = 0; j < argc; j++) { if (j != 0) cmd = sdscat(cmd," "); if (j == argc-1 && rc->flags & REDIS_CMD_BULK) { cmd = sdscatprintf(cmd,"%d",sdslen(argv[j])); } else { cmd = sdscatlen(cmd,argv[j],sdslen(argv[j])); } } cmd = sdscat(cmd,"\r\n"); if (rc->flags & REDIS_CMD_BULK) { cmd = sdscatlen(cmd,argv[argc-1],sdslen(argv[argc-1])); cmd = sdscatlen(cmd,"\r\n",2); } } anetWrite(fd,cmd,sdslen(cmd)); sdsfree(cmd); retval = cliReadReply(fd); if (retval) { close(fd); return retval; } } close(fd); return 0; }
static int cliSendCommand(int argc, char **argv, int repeat) { char *command = argv[0]; int fd, j, retval = 0; sds cmd; config.raw_output = !strcasecmp(command,"info"); if (!strcasecmp(command,"help")) { showInteractiveHelp(); return 0; } if (!strcasecmp(command,"shutdown")) config.shutdown = 1; if (!strcasecmp(command,"monitor")) config.monitor_mode = 1; if (!strcasecmp(command,"subscribe") || !strcasecmp(command,"psubscribe")) config.pubsub_mode = 1; if ((fd = cliConnect(0)) == -1) return 1; /* Select db number */ retval = selectDb(fd); if (retval) { fprintf(stderr,"Error setting DB num\n"); return 1; } /* Build the command to send */ cmd = sdscatprintf(sdsempty(),"*%d\r\n",argc); for (j = 0; j < argc; j++) { cmd = sdscatprintf(cmd,"$%lu\r\n", (unsigned long)sdslen(argv[j])); cmd = sdscatlen(cmd,argv[j],sdslen(argv[j])); cmd = sdscatlen(cmd,"\r\n",2); } while(repeat--) { anetWrite(fd,cmd,sdslen(cmd)); while (config.monitor_mode) { if (cliReadSingleLineReply(fd,0)) exit(1); printf("\n"); } if (config.pubsub_mode) { printf("Reading messages... (press Ctrl-c to quit)\n"); while (1) { cliReadReply(fd); printf("\n\n"); } } retval = cliReadReply(fd); if (!config.raw_output && config.tty) printf("\n"); if (retval) return retval; } return 0; }
static int cliSendCommand(int argc, char **argv) { struct redisCommand *rc = lookupCommand(argv[0]); int fd, j, retval = 0; sds cmd = sdsempty(); if (!rc) { fprintf(stderr,"Unknown command '%s'\n",argv[0]); return 1; } if ((rc->arity > 0 && argc != rc->arity) || (rc->arity < 0 && argc < -rc->arity)) { fprintf(stderr,"Wrong number of arguments for '%s'\n",rc->name); return 1; } if ((fd = cliConnect()) == -1) return 1; /* Build the command to send */ for (j = 0; j < argc; j++) { if (j != 0) cmd = sdscat(cmd," "); if (j == argc-1 && rc->flags & REDIS_CMD_BULK) { cmd = sdscatprintf(cmd,"%d",sdslen(argv[j])); } else { cmd = sdscatlen(cmd,argv[j],sdslen(argv[j])); } } cmd = sdscat(cmd,"\r\n"); if (rc->flags & REDIS_CMD_BULK) { cmd = sdscatlen(cmd,argv[argc-1],sdslen(argv[argc-1])); cmd = sdscat(cmd,"\r\n"); } anetWrite(fd,cmd,sdslen(cmd)); if (rc->flags & REDIS_CMD_INTREPLY) { retval = cliReadInlineReply(fd,REDIS_CMD_INTREPLY); } else if (rc->flags & REDIS_CMD_RETCODEREPLY) { retval = cliReadInlineReply(fd,REDIS_CMD_RETCODEREPLY); } else if (rc->flags & REDIS_CMD_SINGLELINEREPLY) { retval = cliReadInlineReply(fd,REDIS_CMD_SINGLELINEREPLY); } else if (rc->flags & REDIS_CMD_BULKREPLY) { retval = cliReadBulkReply(fd,0); } else if (rc->flags & REDIS_CMD_MULTIBULKREPLY) { retval = cliReadMultiBulkReply(fd); } if (retval) { close(fd); return retval; } close(fd); return 0; }
static void repl() { int argc, j; char *line; sds *argv; config.interactive = 1; while((line = linenoise("redis> ")) != NULL) { if (line[0] != '\0') { argv = sdssplitargs(line,&argc); linenoiseHistoryAdd(line); if (config.historyfile) linenoiseHistorySave(config.historyfile); if (argv == NULL) { printf("Invalid argument(s)\n"); continue; } else if (argc > 0) { if (strcasecmp(argv[0],"quit") == 0 || strcasecmp(argv[0],"exit") == 0) { exit(0); } else { int err; if ((err = cliSendCommand(argc, argv, 1)) != 0) { if (err == ECONNRESET) { printf("Reconnecting... "); fflush(stdout); if (cliConnect(1) == -1) exit(1); printf("OK\n"); cliSendCommand(argc,argv,1); } } } } /* Free the argument vector */ for (j = 0; j < argc; j++) sdsfree(argv[j]); zfree(argv); } /* linenoise() returns malloc-ed lines like readline() */ free(line); } exit(0); }
int main(int argc, char **argv) { int firstarg; config.filename = sdsnew("redislite.db"); config.repeat = 1; config.interactive = 0; config.stdinarg = 0; 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/.redislitecli_history", getenv("HOME")); linenoiseHistoryLoad(config.historyfile); } firstarg = parseOptions(argc, argv); argc -= firstarg; argv += firstarg; /* Try to connect */ if (cliConnect(0) != REDISLITE_OK) { exit(1); } /* Start interactive mode when no command is provided */ if (argc == 0) { repl(); } /* Otherwise, we have some arguments to execute */ char **converted = convertToSds(argc, argv); int ret = noninteractive(argc, converted); cliCleanHelp(); // NOTE: not free-ing converted since it may have changed inside noninteractive sdsfree(config.filename); sdsfree(config.mb_delim); redislite_close_database(db); return ret; }
int main(int argc, char **argv) { int firstarg; config.hostip = sdsnew("127.0.0.1"); config.hostport = 6379; config.hostsocket = NULL; config.repeat = 1; config.dbnum = 0; config.interactive = 0; config.shutdown = 0; config.monitor_mode = 0; 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; /* Try to connect */ if (cliConnect(0) != REDIS_OK) exit(1); /* Start interactive mode when no command is provided */ if (argc == 0) repl(); /* Otherwise, we have some arguments to execute */ return noninteractive(argc,convertToSds(argc,argv)); }
static int cliSendCommand(int argc, char **argv, int repeat) { struct redisCommand *rc = lookupCommand(argv[0]); int fd, j, retval = 0; sds cmd; if (!rc) { fprintf(stderr,"Unknown command '%s'\n",argv[0]); return 1; } config.raw_output = (rc->flags & CMDFLAG_RAWOUTPUT); if ((rc->arity > 0 && argc != rc->arity) || (rc->arity < 0 && argc < -rc->arity)) { fprintf(stderr,"Wrong number of arguments for '%s'\n",rc->name); return 1; } if (!strcasecmp(rc->name,"shutdown")) config.shutdown = 1; if (!strcasecmp(rc->name,"monitor")) config.monitor_mode = 1; if (!strcasecmp(rc->name,"subscribe") || !strcasecmp(rc->name,"psubscribe")) config.pubsub_mode = 1; if ((fd = cliConnect()) == -1) return 1; /* Select db number */ retval = selectDb(fd); if (retval) { fprintf(stderr,"Error setting DB num\n"); return 1; } while(repeat--) { /* Build the command to send */ cmd = sdscatprintf(sdsempty(),"*%d\r\n",argc); for (j = 0; j < argc; j++) { cmd = sdscatprintf(cmd,"$%lu\r\n", (unsigned long)sdslen(argv[j])); cmd = sdscatlen(cmd,argv[j],sdslen(argv[j])); cmd = sdscatlen(cmd,"\r\n",2); } anetWrite(fd,cmd,sdslen(cmd)); sdsfree(cmd); while (config.monitor_mode) { cliReadSingleLineReply(fd,0); } if (config.pubsub_mode) { printf("Reading messages... (press Ctrl-c to quit)\n"); while (1) { cliReadReply(fd); printf("\n"); } } retval = cliReadReply(fd); if (retval) { return retval; } } return 0; }
static int cliSendCommand(int argc, char **argv) { struct redisCommand *rc = lookupCommand(argv[0]); int fd, j, retval = 0; int read_forever = 0; sds cmd; if (!rc) { fprintf(stderr,"Unknown command '%s'\n",argv[0]); return 1; } if ((rc->arity > 0 && argc != rc->arity) || (rc->arity < 0 && argc < -rc->arity)) { fprintf(stderr,"Wrong number of arguments for '%s'\n",rc->name); return 1; } if (!strcasecmp(rc->name,"monitor")) read_forever = 1; if ((fd = cliConnect()) == -1) return 1; /* Select db number */ retval = selectDb(fd); if (retval) { fprintf(stderr,"Error setting DB num\n"); return 1; } while(config.repeat--) { /* Build the command to send */ cmd = sdsempty(); if (rc->flags & REDIS_CMD_MULTIBULK) { cmd = sdscatprintf(cmd,"*%d\r\n",argc); for (j = 0; j < argc; j++) { cmd = sdscatprintf(cmd,"$%lu\r\n", (unsigned long)sdslen(argv[j])); cmd = sdscatlen(cmd,argv[j],sdslen(argv[j])); cmd = sdscatlen(cmd,"\r\n",2); } } else { for (j = 0; j < argc; j++) { if (j != 0) cmd = sdscat(cmd," "); if (j == argc-1 && rc->flags & REDIS_CMD_BULK) { cmd = sdscatprintf(cmd,"%lu", (unsigned long)sdslen(argv[j])); } else { cmd = sdscatlen(cmd,argv[j],sdslen(argv[j])); } } cmd = sdscat(cmd,"\r\n"); if (rc->flags & REDIS_CMD_BULK) { cmd = sdscatlen(cmd,argv[argc-1],sdslen(argv[argc-1])); cmd = sdscatlen(cmd,"\r\n",2); } } anetWrite(fd,cmd,sdslen(cmd)); sdsfree(cmd); while (read_forever) { cliReadSingleLineReply(fd,0); } retval = cliReadReply(fd); if (retval) { return retval; } } return 0; }
static void repl() { sds historyfile = NULL; int history = 0; char *line; int argc; sds *argv; config.interactive = 1; linenoiseSetCompletionCallback(completionCallback); /* 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); if (history) linenoiseHistoryAdd(line); if (historyfile) linenoiseHistorySave(historyfile); if (argv == NULL) { printf("Invalid argument(s)\n"); free(line); continue; } else if (argc > 0) { if (strcasecmp(argv[0],"quit") == 0 || strcasecmp(argv[0],"exit") == 0) { exit(0); } else if (argc == 3 && !strcasecmp(argv[0],"connect")) { sdsfree(config.hostip); config.hostip = sdsnew(argv[1]); config.hostport = atoi(argv[2]); cliConnect(1); } else if (argc == 1 && !strcasecmp(argv[0],"clear")) { linenoiseClearScreen(); } else { long long start_time = mstime(), elapsed; int repeat, skipargs = 0; repeat = atoi(argv[0]); if (argc > 1 && repeat) { skipargs = 1; } else { repeat = 1; } while (1) { config.cluster_reissue_command = 0; if (cliSendCommand(argc-skipargs,argv+skipargs,repeat) != REDIS_OK) { cliConnect(1); /* If we still cannot send the command print error. * We'll try to reconnect the next time. */ if (cliSendCommand(argc-skipargs,argv+skipargs,repeat) != REDIS_OK) cliPrintContextError(); } /* Issue the command again if we got redirected in cluster mode */ if (config.cluster_mode && config.cluster_reissue_command) { cliConnect(1); } else { break; } } elapsed = mstime()-start_time; if (elapsed >= 500) { printf("(%.2fs)\n",(double)elapsed/1000); } } } /* Free the argument vector */ while(argc--) sdsfree(argv[argc]); zfree(argv); } /* linenoise() returns malloc-ed lines like readline() */ free(line); } exit(0); }
int main(int argc, char **argv) { int firstarg; config.hostip = sdsnew("127.0.0.1"); config.hostport = 6379; config.hostsocket = NULL; config.repeat = 1; config.interval = 0; config.dbnum = 0; config.interactive = 0; config.shutdown = 0; config.monitor_mode = 0; config.pubsub_mode = 0; config.latency_mode = 0; config.cluster_mode = 0; config.slave_mode = 0; config.pipe_mode = 0; config.bigkeys = 0; config.stdinarg = 0; config.auth = NULL; config.eval = NULL; if (!isatty(fileno(stdout)) && (getenv("FAKETTY") == NULL)) config.output = OUTPUT_RAW; else config.output = OUTPUT_STANDARD; config.mb_delim = sdsnew("\n"); cliInitHelp(); firstarg = parseOptions(argc,argv); argc -= firstarg; argv += firstarg; /* Latency mode */ if (config.latency_mode) { cliConnect(0); latencyMode(); } /* Slave mode */ if (config.slave_mode) { cliConnect(0); slaveMode(); } /* Pipe mode */ if (config.pipe_mode) { if (cliConnect(0) == REDIS_ERR) exit(1); pipeMode(); } /* Find big keys */ if (config.bigkeys) { cliConnect(0); findBigKeys(); } /* Start interactive mode when no command is provided */ if (argc == 0 && !config.eval) { /* Note that in repl mode we don't abort on connection error. * A new attempt will be performed for every command send. */ cliConnect(0); repl(); } /* Otherwise, we have some arguments to execute */ if (cliConnect(0) != REDIS_OK) exit(1); if (config.eval) { return evalMode(argc,argv); } else { return noninteractive(argc,convertToSds(argc,argv)); } }