Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
c937aa89
Commit
c937aa89
authored
Mar 24, 2009
by
antirez
Browse files
Server replies now in the new format, test-redis.tcl and redis-cli modified accordingly
parent
796d05f8
Changes
3
Show whitespace changes
Inline
Side-by-side
redis-cli.c
View file @
c937aa89
...
@@ -40,11 +40,6 @@
...
@@ -40,11 +40,6 @@
#define REDIS_CMD_INLINE 1
#define REDIS_CMD_INLINE 1
#define REDIS_CMD_BULK 2
#define REDIS_CMD_BULK 2
#define REDIS_CMD_INTREPLY 4
#define REDIS_CMD_RETCODEREPLY 8
#define REDIS_CMD_BULKREPLY 16
#define REDIS_CMD_MULTIBULKREPLY 32
#define REDIS_CMD_SINGLELINEREPLY 64
#define REDIS_NOTUSED(V) ((void) V)
#define REDIS_NOTUSED(V) ((void) V)
...
@@ -60,54 +55,56 @@ struct redisCommand {
...
@@ -60,54 +55,56 @@ struct redisCommand {
};
};
static
struct
redisCommand
cmdTable
[]
=
{
static
struct
redisCommand
cmdTable
[]
=
{
{
"get"
,
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_BULKREPLY
},
{
"get"
,
2
,
REDIS_CMD_INLINE
},
{
"set"
,
3
,
REDIS_CMD_BULK
|
REDIS_CMD_RETCODEREPLY
},
{
"set"
,
3
,
REDIS_CMD_BULK
},
{
"setnx"
,
3
,
REDIS_CMD_BULK
|
REDIS_CMD_INTREPLY
},
{
"setnx"
,
3
,
REDIS_CMD_BULK
},
{
"del"
,
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_INTREPLY
},
{
"del"
,
2
,
REDIS_CMD_INLINE
},
{
"exists"
,
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_INTREPLY
},
{
"exists"
,
2
,
REDIS_CMD_INLINE
},
{
"incr"
,
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_INTREPLY
},
{
"incr"
,
2
,
REDIS_CMD_INLINE
},
{
"decr"
,
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_INTREPLY
},
{
"decr"
,
2
,
REDIS_CMD_INLINE
},
{
"rpush"
,
3
,
REDIS_CMD_BULK
|
REDIS_CMD_RETCODEREPLY
},
{
"rpush"
,
3
,
REDIS_CMD_BULK
},
{
"lpush"
,
3
,
REDIS_CMD_BULK
|
REDIS_CMD_RETCODEREPLY
},
{
"lpush"
,
3
,
REDIS_CMD_BULK
},
{
"rpop"
,
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_BULKREPLY
},
{
"rpop"
,
2
,
REDIS_CMD_INLINE
},
{
"lpop"
,
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_BULKREPLY
},
{
"lpop"
,
2
,
REDIS_CMD_INLINE
},
{
"llen"
,
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_INTREPLY
},
{
"llen"
,
2
,
REDIS_CMD_INLINE
},
{
"lindex"
,
3
,
REDIS_CMD_INLINE
|
REDIS_CMD_BULKREPLY
},
{
"lindex"
,
3
,
REDIS_CMD_INLINE
},
{
"lset"
,
4
,
REDIS_CMD_BULK
|
REDIS_CMD_RETCODEREPLY
},
{
"lset"
,
4
,
REDIS_CMD_BULK
},
{
"lrange"
,
4
,
REDIS_CMD_INLINE
|
REDIS_CMD_MULTIBULKREPLY
},
{
"lrange"
,
4
,
REDIS_CMD_INLINE
},
{
"ltrim"
,
4
,
REDIS_CMD_INLINE
|
REDIS_CMD_RETCODEREPLY
},
{
"ltrim"
,
4
,
REDIS_CMD_INLINE
},
{
"lrem"
,
4
,
REDIS_CMD_BULK
|
REDIS_CMD_INTREPLY
},
{
"lrem"
,
4
,
REDIS_CMD_BULK
},
{
"sadd"
,
3
,
REDIS_CMD_BULK
|
REDIS_CMD_INTREPLY
},
{
"sadd"
,
3
,
REDIS_CMD_BULK
},
{
"srem"
,
3
,
REDIS_CMD_BULK
|
REDIS_CMD_INTREPLY
},
{
"srem"
,
3
,
REDIS_CMD_BULK
},
{
"sismember"
,
3
,
REDIS_CMD_BULK
|
REDIS_CMD_INTREPLY
},
{
"sismember"
,
3
,
REDIS_CMD_BULK
},
{
"scard"
,
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_INTREPLY
},
{
"scard"
,
2
,
REDIS_CMD_INLINE
},
{
"sinter"
,
-
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_MULTIBULKREPLY
},
{
"sinter"
,
-
2
,
REDIS_CMD_INLINE
},
{
"sinterstore"
,
-
3
,
REDIS_CMD_INLINE
|
REDIS_CMD_RETCODEREPLY
},
{
"sinterstore"
,
-
3
,
REDIS_CMD_INLINE
},
{
"smembers"
,
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_MULTIBULKREPLY
},
{
"smembers"
,
2
,
REDIS_CMD_INLINE
},
{
"incrby"
,
3
,
REDIS_CMD_INLINE
|
REDIS_CMD_INTREPLY
},
{
"incrby"
,
3
,
REDIS_CMD_INLINE
},
{
"decrby"
,
3
,
REDIS_CMD_INLINE
|
REDIS_CMD_INTREPLY
},
{
"decrby"
,
3
,
REDIS_CMD_INLINE
},
{
"randomkey"
,
1
,
REDIS_CMD_INLINE
|
REDIS_CMD_SINGLELINEREPLY
},
{
"randomkey"
,
1
,
REDIS_CMD_INLINE
},
{
"select"
,
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_RETCODEREPLY
},
{
"select"
,
2
,
REDIS_CMD_INLINE
},
{
"move"
,
3
,
REDIS_CMD_INLINE
|
REDIS_CMD_INTREPLY
},
{
"move"
,
3
,
REDIS_CMD_INLINE
},
{
"rename"
,
3
,
REDIS_CMD_INLINE
|
REDIS_CMD_RETCODEREPLY
},
{
"rename"
,
3
,
REDIS_CMD_INLINE
},
{
"renamenx"
,
3
,
REDIS_CMD_INLINE
|
REDIS_CMD_INTREPLY
},
{
"renamenx"
,
3
,
REDIS_CMD_INLINE
},
{
"keys"
,
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_BULKREPLY
},
{
"keys"
,
2
,
REDIS_CMD_INLINE
},
{
"dbsize"
,
1
,
REDIS_CMD_INLINE
|
REDIS_CMD_INTREPLY
},
{
"dbsize"
,
1
,
REDIS_CMD_INLINE
},
{
"ping"
,
1
,
REDIS_CMD_INLINE
|
REDIS_CMD_RETCODEREPLY
},
{
"ping"
,
1
,
REDIS_CMD_INLINE
},
{
"echo"
,
2
,
REDIS_CMD_BULK
|
REDIS_CMD_BULKREPLY
},
{
"echo"
,
2
,
REDIS_CMD_BULK
},
{
"save"
,
1
,
REDIS_CMD_INLINE
|
REDIS_CMD_RETCODEREPLY
},
{
"save"
,
1
,
REDIS_CMD_INLINE
},
{
"bgsave"
,
1
,
REDIS_CMD_INLINE
|
REDIS_CMD_RETCODEREPLY
},
{
"bgsave"
,
1
,
REDIS_CMD_INLINE
},
{
"shutdown"
,
1
,
REDIS_CMD_INLINE
|
REDIS_CMD_RETCODEREPLY
},
{
"shutdown"
,
1
,
REDIS_CMD_INLINE
},
{
"lastsave"
,
1
,
REDIS_CMD_INLINE
|
REDIS_CMD_INTREPLY
},
{
"lastsave"
,
1
,
REDIS_CMD_INLINE
},
{
"type"
,
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_SINGLELINEREPLY
},
{
"type"
,
2
,
REDIS_CMD_INLINE
},
{
"flushdb"
,
1
,
REDIS_CMD_INLINE
|
REDIS_CMD_RETCODEREPLY
},
{
"flushdb"
,
1
,
REDIS_CMD_INLINE
},
{
"flushall"
,
1
,
REDIS_CMD_INLINE
|
REDIS_CMD_RETCODEREPLY
},
{
"flushall"
,
1
,
REDIS_CMD_INLINE
},
{
"sort"
,
-
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_MULTIBULKREPLY
},
{
"sort"
,
-
2
,
REDIS_CMD_INLINE
},
{
"info"
,
1
,
REDIS_CMD_INLINE
|
REDIS_CMD_BULKREPLY
},
{
"info"
,
1
,
REDIS_CMD_INLINE
},
{
"mget"
,
-
2
,
REDIS_CMD_INLINE
|
REDIS_CMD_MULTIBULKREPLY
},
{
"mget"
,
-
2
,
REDIS_CMD_INLINE
},
{
NULL
,
0
,
0
}
{
NULL
,
0
,
0
}
};
};
static
int
cliReadReply
(
int
fd
);
static
struct
redisCommand
*
lookupCommand
(
char
*
name
)
{
static
struct
redisCommand
*
lookupCommand
(
char
*
name
)
{
int
j
=
0
;
int
j
=
0
;
while
(
cmdTable
[
j
].
name
!=
NULL
)
{
while
(
cmdTable
[
j
].
name
!=
NULL
)
{
...
@@ -150,38 +147,26 @@ static sds cliReadLine(int fd) {
...
@@ -150,38 +147,26 @@ static sds cliReadLine(int fd) {
return
sdstrim
(
line
,
"
\r\n
"
);
return
sdstrim
(
line
,
"
\r\n
"
);
}
}
static
int
cliRead
Inl
ineReply
(
int
fd
,
int
type
)
{
static
int
cliRead
SingleL
ineReply
(
int
fd
)
{
sds
reply
=
cliReadLine
(
fd
);
sds
reply
=
cliReadLine
(
fd
);
if
(
reply
==
NULL
)
return
1
;
if
(
reply
==
NULL
)
return
1
;
printf
(
"%s
\n
"
,
reply
);
printf
(
"%s
\n
"
,
reply
);
if
(
type
==
REDIS_CMD_SINGLELINEREPLY
)
return
0
;
if
(
type
==
REDIS_CMD_INTREPLY
)
return
atoi
(
reply
)
<
0
;
if
(
type
==
REDIS_CMD_RETCODEREPLY
)
return
reply
[
0
]
==
'-'
;
return
0
;
return
0
;
}
}
static
int
cliReadBulkReply
(
int
fd
,
int
multibulk
)
{
static
int
cliReadBulkReply
(
int
fd
)
{
sds
replylen
=
cliReadLine
(
fd
);
sds
replylen
=
cliReadLine
(
fd
);
char
*
reply
,
crlf
[
2
];
char
*
reply
,
crlf
[
2
];
int
bulklen
,
error
=
0
;
int
bulklen
;
if
(
replylen
==
NULL
)
return
1
;
if
(
replylen
==
NULL
)
return
1
;
if
(
strcmp
(
replylen
,
"nil"
)
==
0
)
{
sdsfree
(
replylen
);
printf
(
"(nil)
\n
"
);
return
0
;
}
bulklen
=
atoi
(
replylen
);
bulklen
=
atoi
(
replylen
);
if
(
multibulk
&&
bulklen
==
-
1
)
{
if
(
bulklen
==
-
1
)
{
sdsfree
(
replylen
);
sdsfree
(
replylen
);
printf
(
"(nil)"
);
printf
(
"(nil)"
);
return
0
;
return
0
;
}
}
if
(
bulklen
<
0
)
{
bulklen
=
-
bulklen
;
error
=
1
;
}
reply
=
zmalloc
(
bulklen
);
reply
=
zmalloc
(
bulklen
);
anetRead
(
fd
,
reply
,
bulklen
);
anetRead
(
fd
,
reply
,
bulklen
);
anetRead
(
fd
,
crlf
,
2
);
anetRead
(
fd
,
crlf
,
2
);
...
@@ -189,10 +174,10 @@ static int cliReadBulkReply(int fd, int multibulk) {
...
@@ -189,10 +174,10 @@ static int cliReadBulkReply(int fd, int multibulk) {
zfree
(
reply
);
zfree
(
reply
);
return
1
;
return
1
;
}
}
if
(
!
multibulk
&&
isatty
(
fileno
(
stdout
))
&&
reply
[
bulklen
-
1
]
!=
'\n'
)
if
(
isatty
(
fileno
(
stdout
))
&&
reply
[
bulklen
-
1
]
!=
'\n'
)
printf
(
"
\n
"
);
printf
(
"
\n
"
);
zfree
(
reply
);
zfree
(
reply
);
return
error
;
return
0
;
}
}
static
int
cliReadMultiBulkReply
(
int
fd
)
{
static
int
cliReadMultiBulkReply
(
int
fd
)
{
...
@@ -200,21 +185,45 @@ static int cliReadMultiBulkReply(int fd) {
...
@@ -200,21 +185,45 @@ static int cliReadMultiBulkReply(int fd) {
int
elements
,
c
=
1
;
int
elements
,
c
=
1
;
if
(
replylen
==
NULL
)
return
1
;
if
(
replylen
==
NULL
)
return
1
;
if
(
strcmp
(
replylen
,
"nil"
)
==
0
)
{
elements
=
atoi
(
replylen
);
if
(
elements
==
-
1
)
{
sdsfree
(
replylen
);
sdsfree
(
replylen
);
printf
(
"(nil)
\n
"
);
printf
(
"(nil)
\n
"
);
return
0
;
return
0
;
}
}
elements
=
atoi
(
replylen
);
if
(
elements
==
0
)
{
printf
(
"(empty list or set)
\n
"
);
}
while
(
elements
--
)
{
while
(
elements
--
)
{
printf
(
"%d. "
,
c
);
printf
(
"%d. "
,
c
);
if
(
cliReadBulkReply
(
fd
,
1
))
return
1
;
if
(
cliReadReply
(
fd
))
return
1
;
printf
(
"
\n
"
);
c
++
;
c
++
;
}
}
return
0
;
return
0
;
}
}
static
int
cliReadReply
(
int
fd
)
{
char
type
;
if
(
anetRead
(
fd
,
&
type
,
1
)
<=
0
)
exit
(
1
);
switch
(
type
)
{
case
'-'
:
printf
(
"(error) "
);
cliReadSingleLineReply
(
fd
);
return
1
;
case
'+'
:
case
':'
:
return
cliReadSingleLineReply
(
fd
);
case
'$'
:
return
cliReadBulkReply
(
fd
);
case
'*'
:
return
cliReadMultiBulkReply
(
fd
);
default:
printf
(
"protocol error, got '%c' as reply type byte
\n
"
,
type
);
return
1
;
}
}
static
int
cliSendCommand
(
int
argc
,
char
**
argv
)
{
static
int
cliSendCommand
(
int
argc
,
char
**
argv
)
{
struct
redisCommand
*
rc
=
lookupCommand
(
argv
[
0
]);
struct
redisCommand
*
rc
=
lookupCommand
(
argv
[
0
]);
int
fd
,
j
,
retval
=
0
;
int
fd
,
j
,
retval
=
0
;
...
@@ -247,17 +256,7 @@ static int cliSendCommand(int argc, char **argv) {
...
@@ -247,17 +256,7 @@ static int cliSendCommand(int argc, char **argv) {
cmd
=
sdscat
(
cmd
,
"
\r\n
"
);
cmd
=
sdscat
(
cmd
,
"
\r\n
"
);
}
}
anetWrite
(
fd
,
cmd
,
sdslen
(
cmd
));
anetWrite
(
fd
,
cmd
,
sdslen
(
cmd
));
if
(
rc
->
flags
&
REDIS_CMD_INTREPLY
)
{
retval
=
cliReadReply
(
fd
);
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
)
{
if
(
retval
)
{
close
(
fd
);
close
(
fd
);
return
retval
;
return
retval
;
...
...
redis.c
View file @
c937aa89
...
@@ -214,10 +214,10 @@ typedef struct _redisSortOperation {
...
@@ -214,10 +214,10 @@ typedef struct _redisSortOperation {
}
redisSortOperation
;
}
redisSortOperation
;
struct
sharedObjectsStruct
{
struct
sharedObjectsStruct
{
robj
*
crlf
,
*
ok
,
*
err
,
*
zero
bulk
,
*
nil
,
*
zero
,
*
one
,
*
pong
,
*
space
,
robj
*
crlf
,
*
ok
,
*
err
,
*
empty
bulk
,
*
c
zero
,
*
c
one
,
*
pong
,
*
space
,
*
minus1
,
*
minus
2
,
*
minus3
,
*
minus4
,
*
colon
,
*
minus
1
,
*
nullbulk
,
*
nullmultibulk
,
*
wrongtypeerr
,
*
nokeyerr
,
*
wrongtypeerrbulk
,
*
nokeyerrbulk
,
*
emptymultibulk
,
*
wrongtypeerr
,
*
nokeyerr
,
*
syntaxerr
,
*
sameobjecterr
,
*
syntaxerr
,
*
syntaxerrbulk
,
*
outofrangeerr
,
*
plus
,
*
select0
,
*
select1
,
*
select2
,
*
select3
,
*
select4
,
*
select0
,
*
select1
,
*
select2
,
*
select3
,
*
select4
,
*
select5
,
*
select6
,
*
select7
,
*
select8
,
*
select9
;
*
select5
,
*
select6
,
*
select7
,
*
select8
,
*
select9
;
}
shared
;
}
shared
;
...
@@ -660,29 +660,28 @@ static void createSharedObjects(void) {
...
@@ -660,29 +660,28 @@ static void createSharedObjects(void) {
shared
.
crlf
=
createObject
(
REDIS_STRING
,
sdsnew
(
"
\r\n
"
));
shared
.
crlf
=
createObject
(
REDIS_STRING
,
sdsnew
(
"
\r\n
"
));
shared
.
ok
=
createObject
(
REDIS_STRING
,
sdsnew
(
"+OK
\r\n
"
));
shared
.
ok
=
createObject
(
REDIS_STRING
,
sdsnew
(
"+OK
\r\n
"
));
shared
.
err
=
createObject
(
REDIS_STRING
,
sdsnew
(
"-ERR
\r\n
"
));
shared
.
err
=
createObject
(
REDIS_STRING
,
sdsnew
(
"-ERR
\r\n
"
));
shared
.
zerobulk
=
createObject
(
REDIS_STRING
,
sdsnew
(
"0
\r\n\r\n
"
));
shared
.
emptybulk
=
createObject
(
REDIS_STRING
,
sdsnew
(
"$0
\r\n\r\n
"
));
shared
.
nil
=
createObject
(
REDIS_STRING
,
sdsnew
(
"nil
\r\n
"
));
shared
.
czero
=
createObject
(
REDIS_STRING
,
sdsnew
(
":0
\r\n
"
));
shared
.
zero
=
createObject
(
REDIS_STRING
,
sdsnew
(
"0
\r\n
"
));
shared
.
cone
=
createObject
(
REDIS_STRING
,
sdsnew
(
":1
\r\n
"
));
shared
.
one
=
createObject
(
REDIS_STRING
,
sdsnew
(
"1
\r\n
"
));
shared
.
nullbulk
=
createObject
(
REDIS_STRING
,
sdsnew
(
"$-1
\r\n
"
));
shared
.
nullmultibulk
=
createObject
(
REDIS_STRING
,
sdsnew
(
"*-1
\r\n
"
));
shared
.
emptymultibulk
=
createObject
(
REDIS_STRING
,
sdsnew
(
"*0
\r\n
"
));
/* no such key */
/* no such key */
shared
.
minus1
=
createObject
(
REDIS_STRING
,
sdsnew
(
"-1
\r\n
"
));
shared
.
minus1
=
createObject
(
REDIS_STRING
,
sdsnew
(
"-1
\r\n
"
));
/* operation against key holding a value of the wrong type */
shared
.
minus2
=
createObject
(
REDIS_STRING
,
sdsnew
(
"-2
\r\n
"
));
/* src and dest objects are the same */
shared
.
minus3
=
createObject
(
REDIS_STRING
,
sdsnew
(
"-3
\r\n
"
));
/* out of range argument */
shared
.
minus4
=
createObject
(
REDIS_STRING
,
sdsnew
(
"-4
\r\n
"
));
shared
.
pong
=
createObject
(
REDIS_STRING
,
sdsnew
(
"+PONG
\r\n
"
));
shared
.
pong
=
createObject
(
REDIS_STRING
,
sdsnew
(
"+PONG
\r\n
"
));
shared
.
wrongtypeerr
=
createObject
(
REDIS_STRING
,
sdsnew
(
shared
.
wrongtypeerr
=
createObject
(
REDIS_STRING
,
sdsnew
(
"-ERR Operation against a key holding the wrong kind of value
\r\n
"
));
"-ERR Operation against a key holding the wrong kind of value
\r\n
"
));
shared
.
wrongtypeerrbulk
=
createObject
(
REDIS_STRING
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
%s"
,
-
sdslen
(
shared
.
wrongtypeerr
->
ptr
)
+
2
,
shared
.
wrongtypeerr
->
ptr
));
shared
.
nokeyerr
=
createObject
(
REDIS_STRING
,
sdsnew
(
shared
.
nokeyerr
=
createObject
(
REDIS_STRING
,
sdsnew
(
"-ERR no such key
\r\n
"
));
"-ERR no such key
\r\n
"
));
shared
.
nokeyerrbulk
=
createObject
(
REDIS_STRING
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
%s"
,
-
sdslen
(
shared
.
nokeyerr
->
ptr
)
+
2
,
shared
.
nokeyerr
->
ptr
));
shared
.
syntaxerr
=
createObject
(
REDIS_STRING
,
sdsnew
(
shared
.
syntaxerr
=
createObject
(
REDIS_STRING
,
sdsnew
(
"-ERR syntax error
\r\n
"
));
"-ERR syntax error
\r\n
"
));
shared
.
syntaxerrbulk
=
createObject
(
REDIS_STRING
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
%s"
,
-
sdslen
(
shared
.
syntaxerr
->
ptr
)
+
2
,
shared
.
syntaxerr
->
ptr
));
shared
.
sameobjecterr
=
createObject
(
REDIS_STRING
,
sdsnew
(
"-ERR source and destination objects are the same
\r\n
"
));
shared
.
outofrangeerr
=
createObject
(
REDIS_STRING
,
sdsnew
(
"-ERR index out of range
\r\n
"
));
shared
.
space
=
createObject
(
REDIS_STRING
,
sdsnew
(
" "
));
shared
.
space
=
createObject
(
REDIS_STRING
,
sdsnew
(
" "
));
shared
.
colon
=
createObject
(
REDIS_STRING
,
sdsnew
(
":"
));
shared
.
plus
=
createObject
(
REDIS_STRING
,
sdsnew
(
"+"
));
shared
.
select0
=
createStringObject
(
"select 0
\r\n
"
,
10
);
shared
.
select0
=
createStringObject
(
"select 0
\r\n
"
,
10
);
shared
.
select1
=
createStringObject
(
"select 1
\r\n
"
,
10
);
shared
.
select1
=
createStringObject
(
"select 1
\r\n
"
,
10
);
shared
.
select2
=
createStringObject
(
"select 2
\r\n
"
,
10
);
shared
.
select2
=
createStringObject
(
"select 2
\r\n
"
,
10
);
...
@@ -1654,7 +1653,7 @@ static void pingCommand(redisClient *c) {
...
@@ -1654,7 +1653,7 @@ static void pingCommand(redisClient *c) {
}
}
static
void
echoCommand
(
redisClient
*
c
)
{
static
void
echoCommand
(
redisClient
*
c
)
{
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
$
%d
\r\n
"
,
(
int
)
sdslen
(
c
->
argv
[
1
]
->
ptr
)));
(
int
)
sdslen
(
c
->
argv
[
1
]
->
ptr
)));
addReply
(
c
,
c
->
argv
[
1
]);
addReply
(
c
,
c
->
argv
[
1
]);
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
...
@@ -1671,7 +1670,7 @@ static void setGenericCommand(redisClient *c, int nx) {
...
@@ -1671,7 +1670,7 @@ static void setGenericCommand(redisClient *c, int nx) {
dictReplace
(
c
->
dict
,
c
->
argv
[
1
],
c
->
argv
[
2
]);
dictReplace
(
c
->
dict
,
c
->
argv
[
1
],
c
->
argv
[
2
]);
incrRefCount
(
c
->
argv
[
2
]);
incrRefCount
(
c
->
argv
[
2
]);
}
else
{
}
else
{
addReply
(
c
,
shared
.
zero
);
addReply
(
c
,
shared
.
c
zero
);
return
;
return
;
}
}
}
else
{
}
else
{
...
@@ -1679,7 +1678,7 @@ static void setGenericCommand(redisClient *c, int nx) {
...
@@ -1679,7 +1678,7 @@ static void setGenericCommand(redisClient *c, int nx) {
incrRefCount
(
c
->
argv
[
2
]);
incrRefCount
(
c
->
argv
[
2
]);
}
}
server
.
dirty
++
;
server
.
dirty
++
;
addReply
(
c
,
nx
?
shared
.
one
:
shared
.
ok
);
addReply
(
c
,
nx
?
shared
.
c
one
:
shared
.
ok
);
}
}
static
void
setCommand
(
redisClient
*
c
)
{
static
void
setCommand
(
redisClient
*
c
)
{
...
@@ -1695,14 +1694,14 @@ static void getCommand(redisClient *c) {
...
@@ -1695,14 +1694,14 @@ static void getCommand(redisClient *c) {
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
addReply
(
c
,
shared
.
n
il
);
addReply
(
c
,
shared
.
n
ullbulk
);
}
else
{
}
else
{
robj
*
o
=
dictGetEntryVal
(
de
);
robj
*
o
=
dictGetEntryVal
(
de
);
if
(
o
->
type
!=
REDIS_STRING
)
{
if
(
o
->
type
!=
REDIS_STRING
)
{
addReply
(
c
,
shared
.
wrongtypeerr
bulk
);
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
}
else
{
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,(
int
)
sdslen
(
o
->
ptr
)));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
$
%d
\r\n
"
,(
int
)
sdslen
(
o
->
ptr
)));
addReply
(
c
,
o
);
addReply
(
c
,
o
);
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
}
}
...
@@ -1713,18 +1712,18 @@ static void mgetCommand(redisClient *c) {
...
@@ -1713,18 +1712,18 @@ static void mgetCommand(redisClient *c) {
dictEntry
*
de
;
dictEntry
*
de
;
int
j
;
int
j
;
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,
c
->
argc
-
1
));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
*
%d
\r\n
"
,
c
->
argc
-
1
));
for
(
j
=
1
;
j
<
c
->
argc
;
j
++
)
{
for
(
j
=
1
;
j
<
c
->
argc
;
j
++
)
{
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
j
]);
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
j
]);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
addReply
(
c
,
shared
.
minus1
);
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
}
else
{
robj
*
o
=
dictGetEntryVal
(
de
);
robj
*
o
=
dictGetEntryVal
(
de
);
if
(
o
->
type
!=
REDIS_STRING
)
{
if
(
o
->
type
!=
REDIS_STRING
)
{
addReply
(
c
,
shared
.
minus1
);
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
}
else
{
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,(
int
)
sdslen
(
o
->
ptr
)));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
$
%d
\r\n
"
,(
int
)
sdslen
(
o
->
ptr
)));
addReply
(
c
,
o
);
addReply
(
c
,
o
);
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
}
}
...
@@ -1762,6 +1761,7 @@ static void incrDecrCommand(redisClient *c, int incr) {
...
@@ -1762,6 +1761,7 @@ static void incrDecrCommand(redisClient *c, int incr) {
incrRefCount
(
c
->
argv
[
1
]);
incrRefCount
(
c
->
argv
[
1
]);
}
}
server
.
dirty
++
;
server
.
dirty
++
;
addReply
(
c
,
shared
.
colon
);
addReply
(
c
,
o
);
addReply
(
c
,
o
);
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
}
}
...
@@ -1789,9 +1789,9 @@ static void decrbyCommand(redisClient *c) {
...
@@ -1789,9 +1789,9 @@ static void decrbyCommand(redisClient *c) {
static
void
delCommand
(
redisClient
*
c
)
{
static
void
delCommand
(
redisClient
*
c
)
{
if
(
dictDelete
(
c
->
dict
,
c
->
argv
[
1
])
==
DICT_OK
)
{
if
(
dictDelete
(
c
->
dict
,
c
->
argv
[
1
])
==
DICT_OK
)
{
server
.
dirty
++
;
server
.
dirty
++
;
addReply
(
c
,
shared
.
one
);
addReply
(
c
,
shared
.
c
one
);
}
else
{
}
else
{
addReply
(
c
,
shared
.
zero
);
addReply
(
c
,
shared
.
c
zero
);
}
}
}
}
...
@@ -1800,9 +1800,9 @@ static void existsCommand(redisClient *c) {
...
@@ -1800,9 +1800,9 @@ static void existsCommand(redisClient *c) {
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
if
(
de
==
NULL
)
if
(
de
==
NULL
)
addReply
(
c
,
shared
.
zero
);
addReply
(
c
,
shared
.
c
zero
);
else
else
addReply
(
c
,
shared
.
one
);
addReply
(
c
,
shared
.
c
one
);
}
}
static
void
selectCommand
(
redisClient
*
c
)
{
static
void
selectCommand
(
redisClient
*
c
)
{
...
@@ -1822,6 +1822,7 @@ static void randomkeyCommand(redisClient *c) {
...
@@ -1822,6 +1822,7 @@ static void randomkeyCommand(redisClient *c) {
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
}
else
{
}
else
{
addReply
(
c
,
shared
.
plus
);
addReply
(
c
,
dictGetEntryKey
(
de
));
addReply
(
c
,
dictGetEntryKey
(
de
));
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
}
}
...
@@ -1852,18 +1853,18 @@ static void keysCommand(redisClient *c) {
...
@@ -1852,18 +1853,18 @@ static void keysCommand(redisClient *c) {
}
}
}
}
dictReleaseIterator
(
di
);
dictReleaseIterator
(
di
);
lenobj
->
ptr
=
sdscatprintf
(
sdsempty
(),
"%lu
\r\n
"
,
keyslen
+
(
numkeys
?
(
numkeys
-
1
)
:
0
));
lenobj
->
ptr
=
sdscatprintf
(
sdsempty
(),
"
$
%lu
\r\n
"
,
keyslen
+
(
numkeys
?
(
numkeys
-
1
)
:
0
));
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
}
}
static
void
dbsizeCommand
(
redisClient
*
c
)
{
static
void
dbsizeCommand
(
redisClient
*
c
)
{
addReplySds
(
c
,
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%lu
\r\n
"
,
dictGetHashTableUsed
(
c
->
dict
)));
sdscatprintf
(
sdsempty
(),
"
:
%lu
\r\n
"
,
dictGetHashTableUsed
(
c
->
dict
)));
}
}
static
void
lastsaveCommand
(
redisClient
*
c
)
{
static
void
lastsaveCommand
(
redisClient
*
c
)
{
addReplySds
(
c
,
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%lu
\r\n
"
,
server
.
lastsave
));
sdscatprintf
(
sdsempty
(),
"
:
%lu
\r\n
"
,
server
.
lastsave
));
}
}
static
void
typeCommand
(
redisClient
*
c
)
{
static
void
typeCommand
(
redisClient
*
c
)
{
...
@@ -1872,14 +1873,14 @@ static void typeCommand(redisClient *c) {
...
@@ -1872,14 +1873,14 @@ static void typeCommand(redisClient *c) {
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
type
=
"none"
;
type
=
"
+
none"
;
}
else
{
}
else
{
robj
*
o
=
dictGetEntryVal
(
de
);
robj
*
o
=
dictGetEntryVal
(
de
);
switch
(
o
->
type
)
{
switch
(
o
->
type
)
{
case
REDIS_STRING
:
type
=
"string"
;
break
;
case
REDIS_STRING
:
type
=
"
+
string"
;
break
;
case
REDIS_LIST
:
type
=
"list"
;
break
;
case
REDIS_LIST
:
type
=
"
+
list"
;
break
;
case
REDIS_SET
:
type
=
"set"
;
break
;
case
REDIS_SET
:
type
=
"
+
set"
;
break
;
default:
type
=
"unknown"
;
break
;
default:
type
=
"unknown"
;
break
;
}
}
}
}
...
@@ -1927,18 +1928,12 @@ static void renameGenericCommand(redisClient *c, int nx) {
...
@@ -1927,18 +1928,12 @@ static void renameGenericCommand(redisClient *c, int nx) {
/* To use the same key as src and dst is probably an error */
/* To use the same key as src and dst is probably an error */
if
(
sdscmp
(
c
->
argv
[
1
]
->
ptr
,
c
->
argv
[
2
]
->
ptr
)
==
0
)
{
if
(
sdscmp
(
c
->
argv
[
1
]
->
ptr
,
c
->
argv
[
2
]
->
ptr
)
==
0
)
{
if
(
nx
)
addReply
(
c
,
shared
.
sameobjecterr
);
addReply
(
c
,
shared
.
minus3
);
else
addReplySds
(
c
,
sdsnew
(
"-ERR src and dest key are the same
\r\n
"
));
return
;
return
;
}
}
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
if
(
nx
)
addReply
(
c
,
shared
.
minus1
);
else
addReply
(
c
,
shared
.
nokeyerr
);
addReply
(
c
,
shared
.
nokeyerr
);
return
;
return
;
}
}
...
@@ -1947,7 +1942,7 @@ static void renameGenericCommand(redisClient *c, int nx) {
...
@@ -1947,7 +1942,7 @@ static void renameGenericCommand(redisClient *c, int nx) {
if
(
dictAdd
(
c
->
dict
,
c
->
argv
[
2
],
o
)
==
DICT_ERR
)
{
if
(
dictAdd
(
c
->
dict
,
c
->
argv
[
2
],
o
)
==
DICT_ERR
)
{
if
(
nx
)
{
if
(
nx
)
{
decrRefCount
(
o
);
decrRefCount
(
o
);
addReply
(
c
,
shared
.
zero
);
addReply
(
c
,
shared
.
c
zero
);
return
;
return
;
}
}
dictReplace
(
c
->
dict
,
c
->
argv
[
2
],
o
);
dictReplace
(
c
->
dict
,
c
->
argv
[
2
],
o
);
...
@@ -1956,7 +1951,7 @@ static void renameGenericCommand(redisClient *c, int nx) {
...
@@ -1956,7 +1951,7 @@ static void renameGenericCommand(redisClient *c, int nx) {
}
}
dictDelete
(
c
->
dict
,
c
->
argv
[
1
]);
dictDelete
(
c
->
dict
,
c
->
argv
[
1
]);
server
.
dirty
++
;
server
.
dirty
++
;
addReply
(
c
,
nx
?
shared
.
one
:
shared
.
ok
);
addReply
(
c
,
nx
?
shared
.
c
one
:
shared
.
ok
);
}
}
static
void
renameCommand
(
redisClient
*
c
)
{
static
void
renameCommand
(
redisClient
*
c
)
{
...
@@ -1977,7 +1972,7 @@ static void moveCommand(redisClient *c) {
...
@@ -1977,7 +1972,7 @@ static void moveCommand(redisClient *c) {
src
=
c
->
dict
;
src
=
c
->
dict
;
srcid
=
c
->
dictid
;
srcid
=
c
->
dictid
;
if
(
selectDb
(
c
,
atoi
(
c
->
argv
[
2
]
->
ptr
))
==
REDIS_ERR
)
{
if
(
selectDb
(
c
,
atoi
(
c
->
argv
[
2
]
->
ptr
))
==
REDIS_ERR
)
{
addReply
(
c
,
shared
.
minus4
);
addReply
(
c
,
shared
.
outofrangeerr
);
return
;
return
;
}
}
dst
=
c
->
dict
;
dst
=
c
->
dict
;
...
@@ -1987,14 +1982,14 @@ static void moveCommand(redisClient *c) {
...
@@ -1987,14 +1982,14 @@ static void moveCommand(redisClient *c) {
/* If the user is moving using as target the same
/* If the user is moving using as target the same
* DB as the source DB it is probably an error. */
* DB as the source DB it is probably an error. */
if
(
src
==
dst
)
{
if
(
src
==
dst
)
{
addReply
(
c
,
shared
.
minus3
);
addReply
(
c
,
shared
.
sameobjecterr
);
return
;
return
;
}
}
/* Check if the element exists and get a reference */
/* Check if the element exists and get a reference */
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
if
(
!
de
)
{
if
(
!
de
)
{
addReply
(
c
,
shared
.
zero
);
addReply
(
c
,
shared
.
c
zero
);
return
;
return
;
}
}
...
@@ -2002,7 +1997,7 @@ static void moveCommand(redisClient *c) {
...
@@ -2002,7 +1997,7 @@ static void moveCommand(redisClient *c) {
key
=
dictGetEntryKey
(
de
);
key
=
dictGetEntryKey
(
de
);
o
=
dictGetEntryVal
(
de
);
o
=
dictGetEntryVal
(
de
);
if
(
dictAdd
(
dst
,
key
,
o
)
==
DICT_ERR
)
{
if
(
dictAdd
(
dst
,
key
,
o
)
==
DICT_ERR
)
{
addReply
(
c
,
shared
.
zero
);
addReply
(
c
,
shared
.
c
zero
);
return
;
return
;
}
}
incrRefCount
(
key
);
incrRefCount
(
key
);
...
@@ -2011,7 +2006,7 @@ static void moveCommand(redisClient *c) {
...
@@ -2011,7 +2006,7 @@ static void moveCommand(redisClient *c) {
/* OK! key moved, free the entry in the source DB */
/* OK! key moved, free the entry in the source DB */
dictDelete
(
src
,
c
->
argv
[
1
]);
dictDelete
(
src
,
c
->
argv
[
1
]);
server
.
dirty
++
;
server
.
dirty
++
;
addReply
(
c
,
shared
.
one
);
addReply
(
c
,
shared
.
c
one
);
}
}
/* =================================== Lists ================================ */
/* =================================== Lists ================================ */
...
@@ -2064,15 +2059,15 @@ static void llenCommand(redisClient *c) {
...
@@ -2064,15 +2059,15 @@ static void llenCommand(redisClient *c) {
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
addReply
(
c
,
shared
.
zero
);
addReply
(
c
,
shared
.
c
zero
);
return
;
return
;
}
else
{
}
else
{
robj
*
o
=
dictGetEntryVal
(
de
);
robj
*
o
=
dictGetEntryVal
(
de
);
if
(
o
->
type
!=
REDIS_LIST
)
{
if
(
o
->
type
!=
REDIS_LIST
)
{
addReply
(
c
,
shared
.
minus2
);
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
}
else
{
l
=
o
->
ptr
;
l
=
o
->
ptr
;
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,
listLength
(
l
)));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
:
%d
\r\n
"
,
listLength
(
l
)));
}
}
}
}
}
}
...
@@ -2083,22 +2078,22 @@ static void lindexCommand(redisClient *c) {
...
@@ -2083,22 +2078,22 @@ static void lindexCommand(redisClient *c) {
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
addReply
(
c
,
shared
.
n
il
);
addReply
(
c
,
shared
.
n
ullbulk
);
}
else
{
}
else
{
robj
*
o
=
dictGetEntryVal
(
de
);
robj
*
o
=
dictGetEntryVal
(
de
);
if
(
o
->
type
!=
REDIS_LIST
)
{
if
(
o
->
type
!=
REDIS_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
bulk
);
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
}
else
{
list
*
list
=
o
->
ptr
;
list
*
list
=
o
->
ptr
;
listNode
*
ln
;
listNode
*
ln
;
ln
=
listIndex
(
list
,
index
);
ln
=
listIndex
(
list
,
index
);
if
(
ln
==
NULL
)
{
if
(
ln
==
NULL
)
{
addReply
(
c
,
shared
.
n
il
);
addReply
(
c
,
shared
.
n
ullbulk
);
}
else
{
}
else
{
robj
*
ele
=
listNodeValue
(
ln
);
robj
*
ele
=
listNodeValue
(
ln
);
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,(
int
)
sdslen
(
ele
->
ptr
)));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
$
%d
\r\n
"
,(
int
)
sdslen
(
ele
->
ptr
)));
addReply
(
c
,
ele
);
addReply
(
c
,
ele
);
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
}
}
...
@@ -2124,7 +2119,7 @@ static void lsetCommand(redisClient *c) {
...
@@ -2124,7 +2119,7 @@ static void lsetCommand(redisClient *c) {
ln
=
listIndex
(
list
,
index
);
ln
=
listIndex
(
list
,
index
);
if
(
ln
==
NULL
)
{
if
(
ln
==
NULL
)
{
addReply
Sds
(
c
,
s
dsnew
(
"-ERR index
out
of
range
\r\n
"
)
);
addReply
(
c
,
s
hared
.
outofrange
err
);
}
else
{
}
else
{
robj
*
ele
=
listNodeValue
(
ln
);
robj
*
ele
=
listNodeValue
(
ln
);
...
@@ -2143,12 +2138,12 @@ static void popGenericCommand(redisClient *c, int where) {
...
@@ -2143,12 +2138,12 @@ static void popGenericCommand(redisClient *c, int where) {
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
addReply
(
c
,
shared
.
n
il
);
addReply
(
c
,
shared
.
n
ullbulk
);
}
else
{
}
else
{
robj
*
o
=
dictGetEntryVal
(
de
);
robj
*
o
=
dictGetEntryVal
(
de
);
if
(
o
->
type
!=
REDIS_LIST
)
{
if
(
o
->
type
!=
REDIS_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
bulk
);
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
}
else
{
list
*
list
=
o
->
ptr
;
list
*
list
=
o
->
ptr
;
listNode
*
ln
;
listNode
*
ln
;
...
@@ -2159,10 +2154,10 @@ static void popGenericCommand(redisClient *c, int where) {
...
@@ -2159,10 +2154,10 @@ static void popGenericCommand(redisClient *c, int where) {
ln
=
listLast
(
list
);
ln
=
listLast
(
list
);
if
(
ln
==
NULL
)
{
if
(
ln
==
NULL
)
{
addReply
(
c
,
shared
.
n
il
);
addReply
(
c
,
shared
.
n
ullbulk
);
}
else
{
}
else
{
robj
*
ele
=
listNodeValue
(
ln
);
robj
*
ele
=
listNodeValue
(
ln
);
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,(
int
)
sdslen
(
ele
->
ptr
)));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
$
%d
\r\n
"
,(
int
)
sdslen
(
ele
->
ptr
)));
addReply
(
c
,
ele
);
addReply
(
c
,
ele
);
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
listDelNode
(
list
,
ln
);
listDelNode
(
list
,
ln
);
...
@@ -2187,12 +2182,12 @@ static void lrangeCommand(redisClient *c) {
...
@@ -2187,12 +2182,12 @@ static void lrangeCommand(redisClient *c) {
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
addReply
(
c
,
shared
.
n
il
);
addReply
(
c
,
shared
.
n
ullmultibulk
);
}
else
{
}
else
{
robj
*
o
=
dictGetEntryVal
(
de
);
robj
*
o
=
dictGetEntryVal
(
de
);
if
(
o
->
type
!=
REDIS_LIST
)
{
if
(
o
->
type
!=
REDIS_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
bulk
);
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
}
else
{
list
*
list
=
o
->
ptr
;
list
*
list
=
o
->
ptr
;
listNode
*
ln
;
listNode
*
ln
;
...
@@ -2209,7 +2204,7 @@ static void lrangeCommand(redisClient *c) {
...
@@ -2209,7 +2204,7 @@ static void lrangeCommand(redisClient *c) {
/* indexes sanity checks */
/* indexes sanity checks */
if
(
start
>
end
||
start
>=
llen
)
{
if
(
start
>
end
||
start
>=
llen
)
{
/* Out of range start or start > end result in empty list */
/* Out of range start or start > end result in empty list */
addReply
(
c
,
shared
.
zero
);
addReply
(
c
,
shared
.
emptymultibulk
);
return
;
return
;
}
}
if
(
end
>=
llen
)
end
=
llen
-
1
;
if
(
end
>=
llen
)
end
=
llen
-
1
;
...
@@ -2217,10 +2212,10 @@ static void lrangeCommand(redisClient *c) {
...
@@ -2217,10 +2212,10 @@ static void lrangeCommand(redisClient *c) {
/* Return the result in form of a multi-bulk reply */
/* Return the result in form of a multi-bulk reply */
ln
=
listIndex
(
list
,
start
);
ln
=
listIndex
(
list
,
start
);
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,
rangelen
));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
*
%d
\r\n
"
,
rangelen
));
for
(
j
=
0
;
j
<
rangelen
;
j
++
)
{
for
(
j
=
0
;
j
<
rangelen
;
j
++
)
{
ele
=
listNodeValue
(
ln
);
ele
=
listNodeValue
(
ln
);
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,(
int
)
sdslen
(
ele
->
ptr
)));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
$
%d
\r\n
"
,(
int
)
sdslen
(
ele
->
ptr
)));
addReply
(
c
,
ele
);
addReply
(
c
,
ele
);
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
ln
=
ln
->
next
;
ln
=
ln
->
next
;
...
@@ -2290,7 +2285,7 @@ static void lremCommand(redisClient *c) {
...
@@ -2290,7 +2285,7 @@ static void lremCommand(redisClient *c) {
robj
*
o
=
dictGetEntryVal
(
de
);
robj
*
o
=
dictGetEntryVal
(
de
);
if
(
o
->
type
!=
REDIS_LIST
)
{
if
(
o
->
type
!=
REDIS_LIST
)
{
addReply
(
c
,
shared
.
minus2
);
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
}
else
{
list
*
list
=
o
->
ptr
;
list
*
list
=
o
->
ptr
;
listNode
*
ln
,
*
next
;
listNode
*
ln
,
*
next
;
...
@@ -2314,7 +2309,7 @@ static void lremCommand(redisClient *c) {
...
@@ -2314,7 +2309,7 @@ static void lremCommand(redisClient *c) {
}
}
ln
=
next
;
ln
=
next
;
}
}
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,
removed
));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
:
%d
\r\n
"
,
removed
));
}
}
}
}
}
}
...
@@ -2333,16 +2328,16 @@ static void saddCommand(redisClient *c) {
...
@@ -2333,16 +2328,16 @@ static void saddCommand(redisClient *c) {
}
else
{
}
else
{
set
=
dictGetEntryVal
(
de
);
set
=
dictGetEntryVal
(
de
);
if
(
set
->
type
!=
REDIS_SET
)
{
if
(
set
->
type
!=
REDIS_SET
)
{
addReply
(
c
,
shared
.
minus2
);
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
return
;
}
}
}
}
if
(
dictAdd
(
set
->
ptr
,
c
->
argv
[
2
],
NULL
)
==
DICT_OK
)
{
if
(
dictAdd
(
set
->
ptr
,
c
->
argv
[
2
],
NULL
)
==
DICT_OK
)
{
incrRefCount
(
c
->
argv
[
2
]);
incrRefCount
(
c
->
argv
[
2
]);
server
.
dirty
++
;
server
.
dirty
++
;
addReply
(
c
,
shared
.
one
);
addReply
(
c
,
shared
.
c
one
);
}
else
{
}
else
{
addReply
(
c
,
shared
.
zero
);
addReply
(
c
,
shared
.
c
zero
);
}
}
}
}
...
@@ -2351,20 +2346,20 @@ static void sremCommand(redisClient *c) {
...
@@ -2351,20 +2346,20 @@ static void sremCommand(redisClient *c) {
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
addReply
(
c
,
shared
.
zero
);
addReply
(
c
,
shared
.
c
zero
);
}
else
{
}
else
{
robj
*
set
;
robj
*
set
;
set
=
dictGetEntryVal
(
de
);
set
=
dictGetEntryVal
(
de
);
if
(
set
->
type
!=
REDIS_SET
)
{
if
(
set
->
type
!=
REDIS_SET
)
{
addReply
(
c
,
shared
.
minus2
);
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
return
;
}
}
if
(
dictDelete
(
set
->
ptr
,
c
->
argv
[
2
])
==
DICT_OK
)
{
if
(
dictDelete
(
set
->
ptr
,
c
->
argv
[
2
])
==
DICT_OK
)
{
server
.
dirty
++
;
server
.
dirty
++
;
addReply
(
c
,
shared
.
one
);
addReply
(
c
,
shared
.
c
one
);
}
else
{
}
else
{
addReply
(
c
,
shared
.
zero
);
addReply
(
c
,
shared
.
c
zero
);
}
}
}
}
}
}
...
@@ -2374,19 +2369,19 @@ static void sismemberCommand(redisClient *c) {
...
@@ -2374,19 +2369,19 @@ static void sismemberCommand(redisClient *c) {
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
addReply
(
c
,
shared
.
zero
);
addReply
(
c
,
shared
.
c
zero
);
}
else
{
}
else
{
robj
*
set
;
robj
*
set
;
set
=
dictGetEntryVal
(
de
);
set
=
dictGetEntryVal
(
de
);
if
(
set
->
type
!=
REDIS_SET
)
{
if
(
set
->
type
!=
REDIS_SET
)
{
addReply
(
c
,
shared
.
minus2
);
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
return
;
}
}
if
(
dictFind
(
set
->
ptr
,
c
->
argv
[
2
]))
if
(
dictFind
(
set
->
ptr
,
c
->
argv
[
2
]))
addReply
(
c
,
shared
.
one
);
addReply
(
c
,
shared
.
c
one
);
else
else
addReply
(
c
,
shared
.
zero
);
addReply
(
c
,
shared
.
c
zero
);
}
}
}
}
...
@@ -2396,15 +2391,15 @@ static void scardCommand(redisClient *c) {
...
@@ -2396,15 +2391,15 @@ static void scardCommand(redisClient *c) {
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
addReply
(
c
,
shared
.
zero
);
addReply
(
c
,
shared
.
c
zero
);
return
;
return
;
}
else
{
}
else
{
robj
*
o
=
dictGetEntryVal
(
de
);
robj
*
o
=
dictGetEntryVal
(
de
);
if
(
o
->
type
!=
REDIS_SET
)
{
if
(
o
->
type
!=
REDIS_SET
)
{
addReply
(
c
,
shared
.
minus2
);
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
}
else
{
s
=
o
->
ptr
;
s
=
o
->
ptr
;
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
:
%d
\r\n
"
,
dictGetHashTableUsed
(
s
)));
dictGetHashTableUsed
(
s
)));
}
}
}
}
...
@@ -2431,13 +2426,13 @@ static void sinterGenericCommand(redisClient *c, robj **setskeys, int setsnum, r
...
@@ -2431,13 +2426,13 @@ static void sinterGenericCommand(redisClient *c, robj **setskeys, int setsnum, r
de
=
dictFind
(
c
->
dict
,
setskeys
[
j
]);
de
=
dictFind
(
c
->
dict
,
setskeys
[
j
]);
if
(
!
de
)
{
if
(
!
de
)
{
zfree
(
dv
);
zfree
(
dv
);
addReply
(
c
,
dstkey
?
shared
.
nokeyerr
:
shared
.
nil
);
addReply
(
c
,
shared
.
nokeyerr
);
return
;
return
;
}
}
setobj
=
dictGetEntryVal
(
de
);
setobj
=
dictGetEntryVal
(
de
);
if
(
setobj
->
type
!=
REDIS_SET
)
{
if
(
setobj
->
type
!=
REDIS_SET
)
{
zfree
(
dv
);
zfree
(
dv
);
addReply
(
c
,
dstkey
?
shared
.
wrongtypeerr
:
shared
.
wrongtypeerrbulk
);
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
return
;
}
}
dv
[
j
]
=
setobj
->
ptr
;
dv
[
j
]
=
setobj
->
ptr
;
...
@@ -2479,7 +2474,7 @@ static void sinterGenericCommand(redisClient *c, robj **setskeys, int setsnum, r
...
@@ -2479,7 +2474,7 @@ static void sinterGenericCommand(redisClient *c, robj **setskeys, int setsnum, r
continue
;
/* at least one set does not contain the member */
continue
;
/* at least one set does not contain the member */
ele
=
dictGetEntryKey
(
de
);
ele
=
dictGetEntryKey
(
de
);
if
(
!
dstkey
)
{
if
(
!
dstkey
)
{
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,
sdslen
(
ele
->
ptr
)));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
$
%d
\r\n
"
,
sdslen
(
ele
->
ptr
)));
addReply
(
c
,
ele
);
addReply
(
c
,
ele
);
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
cardinality
++
;
cardinality
++
;
...
@@ -2491,7 +2486,7 @@ static void sinterGenericCommand(redisClient *c, robj **setskeys, int setsnum, r
...
@@ -2491,7 +2486,7 @@ static void sinterGenericCommand(redisClient *c, robj **setskeys, int setsnum, r
dictReleaseIterator
(
di
);
dictReleaseIterator
(
di
);
if
(
!
dstkey
)
if
(
!
dstkey
)
lenobj
->
ptr
=
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,
cardinality
);
lenobj
->
ptr
=
sdscatprintf
(
sdsempty
(),
"
*
%d
\r\n
"
,
cardinality
);
else
else
addReply
(
c
,
shared
.
ok
);
addReply
(
c
,
shared
.
ok
);
zfree
(
dv
);
zfree
(
dv
);
...
@@ -2621,12 +2616,12 @@ static void sortCommand(redisClient *c) {
...
@@ -2621,12 +2616,12 @@ static void sortCommand(redisClient *c) {
/* Lookup the key to sort. It must be of the right types */
/* Lookup the key to sort. It must be of the right types */
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
de
=
dictFind
(
c
->
dict
,
c
->
argv
[
1
]);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
addReply
(
c
,
shared
.
nokeyerr
bulk
);
addReply
(
c
,
shared
.
nokeyerr
);
return
;
return
;
}
}
sortval
=
dictGetEntryVal
(
de
);
sortval
=
dictGetEntryVal
(
de
);
if
(
sortval
->
type
!=
REDIS_SET
&&
sortval
->
type
!=
REDIS_LIST
)
{
if
(
sortval
->
type
!=
REDIS_SET
&&
sortval
->
type
!=
REDIS_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
bulk
);
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
return
;
}
}
...
@@ -2680,7 +2675,7 @@ static void sortCommand(redisClient *c) {
...
@@ -2680,7 +2675,7 @@ static void sortCommand(redisClient *c) {
}
else
{
}
else
{
decrRefCount
(
sortval
);
decrRefCount
(
sortval
);
listRelease
(
operations
);
listRelease
(
operations
);
addReply
(
c
,
shared
.
syntaxerr
bulk
);
addReply
(
c
,
shared
.
syntaxerr
);
return
;
return
;
}
}
j
++
;
j
++
;
...
@@ -2761,11 +2756,11 @@ static void sortCommand(redisClient *c) {
...
@@ -2761,11 +2756,11 @@ static void sortCommand(redisClient *c) {
/* Send command output to the output buffer, performing the specified
/* Send command output to the output buffer, performing the specified
* GET/DEL/INCR/DECR operations if any. */
* GET/DEL/INCR/DECR operations if any. */
outputlen
=
getop
?
getop
*
(
end
-
start
+
1
)
:
end
-
start
+
1
;
outputlen
=
getop
?
getop
*
(
end
-
start
+
1
)
:
end
-
start
+
1
;
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,
outputlen
));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
*
%d
\r\n
"
,
outputlen
));
for
(
j
=
start
;
j
<=
end
;
j
++
)
{
for
(
j
=
start
;
j
<=
end
;
j
++
)
{
listNode
*
ln
=
operations
->
head
;
listNode
*
ln
=
operations
->
head
;
if
(
!
getop
)
{
if
(
!
getop
)
{
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
$
%d
\r\n
"
,
sdslen
(
vector
[
j
].
obj
->
ptr
)));
sdslen
(
vector
[
j
].
obj
->
ptr
)));
addReply
(
c
,
vector
[
j
].
obj
);
addReply
(
c
,
vector
[
j
].
obj
);
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
...
@@ -2779,7 +2774,7 @@ static void sortCommand(redisClient *c) {
...
@@ -2779,7 +2774,7 @@ static void sortCommand(redisClient *c) {
if
(
!
val
||
val
->
type
!=
REDIS_STRING
)
{
if
(
!
val
||
val
->
type
!=
REDIS_STRING
)
{
addReply
(
c
,
shared
.
minus1
);
addReply
(
c
,
shared
.
minus1
);
}
else
{
}
else
{
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
$
%d
\r\n
"
,
sdslen
(
val
->
ptr
)));
sdslen
(
val
->
ptr
)));
addReply
(
c
,
val
);
addReply
(
c
,
val
);
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
...
@@ -2827,7 +2822,7 @@ static void infoCommand(redisClient *c) {
...
@@ -2827,7 +2822,7 @@ static void infoCommand(redisClient *c) {
uptime
,
uptime
,
uptime
/
(
3600
*
24
)
uptime
/
(
3600
*
24
)
);
);
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"%d
\r\n
"
,
sdslen
(
info
)));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"
$
%d
\r\n
"
,
sdslen
(
info
)));
addReplySds
(
c
,
info
);
addReplySds
(
c
,
info
);
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
}
}
...
@@ -2930,7 +2925,7 @@ static void syncCommand(redisClient *c) {
...
@@ -2930,7 +2925,7 @@ static void syncCommand(redisClient *c) {
if
(
fd
==
-
1
||
fstat
(
fd
,
&
sb
)
==
-
1
)
goto
closeconn
;
if
(
fd
==
-
1
||
fstat
(
fd
,
&
sb
)
==
-
1
)
goto
closeconn
;
len
=
sb
.
st_size
;
len
=
sb
.
st_size
;
snprintf
(
sizebuf
,
32
,
"%d
\r\n
"
,
len
);
snprintf
(
sizebuf
,
32
,
"
$
%d
\r\n
"
,
len
);
if
(
syncWrite
(
c
->
fd
,
sizebuf
,
strlen
(
sizebuf
),
5
)
==
-
1
)
goto
closeconn
;
if
(
syncWrite
(
c
->
fd
,
sizebuf
,
strlen
(
sizebuf
),
5
)
==
-
1
)
goto
closeconn
;
while
(
len
)
{
while
(
len
)
{
char
buf
[
1024
];
char
buf
[
1024
];
...
@@ -2982,7 +2977,7 @@ static int syncWithMaster(void) {
...
@@ -2982,7 +2977,7 @@ static int syncWithMaster(void) {
strerror
(
errno
));
strerror
(
errno
));
return
REDIS_ERR
;
return
REDIS_ERR
;
}
}
dumpsize
=
atoi
(
buf
);
dumpsize
=
atoi
(
buf
+
1
);
redisLog
(
REDIS_NOTICE
,
"Receiving %d bytes data dump from MASTER"
,
dumpsize
);
redisLog
(
REDIS_NOTICE
,
"Receiving %d bytes data dump from MASTER"
,
dumpsize
);
/* Read the bulk write data on a temp file */
/* Read the bulk write data on a temp file */
snprintf
(
tmpfile
,
256
,
"temp-%d.%ld.rdb"
,(
int
)
time
(
NULL
),(
long
int
)
random
());
snprintf
(
tmpfile
,
256
,
"temp-%d.%ld.rdb"
,(
int
)
time
(
NULL
),(
long
int
)
random
());
...
...
test-redis.tcl
View file @
c937aa89
...
@@ -124,16 +124,16 @@ proc main {server port} {
...
@@ -124,16 +124,16 @@ proc main {server port} {
puts -nonewline $fd
"SET k1 4
\r\n
xyzk
\r\n
GET k1
\r\n
PING
\r\n
"
puts -nonewline $fd
"SET k1 4
\r\n
xyzk
\r\n
GET k1
\r\n
PING
\r\n
"
flush $fd
flush $fd
set res
{}
set res
{}
append res
[
string match
+
OK*
[
redis_read_re
tcode
$fd
]]
append res
[
string match OK*
[
redis_read_re
ply
$fd
]]
append res
[
redis_
bulk_read
$fd
]
append res
[
redis_
read_reply
$fd
]
append res
[
string match
+
PONG*
[
redis_read_re
tcode
$fd
]]
append res
[
string match PONG*
[
redis_read_re
ply
$fd
]]
format $res
format $res
}
{
1xyzk1
}
}
{
1xyzk1
}
test
{
Non existing command
}
{
test
{
Non existing command
}
{
puts -nonewline $fd
"foo
\r\n
"
puts -nonewline $fd
"foo
\r\n
"
flush $fd
flush $fd
string match
-
ERR*
[
redis_read_re
tcode
$fd
]
string match ERR*
[
redis_read_re
ply
$fd
]
}
{
1
}
}
{
1
}
test
{
Basic LPUSH, RPUSH, LLENGTH, LINDEX
}
{
test
{
Basic LPUSH, RPUSH, LLENGTH, LINDEX
}
{
...
@@ -181,19 +181,19 @@ proc main {server port} {
...
@@ -181,19 +181,19 @@ proc main {server port} {
redis_del $fd mylist
redis_del $fd mylist
redis_set $fd mylist foobar
redis_set $fd mylist foobar
redis_llen $fd mylist
redis_llen $fd mylist
}
{
-2
}
}
{
ERR*
}
test
{
LINDEX against non-list value error
}
{
test
{
LINDEX against non-list value error
}
{
redis_lindex $fd mylist 0
redis_lindex $fd mylist 0
}
{
*
ERR
OR
*
}
}
{
ERR*
}
test
{
LPUSH against non-list value error
}
{
test
{
LPUSH against non-list value error
}
{
redis_lpush $fd mylist 0
redis_lpush $fd mylist 0
}
{
-
ERR*
}
}
{
ERR*
}
test
{
RPUSH against non-list value error
}
{
test
{
RPUSH against non-list value error
}
{
redis_rpush $fd mylist 0
redis_rpush $fd mylist 0
}
{
-
ERR*
}
}
{
ERR*
}
test
{
RENAME basic usage
}
{
test
{
RENAME basic usage
}
{
redis_set $fd mykey hello
redis_set $fd mykey hello
...
@@ -236,11 +236,11 @@ proc main {server port} {
...
@@ -236,11 +236,11 @@ proc main {server port} {
test
{
RENAME against non existing source key
}
{
test
{
RENAME against non existing source key
}
{
redis_rename $fd nokey foobar
redis_rename $fd nokey foobar
}
{
-
ERR*
}
}
{
ERR*
}
test
{
RENAME where source and dest key is the same
}
{
test
{
RENAME where source and dest key is the same
}
{
redis_rename $fd mykey mykey
redis_rename $fd mykey mykey
}
{
-
ERR*
}
}
{
ERR*
}
test
{
DEL all keys again
(
DB 0
)}
{
test
{
DEL all keys again
(
DB 0
)}
{
foreach key
[
redis_keys $fd *
]
{
foreach key
[
redis_keys $fd *
]
{
...
@@ -309,7 +309,7 @@ proc main {server port} {
...
@@ -309,7 +309,7 @@ proc main {server port} {
test
{
LPOP against non list value
}
{
test
{
LPOP against non list value
}
{
redis_set $fd notalist foo
redis_set $fd notalist foo
redis_lpop $fd notalist
redis_lpop $fd notalist
}
{
*
ERR
OR*against
*
}
}
{
ERR
*kind
*
}
test
{
Mass LPUSH/LPOP
}
{
test
{
Mass LPUSH/LPOP
}
{
set sum 0
set sum 0
...
@@ -363,16 +363,16 @@ proc main {server port} {
...
@@ -363,16 +363,16 @@ proc main {server port} {
test
{
LSET out of range index
}
{
test
{
LSET out of range index
}
{
redis_lset $fd mylist 10 foo
redis_lset $fd mylist 10 foo
}
{
-
ERR*range*
}
}
{
ERR*range*
}
test
{
LSET against non existing key
}
{
test
{
LSET against non existing key
}
{
redis_lset $fd nosuchkey 10 foo
redis_lset $fd nosuchkey 10 foo
}
{
-
ERR*key*
}
}
{
ERR*key*
}
test
{
LSET against non list value
}
{
test
{
LSET against non list value
}
{
redis_set $fd nolist foobar
redis_set $fd nolist foobar
redis_lset $fd nolist 0 foo
redis_lset $fd nolist 0 foo
}
{
-
ERR*value*
}
}
{
ERR*value*
}
test
{
SADD, SCARD, SISMEMBER, SMEMBERS basics
}
{
test
{
SADD, SCARD, SISMEMBER, SMEMBERS basics
}
{
redis_sadd $fd myset foo
redis_sadd $fd myset foo
...
@@ -391,7 +391,7 @@ proc main {server port} {
...
@@ -391,7 +391,7 @@ proc main {server port} {
test
{
SADD against non set
}
{
test
{
SADD against non set
}
{
redis_sadd $fd mylist foo
redis_sadd $fd mylist foo
}
{
-2
}
}
{
ERR*kind*
}
test
{
SREM basics
}
{
test
{
SREM basics
}
{
redis_sadd $fd myset ciao
redis_sadd $fd myset ciao
...
@@ -431,7 +431,7 @@ proc main {server port} {
...
@@ -431,7 +431,7 @@ proc main {server port} {
redis_set $fd myemptykey
{}
redis_set $fd myemptykey
{}
redis_set $fd mynormalkey
{
blablablba
}
redis_set $fd mynormalkey
{
blablablba
}
redis_save $fd
redis_save $fd
}
{
+
OK
}
}
{
OK
}
test
{
Create a random list
}
{
test
{
Create a random list
}
{
set tosort
{}
set tosort
{}
...
@@ -606,221 +606,224 @@ proc redis_readnl {fd len} {
...
@@ -606,221 +606,224 @@ proc redis_readnl {fd len} {
return $buf
return $buf
}
}
proc redis_bulk_read
{
fd
{
multi 0
}}
{
proc redis_bulk_read
{
fd
}
{
set count
[
redis_read_integer $fd
]
set count
[
redis_read_line $fd
]
if
{
$count
eq
{
nil
}}
return
{}
if
{
$count
== -1
}
return
{}
if
{
$multi
&& $count == -1
}
return
{}
set buf
[
redis_readnl $fd $count
]
set len
[
expr
{
abs
(
$count
)}]
set buf
[
redis_readnl $fd $len
]
if
{
$count
< 0
}
{
return
"***ERROR***
$buf
"
}
return $buf
return $buf
}
}
proc redis_multi_bulk_read fd
{
proc redis_multi_bulk_read fd
{
set count
[
redis_read_integer $fd
]
set count
[
redis_read_line $fd
]
if
{
$count
eq
{
nil
}}
return
{}
if
{
$count
== -1
}
return
{}
if
{
$count
< 0
}
{
set len
[
expr
{
abs
(
$count
)}]
set buf
[
redis_readnl $fd $len
]
return
"***ERROR***
$buf
"
}
set l
{}
set l
{}
for
{
set i 0
}
{
$i
< $count
}
{
incr i
}
{
for
{
set i 0
}
{
$i
< $count
}
{
incr i
}
{
lappend l
[
redis_
bulk_read
$fd
1
]
lappend l
[
redis_
read_reply
$fd
]
}
}
return $l
return $l
}
}
proc redis_read_retcode fd
{
proc redis_read_line fd
{
set retcode
[
string trim
[
gets $fd
]]
string trim
[
gets $fd
]
# puts
"S:
$retcode
"
return $retcode
}
}
proc redis_read_integer fd
{
proc redis_read_reply fd
{
string trim
[
gets $fd
]
set type
[
read $fd 1
]
if
{
$type
eq
{
:
}}
{
redis_read_line $fd
}
elseif
{
$type
eq
{
-
}}
{
redis_read_line $fd
}
elseif
{
$type
eq
{
+
}}
{
redis_read_line $fd
}
elseif
{
$type
eq
{
$
}}
{
redis_bulk_read $fd
}
elseif
{
$type
eq
{*}
}
{
redis_multi_bulk_read $fd
}
else
{
error
"Bad protocol:
$type
as initial reply byte"
}
}
}
### Actual API ###
### Actual API ###
proc redis_set
{
fd key val
}
{
proc redis_set
{
fd key val
}
{
redis_writenl $fd
"set
$key
[
string length $val
]
\r\n
$val
"
redis_writenl $fd
"set
$key
[
string length $val
]
\r\n
$val
"
redis_read_re
tcode
$fd
redis_read_re
ply
$fd
}
}
proc redis_setnx
{
fd key val
}
{
proc redis_setnx
{
fd key val
}
{
redis_writenl $fd
"setnx
$key
[
string length $val
]
\r\n
$val
"
redis_writenl $fd
"setnx
$key
[
string length $val
]
\r\n
$val
"
redis_read_
integer
$fd
redis_read_
reply
$fd
}
}
proc redis_get
{
fd key
}
{
proc redis_get
{
fd key
}
{
redis_writenl $fd
"get
$key
"
redis_writenl $fd
"get
$key
"
redis_
bulk_read
$fd
redis_
read_reply
$fd
}
}
proc redis_select
{
fd id
}
{
proc redis_select
{
fd id
}
{
redis_writenl $fd
"select
$id
"
redis_writenl $fd
"select
$id
"
redis_read_re
tcode
$fd
redis_read_re
ply
$fd
}
}
proc redis_move
{
fd key id
}
{
proc redis_move
{
fd key id
}
{
redis_writenl $fd
"move
$key
$id
"
redis_writenl $fd
"move
$key
$id
"
redis_read_
integer
$fd
redis_read_
reply
$fd
}
}
proc redis_del
{
fd key
}
{
proc redis_del
{
fd key
}
{
redis_writenl $fd
"del
$key
"
redis_writenl $fd
"del
$key
"
redis_read_
integer
$fd
redis_read_
reply
$fd
}
}
proc redis_keys
{
fd pattern
}
{
proc redis_keys
{
fd pattern
}
{
redis_writenl $fd
"keys
$pattern
"
redis_writenl $fd
"keys
$pattern
"
split
[
redis_
bulk_read
$fd
]
split
[
redis_
read_reply
$fd
]
}
}
proc redis_dbsize
{
fd
}
{
proc redis_dbsize
{
fd
}
{
redis_writenl $fd
"dbsize"
redis_writenl $fd
"dbsize"
redis_read_
integer
$fd
redis_read_
reply
$fd
}
}
proc redis_incr
{
fd key
}
{
proc redis_incr
{
fd key
}
{
redis_writenl $fd
"incr
$key
"
redis_writenl $fd
"incr
$key
"
redis_read_
integer
$fd
redis_read_
reply
$fd
}
}
proc redis_decr
{
fd key
}
{
proc redis_decr
{
fd key
}
{
redis_writenl $fd
"decr
$key
"
redis_writenl $fd
"decr
$key
"
redis_read_
integer
$fd
redis_read_
reply
$fd
}
}
proc redis_exists
{
fd key
}
{
proc redis_exists
{
fd key
}
{
redis_writenl $fd
"exists
$key
"
redis_writenl $fd
"exists
$key
"
redis_read_
integer
$fd
redis_read_
reply
$fd
}
}
proc redis_lpush
{
fd key val
}
{
proc redis_lpush
{
fd key val
}
{
redis_writenl $fd
"lpush
$key
[
string length $val
]
\r\n
$val
"
redis_writenl $fd
"lpush
$key
[
string length $val
]
\r\n
$val
"
redis_read_re
tcode
$fd
redis_read_re
ply
$fd
}
}
proc redis_rpush
{
fd key val
}
{
proc redis_rpush
{
fd key val
}
{
redis_writenl $fd
"rpush
$key
[
string length $val
]
\r\n
$val
"
redis_writenl $fd
"rpush
$key
[
string length $val
]
\r\n
$val
"
redis_read_re
tcode
$fd
redis_read_re
ply
$fd
}
}
proc redis_llen
{
fd key
}
{
proc redis_llen
{
fd key
}
{
redis_writenl $fd
"llen
$key
"
redis_writenl $fd
"llen
$key
"
redis_read_
integer
$fd
redis_read_
reply
$fd
}
}
proc redis_scard
{
fd key
}
{
proc redis_scard
{
fd key
}
{
redis_writenl $fd
"scard
$key
"
redis_writenl $fd
"scard
$key
"
redis_read_
integer
$fd
redis_read_
reply
$fd
}
}
proc redis_lindex
{
fd key index
}
{
proc redis_lindex
{
fd key index
}
{
redis_writenl $fd
"lindex
$key
$index
"
redis_writenl $fd
"lindex
$key
$index
"
redis_
bulk_read
$fd
redis_
read_reply
$fd
}
}
proc redis_lrange
{
fd key first last
}
{
proc redis_lrange
{
fd key first last
}
{
redis_writenl $fd
"lrange
$key
$first
$last
"
redis_writenl $fd
"lrange
$key
$first
$last
"
redis_
multi_bulk_read
$fd
redis_
read_reply
$fd
}
}
proc redis_mget
{
fd args
}
{
proc redis_mget
{
fd args
}
{
redis_writenl $fd
"mget
[
join $args
]
"
redis_writenl $fd
"mget
[
join $args
]
"
redis_
multi_bulk_read
$fd
redis_
read_reply
$fd
}
}
proc redis_sort
{
fd key
{
params
{}}}
{
proc redis_sort
{
fd key
{
params
{}}}
{
redis_writenl $fd
"sort
$key
$params
"
redis_writenl $fd
"sort
$key
$params
"
redis_
multi_bulk_read
$fd
redis_
read_reply
$fd
}
}
proc redis_ltrim
{
fd key first last
}
{
proc redis_ltrim
{
fd key first last
}
{
redis_writenl $fd
"ltrim
$key
$first
$last
"
redis_writenl $fd
"ltrim
$key
$first
$last
"
redis_read_re
tcode
$fd
redis_read_re
ply
$fd
}
}
proc redis_rename
{
fd key1 key2
}
{
proc redis_rename
{
fd key1 key2
}
{
redis_writenl $fd
"rename
$key1
$key2
"
redis_writenl $fd
"rename
$key1
$key2
"
redis_read_re
tcode
$fd
redis_read_re
ply
$fd
}
}
proc redis_renamenx
{
fd key1 key2
}
{
proc redis_renamenx
{
fd key1 key2
}
{
redis_writenl $fd
"renamenx
$key1
$key2
"
redis_writenl $fd
"renamenx
$key1
$key2
"
redis_read_
integer
$fd
redis_read_
reply
$fd
}
}
proc redis_lpop
{
fd key
}
{
proc redis_lpop
{
fd key
}
{
redis_writenl $fd
"lpop
$key
"
redis_writenl $fd
"lpop
$key
"
redis_
bulk_read
$fd
redis_
read_reply
$fd
}
}
proc redis_rpop
{
fd key
}
{
proc redis_rpop
{
fd key
}
{
redis_writenl $fd
"rpop
$key
"
redis_writenl $fd
"rpop
$key
"
redis_
bulk_read
$fd
redis_
read_reply
$fd
}
}
proc redis_lset
{
fd key index val
}
{
proc redis_lset
{
fd key index val
}
{
redis_writenl $fd
"lset
$key
$index
[
string length $val
]
\r\n
$val
"
redis_writenl $fd
"lset
$key
$index
[
string length $val
]
\r\n
$val
"
redis_read_re
tcode
$fd
redis_read_re
ply
$fd
}
}
proc redis_sadd
{
fd key val
}
{
proc redis_sadd
{
fd key val
}
{
redis_writenl $fd
"sadd
$key
[
string length $val
]
\r\n
$val
"
redis_writenl $fd
"sadd
$key
[
string length $val
]
\r\n
$val
"
redis_read_
integer
$fd
redis_read_
reply
$fd
}
}
proc redis_srem
{
fd key val
}
{
proc redis_srem
{
fd key val
}
{
redis_writenl $fd
"srem
$key
[
string length $val
]
\r\n
$val
"
redis_writenl $fd
"srem
$key
[
string length $val
]
\r\n
$val
"
redis_read_
integer
$fd
redis_read_
reply
$fd
}
}
proc redis_sismember
{
fd key val
}
{
proc redis_sismember
{
fd key val
}
{
redis_writenl $fd
"sismember
$key
[
string length $val
]
\r\n
$val
"
redis_writenl $fd
"sismember
$key
[
string length $val
]
\r\n
$val
"
redis_read_
integer
$fd
redis_read_
reply
$fd
}
}
proc redis_sinter
{
fd args
}
{
proc redis_sinter
{
fd args
}
{
redis_writenl $fd
"sinter
[
join $args
]
"
redis_writenl $fd
"sinter
[
join $args
]
"
redis_
multi_bulk_read
$fd
redis_
read_reply
$fd
}
}
proc redis_sinterstore
{
fd args
}
{
proc redis_sinterstore
{
fd args
}
{
redis_writenl $fd
"sinterstore
[
join $args
]
"
redis_writenl $fd
"sinterstore
[
join $args
]
"
redis_read_re
tcode
$fd
redis_read_re
ply
$fd
}
}
proc redis_smembers
{
fd key
}
{
proc redis_smembers
{
fd key
}
{
redis_writenl $fd
"smembers
$key
"
redis_writenl $fd
"smembers
$key
"
redis_
multi_bulk_read
$fd
redis_
read_reply
$fd
}
}
proc redis_echo
{
fd str
}
{
proc redis_echo
{
fd str
}
{
redis_writenl $fd
"echo
[
string length $str
]
\r\n
$str
"
redis_writenl $fd
"echo
[
string length $str
]
\r\n
$str
"
redis_
writenl $fd
"smembers
$key
"
redis_
read_reply $fd
}
}
proc redis_save
{
fd
}
{
proc redis_save
{
fd
}
{
redis_writenl $fd
"save"
redis_writenl $fd
"save"
redis_read_re
tcode
$fd
redis_read_re
ply
$fd
}
}
proc redis_flushall
{
fd
}
{
proc redis_flushall
{
fd
}
{
redis_writenl $fd
"flushall"
redis_writenl $fd
"flushall"
redis_read_re
tcode
$fd
redis_read_re
ply
$fd
}
}
proc redis_flushdb
{
fd
}
{
proc redis_flushdb
{
fd
}
{
redis_writenl $fd
"flushdb"
redis_writenl $fd
"flushdb"
redis_read_re
tcode
$fd
redis_read_re
ply
$fd
}
}
proc redis_lrem
{
fd key count val
}
{
proc redis_lrem
{
fd key count val
}
{
redis_writenl $fd
"lrem
$key
$count
[
string length $val
]
\r\n
$val
"
redis_writenl $fd
"lrem
$key
$count
[
string length $val
]
\r\n
$val
"
redis_read_
integer
$fd
redis_read_
reply
$fd
}
}
proc stress
{}
{
proc stress
{}
{
...
...
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