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
dd88747b
Commit
dd88747b
authored
Mar 15, 2010
by
antirez
Browse files
pretty big refactoring
parent
92b27fe9
Changes
1
Show whitespace changes
Inline
Side-by-side
redis.c
View file @
dd88747b
...
@@ -2478,6 +2478,13 @@ static void addReplyLong(redisClient *c, long l) {
...
@@ -2478,6 +2478,13 @@ static void addReplyLong(redisClient *c, long l) {
char
buf
[
128
];
char
buf
[
128
];
size_t
len
;
size_t
len
;
if
(
l
==
0
)
{
addReply
(
c
,
shared
.
czero
);
return
;
}
else
if
(
l
==
1
)
{
addReply
(
c
,
shared
.
cone
);
return
;
}
len
=
snprintf
(
buf
,
sizeof
(
buf
),
":%ld
\r\n
"
,
l
);
len
=
snprintf
(
buf
,
sizeof
(
buf
),
":%ld
\r\n
"
,
l
);
addReplySds
(
c
,
sdsnewlen
(
buf
,
len
));
addReplySds
(
c
,
sdsnewlen
(
buf
,
len
));
}
}
...
@@ -2486,6 +2493,13 @@ static void addReplyUlong(redisClient *c, unsigned long ul) {
...
@@ -2486,6 +2493,13 @@ static void addReplyUlong(redisClient *c, unsigned long ul) {
char
buf
[
128
];
char
buf
[
128
];
size_t
len
;
size_t
len
;
if
(
ul
==
0
)
{
addReply
(
c
,
shared
.
czero
);
return
;
}
else
if
(
ul
==
1
)
{
addReply
(
c
,
shared
.
cone
);
return
;
}
len
=
snprintf
(
buf
,
sizeof
(
buf
),
":%lu
\r\n
"
,
ul
);
len
=
snprintf
(
buf
,
sizeof
(
buf
),
":%lu
\r\n
"
,
ul
);
addReplySds
(
c
,
sdsnewlen
(
buf
,
len
));
addReplySds
(
c
,
sdsnewlen
(
buf
,
len
));
}
}
...
@@ -2511,6 +2525,12 @@ static void addReplyBulkLen(redisClient *c, robj *obj) {
...
@@ -2511,6 +2525,12 @@ static void addReplyBulkLen(redisClient *c, robj *obj) {
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"$%lu
\r\n
"
,(
unsigned
long
)
len
));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"$%lu
\r\n
"
,(
unsigned
long
)
len
));
}
}
static
void
addReplyBulk
(
redisClient
*
c
,
robj
*
obj
)
{
addReplyBulkLen
(
c
,
obj
);
addReply
(
c
,
obj
);
addReply
(
c
,
shared
.
crlf
);
}
static
void
acceptHandler
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
)
{
static
void
acceptHandler
(
aeEventLoop
*
el
,
int
fd
,
void
*
privdata
,
int
mask
)
{
int
cport
,
cfd
;
int
cport
,
cfd
;
char
cip
[
128
];
char
cip
[
128
];
...
@@ -3682,9 +3702,7 @@ static void pingCommand(redisClient *c) {
...
@@ -3682,9 +3702,7 @@ static void pingCommand(redisClient *c) {
}
}
static
void
echoCommand
(
redisClient
*
c
)
{
static
void
echoCommand
(
redisClient
*
c
)
{
addReplyBulkLen
(
c
,
c
->
argv
[
1
]);
addReplyBulk
(
c
,
c
->
argv
[
1
]);
addReply
(
c
,
c
->
argv
[
1
]);
addReply
(
c
,
shared
.
crlf
);
}
}
/*=================================== Strings =============================== */
/*=================================== Strings =============================== */
...
@@ -3726,22 +3744,18 @@ static void setnxCommand(redisClient *c) {
...
@@ -3726,22 +3744,18 @@ static void setnxCommand(redisClient *c) {
}
}
static
int
getGenericCommand
(
redisClient
*
c
)
{
static
int
getGenericCommand
(
redisClient
*
c
)
{
robj
*
o
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
])
;
robj
*
o
;
if
(
o
==
NULL
)
{
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
))
==
NULL
)
addReply
(
c
,
shared
.
nullbulk
);
return
REDIS_OK
;
return
REDIS_OK
;
}
else
{
if
(
o
->
type
!=
REDIS_STRING
)
{
if
(
o
->
type
!=
REDIS_STRING
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
addReply
(
c
,
shared
.
wrongtypeerr
);
return
REDIS_ERR
;
return
REDIS_ERR
;
}
else
{
}
else
{
addReplyBulkLen
(
c
,
o
);
addReplyBulk
(
c
,
o
);
addReply
(
c
,
o
);
addReply
(
c
,
shared
.
crlf
);
return
REDIS_OK
;
return
REDIS_OK
;
}
}
}
}
}
static
void
getCommand
(
redisClient
*
c
)
{
static
void
getCommand
(
redisClient
*
c
)
{
...
@@ -3772,9 +3786,7 @@ static void mgetCommand(redisClient *c) {
...
@@ -3772,9 +3786,7 @@ static void mgetCommand(redisClient *c) {
if
(
o
->
type
!=
REDIS_STRING
)
{
if
(
o
->
type
!=
REDIS_STRING
)
{
addReply
(
c
,
shared
.
nullbulk
);
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
}
else
{
addReplyBulkLen
(
c
,
o
);
addReplyBulk
(
c
,
o
);
addReply
(
c
,
o
);
addReply
(
c
,
shared
.
crlf
);
}
}
}
}
}
}
...
@@ -3934,17 +3946,12 @@ static void substrCommand(redisClient *c) {
...
@@ -3934,17 +3946,12 @@ static void substrCommand(redisClient *c) {
robj
*
o
;
robj
*
o
;
long
start
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
long
start
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
long
end
=
atoi
(
c
->
argv
[
3
]
->
ptr
);
long
end
=
atoi
(
c
->
argv
[
3
]
->
ptr
);
o
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
]);
if
(
o
==
NULL
)
{
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
if
(
o
->
type
!=
REDIS_STRING
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
size_t
rangelen
,
strlen
;
size_t
rangelen
,
strlen
;
sds
range
;
sds
range
;
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
))
==
NULL
||
checkType
(
c
,
o
,
REDIS_STRING
))
return
;
o
=
getDecodedObject
(
o
);
o
=
getDecodedObject
(
o
);
strlen
=
sdslen
(
o
->
ptr
);
strlen
=
sdslen
(
o
->
ptr
);
...
@@ -3970,8 +3977,6 @@ static void substrCommand(redisClient *c) {
...
@@ -3970,8 +3977,6 @@ static void substrCommand(redisClient *c) {
addReplySds
(
c
,
range
);
addReplySds
(
c
,
range
);
addReply
(
c
,
shared
.
crlf
);
addReply
(
c
,
shared
.
crlf
);
decrRefCount
(
o
);
decrRefCount
(
o
);
}
}
}
}
/* ========================= Type agnostic commands ========================= */
/* ========================= Type agnostic commands ========================= */
...
@@ -3985,17 +3990,7 @@ static void delCommand(redisClient *c) {
...
@@ -3985,17 +3990,7 @@ static void delCommand(redisClient *c) {
deleted
++
;
deleted
++
;
}
}
}
}
switch
(
deleted
)
{
addReplyLong
(
c
,
deleted
);
case
0
:
addReply
(
c
,
shared
.
czero
);
break
;
case
1
:
addReply
(
c
,
shared
.
cone
);
break
;
default:
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
":%d
\r\n
"
,
deleted
));
break
;
}
}
}
static
void
existsCommand
(
redisClient
*
c
)
{
static
void
existsCommand
(
redisClient
*
c
)
{
...
@@ -4047,9 +4042,7 @@ static void keysCommand(redisClient *c) {
...
@@ -4047,9 +4042,7 @@ static void keysCommand(redisClient *c) {
if
((
pattern
[
0
]
==
'*'
&&
pattern
[
1
]
==
'\0'
)
||
if
((
pattern
[
0
]
==
'*'
&&
pattern
[
1
]
==
'\0'
)
||
stringmatchlen
(
pattern
,
plen
,
key
,
sdslen
(
key
),
0
))
{
stringmatchlen
(
pattern
,
plen
,
key
,
sdslen
(
key
),
0
))
{
if
(
expireIfNeeded
(
c
->
db
,
keyobj
)
==
0
)
{
if
(
expireIfNeeded
(
c
->
db
,
keyobj
)
==
0
)
{
addReplyBulkLen
(
c
,
keyobj
);
addReplyBulk
(
c
,
keyobj
);
addReply
(
c
,
keyobj
);
addReply
(
c
,
shared
.
crlf
);
numkeys
++
;
numkeys
++
;
}
}
}
}
...
@@ -4139,12 +4132,14 @@ static void shutdownCommand(redisClient *c) {
...
@@ -4139,12 +4132,14 @@ static void shutdownCommand(redisClient *c) {
if
(
server
.
vm_enabled
)
unlink
(
server
.
vm_swap_file
);
if
(
server
.
vm_enabled
)
unlink
(
server
.
vm_swap_file
);
exit
(
0
);
exit
(
0
);
}
else
{
}
else
{
/* Ooops.. error saving! The best we can do is to continue operating.
/* Ooops.. error saving! The best we can do is to continue
* Note that if there was a background saving process, in the next
* operating. Note that if there was a background saving process,
* cron() Redis will be notified that the background saving aborted,
* in the next cron() Redis will be notified that the background
* handling special stuff like slaves pending for synchronization... */
* saving aborted, handling special stuff like slaves pending for
* synchronization... */
redisLog
(
REDIS_WARNING
,
"Error trying to save the DB, can't exit"
);
redisLog
(
REDIS_WARNING
,
"Error trying to save the DB, can't exit"
);
addReplySds
(
c
,
sdsnew
(
"-ERR can't quit, problems saving the DB
\r\n
"
));
addReplySds
(
c
,
sdsnew
(
"-ERR can't quit, problems saving the DB
\r\n
"
));
}
}
}
}
}
}
...
@@ -4158,11 +4153,9 @@ static void renameGenericCommand(redisClient *c, int nx) {
...
@@ -4158,11 +4153,9 @@ static void renameGenericCommand(redisClient *c, int nx) {
return
;
return
;
}
}
o
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
if
((
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nokeyerr
))
==
NULL
)
if
(
o
==
NULL
)
{
addReply
(
c
,
shared
.
nokeyerr
);
return
;
return
;
}
incrRefCount
(
o
);
incrRefCount
(
o
);
deleteIfVolatile
(
c
->
db
,
c
->
argv
[
2
]);
deleteIfVolatile
(
c
->
db
,
c
->
argv
[
2
]);
if
(
dictAdd
(
c
->
db
->
dict
,
c
->
argv
[
2
],
o
)
==
DICT_ERR
)
{
if
(
dictAdd
(
c
->
db
->
dict
,
c
->
argv
[
2
],
o
)
==
DICT_ERR
)
{
...
@@ -4286,61 +4279,42 @@ static void llenCommand(redisClient *c) {
...
@@ -4286,61 +4279,42 @@ static void llenCommand(redisClient *c) {
robj
*
o
;
robj
*
o
;
list
*
l
;
list
*
l
;
o
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
]);
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
if
(
o
==
NULL
)
{
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
addReply
(
c
,
shared
.
czero
);
return
;
}
else
{
if
(
o
->
type
!=
REDIS_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
l
=
o
->
ptr
;
l
=
o
->
ptr
;
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
":%d
\r\n
"
,
listLength
(
l
)));
addReplyUlong
(
c
,
listLength
(
l
));
}
}
}
}
static
void
lindexCommand
(
redisClient
*
c
)
{
static
void
lindexCommand
(
redisClient
*
c
)
{
robj
*
o
;
robj
*
o
;
int
index
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
index
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
list
*
list
;
o
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
]);
if
(
o
==
NULL
)
{
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
if
(
o
->
type
!=
REDIS_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
list
*
list
=
o
->
ptr
;
listNode
*
ln
;
listNode
*
ln
;
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
))
==
NULL
||
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
list
=
o
->
ptr
;
ln
=
listIndex
(
list
,
index
);
ln
=
listIndex
(
list
,
index
);
if
(
ln
==
NULL
)
{
if
(
ln
==
NULL
)
{
addReply
(
c
,
shared
.
nullbulk
);
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
}
else
{
robj
*
ele
=
listNodeValue
(
ln
);
robj
*
ele
=
listNodeValue
(
ln
);
addReplyBulkLen
(
c
,
ele
);
addReplyBulk
(
c
,
ele
);
addReply
(
c
,
ele
);
addReply
(
c
,
shared
.
crlf
);
}
}
}
}
}
}
static
void
lsetCommand
(
redisClient
*
c
)
{
static
void
lsetCommand
(
redisClient
*
c
)
{
robj
*
o
;
robj
*
o
;
int
index
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
index
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
list
*
list
;
o
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
if
(
o
==
NULL
)
{
addReply
(
c
,
shared
.
nokeyerr
);
}
else
{
if
(
o
->
type
!=
REDIS_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
list
*
list
=
o
->
ptr
;
listNode
*
ln
;
listNode
*
ln
;
if
((
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nokeyerr
))
==
NULL
||
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
list
=
o
->
ptr
;
ln
=
listIndex
(
list
,
index
);
ln
=
listIndex
(
list
,
index
);
if
(
ln
==
NULL
)
{
if
(
ln
==
NULL
)
{
addReply
(
c
,
shared
.
outofrangeerr
);
addReply
(
c
,
shared
.
outofrangeerr
);
...
@@ -4353,23 +4327,17 @@ static void lsetCommand(redisClient *c) {
...
@@ -4353,23 +4327,17 @@ static void lsetCommand(redisClient *c) {
addReply
(
c
,
shared
.
ok
);
addReply
(
c
,
shared
.
ok
);
server
.
dirty
++
;
server
.
dirty
++
;
}
}
}
}
}
}
static
void
popGenericCommand
(
redisClient
*
c
,
int
where
)
{
static
void
popGenericCommand
(
redisClient
*
c
,
int
where
)
{
robj
*
o
;
robj
*
o
;
list
*
list
;
o
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
if
(
o
==
NULL
)
{
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
if
(
o
->
type
!=
REDIS_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
list
*
list
=
o
->
ptr
;
listNode
*
ln
;
listNode
*
ln
;
if
((
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
))
==
NULL
||
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
list
=
o
->
ptr
;
if
(
where
==
REDIS_HEAD
)
if
(
where
==
REDIS_HEAD
)
ln
=
listFirst
(
list
);
ln
=
listFirst
(
list
);
else
else
...
@@ -4379,14 +4347,10 @@ static void popGenericCommand(redisClient *c, int where) {
...
@@ -4379,14 +4347,10 @@ static void popGenericCommand(redisClient *c, int where) {
addReply
(
c
,
shared
.
nullbulk
);
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
}
else
{
robj
*
ele
=
listNodeValue
(
ln
);
robj
*
ele
=
listNodeValue
(
ln
);
addReplyBulkLen
(
c
,
ele
);
addReplyBulk
(
c
,
ele
);
addReply
(
c
,
ele
);
addReply
(
c
,
shared
.
crlf
);
listDelNode
(
list
,
ln
);
listDelNode
(
list
,
ln
);
server
.
dirty
++
;
server
.
dirty
++
;
}
}
}
}
}
}
static
void
lpopCommand
(
redisClient
*
c
)
{
static
void
lpopCommand
(
redisClient
*
c
)
{
...
@@ -4401,20 +4365,17 @@ static void lrangeCommand(redisClient *c) {
...
@@ -4401,20 +4365,17 @@ static void lrangeCommand(redisClient *c) {
robj
*
o
;
robj
*
o
;
int
start
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
start
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
end
=
atoi
(
c
->
argv
[
3
]
->
ptr
);
int
end
=
atoi
(
c
->
argv
[
3
]
->
ptr
);
int
llen
;
o
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
]);
if
(
o
==
NULL
)
{
addReply
(
c
,
shared
.
nullmultibulk
);
}
else
{
if
(
o
->
type
!=
REDIS_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
list
*
list
=
o
->
ptr
;
listNode
*
ln
;
int
llen
=
listLength
(
list
);
int
rangelen
,
j
;
int
rangelen
,
j
;
list
*
list
;
listNode
*
ln
;
robj
*
ele
;
robj
*
ele
;
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullmultibulk
))
==
NULL
||
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
list
=
o
->
ptr
;
llen
=
listLength
(
list
);
/* convert negative indexes */
/* convert negative indexes */
if
(
start
<
0
)
start
=
llen
+
start
;
if
(
start
<
0
)
start
=
llen
+
start
;
if
(
end
<
0
)
end
=
llen
+
end
;
if
(
end
<
0
)
end
=
llen
+
end
;
...
@@ -4435,31 +4396,24 @@ static void lrangeCommand(redisClient *c) {
...
@@ -4435,31 +4396,24 @@ static void lrangeCommand(redisClient *c) {
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
);
addReplyBulkLen
(
c
,
ele
);
addReplyBulk
(
c
,
ele
);
addReply
(
c
,
ele
);
addReply
(
c
,
shared
.
crlf
);
ln
=
ln
->
next
;
ln
=
ln
->
next
;
}
}
}
}
}
}
static
void
ltrimCommand
(
redisClient
*
c
)
{
static
void
ltrimCommand
(
redisClient
*
c
)
{
robj
*
o
;
robj
*
o
;
int
start
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
start
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
end
=
atoi
(
c
->
argv
[
3
]
->
ptr
);
int
end
=
atoi
(
c
->
argv
[
3
]
->
ptr
);
int
llen
;
o
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
if
(
o
==
NULL
)
{
addReply
(
c
,
shared
.
ok
);
}
else
{
if
(
o
->
type
!=
REDIS_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
list
*
list
=
o
->
ptr
;
listNode
*
ln
;
int
llen
=
listLength
(
list
);
int
j
,
ltrim
,
rtrim
;
int
j
,
ltrim
,
rtrim
;
list
*
list
;
listNode
*
ln
;
if
((
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
ok
))
==
NULL
||
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
list
=
o
->
ptr
;
llen
=
listLength
(
list
);
/* convert negative indexes */
/* convert negative indexes */
if
(
start
<
0
)
start
=
llen
+
start
;
if
(
start
<
0
)
start
=
llen
+
start
;
...
@@ -4489,26 +4443,20 @@ static void ltrimCommand(redisClient *c) {
...
@@ -4489,26 +4443,20 @@ static void ltrimCommand(redisClient *c) {
}
}
server
.
dirty
++
;
server
.
dirty
++
;
addReply
(
c
,
shared
.
ok
);
addReply
(
c
,
shared
.
ok
);
}
}
}
}
static
void
lremCommand
(
redisClient
*
c
)
{
static
void
lremCommand
(
redisClient
*
c
)
{
robj
*
o
;
robj
*
o
;
list
*
list
;
o
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
if
(
o
==
NULL
)
{
addReply
(
c
,
shared
.
czero
);
}
else
{
if
(
o
->
type
!=
REDIS_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
list
*
list
=
o
->
ptr
;
listNode
*
ln
,
*
next
;
listNode
*
ln
,
*
next
;
int
toremove
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
toremove
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
removed
=
0
;
int
removed
=
0
;
int
fromtail
=
0
;
int
fromtail
=
0
;
if
((
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
list
=
o
->
ptr
;
if
(
toremove
<
0
)
{
if
(
toremove
<
0
)
{
toremove
=
-
toremove
;
toremove
=
-
toremove
;
fromtail
=
1
;
fromtail
=
1
;
...
@@ -4527,8 +4475,6 @@ static void lremCommand(redisClient *c) {
...
@@ -4527,8 +4475,6 @@ 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
));
}
}
}
}
/* This is the semantic of this command:
/* This is the semantic of this command:
...
@@ -4548,16 +4494,13 @@ static void lremCommand(redisClient *c) {
...
@@ -4548,16 +4494,13 @@ static void lremCommand(redisClient *c) {
*/
*/
static
void
rpoplpushcommand
(
redisClient
*
c
)
{
static
void
rpoplpushcommand
(
redisClient
*
c
)
{
robj
*
sobj
;
robj
*
sobj
;
list
*
srclist
;
listNode
*
ln
;
sobj
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
if
((
sobj
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
))
==
NULL
||
if
(
sobj
==
NULL
)
{
checkType
(
c
,
sobj
,
REDIS_LIST
))
return
;
addReply
(
c
,
shared
.
nullbulk
);
srclist
=
sobj
->
ptr
;
}
else
{
ln
=
listLast
(
srclist
);
if
(
sobj
->
type
!=
REDIS_LIST
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
list
*
srclist
=
sobj
->
ptr
;
listNode
*
ln
=
listLast
(
srclist
);
if
(
ln
==
NULL
)
{
if
(
ln
==
NULL
)
{
addReply
(
c
,
shared
.
nullbulk
);
addReply
(
c
,
shared
.
nullbulk
);
...
@@ -4586,19 +4529,14 @@ static void rpoplpushcommand(redisClient *c) {
...
@@ -4586,19 +4529,14 @@ static void rpoplpushcommand(redisClient *c) {
}
}
/* Send the element to the client as reply as well */
/* Send the element to the client as reply as well */
addReplyBulkLen
(
c
,
ele
);
addReplyBulk
(
c
,
ele
);
addReply
(
c
,
ele
);
addReply
(
c
,
shared
.
crlf
);
/* Finally remove the element from the source list */
/* Finally remove the element from the source list */
listDelNode
(
srclist
,
ln
);
listDelNode
(
srclist
,
ln
);
server
.
dirty
++
;
server
.
dirty
++
;
}
}
}
}
}
}
/* ==================================== Sets ================================ */
/* ==================================== Sets ================================ */
static
void
saddCommand
(
redisClient
*
c
)
{
static
void
saddCommand
(
redisClient
*
c
)
{
...
@@ -4627,14 +4565,9 @@ static void saddCommand(redisClient *c) {
...
@@ -4627,14 +4565,9 @@ static void saddCommand(redisClient *c) {
static
void
sremCommand
(
redisClient
*
c
)
{
static
void
sremCommand
(
redisClient
*
c
)
{
robj
*
set
;
robj
*
set
;
set
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
if
((
set
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
if
(
set
==
NULL
)
{
checkType
(
c
,
set
,
REDIS_SET
))
return
;
addReply
(
c
,
shared
.
czero
);
}
else
{
if
(
set
->
type
!=
REDIS_SET
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
}
if
(
dictDelete
(
set
->
ptr
,
c
->
argv
[
2
])
==
DICT_OK
)
{
if
(
dictDelete
(
set
->
ptr
,
c
->
argv
[
2
])
==
DICT_OK
)
{
server
.
dirty
++
;
server
.
dirty
++
;
if
(
htNeedsResize
(
set
->
ptr
))
dictResize
(
set
->
ptr
);
if
(
htNeedsResize
(
set
->
ptr
))
dictResize
(
set
->
ptr
);
...
@@ -4642,7 +4575,6 @@ static void sremCommand(redisClient *c) {
...
@@ -4642,7 +4575,6 @@ static void sremCommand(redisClient *c) {
}
else
{
}
else
{
addReply
(
c
,
shared
.
czero
);
addReply
(
c
,
shared
.
czero
);
}
}
}
}
}
static
void
smoveCommand
(
redisClient
*
c
)
{
static
void
smoveCommand
(
redisClient
*
c
)
{
...
@@ -4683,90 +4615,60 @@ static void smoveCommand(redisClient *c) {
...
@@ -4683,90 +4615,60 @@ static void smoveCommand(redisClient *c) {
static
void
sismemberCommand
(
redisClient
*
c
)
{
static
void
sismemberCommand
(
redisClient
*
c
)
{
robj
*
set
;
robj
*
set
;
set
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
]);
if
((
set
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
if
(
set
==
NULL
)
{
checkType
(
c
,
set
,
REDIS_SET
))
return
;
addReply
(
c
,
shared
.
czero
);
}
else
{
if
(
set
->
type
!=
REDIS_SET
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
}
if
(
dictFind
(
set
->
ptr
,
c
->
argv
[
2
]))
if
(
dictFind
(
set
->
ptr
,
c
->
argv
[
2
]))
addReply
(
c
,
shared
.
cone
);
addReply
(
c
,
shared
.
cone
);
else
else
addReply
(
c
,
shared
.
czero
);
addReply
(
c
,
shared
.
czero
);
}
}
}
static
void
scardCommand
(
redisClient
*
c
)
{
static
void
scardCommand
(
redisClient
*
c
)
{
robj
*
o
;
robj
*
o
;
dict
*
s
;
dict
*
s
;
o
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
]);
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
if
(
o
==
NULL
)
{
checkType
(
c
,
o
,
REDIS_SET
))
return
;
addReply
(
c
,
shared
.
czero
);
return
;
}
else
{
if
(
o
->
type
!=
REDIS_SET
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
s
=
o
->
ptr
;
s
=
o
->
ptr
;
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
":%lu
\r\n
"
,
addReplyUlong
(
c
,
dictSize
(
s
));
dictSize
(
s
)));
}
}
}
}
static
void
spopCommand
(
redisClient
*
c
)
{
static
void
spopCommand
(
redisClient
*
c
)
{
robj
*
set
;
robj
*
set
;
dictEntry
*
de
;
dictEntry
*
de
;
set
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
if
((
set
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
))
==
NULL
||
if
(
set
==
NULL
)
{
checkType
(
c
,
set
,
REDIS_SET
))
return
;
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
if
(
set
->
type
!=
REDIS_SET
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
}
de
=
dictGetRandomKey
(
set
->
ptr
);
de
=
dictGetRandomKey
(
set
->
ptr
);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
addReply
(
c
,
shared
.
nullbulk
);
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
}
else
{
robj
*
ele
=
dictGetEntryKey
(
de
);
robj
*
ele
=
dictGetEntryKey
(
de
);
addReplyBulkLen
(
c
,
ele
);
addReplyBulk
(
c
,
ele
);
addReply
(
c
,
ele
);
addReply
(
c
,
shared
.
crlf
);
dictDelete
(
set
->
ptr
,
ele
);
dictDelete
(
set
->
ptr
,
ele
);
if
(
htNeedsResize
(
set
->
ptr
))
dictResize
(
set
->
ptr
);
if
(
htNeedsResize
(
set
->
ptr
))
dictResize
(
set
->
ptr
);
server
.
dirty
++
;
server
.
dirty
++
;
}
}
}
}
}
static
void
srandmemberCommand
(
redisClient
*
c
)
{
static
void
srandmemberCommand
(
redisClient
*
c
)
{
robj
*
set
;
robj
*
set
;
dictEntry
*
de
;
dictEntry
*
de
;
set
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
]);
if
((
set
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
))
==
NULL
||
if
(
set
==
NULL
)
{
checkType
(
c
,
set
,
REDIS_SET
))
return
;
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
if
(
set
->
type
!=
REDIS_SET
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
}
de
=
dictGetRandomKey
(
set
->
ptr
);
de
=
dictGetRandomKey
(
set
->
ptr
);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
addReply
(
c
,
shared
.
nullbulk
);
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
}
else
{
robj
*
ele
=
dictGetEntryKey
(
de
);
robj
*
ele
=
dictGetEntryKey
(
de
);
addReplyBulkLen
(
c
,
ele
);
addReplyBulk
(
c
,
ele
);
addReply
(
c
,
ele
);
addReply
(
c
,
shared
.
crlf
);
}
}
}
}
}
...
@@ -4840,9 +4742,7 @@ static void sinterGenericCommand(redisClient *c, robj **setskeys, unsigned long
...
@@ -4840,9 +4742,7 @@ static void sinterGenericCommand(redisClient *c, robj **setskeys, unsigned long
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
)
{
addReplyBulkLen
(
c
,
ele
);
addReplyBulk
(
c
,
ele
);
addReply
(
c
,
ele
);
addReply
(
c
,
shared
.
crlf
);
cardinality
++
;
cardinality
++
;
}
else
{
}
else
{
dictAdd
(
dstset
->
ptr
,
ele
,
NULL
);
dictAdd
(
dstset
->
ptr
,
ele
,
NULL
);
...
@@ -4947,9 +4847,7 @@ static void sunionDiffGenericCommand(redisClient *c, robj **setskeys, int setsnu
...
@@ -4947,9 +4847,7 @@ static void sunionDiffGenericCommand(redisClient *c, robj **setskeys, int setsnu
robj
*
ele
;
robj
*
ele
;
ele
=
dictGetEntryKey
(
de
);
ele
=
dictGetEntryKey
(
de
);
addReplyBulkLen
(
c
,
ele
);
addReplyBulk
(
c
,
ele
);
addReply
(
c
,
ele
);
addReply
(
c
,
shared
.
crlf
);
}
}
dictReleaseIterator
(
di
);
dictReleaseIterator
(
di
);
}
else
{
}
else
{
...
@@ -5284,11 +5182,11 @@ zskiplistNode* zslGetElementByRank(zskiplist *zsl, unsigned long rank) {
...
@@ -5284,11 +5182,11 @@ zskiplistNode* zslGetElementByRank(zskiplist *zsl, unsigned long rank) {
x
=
zsl
->
header
;
x
=
zsl
->
header
;
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
while
(
x
->
forward
[
i
]
&&
(
traversed
+
(
i
>
0
?
x
->
span
[
i
-
1
]
:
1
))
<=
rank
)
{
while
(
x
->
forward
[
i
]
&&
(
traversed
+
(
i
>
0
?
x
->
span
[
i
-
1
]
:
1
))
<=
rank
)
{
traversed
+=
i
>
0
?
x
->
span
[
i
-
1
]
:
1
;
traversed
+=
i
>
0
?
x
->
span
[
i
-
1
]
:
1
;
x
=
x
->
forward
[
i
];
x
=
x
->
forward
[
i
];
}
}
if
(
traversed
==
rank
)
{
if
(
traversed
==
rank
)
{
return
x
;
return
x
;
}
}
...
@@ -5396,19 +5294,13 @@ static void zincrbyCommand(redisClient *c) {
...
@@ -5396,19 +5294,13 @@ static void zincrbyCommand(redisClient *c) {
static
void
zremCommand
(
redisClient
*
c
)
{
static
void
zremCommand
(
redisClient
*
c
)
{
robj
*
zsetobj
;
robj
*
zsetobj
;
zset
*
zs
;
zset
*
zs
;
zsetobj
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
if
(
zsetobj
==
NULL
)
{
addReply
(
c
,
shared
.
czero
);
}
else
{
dictEntry
*
de
;
dictEntry
*
de
;
double
*
oldscore
;
double
*
oldscore
;
int
deleted
;
int
deleted
;
if
(
zsetobj
->
type
!=
REDIS_ZSET
)
{
if
((
zsetobj
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
addReply
(
c
,
shared
.
wrongtypeerr
);
checkType
(
c
,
zsetobj
,
REDIS_ZSET
))
return
;
return
;
}
zs
=
zsetobj
->
ptr
;
zs
=
zsetobj
->
ptr
;
de
=
dictFind
(
zs
->
dict
,
c
->
argv
[
2
]);
de
=
dictFind
(
zs
->
dict
,
c
->
argv
[
2
]);
if
(
de
==
NULL
)
{
if
(
de
==
NULL
)
{
...
@@ -5425,51 +5317,37 @@ static void zremCommand(redisClient *c) {
...
@@ -5425,51 +5317,37 @@ static void zremCommand(redisClient *c) {
if
(
htNeedsResize
(
zs
->
dict
))
dictResize
(
zs
->
dict
);
if
(
htNeedsResize
(
zs
->
dict
))
dictResize
(
zs
->
dict
);
server
.
dirty
++
;
server
.
dirty
++
;
addReply
(
c
,
shared
.
cone
);
addReply
(
c
,
shared
.
cone
);
}
}
}
static
void
zremrangebyscoreCommand
(
redisClient
*
c
)
{
static
void
zremrangebyscoreCommand
(
redisClient
*
c
)
{
double
min
=
strtod
(
c
->
argv
[
2
]
->
ptr
,
NULL
);
double
min
=
strtod
(
c
->
argv
[
2
]
->
ptr
,
NULL
);
double
max
=
strtod
(
c
->
argv
[
3
]
->
ptr
,
NULL
);
double
max
=
strtod
(
c
->
argv
[
3
]
->
ptr
,
NULL
);
long
deleted
;
robj
*
zsetobj
;
robj
*
zsetobj
;
zset
*
zs
;
zset
*
zs
;
zsetobj
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
if
((
zsetobj
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
if
(
zsetobj
==
NULL
)
{
checkType
(
c
,
zsetobj
,
REDIS_ZSET
))
return
;
addReply
(
c
,
shared
.
czero
);
}
else
{
long
deleted
;
if
(
zsetobj
->
type
!=
REDIS_ZSET
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
}
zs
=
zsetobj
->
ptr
;
zs
=
zsetobj
->
ptr
;
deleted
=
zslDeleteRangeByScore
(
zs
->
zsl
,
min
,
max
,
zs
->
dict
);
deleted
=
zslDeleteRangeByScore
(
zs
->
zsl
,
min
,
max
,
zs
->
dict
);
if
(
htNeedsResize
(
zs
->
dict
))
dictResize
(
zs
->
dict
);
if
(
htNeedsResize
(
zs
->
dict
))
dictResize
(
zs
->
dict
);
server
.
dirty
+=
deleted
;
server
.
dirty
+=
deleted
;
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
":%lu
\r\n
"
,
deleted
));
addReplyLong
(
c
,
deleted
);
}
}
}
static
void
zremrangebyrankCommand
(
redisClient
*
c
)
{
static
void
zremrangebyrankCommand
(
redisClient
*
c
)
{
int
start
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
start
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
end
=
atoi
(
c
->
argv
[
3
]
->
ptr
);
int
end
=
atoi
(
c
->
argv
[
3
]
->
ptr
);
int
llen
;
long
deleted
;
robj
*
zsetobj
;
robj
*
zsetobj
;
zset
*
zs
;
zset
*
zs
;
zsetobj
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
if
((
zsetobj
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
if
(
zsetobj
==
NULL
)
{
checkType
(
c
,
zsetobj
,
REDIS_ZSET
))
return
;
addReply
(
c
,
shared
.
czero
);
}
else
{
if
(
zsetobj
->
type
!=
REDIS_ZSET
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
}
zs
=
zsetobj
->
ptr
;
zs
=
zsetobj
->
ptr
;
int
llen
=
zs
->
zsl
->
length
;
llen
=
zs
->
zsl
->
length
;
long
deleted
;
/* convert negative indexes */
/* convert negative indexes */
if
(
start
<
0
)
start
=
llen
+
start
;
if
(
start
<
0
)
start
=
llen
+
start
;
...
@@ -5490,7 +5368,6 @@ static void zremrangebyrankCommand(redisClient *c) {
...
@@ -5490,7 +5368,6 @@ static void zremrangebyrankCommand(redisClient *c) {
if
(
htNeedsResize
(
zs
->
dict
))
dictResize
(
zs
->
dict
);
if
(
htNeedsResize
(
zs
->
dict
))
dictResize
(
zs
->
dict
);
server
.
dirty
+=
deleted
;
server
.
dirty
+=
deleted
;
addReplyLong
(
c
,
deleted
);
addReplyLong
(
c
,
deleted
);
}
}
}
typedef
struct
{
typedef
struct
{
...
@@ -5663,6 +5540,12 @@ static void zrangeGenericCommand(redisClient *c, int reverse) {
...
@@ -5663,6 +5540,12 @@ static void zrangeGenericCommand(redisClient *c, int reverse) {
int
start
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
start
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
end
=
atoi
(
c
->
argv
[
3
]
->
ptr
);
int
end
=
atoi
(
c
->
argv
[
3
]
->
ptr
);
int
withscores
=
0
;
int
withscores
=
0
;
int
llen
;
int
rangelen
,
j
;
zset
*
zsetobj
;
zskiplist
*
zsl
;
zskiplistNode
*
ln
;
robj
*
ele
;
if
(
c
->
argc
==
5
&&
!
strcasecmp
(
c
->
argv
[
4
]
->
ptr
,
"withscores"
))
{
if
(
c
->
argc
==
5
&&
!
strcasecmp
(
c
->
argv
[
4
]
->
ptr
,
"withscores"
))
{
withscores
=
1
;
withscores
=
1
;
...
@@ -5671,20 +5554,11 @@ static void zrangeGenericCommand(redisClient *c, int reverse) {
...
@@ -5671,20 +5554,11 @@ static void zrangeGenericCommand(redisClient *c, int reverse) {
return
;
return
;
}
}
o
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
]);
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullmultibulk
))
==
NULL
||
if
(
o
==
NULL
)
{
checkType
(
c
,
o
,
REDIS_ZSET
))
return
;
addReply
(
c
,
shared
.
nullmultibulk
);
zsetobj
=
o
->
ptr
;
}
else
{
zsl
=
zsetobj
->
zsl
;
if
(
o
->
type
!=
REDIS_ZSET
)
{
llen
=
zsl
->
length
;
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
zset
*
zsetobj
=
o
->
ptr
;
zskiplist
*
zsl
=
zsetobj
->
zsl
;
zskiplistNode
*
ln
;
int
llen
=
zsl
->
length
;
int
rangelen
,
j
;
robj
*
ele
;
/* convert negative indexes */
/* convert negative indexes */
if
(
start
<
0
)
start
=
llen
+
start
;
if
(
start
<
0
)
start
=
llen
+
start
;
...
@@ -5706,7 +5580,8 @@ static void zrangeGenericCommand(redisClient *c, int reverse) {
...
@@ -5706,7 +5580,8 @@ static void zrangeGenericCommand(redisClient *c, int reverse) {
if
(
reverse
)
{
if
(
reverse
)
{
ln
=
start
==
0
?
zsl
->
tail
:
zslGetElementByRank
(
zsl
,
llen
-
start
);
ln
=
start
==
0
?
zsl
->
tail
:
zslGetElementByRank
(
zsl
,
llen
-
start
);
}
else
{
}
else
{
ln
=
start
==
0
?
zsl
->
header
->
forward
[
0
]
:
zslGetElementByRank
(
zsl
,
start
+
1
);
ln
=
start
==
0
?
zsl
->
header
->
forward
[
0
]
:
zslGetElementByRank
(
zsl
,
start
+
1
);
}
}
/* Return the result in form of a multi-bulk reply */
/* Return the result in form of a multi-bulk reply */
...
@@ -5714,15 +5589,11 @@ static void zrangeGenericCommand(redisClient *c, int reverse) {
...
@@ -5714,15 +5589,11 @@ static void zrangeGenericCommand(redisClient *c, int reverse) {
withscores
?
(
rangelen
*
2
)
:
rangelen
));
withscores
?
(
rangelen
*
2
)
:
rangelen
));
for
(
j
=
0
;
j
<
rangelen
;
j
++
)
{
for
(
j
=
0
;
j
<
rangelen
;
j
++
)
{
ele
=
ln
->
obj
;
ele
=
ln
->
obj
;
addReplyBulkLen
(
c
,
ele
);
addReplyBulk
(
c
,
ele
);
addReply
(
c
,
ele
);
addReply
(
c
,
shared
.
crlf
);
if
(
withscores
)
if
(
withscores
)
addReplyDouble
(
c
,
ln
->
score
);
addReplyDouble
(
c
,
ln
->
score
);
ln
=
reverse
?
ln
->
backward
:
ln
->
forward
[
0
];
ln
=
reverse
?
ln
->
backward
:
ln
->
forward
[
0
];
}
}
}
}
}
}
static
void
zrangeCommand
(
redisClient
*
c
)
{
static
void
zrangeCommand
(
redisClient
*
c
)
{
...
@@ -5831,9 +5702,7 @@ static void genericZrangebyscoreCommand(redisClient *c, int justcount) {
...
@@ -5831,9 +5702,7 @@ static void genericZrangebyscoreCommand(redisClient *c, int justcount) {
if
(
limit
==
0
)
break
;
if
(
limit
==
0
)
break
;
if
(
!
justcount
)
{
if
(
!
justcount
)
{
ele
=
ln
->
obj
;
ele
=
ln
->
obj
;
addReplyBulkLen
(
c
,
ele
);
addReplyBulk
(
c
,
ele
);
addReply
(
c
,
ele
);
addReply
(
c
,
shared
.
crlf
);
if
(
withscores
)
if
(
withscores
)
addReplyDouble
(
c
,
ln
->
score
);
addReplyDouble
(
c
,
ln
->
score
);
}
}
...
@@ -5863,34 +5732,21 @@ static void zcardCommand(redisClient *c) {
...
@@ -5863,34 +5732,21 @@ static void zcardCommand(redisClient *c) {
robj
*
o
;
robj
*
o
;
zset
*
zs
;
zset
*
zs
;
o
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
]);
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
if
(
o
==
NULL
)
{
checkType
(
c
,
o
,
REDIS_ZSET
))
return
;
addReply
(
c
,
shared
.
czero
);
return
;
}
else
{
if
(
o
->
type
!=
REDIS_ZSET
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
zs
=
o
->
ptr
;
zs
=
o
->
ptr
;
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
":%lu
\r\n
"
,
zs
->
zsl
->
length
));
addReplyUlong
(
c
,
zs
->
zsl
->
length
);
}
}
}
}
static
void
zscoreCommand
(
redisClient
*
c
)
{
static
void
zscoreCommand
(
redisClient
*
c
)
{
robj
*
o
;
robj
*
o
;
zset
*
zs
;
zset
*
zs
;
o
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
]);
if
(
o
==
NULL
)
{
addReply
(
c
,
shared
.
nullbulk
);
return
;
}
else
{
if
(
o
->
type
!=
REDIS_ZSET
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
dictEntry
*
de
;
dictEntry
*
de
;
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
))
==
NULL
||
checkType
(
c
,
o
,
REDIS_ZSET
))
return
;
zs
=
o
->
ptr
;
zs
=
o
->
ptr
;
de
=
dictFind
(
zs
->
dict
,
c
->
argv
[
2
]);
de
=
dictFind
(
zs
->
dict
,
c
->
argv
[
2
]);
if
(
!
de
)
{
if
(
!
de
)
{
...
@@ -5900,32 +5756,28 @@ static void zscoreCommand(redisClient *c) {
...
@@ -5900,32 +5756,28 @@ static void zscoreCommand(redisClient *c) {
addReplyDouble
(
c
,
*
score
);
addReplyDouble
(
c
,
*
score
);
}
}
}
}
}
}
static
void
zrankGenericCommand
(
redisClient
*
c
,
int
reverse
)
{
static
void
zrankGenericCommand
(
redisClient
*
c
,
int
reverse
)
{
robj
*
o
;
robj
*
o
;
o
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
]);
zset
*
zs
;
if
(
o
==
NULL
)
{
zskiplist
*
zsl
;
addReply
(
c
,
shared
.
nullbulk
);
return
;
}
if
(
o
->
type
!=
REDIS_ZSET
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
}
else
{
zset
*
zs
=
o
->
ptr
;
zskiplist
*
zsl
=
zs
->
zsl
;
dictEntry
*
de
;
dictEntry
*
de
;
unsigned
long
rank
;
unsigned
long
rank
;
double
*
score
;
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
))
==
NULL
||
checkType
(
c
,
o
,
REDIS_ZSET
))
return
;
zs
=
o
->
ptr
;
zsl
=
zs
->
zsl
;
de
=
dictFind
(
zs
->
dict
,
c
->
argv
[
2
]);
de
=
dictFind
(
zs
->
dict
,
c
->
argv
[
2
]);
if
(
!
de
)
{
if
(
!
de
)
{
addReply
(
c
,
shared
.
nullbulk
);
addReply
(
c
,
shared
.
nullbulk
);
return
;
return
;
}
}
double
*
score
=
dictGetEntryVal
(
de
);
score
=
dictGetEntryVal
(
de
);
rank
=
zslGetRank
(
zsl
,
*
score
,
c
->
argv
[
2
]);
rank
=
zslGetRank
(
zsl
,
*
score
,
c
->
argv
[
2
]);
if
(
rank
)
{
if
(
rank
)
{
if
(
reverse
)
{
if
(
reverse
)
{
...
@@ -5936,7 +5788,6 @@ static void zrankGenericCommand(redisClient *c, int reverse) {
...
@@ -5936,7 +5788,6 @@ static void zrankGenericCommand(redisClient *c, int reverse) {
}
else
{
}
else
{
addReply
(
c
,
shared
.
nullbulk
);
addReply
(
c
,
shared
.
nullbulk
);
}
}
}
}
}
static
void
zrankCommand
(
redisClient
*
c
)
{
static
void
zrankCommand
(
redisClient
*
c
)
{
...
@@ -6006,16 +5857,10 @@ static void hsetCommand(redisClient *c) {
...
@@ -6006,16 +5857,10 @@ static void hsetCommand(redisClient *c) {
}
}
static
void
hgetCommand
(
redisClient
*
c
)
{
static
void
hgetCommand
(
redisClient
*
c
)
{
robj
*
o
=
lookupKeyRead
(
c
->
db
,
c
->
argv
[
1
])
;
robj
*
o
;
if
(
o
==
NULL
)
{
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
))
==
NULL
||
addReply
(
c
,
shared
.
nullbulk
);
checkType
(
c
,
o
,
REDIS_HASH
))
return
;
return
;
}
else
{
if
(
o
->
type
!=
REDIS_HASH
)
{
addReply
(
c
,
shared
.
wrongtypeerr
);
return
;
}
if
(
o
->
encoding
==
REDIS_ENCODING_ZIPMAP
)
{
if
(
o
->
encoding
==
REDIS_ENCODING_ZIPMAP
)
{
unsigned
char
*
zm
=
o
->
ptr
;
unsigned
char
*
zm
=
o
->
ptr
;
...
@@ -6040,27 +5885,17 @@ static void hgetCommand(redisClient *c) {
...
@@ -6040,27 +5885,17 @@ static void hgetCommand(redisClient *c) {
}
else
{
}
else
{
robj
*
e
=
dictGetEntryVal
(
de
);
robj
*
e
=
dictGetEntryVal
(
de
);
addReplyBulkLen
(
c
,
e
);
addReplyBulk
(
c
,
e
);
addReply
(
c
,
e
);
addReply
(
c
,
shared
.
crlf
);
}
}
}
}
}
}
}
static
void
hdelCommand
(
redisClient
*
c
)
{
static
void
hdelCommand
(
redisClient
*
c
)
{
robj
*
o
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
1
]);
robj
*
o
;
if
(
o
==
NULL
)
{
addReply
(
c
,
shared
.
czero
);
return
;
}
else
{
int
deleted
=
0
;
int
deleted
=
0
;
if
(
o
->
type
!=
REDIS_HASH
)
{
if
((
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
addReply
(
c
,
shared
.
wrongtypeerr
);
checkType
(
c
,
o
,
REDIS_HASH
))
return
;
return
;
}
if
(
o
->
encoding
==
REDIS_ENCODING_ZIPMAP
)
{
if
(
o
->
encoding
==
REDIS_ENCODING_ZIPMAP
)
{
o
->
ptr
=
zipmapDel
((
unsigned
char
*
)
o
->
ptr
,
o
->
ptr
=
zipmapDel
((
unsigned
char
*
)
o
->
ptr
,
...
@@ -6070,14 +5905,13 @@ static void hdelCommand(redisClient *c) {
...
@@ -6070,14 +5905,13 @@ static void hdelCommand(redisClient *c) {
deleted
=
dictDelete
((
dict
*
)
o
->
ptr
,
c
->
argv
[
2
])
==
DICT_OK
;
deleted
=
dictDelete
((
dict
*
)
o
->
ptr
,
c
->
argv
[
2
])
==
DICT_OK
;
}
}
addReply
(
c
,
deleted
?
shared
.
cone
:
shared
.
czero
);
addReply
(
c
,
deleted
?
shared
.
cone
:
shared
.
czero
);
}
}
}
static
void
hlenCommand
(
redisClient
*
c
)
{
static
void
hlenCommand
(
redisClient
*
c
)
{
robj
*
o
;
robj
*
o
;
unsigned
long
len
;
unsigned
long
len
;
if
((
o
=
lookupKey
Write
OrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
if
((
o
=
lookupKey
Read
OrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
))
==
NULL
||
checkType
(
c
,
o
,
REDIS_HASH
))
return
;
checkType
(
c
,
o
,
REDIS_HASH
))
return
;
len
=
(
o
->
encoding
==
REDIS_ENCODING_ZIPMAP
)
?
len
=
(
o
->
encoding
==
REDIS_ENCODING_ZIPMAP
)
?
...
@@ -6410,11 +6244,7 @@ static void sortCommand(redisClient *c) {
...
@@ -6410,11 +6244,7 @@ static void sortCommand(redisClient *c) {
listNode
*
ln
;
listNode
*
ln
;
listIter
li
;
listIter
li
;
if
(
!
getop
)
{
if
(
!
getop
)
addReplyBulk
(
c
,
vector
[
j
].
obj
);
addReplyBulkLen
(
c
,
vector
[
j
].
obj
);
addReply
(
c
,
vector
[
j
].
obj
);
addReply
(
c
,
shared
.
crlf
);
}
listRewind
(
operations
,
&
li
);
listRewind
(
operations
,
&
li
);
while
((
ln
=
listNext
(
&
li
)))
{
while
((
ln
=
listNext
(
&
li
)))
{
redisSortOperation
*
sop
=
ln
->
value
;
redisSortOperation
*
sop
=
ln
->
value
;
...
@@ -6425,9 +6255,7 @@ static void sortCommand(redisClient *c) {
...
@@ -6425,9 +6255,7 @@ static void sortCommand(redisClient *c) {
if
(
!
val
||
val
->
type
!=
REDIS_STRING
)
{
if
(
!
val
||
val
->
type
!=
REDIS_STRING
)
{
addReply
(
c
,
shared
.
nullbulk
);
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
}
else
{
addReplyBulkLen
(
c
,
val
);
addReplyBulk
(
c
,
val
);
addReply
(
c
,
val
);
addReply
(
c
,
shared
.
crlf
);
}
}
}
else
{
}
else
{
redisAssert
(
sop
->
type
==
REDIS_SORT_GET
);
/* always fails */
redisAssert
(
sop
->
type
==
REDIS_SORT_GET
);
/* always fails */
...
@@ -6945,12 +6773,8 @@ static int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele) {
...
@@ -6945,12 +6773,8 @@ static int handleClientsWaitingListPush(redisClient *c, robj *key, robj *ele) {
receiver
=
ln
->
value
;
receiver
=
ln
->
value
;
addReplySds
(
receiver
,
sdsnew
(
"*2
\r\n
"
));
addReplySds
(
receiver
,
sdsnew
(
"*2
\r\n
"
));
addReplyBulkLen
(
receiver
,
key
);
addReplyBulk
(
receiver
,
key
);
addReply
(
receiver
,
key
);
addReplyBulk
(
receiver
,
ele
);
addReply
(
receiver
,
shared
.
crlf
);
addReplyBulkLen
(
receiver
,
ele
);
addReply
(
receiver
,
ele
);
addReply
(
receiver
,
shared
.
crlf
);
unblockClientWaitingData
(
receiver
);
unblockClientWaitingData
(
receiver
);
return
1
;
return
1
;
}
}
...
@@ -6989,9 +6813,7 @@ static void blockingPopGenericCommand(redisClient *c, int where) {
...
@@ -6989,9 +6813,7 @@ static void blockingPopGenericCommand(redisClient *c, int where) {
* for us. If this souds like an hack to you it's just
* for us. If this souds like an hack to you it's just
* because it is... */
* because it is... */
addReplySds
(
c
,
sdsnew
(
"*2
\r\n
"
));
addReplySds
(
c
,
sdsnew
(
"*2
\r\n
"
));
addReplyBulkLen
(
c
,
argv
[
1
]);
addReplyBulk
(
c
,
argv
[
1
]);
addReply
(
c
,
argv
[
1
]);
addReply
(
c
,
shared
.
crlf
);
popGenericCommand
(
c
,
where
);
popGenericCommand
(
c
,
where
);
/* Fix the client structure with the original stuff */
/* Fix the client structure with the original stuff */
...
...
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