Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
3caf15e6
Commit
3caf15e6
authored
May 28, 2010
by
antirez
Browse files
Merge branch 'cli-stdin' of
git://github.com/pietern/redis
parents
5fc9229c
a2f4f871
Changes
1
Hide whitespace changes
Inline
Side-by-side
redis-cli.c
View file @
3caf15e6
...
@@ -53,6 +53,7 @@ static struct config {
...
@@ -53,6 +53,7 @@ static struct config {
int
hostport
;
int
hostport
;
long
repeat
;
long
repeat
;
int
dbnum
;
int
dbnum
;
int
argn_from_stdin
;
int
interactive
;
int
interactive
;
int
shutdown
;
int
shutdown
;
int
monitor_mode
;
int
monitor_mode
;
...
@@ -61,137 +62,9 @@ static struct config {
...
@@ -61,137 +62,9 @@ static struct config {
char
*
auth
;
char
*
auth
;
}
config
;
}
config
;
struct
redisCommand
{
char
*
name
;
int
arity
;
int
flags
;
};
#define CMDFLAG_NONE 0
#define CMDFLAG_RAWOUTPUT 1
static
struct
redisCommand
cmdTable
[]
=
{
{
"auth"
,
2
,
CMDFLAG_NONE
},
{
"get"
,
2
,
CMDFLAG_NONE
},
{
"set"
,
3
,
CMDFLAG_NONE
},
{
"setnx"
,
3
,
CMDFLAG_NONE
},
{
"setex"
,
4
,
CMDFLAG_NONE
},
{
"append"
,
3
,
CMDFLAG_NONE
},
{
"substr"
,
4
,
CMDFLAG_NONE
},
{
"del"
,
-
2
,
CMDFLAG_NONE
},
{
"exists"
,
2
,
CMDFLAG_NONE
},
{
"incr"
,
2
,
CMDFLAG_NONE
},
{
"decr"
,
2
,
CMDFLAG_NONE
},
{
"rpush"
,
3
,
CMDFLAG_NONE
},
{
"lpush"
,
3
,
CMDFLAG_NONE
},
{
"rpop"
,
2
,
CMDFLAG_NONE
},
{
"lpop"
,
2
,
CMDFLAG_NONE
},
{
"brpop"
,
-
3
,
CMDFLAG_NONE
},
{
"blpop"
,
-
3
,
CMDFLAG_NONE
},
{
"llen"
,
2
,
CMDFLAG_NONE
},
{
"lindex"
,
3
,
CMDFLAG_NONE
},
{
"lset"
,
4
,
CMDFLAG_NONE
},
{
"lrange"
,
4
,
CMDFLAG_NONE
},
{
"ltrim"
,
4
,
CMDFLAG_NONE
},
{
"lrem"
,
4
,
CMDFLAG_NONE
},
{
"rpoplpush"
,
3
,
CMDFLAG_NONE
},
{
"sadd"
,
3
,
CMDFLAG_NONE
},
{
"srem"
,
3
,
CMDFLAG_NONE
},
{
"smove"
,
4
,
CMDFLAG_NONE
},
{
"sismember"
,
3
,
CMDFLAG_NONE
},
{
"scard"
,
2
,
CMDFLAG_NONE
},
{
"spop"
,
2
,
CMDFLAG_NONE
},
{
"srandmember"
,
2
,
CMDFLAG_NONE
},
{
"sinter"
,
-
2
,
CMDFLAG_NONE
},
{
"sinterstore"
,
-
3
,
CMDFLAG_NONE
},
{
"sunion"
,
-
2
,
CMDFLAG_NONE
},
{
"sunionstore"
,
-
3
,
CMDFLAG_NONE
},
{
"sdiff"
,
-
2
,
CMDFLAG_NONE
},
{
"sdiffstore"
,
-
3
,
CMDFLAG_NONE
},
{
"smembers"
,
2
,
CMDFLAG_NONE
},
{
"zadd"
,
4
,
CMDFLAG_NONE
},
{
"zincrby"
,
4
,
CMDFLAG_NONE
},
{
"zrem"
,
3
,
CMDFLAG_NONE
},
{
"zremrangebyscore"
,
4
,
CMDFLAG_NONE
},
{
"zunion"
,
-
4
,
CMDFLAG_NONE
},
{
"zinter"
,
-
4
,
CMDFLAG_NONE
},
{
"zrange"
,
-
4
,
CMDFLAG_NONE
},
{
"zrank"
,
3
,
CMDFLAG_NONE
},
{
"zrevrank"
,
3
,
CMDFLAG_NONE
},
{
"zrangebyscore"
,
-
4
,
CMDFLAG_NONE
},
{
"zcount"
,
4
,
CMDFLAG_NONE
},
{
"zrevrange"
,
-
4
,
CMDFLAG_NONE
},
{
"zcard"
,
2
,
CMDFLAG_NONE
},
{
"zscore"
,
3
,
CMDFLAG_NONE
},
{
"incrby"
,
3
,
CMDFLAG_NONE
},
{
"decrby"
,
3
,
CMDFLAG_NONE
},
{
"getset"
,
3
,
CMDFLAG_NONE
},
{
"randomkey"
,
1
,
CMDFLAG_NONE
},
{
"select"
,
2
,
CMDFLAG_NONE
},
{
"move"
,
3
,
CMDFLAG_NONE
},
{
"rename"
,
3
,
CMDFLAG_NONE
},
{
"renamenx"
,
3
,
CMDFLAG_NONE
},
{
"keys"
,
2
,
CMDFLAG_NONE
},
{
"dbsize"
,
1
,
CMDFLAG_NONE
},
{
"ping"
,
1
,
CMDFLAG_NONE
},
{
"echo"
,
2
,
CMDFLAG_NONE
},
{
"save"
,
1
,
CMDFLAG_NONE
},
{
"bgsave"
,
1
,
CMDFLAG_NONE
},
{
"rewriteaof"
,
1
,
CMDFLAG_NONE
},
{
"bgrewriteaof"
,
1
,
CMDFLAG_NONE
},
{
"shutdown"
,
1
,
CMDFLAG_NONE
},
{
"lastsave"
,
1
,
CMDFLAG_NONE
},
{
"type"
,
2
,
CMDFLAG_NONE
},
{
"flushdb"
,
1
,
CMDFLAG_NONE
},
{
"flushall"
,
1
,
CMDFLAG_NONE
},
{
"sort"
,
-
2
,
CMDFLAG_NONE
},
{
"info"
,
1
,
CMDFLAG_RAWOUTPUT
},
{
"mget"
,
-
2
,
CMDFLAG_NONE
},
{
"expire"
,
3
,
CMDFLAG_NONE
},
{
"expireat"
,
3
,
CMDFLAG_NONE
},
{
"ttl"
,
2
,
CMDFLAG_NONE
},
{
"slaveof"
,
3
,
CMDFLAG_NONE
},
{
"debug"
,
-
2
,
CMDFLAG_NONE
},
{
"mset"
,
-
3
,
CMDFLAG_NONE
},
{
"msetnx"
,
-
3
,
CMDFLAG_NONE
},
{
"monitor"
,
1
,
CMDFLAG_NONE
},
{
"multi"
,
1
,
CMDFLAG_NONE
},
{
"exec"
,
1
,
CMDFLAG_NONE
},
{
"discard"
,
1
,
CMDFLAG_NONE
},
{
"hset"
,
4
,
CMDFLAG_NONE
},
{
"hget"
,
3
,
CMDFLAG_NONE
},
{
"hmset"
,
-
4
,
CMDFLAG_NONE
},
{
"hmget"
,
-
3
,
CMDFLAG_NONE
},
{
"hincrby"
,
4
,
CMDFLAG_NONE
},
{
"hdel"
,
3
,
CMDFLAG_NONE
},
{
"hlen"
,
2
,
CMDFLAG_NONE
},
{
"hkeys"
,
2
,
CMDFLAG_NONE
},
{
"hvals"
,
2
,
CMDFLAG_NONE
},
{
"hgetall"
,
2
,
CMDFLAG_NONE
},
{
"hexists"
,
3
,
CMDFLAG_NONE
},
{
"config"
,
-
2
,
CMDFLAG_NONE
},
{
"subscribe"
,
-
2
,
CMDFLAG_NONE
},
{
"unsubscribe"
,
-
1
,
CMDFLAG_NONE
},
{
"psubscribe"
,
-
2
,
CMDFLAG_NONE
},
{
"punsubscribe"
,
-
1
,
CMDFLAG_NONE
},
{
"publish"
,
3
,
CMDFLAG_NONE
},
{
"watch"
,
-
2
,
CMDFLAG_NONE
},
{
"unwatch"
,
1
,
CMDFLAG_NONE
},
{
NULL
,
0
,
CMDFLAG_NONE
}
};
static
int
cliReadReply
(
int
fd
);
static
int
cliReadReply
(
int
fd
);
static
void
usage
();
static
void
usage
();
static
struct
redisCommand
*
lookupCommand
(
char
*
name
)
{
int
j
=
0
;
while
(
cmdTable
[
j
].
name
!=
NULL
)
{
if
(
!
strcasecmp
(
name
,
cmdTable
[
j
].
name
))
return
&
cmdTable
[
j
];
j
++
;
}
return
NULL
;
}
static
int
cliConnect
(
void
)
{
static
int
cliConnect
(
void
)
{
char
err
[
ANET_ERR_LEN
];
char
err
[
ANET_ERR_LEN
];
static
int
fd
=
ANET_ERR
;
static
int
fd
=
ANET_ERR
;
...
@@ -361,26 +234,15 @@ static int selectDb(int fd) {
...
@@ -361,26 +234,15 @@ static int selectDb(int fd) {
}
}
static
int
cliSendCommand
(
int
argc
,
char
**
argv
,
int
repeat
)
{
static
int
cliSendCommand
(
int
argc
,
char
**
argv
,
int
repeat
)
{
struct
redisCommand
*
rc
=
lookupCommand
(
argv
[
0
]
)
;
char
*
command
=
argv
[
0
];
int
fd
,
j
,
retval
=
0
;
int
fd
,
j
,
retval
=
0
;
sds
cmd
;
sds
cmd
;
if
(
!
rc
)
{
config
.
raw_output
=
!
strcasecmp
(
command
,
"info"
);
fprintf
(
stderr
,
"Unknown command '%s'
\n
"
,
argv
[
0
]);
if
(
!
strcasecmp
(
command
,
"shutdown"
))
config
.
shutdown
=
1
;
return
1
;
if
(
!
strcasecmp
(
command
,
"monitor"
))
config
.
monitor_mode
=
1
;
}
if
(
!
strcasecmp
(
command
,
"subscribe"
)
||
config
.
raw_output
=
(
rc
->
flags
&
CMDFLAG_RAWOUTPUT
);
!
strcasecmp
(
command
,
"psubscribe"
))
config
.
pubsub_mode
=
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
,
"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
;
if
((
fd
=
cliConnect
())
==
-
1
)
return
1
;
/* Select db number */
/* Select db number */
...
@@ -390,18 +252,17 @@ static int cliSendCommand(int argc, char **argv, int repeat) {
...
@@ -390,18 +252,17 @@ static int cliSendCommand(int argc, char **argv, int repeat) {
return
1
;
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
--
)
{
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
));
anetWrite
(
fd
,
cmd
,
sdslen
(
cmd
));
sdsfree
(
cmd
);
while
(
config
.
monitor_mode
)
{
while
(
config
.
monitor_mode
)
{
cliReadSingleLineReply
(
fd
,
0
);
cliReadSingleLineReply
(
fd
,
0
);
}
}
...
@@ -415,7 +276,6 @@ static int cliSendCommand(int argc, char **argv, int repeat) {
...
@@ -415,7 +276,6 @@ static int cliSendCommand(int argc, char **argv, int repeat) {
}
}
retval
=
cliReadReply
(
fd
);
retval
=
cliReadReply
(
fd
);
if
(
retval
)
{
if
(
retval
)
{
return
retval
;
return
retval
;
}
}
...
@@ -453,6 +313,8 @@ static int parseOptions(int argc, char **argv) {
...
@@ -453,6 +313,8 @@ static int parseOptions(int argc, char **argv) {
i
++
;
i
++
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"-i"
))
{
}
else
if
(
!
strcmp
(
argv
[
i
],
"-i"
))
{
config
.
interactive
=
1
;
config
.
interactive
=
1
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"-c"
))
{
config
.
argn_from_stdin
=
1
;
}
else
{
}
else
{
break
;
break
;
}
}
...
@@ -479,7 +341,7 @@ static sds readArgFromStdin(void) {
...
@@ -479,7 +341,7 @@ static sds readArgFromStdin(void) {
static
void
usage
()
{
static
void
usage
()
{
fprintf
(
stderr
,
"usage: redis-cli [-h host] [-p port] [-a authpw] [-r repeat_times] [-n db_num] [-i] cmd arg1 arg2 arg3 ... argN
\n
"
);
fprintf
(
stderr
,
"usage: redis-cli [-h host] [-p port] [-a authpw] [-r repeat_times] [-n db_num] [-i] cmd arg1 arg2 arg3 ... argN
\n
"
);
fprintf
(
stderr
,
"usage: echo
\"
argN
\"
| redis-cli [-h host] [-
a authpw] [-p port
] [-r repeat_times] [-n db_num] cmd arg1 arg2 ... arg(N-1)
\n
"
);
fprintf
(
stderr
,
"usage: echo
\"
argN
\"
| redis-cli
-c
[-h host] [-
p port] [-a authpw
] [-r repeat_times] [-n db_num] cmd arg1 arg2 ... arg(N-1)
\n
"
);
fprintf
(
stderr
,
"
\n
If a pipe from standard input is detected this data is used as last argument.
\n\n
"
);
fprintf
(
stderr
,
"
\n
If a pipe from standard input is detected this data is used as last argument.
\n\n
"
);
fprintf
(
stderr
,
"example: cat /etc/passwd | redis-cli set my_passwd
\n
"
);
fprintf
(
stderr
,
"example: cat /etc/passwd | redis-cli set my_passwd
\n
"
);
fprintf
(
stderr
,
"example: redis-cli get my_passwd
\n
"
);
fprintf
(
stderr
,
"example: redis-cli get my_passwd
\n
"
);
...
@@ -491,7 +353,7 @@ static void usage() {
...
@@ -491,7 +353,7 @@ static void usage() {
/* Turn the plain C strings into Sds strings */
/* Turn the plain C strings into Sds strings */
static
char
**
convertToSds
(
int
count
,
char
**
args
)
{
static
char
**
convertToSds
(
int
count
,
char
**
args
)
{
int
j
;
int
j
;
char
**
sds
=
zmalloc
(
sizeof
(
char
*
)
*
count
+
1
);
char
**
sds
=
zmalloc
(
sizeof
(
char
*
)
*
count
);
for
(
j
=
0
;
j
<
count
;
j
++
)
for
(
j
=
0
;
j
<
count
;
j
++
)
sds
[
j
]
=
sdsnew
(
args
[
j
]);
sds
[
j
]
=
sdsnew
(
args
[
j
]);
...
@@ -594,12 +456,12 @@ static void repl() {
...
@@ -594,12 +456,12 @@ static void repl() {
int
main
(
int
argc
,
char
**
argv
)
{
int
main
(
int
argc
,
char
**
argv
)
{
int
firstarg
;
int
firstarg
;
char
**
argvcopy
;
char
**
argvcopy
;
struct
redisCommand
*
rc
;
config
.
hostip
=
"127.0.0.1"
;
config
.
hostip
=
"127.0.0.1"
;
config
.
hostport
=
6379
;
config
.
hostport
=
6379
;
config
.
repeat
=
1
;
config
.
repeat
=
1
;
config
.
dbnum
=
0
;
config
.
dbnum
=
0
;
config
.
argn_from_stdin
=
0
;
config
.
shutdown
=
0
;
config
.
shutdown
=
0
;
config
.
interactive
=
0
;
config
.
interactive
=
0
;
config
.
monitor_mode
=
0
;
config
.
monitor_mode
=
0
;
...
@@ -621,16 +483,11 @@ int main(int argc, char **argv) {
...
@@ -621,16 +483,11 @@ int main(int argc, char **argv) {
if
(
argc
==
0
||
config
.
interactive
==
1
)
repl
();
if
(
argc
==
0
||
config
.
interactive
==
1
)
repl
();
argvcopy
=
convertToSds
(
argc
,
argv
);
argvcopy
=
convertToSds
(
argc
+
1
,
argv
);
if
(
config
.
argn_from_stdin
)
{
/* Read the last argument from stdandard input if needed */
if
((
rc
=
lookupCommand
(
argv
[
0
]))
!=
NULL
)
{
if
(
rc
->
arity
>
0
&&
argc
==
rc
->
arity
-
1
)
{
sds
lastarg
=
readArgFromStdin
();
sds
lastarg
=
readArgFromStdin
();
argvcopy
[
argc
]
=
lastarg
;
argvcopy
[
argc
]
=
lastarg
;
argc
++
;
argc
++
;
}
}
}
return
cliSendCommand
(
argc
,
argvcopy
,
config
.
repeat
);
return
cliSendCommand
(
argc
,
argvcopy
,
config
.
repeat
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment