Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
003f0840
Commit
003f0840
authored
Jun 04, 2010
by
Pieter Noordhuis
Browse files
renamed list wrapper functions to be more verbose
parent
d0686e07
Changes
1
Hide whitespace changes
Inline
Side-by-side
redis.c
View file @
003f0840
...
@@ -650,7 +650,7 @@ static struct redisCommand *lookupCommand(char *name);
...
@@ -650,7 +650,7 @@ static struct redisCommand *lookupCommand(char *name);
static
void
call
(
redisClient
*
c
,
struct
redisCommand
*
cmd
);
static
void
call
(
redisClient
*
c
,
struct
redisCommand
*
cmd
);
static
void
resetClient
(
redisClient
*
c
);
static
void
resetClient
(
redisClient
*
c
);
static
void
convertToRealHash
(
robj
*
o
);
static
void
convertToRealHash
(
robj
*
o
);
static
void
c
onvert
List
(
robj
*
o
,
int
enc
);
static
void
listTypeC
onvert
(
robj
*
o
,
int
enc
);
static
int
pubsubUnsubscribeAllChannels
(
redisClient
*
c
,
int
notify
);
static
int
pubsubUnsubscribeAllChannels
(
redisClient
*
c
,
int
notify
);
static
int
pubsubUnsubscribeAllPatterns
(
redisClient
*
c
,
int
notify
);
static
int
pubsubUnsubscribeAllPatterns
(
redisClient
*
c
,
int
notify
);
static
void
freePubsubPattern
(
void
*
p
);
static
void
freePubsubPattern
(
void
*
p
);
...
@@ -4181,7 +4181,7 @@ static robj *rdbLoadObject(int type, FILE *fp) {
...
@@ -4181,7 +4181,7 @@ static robj *rdbLoadObject(int type, FILE *fp) {
if
(
o
->
encoding
==
REDIS_ENCODING_ZIPLIST
&&
if
(
o
->
encoding
==
REDIS_ENCODING_ZIPLIST
&&
ele
->
encoding
==
REDIS_ENCODING_RAW
&&
ele
->
encoding
==
REDIS_ENCODING_RAW
&&
sdslen
(
ele
->
ptr
)
>
server
.
list_max_ziplist_value
)
sdslen
(
ele
->
ptr
)
>
server
.
list_max_ziplist_value
)
c
onvert
List
(
o
,
REDIS_ENCODING_LIST
);
listTypeC
onvert
(
o
,
REDIS_ENCODING_LIST
);
if
(
o
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
dec
=
getDecodedObject
(
ele
);
dec
=
getDecodedObject
(
ele
);
...
@@ -4910,19 +4910,19 @@ static void moveCommand(redisClient *c) {
...
@@ -4910,19 +4910,19 @@ static void moveCommand(redisClient *c) {
/* Check the argument length to see if it requires us to convert the ziplist
/* Check the argument length to see if it requires us to convert the ziplist
* to a real list. Only check raw-encoded objects because integer encoded
* to a real list. Only check raw-encoded objects because integer encoded
* objects are never too long. */
* objects are never too long. */
static
void
listTryConversion
(
robj
*
subject
,
robj
*
value
)
{
static
void
listT
ypeT
ryConversion
(
robj
*
subject
,
robj
*
value
)
{
if
(
subject
->
encoding
!=
REDIS_ENCODING_ZIPLIST
)
return
;
if
(
subject
->
encoding
!=
REDIS_ENCODING_ZIPLIST
)
return
;
if
(
value
->
encoding
==
REDIS_ENCODING_RAW
&&
if
(
value
->
encoding
==
REDIS_ENCODING_RAW
&&
sdslen
(
value
->
ptr
)
>
server
.
list_max_ziplist_value
)
sdslen
(
value
->
ptr
)
>
server
.
list_max_ziplist_value
)
c
onvert
List
(
subject
,
REDIS_ENCODING_LIST
);
listTypeC
onvert
(
subject
,
REDIS_ENCODING_LIST
);
}
}
static
void
lPush
(
robj
*
subject
,
robj
*
value
,
int
where
)
{
static
void
l
istType
Push
(
robj
*
subject
,
robj
*
value
,
int
where
)
{
/* Check if we need to convert the ziplist */
/* Check if we need to convert the ziplist */
listTryConversion
(
subject
,
value
);
listT
ypeT
ryConversion
(
subject
,
value
);
if
(
subject
->
encoding
==
REDIS_ENCODING_ZIPLIST
&&
if
(
subject
->
encoding
==
REDIS_ENCODING_ZIPLIST
&&
ziplistLen
(
subject
->
ptr
)
>
server
.
list_max_ziplist_entries
)
ziplistLen
(
subject
->
ptr
)
>
server
.
list_max_ziplist_entries
)
c
onvert
List
(
subject
,
REDIS_ENCODING_LIST
);
listTypeC
onvert
(
subject
,
REDIS_ENCODING_LIST
);
if
(
subject
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
if
(
subject
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
int
pos
=
(
where
==
REDIS_HEAD
)
?
ZIPLIST_HEAD
:
ZIPLIST_TAIL
;
int
pos
=
(
where
==
REDIS_HEAD
)
?
ZIPLIST_HEAD
:
ZIPLIST_TAIL
;
...
@@ -4941,7 +4941,7 @@ static void lPush(robj *subject, robj *value, int where) {
...
@@ -4941,7 +4941,7 @@ static void lPush(robj *subject, robj *value, int where) {
}
}
}
}
static
robj
*
lPop
(
robj
*
subject
,
int
where
)
{
static
robj
*
l
istType
Pop
(
robj
*
subject
,
int
where
)
{
robj
*
value
=
NULL
;
robj
*
value
=
NULL
;
if
(
subject
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
if
(
subject
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
unsigned
char
*
p
;
unsigned
char
*
p
;
...
@@ -4978,7 +4978,7 @@ static robj *lPop(robj *subject, int where) {
...
@@ -4978,7 +4978,7 @@ static robj *lPop(robj *subject, int where) {
return
value
;
return
value
;
}
}
static
unsigned
long
lLength
(
robj
*
subject
)
{
static
unsigned
long
l
istType
Length
(
robj
*
subject
)
{
if
(
subject
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
if
(
subject
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
return
ziplistLen
(
subject
->
ptr
);
return
ziplistLen
(
subject
->
ptr
);
}
else
if
(
subject
->
encoding
==
REDIS_ENCODING_LIST
)
{
}
else
if
(
subject
->
encoding
==
REDIS_ENCODING_LIST
)
{
...
@@ -4995,18 +4995,18 @@ typedef struct {
...
@@ -4995,18 +4995,18 @@ typedef struct {
unsigned
char
direction
;
/* Iteration direction */
unsigned
char
direction
;
/* Iteration direction */
unsigned
char
*
zi
;
unsigned
char
*
zi
;
listNode
*
ln
;
listNode
*
ln
;
}
lIterator
;
}
l
istType
Iterator
;
/* Structure for an entry while iterating over a list. */
/* Structure for an entry while iterating over a list. */
typedef
struct
{
typedef
struct
{
lIterator
*
li
;
l
istType
Iterator
*
li
;
unsigned
char
*
zi
;
/* Entry in ziplist */
unsigned
char
*
zi
;
/* Entry in ziplist */
listNode
*
ln
;
/* Entry in linked list */
listNode
*
ln
;
/* Entry in linked list */
}
lEntry
;
}
l
istType
Entry
;
/* Initialize an iterator at the specified index. */
/* Initialize an iterator at the specified index. */
static
lIterator
*
lInitIterator
(
robj
*
subject
,
int
index
,
unsigned
char
direction
)
{
static
l
istType
Iterator
*
l
istType
InitIterator
(
robj
*
subject
,
int
index
,
unsigned
char
direction
)
{
lIterator
*
li
=
zmalloc
(
sizeof
(
lIterator
));
l
istType
Iterator
*
li
=
zmalloc
(
sizeof
(
l
istType
Iterator
));
li
->
subject
=
subject
;
li
->
subject
=
subject
;
li
->
encoding
=
subject
->
encoding
;
li
->
encoding
=
subject
->
encoding
;
li
->
direction
=
direction
;
li
->
direction
=
direction
;
...
@@ -5021,14 +5021,14 @@ static lIterator *lInitIterator(robj *subject, int index, unsigned char directio
...
@@ -5021,14 +5021,14 @@ static lIterator *lInitIterator(robj *subject, int index, unsigned char directio
}
}
/* Clean up the iterator. */
/* Clean up the iterator. */
static
void
lReleaseIterator
(
lIterator
*
li
)
{
static
void
l
istType
ReleaseIterator
(
l
istType
Iterator
*
li
)
{
zfree
(
li
);
zfree
(
li
);
}
}
/* Stores pointer to current the entry in the provided entry structure
/* Stores pointer to current the entry in the provided entry structure
* and advances the position of the iterator. Returns 1 when the current
* and advances the position of the iterator. Returns 1 when the current
* entry is in fact an entry, 0 otherwise. */
* entry is in fact an entry, 0 otherwise. */
static
int
l
Next
(
l
Iterator
*
li
,
lEntry
*
entry
)
{
static
int
l
istTypeNext
(
listType
Iterator
*
li
,
l
istType
Entry
*
entry
)
{
entry
->
li
=
li
;
entry
->
li
=
li
;
if
(
li
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
if
(
li
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
entry
->
zi
=
li
->
zi
;
entry
->
zi
=
li
->
zi
;
...
@@ -5055,8 +5055,8 @@ static int lNext(lIterator *li, lEntry *entry) {
...
@@ -5055,8 +5055,8 @@ static int lNext(lIterator *li, lEntry *entry) {
}
}
/* Return entry or NULL at the current position of the iterator. */
/* Return entry or NULL at the current position of the iterator. */
static
robj
*
l
Get
(
l
Entry
*
entry
)
{
static
robj
*
l
istTypeGet
(
listType
Entry
*
entry
)
{
lIterator
*
li
=
entry
->
li
;
l
istType
Iterator
*
li
=
entry
->
li
;
robj
*
value
=
NULL
;
robj
*
value
=
NULL
;
if
(
li
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
if
(
li
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
unsigned
char
*
vstr
;
unsigned
char
*
vstr
;
...
@@ -5081,8 +5081,8 @@ static robj *lGet(lEntry *entry) {
...
@@ -5081,8 +5081,8 @@ static robj *lGet(lEntry *entry) {
}
}
/* Compare the given object with the entry at the current position. */
/* Compare the given object with the entry at the current position. */
static
int
l
Equal
(
l
Entry
*
entry
,
robj
*
o
)
{
static
int
l
istTypeEqual
(
listType
Entry
*
entry
,
robj
*
o
)
{
lIterator
*
li
=
entry
->
li
;
l
istType
Iterator
*
li
=
entry
->
li
;
if
(
li
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
if
(
li
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
redisAssert
(
o
->
encoding
==
REDIS_ENCODING_RAW
);
redisAssert
(
o
->
encoding
==
REDIS_ENCODING_RAW
);
return
ziplistCompare
(
entry
->
zi
,
o
->
ptr
,
sdslen
(
o
->
ptr
));
return
ziplistCompare
(
entry
->
zi
,
o
->
ptr
,
sdslen
(
o
->
ptr
));
...
@@ -5094,8 +5094,8 @@ static int lEqual(lEntry *entry, robj *o) {
...
@@ -5094,8 +5094,8 @@ static int lEqual(lEntry *entry, robj *o) {
}
}
/* Delete the element pointed to. */
/* Delete the element pointed to. */
static
void
lDelete
(
lEntry
*
entry
)
{
static
void
l
istType
Delete
(
l
istType
Entry
*
entry
)
{
lIterator
*
li
=
entry
->
li
;
l
istType
Iterator
*
li
=
entry
->
li
;
if
(
li
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
if
(
li
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
unsigned
char
*
p
=
entry
->
zi
;
unsigned
char
*
p
=
entry
->
zi
;
li
->
subject
->
ptr
=
ziplistDelete
(
li
->
subject
->
ptr
,
&
p
);
li
->
subject
->
ptr
=
ziplistDelete
(
li
->
subject
->
ptr
,
&
p
);
...
@@ -5118,18 +5118,18 @@ static void lDelete(lEntry *entry) {
...
@@ -5118,18 +5118,18 @@ static void lDelete(lEntry *entry) {
}
}
}
}
static
void
c
onvert
List
(
robj
*
subject
,
int
enc
)
{
static
void
listTypeC
onvert
(
robj
*
subject
,
int
enc
)
{
lIterator
*
li
;
l
istType
Iterator
*
li
;
lEntry
entry
;
l
istType
Entry
entry
;
redisAssert
(
subject
->
type
==
REDIS_LIST
);
redisAssert
(
subject
->
type
==
REDIS_LIST
);
if
(
enc
==
REDIS_ENCODING_LIST
)
{
if
(
enc
==
REDIS_ENCODING_LIST
)
{
list
*
l
=
listCreate
();
list
*
l
=
listCreate
();
/* lGet returns a robj with incremented refcount */
/* l
istType
Get returns a robj with incremented refcount */
li
=
lInitIterator
(
subject
,
0
,
REDIS_TAIL
);
li
=
l
istType
InitIterator
(
subject
,
0
,
REDIS_TAIL
);
while
(
lNext
(
li
,
&
entry
))
listAddNodeTail
(
l
,
lGet
(
&
entry
));
while
(
l
istType
Next
(
li
,
&
entry
))
listAddNodeTail
(
l
,
l
istType
Get
(
&
entry
));
lReleaseIterator
(
li
);
l
istType
ReleaseIterator
(
li
);
subject
->
encoding
=
REDIS_ENCODING_LIST
;
subject
->
encoding
=
REDIS_ENCODING_LIST
;
zfree
(
subject
->
ptr
);
zfree
(
subject
->
ptr
);
...
@@ -5158,8 +5158,8 @@ static void pushGenericCommand(redisClient *c, int where) {
...
@@ -5158,8 +5158,8 @@ static void pushGenericCommand(redisClient *c, int where) {
return
;
return
;
}
}
}
}
lPush
(
lobj
,
c
->
argv
[
2
],
where
);
l
istType
Push
(
lobj
,
c
->
argv
[
2
],
where
);
addReplyLongLong
(
c
,
lLength
(
lobj
));
addReplyLongLong
(
c
,
l
istType
Length
(
lobj
));
server
.
dirty
++
;
server
.
dirty
++
;
}
}
...
@@ -5174,7 +5174,7 @@ static void rpushCommand(redisClient *c) {
...
@@ -5174,7 +5174,7 @@ static void rpushCommand(redisClient *c) {
static
void
llenCommand
(
redisClient
*
c
)
{
static
void
llenCommand
(
redisClient
*
c
)
{
robj
*
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
);
robj
*
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
);
if
(
o
==
NULL
||
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
if
(
o
==
NULL
||
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
addReplyUlong
(
c
,
lLength
(
o
));
addReplyUlong
(
c
,
l
istType
Length
(
o
));
}
}
static
void
lindexCommand
(
redisClient
*
c
)
{
static
void
lindexCommand
(
redisClient
*
c
)
{
...
@@ -5219,7 +5219,7 @@ static void lsetCommand(redisClient *c) {
...
@@ -5219,7 +5219,7 @@ static void lsetCommand(redisClient *c) {
int
index
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
index
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
robj
*
value
=
c
->
argv
[
3
];
robj
*
value
=
c
->
argv
[
3
];
listTryConversion
(
o
,
value
);
listT
ypeT
ryConversion
(
o
,
value
);
if
(
o
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
if
(
o
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
{
unsigned
char
*
p
,
*
zl
=
o
->
ptr
;
unsigned
char
*
p
,
*
zl
=
o
->
ptr
;
p
=
ziplistIndex
(
zl
,
index
);
p
=
ziplistIndex
(
zl
,
index
);
...
@@ -5253,13 +5253,13 @@ static void popGenericCommand(redisClient *c, int where) {
...
@@ -5253,13 +5253,13 @@ static void popGenericCommand(redisClient *c, int where) {
robj
*
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
);
robj
*
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
);
if
(
o
==
NULL
||
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
if
(
o
==
NULL
||
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
robj
*
value
=
lPop
(
o
,
where
);
robj
*
value
=
l
istType
Pop
(
o
,
where
);
if
(
value
==
NULL
)
{
if
(
value
==
NULL
)
{
addReply
(
c
,
shared
.
nullbulk
);
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
}
else
{
addReplyBulk
(
c
,
value
);
addReplyBulk
(
c
,
value
);
decrRefCount
(
value
);
decrRefCount
(
value
);
if
(
lLength
(
o
)
==
0
)
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
if
(
l
istType
Length
(
o
)
==
0
)
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
server
.
dirty
++
;
server
.
dirty
++
;
}
}
}
}
...
@@ -5278,11 +5278,11 @@ static void lrangeCommand(redisClient *c) {
...
@@ -5278,11 +5278,11 @@ static void lrangeCommand(redisClient *c) {
int
end
=
atoi
(
c
->
argv
[
3
]
->
ptr
);
int
end
=
atoi
(
c
->
argv
[
3
]
->
ptr
);
int
llen
;
int
llen
;
int
rangelen
,
j
;
int
rangelen
,
j
;
lEntry
entry
;
l
istType
Entry
entry
;
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
emptymultibulk
))
==
NULL
if
((
o
=
lookupKeyReadOrReply
(
c
,
c
->
argv
[
1
],
shared
.
emptymultibulk
))
==
NULL
||
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
||
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
llen
=
lLength
(
o
);
llen
=
l
istType
Length
(
o
);
/* convert negative indexes */
/* convert negative indexes */
if
(
start
<
0
)
start
=
llen
+
start
;
if
(
start
<
0
)
start
=
llen
+
start
;
...
@@ -5301,14 +5301,14 @@ static void lrangeCommand(redisClient *c) {
...
@@ -5301,14 +5301,14 @@ 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 */
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"*%d
\r\n
"
,
rangelen
));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
"*%d
\r\n
"
,
rangelen
));
lIterator
*
li
=
lInitIterator
(
o
,
start
,
REDIS_TAIL
);
l
istType
Iterator
*
li
=
l
istType
InitIterator
(
o
,
start
,
REDIS_TAIL
);
for
(
j
=
0
;
j
<
rangelen
;
j
++
)
{
for
(
j
=
0
;
j
<
rangelen
;
j
++
)
{
redisAssert
(
lNext
(
li
,
&
entry
));
redisAssert
(
l
istType
Next
(
li
,
&
entry
));
value
=
lGet
(
&
entry
);
value
=
l
istType
Get
(
&
entry
);
addReplyBulk
(
c
,
value
);
addReplyBulk
(
c
,
value
);
decrRefCount
(
value
);
decrRefCount
(
value
);
}
}
lReleaseIterator
(
li
);
l
istType
ReleaseIterator
(
li
);
}
}
static
void
ltrimCommand
(
redisClient
*
c
)
{
static
void
ltrimCommand
(
redisClient
*
c
)
{
...
@@ -5322,7 +5322,7 @@ static void ltrimCommand(redisClient *c) {
...
@@ -5322,7 +5322,7 @@ static void ltrimCommand(redisClient *c) {
if
((
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
ok
))
==
NULL
||
if
((
o
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
ok
))
==
NULL
||
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
checkType
(
c
,
o
,
REDIS_LIST
))
return
;
llen
=
lLength
(
o
);
llen
=
l
istType
Length
(
o
);
/* convert negative indexes */
/* convert negative indexes */
if
(
start
<
0
)
start
=
llen
+
start
;
if
(
start
<
0
)
start
=
llen
+
start
;
...
@@ -5358,7 +5358,7 @@ static void ltrimCommand(redisClient *c) {
...
@@ -5358,7 +5358,7 @@ static void ltrimCommand(redisClient *c) {
}
else
{
}
else
{
redisPanic
(
"Unknown list encoding"
);
redisPanic
(
"Unknown list encoding"
);
}
}
if
(
lLength
(
o
)
==
0
)
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
if
(
l
istType
Length
(
o
)
==
0
)
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
server
.
dirty
++
;
server
.
dirty
++
;
addReply
(
c
,
shared
.
ok
);
addReply
(
c
,
shared
.
ok
);
}
}
...
@@ -5367,7 +5367,7 @@ static void lremCommand(redisClient *c) {
...
@@ -5367,7 +5367,7 @@ static void lremCommand(redisClient *c) {
robj
*
subject
,
*
obj
=
c
->
argv
[
3
];
robj
*
subject
,
*
obj
=
c
->
argv
[
3
];
int
toremove
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
toremove
=
atoi
(
c
->
argv
[
2
]
->
ptr
);
int
removed
=
0
;
int
removed
=
0
;
lEntry
entry
;
l
istType
Entry
entry
;
subject
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
);
subject
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
czero
);
if
(
subject
==
NULL
||
checkType
(
c
,
subject
,
REDIS_LIST
))
return
;
if
(
subject
==
NULL
||
checkType
(
c
,
subject
,
REDIS_LIST
))
return
;
...
@@ -5376,29 +5376,29 @@ static void lremCommand(redisClient *c) {
...
@@ -5376,29 +5376,29 @@ static void lremCommand(redisClient *c) {
if
(
subject
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
if
(
subject
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
obj
=
getDecodedObject
(
obj
);
obj
=
getDecodedObject
(
obj
);
lIterator
*
li
;
l
istType
Iterator
*
li
;
if
(
toremove
<
0
)
{
if
(
toremove
<
0
)
{
toremove
=
-
toremove
;
toremove
=
-
toremove
;
li
=
lInitIterator
(
subject
,
-
1
,
REDIS_HEAD
);
li
=
l
istType
InitIterator
(
subject
,
-
1
,
REDIS_HEAD
);
}
else
{
}
else
{
li
=
lInitIterator
(
subject
,
0
,
REDIS_TAIL
);
li
=
l
istType
InitIterator
(
subject
,
0
,
REDIS_TAIL
);
}
}
while
(
lNext
(
li
,
&
entry
))
{
while
(
l
istType
Next
(
li
,
&
entry
))
{
if
(
lEqual
(
&
entry
,
obj
))
{
if
(
l
istType
Equal
(
&
entry
,
obj
))
{
lDelete
(
&
entry
);
l
istType
Delete
(
&
entry
);
server
.
dirty
++
;
server
.
dirty
++
;
removed
++
;
removed
++
;
if
(
toremove
&&
removed
==
toremove
)
break
;
if
(
toremove
&&
removed
==
toremove
)
break
;
}
}
}
}
lReleaseIterator
(
li
);
l
istType
ReleaseIterator
(
li
);
/* Clean up raw encoded object */
/* Clean up raw encoded object */
if
(
subject
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
if
(
subject
->
encoding
==
REDIS_ENCODING_ZIPLIST
)
decrRefCount
(
obj
);
decrRefCount
(
obj
);
if
(
lLength
(
subject
)
==
0
)
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
if
(
l
istType
Length
(
subject
)
==
0
)
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
":%d
\r\n
"
,
removed
));
addReplySds
(
c
,
sdscatprintf
(
sdsempty
(),
":%d
\r\n
"
,
removed
));
}
}
...
@@ -5422,12 +5422,12 @@ static void rpoplpushcommand(redisClient *c) {
...
@@ -5422,12 +5422,12 @@ static void rpoplpushcommand(redisClient *c) {
if
((
sobj
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
))
==
NULL
||
if
((
sobj
=
lookupKeyWriteOrReply
(
c
,
c
->
argv
[
1
],
shared
.
nullbulk
))
==
NULL
||
checkType
(
c
,
sobj
,
REDIS_LIST
))
return
;
checkType
(
c
,
sobj
,
REDIS_LIST
))
return
;
if
(
lLength
(
sobj
)
==
0
)
{
if
(
l
istType
Length
(
sobj
)
==
0
)
{
addReply
(
c
,
shared
.
nullbulk
);
addReply
(
c
,
shared
.
nullbulk
);
}
else
{
}
else
{
robj
*
dobj
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
2
]);
robj
*
dobj
=
lookupKeyWrite
(
c
->
db
,
c
->
argv
[
2
]);
if
(
dobj
&&
checkType
(
c
,
dobj
,
REDIS_LIST
))
return
;
if
(
dobj
&&
checkType
(
c
,
dobj
,
REDIS_LIST
))
return
;
value
=
lPop
(
sobj
,
REDIS_TAIL
);
value
=
l
istType
Pop
(
sobj
,
REDIS_TAIL
);
/* Add the element to the target list (unless it's directly
/* Add the element to the target list (unless it's directly
* passed to some BLPOP-ing client */
* passed to some BLPOP-ing client */
...
@@ -5437,17 +5437,17 @@ static void rpoplpushcommand(redisClient *c) {
...
@@ -5437,17 +5437,17 @@ static void rpoplpushcommand(redisClient *c) {
dobj
=
createZiplistObject
();
dobj
=
createZiplistObject
();
dbAdd
(
c
->
db
,
c
->
argv
[
2
],
dobj
);
dbAdd
(
c
->
db
,
c
->
argv
[
2
],
dobj
);
}
}
lPush
(
dobj
,
value
,
REDIS_HEAD
);
l
istType
Push
(
dobj
,
value
,
REDIS_HEAD
);
}
}
/* Send the element to the client as reply as well */
/* Send the element to the client as reply as well */
addReplyBulk
(
c
,
value
);
addReplyBulk
(
c
,
value
);
/* lPop returns an object with its refcount incremented */
/* l
istType
Pop returns an object with its refcount incremented */
decrRefCount
(
value
);
decrRefCount
(
value
);
/* Delete the source list when it is empty */
/* Delete the source list when it is empty */
if
(
lLength
(
sobj
)
==
0
)
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
if
(
l
istType
Length
(
sobj
)
==
0
)
dbDelete
(
c
->
db
,
c
->
argv
[
1
]);
server
.
dirty
++
;
server
.
dirty
++
;
}
}
}
}
...
@@ -6070,7 +6070,7 @@ static zskiplistNode *zslFirstWithScore(zskiplist *zsl, double score) {
...
@@ -6070,7 +6070,7 @@ static zskiplistNode *zslFirstWithScore(zskiplist *zsl, double score) {
* Returns 0 when the element cannot be found, rank otherwise.
* Returns 0 when the element cannot be found, rank otherwise.
* Note that the rank is 1-based due to the span of zsl->header to the
* Note that the rank is 1-based due to the span of zsl->header to the
* first element. */
* first element. */
static
unsigned
long
zslGetRank
(
zskiplist
*
zsl
,
double
score
,
robj
*
o
)
{
static
unsigned
long
zsl
istType
GetRank
(
zskiplist
*
zsl
,
double
score
,
robj
*
o
)
{
zskiplistNode
*
x
;
zskiplistNode
*
x
;
unsigned
long
rank
=
0
;
unsigned
long
rank
=
0
;
int
i
;
int
i
;
...
@@ -6094,7 +6094,7 @@ static unsigned long zslGetRank(zskiplist *zsl, double score, robj *o) {
...
@@ -6094,7 +6094,7 @@ static unsigned long zslGetRank(zskiplist *zsl, double score, robj *o) {
}
}
/* Finds an element by its rank. The rank argument needs to be 1-based. */
/* Finds an element by its rank. The rank argument needs to be 1-based. */
zskiplistNode
*
zslGetElementByRank
(
zskiplist
*
zsl
,
unsigned
long
rank
)
{
zskiplistNode
*
zsl
istType
GetElementByRank
(
zskiplist
*
zsl
,
unsigned
long
rank
)
{
zskiplistNode
*
x
;
zskiplistNode
*
x
;
unsigned
long
traversed
=
0
;
unsigned
long
traversed
=
0
;
int
i
;
int
i
;
...
@@ -6560,10 +6560,10 @@ static void zrangeGenericCommand(redisClient *c, int reverse) {
...
@@ -6560,10 +6560,10 @@ static void zrangeGenericCommand(redisClient *c, int reverse) {
/* check if starting point is trivial, before searching
/* check if starting point is trivial, before searching
* the element in log(N) time */
* the element in log(N) time */
if
(
reverse
)
{
if
(
reverse
)
{
ln
=
start
==
0
?
zsl
->
tail
:
zslGetElementByRank
(
zsl
,
llen
-
start
);
ln
=
start
==
0
?
zsl
->
tail
:
zsl
istType
GetElementByRank
(
zsl
,
llen
-
start
);
}
else
{
}
else
{
ln
=
start
==
0
?
ln
=
start
==
0
?
zsl
->
header
->
forward
[
0
]
:
zslGetElementByRank
(
zsl
,
start
+
1
);
zsl
->
header
->
forward
[
0
]
:
zsl
istType
GetElementByRank
(
zsl
,
start
+
1
);
}
}
/* Return the result in form of a multi-bulk reply */
/* Return the result in form of a multi-bulk reply */
...
@@ -6760,7 +6760,7 @@ static void zrankGenericCommand(redisClient *c, int reverse) {
...
@@ -6760,7 +6760,7 @@ static void zrankGenericCommand(redisClient *c, int reverse) {
}
}
score
=
dictGetEntryVal
(
de
);
score
=
dictGetEntryVal
(
de
);
rank
=
zslGetRank
(
zsl
,
*
score
,
c
->
argv
[
2
]);
rank
=
zsl
istType
GetRank
(
zsl
,
*
score
,
c
->
argv
[
2
]);
if
(
rank
)
{
if
(
rank
)
{
if
(
reverse
)
{
if
(
reverse
)
{
addReplyLongLong
(
c
,
zsl
->
length
-
rank
);
addReplyLongLong
(
c
,
zsl
->
length
-
rank
);
...
@@ -7407,7 +7407,7 @@ static void sortCommand(redisClient *c) {
...
@@ -7407,7 +7407,7 @@ static void sortCommand(redisClient *c) {
/* Load the sorting vector with all the objects to sort */
/* Load the sorting vector with all the objects to sort */
switch
(
sortval
->
type
)
{
switch
(
sortval
->
type
)
{
case
REDIS_LIST
:
vectorlen
=
lLength
(
sortval
);
break
;
case
REDIS_LIST
:
vectorlen
=
l
istType
Length
(
sortval
);
break
;
case
REDIS_SET
:
vectorlen
=
dictSize
((
dict
*
)
sortval
->
ptr
);
break
;
case
REDIS_SET
:
vectorlen
=
dictSize
((
dict
*
)
sortval
->
ptr
);
break
;
case
REDIS_ZSET
:
vectorlen
=
dictSize
(((
zset
*
)
sortval
->
ptr
)
->
dict
);
break
;
case
REDIS_ZSET
:
vectorlen
=
dictSize
(((
zset
*
)
sortval
->
ptr
)
->
dict
);
break
;
default:
vectorlen
=
0
;
redisPanic
(
"Bad SORT type"
);
/* Avoid GCC warning */
default:
vectorlen
=
0
;
redisPanic
(
"Bad SORT type"
);
/* Avoid GCC warning */
...
@@ -7416,15 +7416,15 @@ static void sortCommand(redisClient *c) {
...
@@ -7416,15 +7416,15 @@ static void sortCommand(redisClient *c) {
j
=
0
;
j
=
0
;
if
(
sortval
->
type
==
REDIS_LIST
)
{
if
(
sortval
->
type
==
REDIS_LIST
)
{
lIterator
*
li
=
lInitIterator
(
sortval
,
0
,
REDIS_TAIL
);
l
istType
Iterator
*
li
=
l
istType
InitIterator
(
sortval
,
0
,
REDIS_TAIL
);
lEntry
entry
;
l
istType
Entry
entry
;
while
(
lNext
(
li
,
&
entry
))
{
while
(
l
istType
Next
(
li
,
&
entry
))
{
vector
[
j
].
obj
=
lGet
(
&
entry
);
vector
[
j
].
obj
=
l
istType
Get
(
&
entry
);
vector
[
j
].
u
.
score
=
0
;
vector
[
j
].
u
.
score
=
0
;
vector
[
j
].
u
.
cmpobj
=
NULL
;
vector
[
j
].
u
.
cmpobj
=
NULL
;
j
++
;
j
++
;
}
}
lReleaseIterator
(
li
);
l
istType
ReleaseIterator
(
li
);
}
else
{
}
else
{
dict
*
set
;
dict
*
set
;
dictIterator
*
di
;
dictIterator
*
di
;
...
@@ -7542,7 +7542,7 @@ static void sortCommand(redisClient *c) {
...
@@ -7542,7 +7542,7 @@ static void sortCommand(redisClient *c) {
listIter
li
;
listIter
li
;
if
(
!
getop
)
{
if
(
!
getop
)
{
lPush
(
sobj
,
vector
[
j
].
obj
,
REDIS_TAIL
);
l
istType
Push
(
sobj
,
vector
[
j
].
obj
,
REDIS_TAIL
);
}
else
{
}
else
{
listRewind
(
operations
,
&
li
);
listRewind
(
operations
,
&
li
);
while
((
ln
=
listNext
(
&
li
)))
{
while
((
ln
=
listNext
(
&
li
)))
{
...
@@ -7553,10 +7553,10 @@ static void sortCommand(redisClient *c) {
...
@@ -7553,10 +7553,10 @@ static void sortCommand(redisClient *c) {
if
(
sop
->
type
==
REDIS_SORT_GET
)
{
if
(
sop
->
type
==
REDIS_SORT_GET
)
{
if
(
!
val
)
val
=
createStringObject
(
""
,
0
);
if
(
!
val
)
val
=
createStringObject
(
""
,
0
);
/* lPush does an incrRefCount, so we should take care
/* l
istType
Push does an incrRefCount, so we should take care
* care of the incremented refcount caused by either
* care of the incremented refcount caused by either
* lookupKeyByPattern or createStringObject("",0) */
* lookupKeyByPattern or createStringObject("",0) */
lPush
(
sobj
,
val
,
REDIS_TAIL
);
l
istType
Push
(
sobj
,
val
,
REDIS_TAIL
);
decrRefCount
(
val
);
decrRefCount
(
val
);
}
else
{
}
else
{
/* always fails */
/* always fails */
...
@@ -11075,14 +11075,14 @@ static void computeDatasetDigest(unsigned char *final) {
...
@@ -11075,14 +11075,14 @@ static void computeDatasetDigest(unsigned char *final) {
if
(
o
->
type
==
REDIS_STRING
)
{
if
(
o
->
type
==
REDIS_STRING
)
{
mixObjectDigest
(
digest
,
o
);
mixObjectDigest
(
digest
,
o
);
}
else
if
(
o
->
type
==
REDIS_LIST
)
{
}
else
if
(
o
->
type
==
REDIS_LIST
)
{
lIterator
*
li
=
lInitIterator
(
o
,
0
,
REDIS_TAIL
);
l
istType
Iterator
*
li
=
l
istType
InitIterator
(
o
,
0
,
REDIS_TAIL
);
lEntry
entry
;
l
istType
Entry
entry
;
while
(
lNext
(
li
,
&
entry
))
{
while
(
l
istType
Next
(
li
,
&
entry
))
{
robj
*
eleobj
=
lGet
(
&
entry
);
robj
*
eleobj
=
l
istType
Get
(
&
entry
);
mixObjectDigest
(
digest
,
eleobj
);
mixObjectDigest
(
digest
,
eleobj
);
decrRefCount
(
eleobj
);
decrRefCount
(
eleobj
);
}
}
lReleaseIterator
(
li
);
l
istType
ReleaseIterator
(
li
);
}
else
if
(
o
->
type
==
REDIS_SET
)
{
}
else
if
(
o
->
type
==
REDIS_SET
)
{
dict
*
set
=
o
->
ptr
;
dict
*
set
=
o
->
ptr
;
dictIterator
*
di
=
dictGetIterator
(
set
);
dictIterator
*
di
=
dictGetIterator
(
set
);
...
...
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