Compare commits

...
Author SHA1 Message Date
Robey Pointer 0b6677608d add LISMEMBER. 2010-08-02 19:01:56 -07:00
4 changed files with 51 additions and 0 deletions
+1
View File
@@ -91,6 +91,7 @@ struct redisCommand readonlyCommandTable[] = {
{"blpop",blpopCommand,-3,REDIS_CMD_INLINE,NULL,1,1,1},
{"llen",llenCommand,2,REDIS_CMD_INLINE,NULL,1,1,1},
{"lindex",lindexCommand,3,REDIS_CMD_INLINE,NULL,1,1,1},
{"lismember",lismemberCommand,3,REDIS_CMD_INLINE,NULL,1,1,1},
{"lset",lsetCommand,4,REDIS_CMD_BULK|REDIS_CMD_DENYOOM,NULL,1,1,1},
{"lrange",lrangeCommand,4,REDIS_CMD_INLINE,NULL,1,1,1},
{"ltrim",ltrimCommand,4,REDIS_CMD_INLINE,NULL,1,1,1},
+1
View File
@@ -808,6 +808,7 @@ void lpopCommand(redisClient *c);
void rpopCommand(redisClient *c);
void llenCommand(redisClient *c);
void lindexCommand(redisClient *c);
void lismemberCommand(redisClient *c);
void lrangeCommand(redisClient *c);
void ltrimCommand(redisClient *c);
void typeCommand(redisClient *c);
+29
View File
@@ -405,6 +405,35 @@ void lindexCommand(redisClient *c) {
}
}
void lismemberCommand(redisClient *c) {
robj *subject;
robj *refval = c->argv[2];
listTypeIterator *iter;
listTypeEntry entry;
int found = 0;
if ((subject = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
checkType(c,subject,REDIS_LIST)) return;
redisAssert(refval->encoding == REDIS_ENCODING_RAW);
/* Seek refval from head to tail */
iter = listTypeInitIterator(subject,0,REDIS_TAIL);
while (listTypeNext(iter,&entry)) {
if (listTypeEqual(&entry,refval)) {
found = 1;
break;
}
}
listTypeReleaseIterator(iter);
if (found) {
addReply(c,shared.cone);
} else {
addReply(c,shared.czero);
}
}
void lsetCommand(redisClient *c) {
robj *o = lookupKeyWriteOrReply(c,c->argv[1],shared.nokeyerr);
if (o == NULL || checkType(c,o,REDIS_LIST)) return;
+20
View File
@@ -55,6 +55,26 @@ start_server {
assert_equal $largevalue(linkedlist) [r lindex mylist2 2]
}
test {LISMEMBER - ziplist} {
r del mylist1
assert_equal 1 [r rpush mylist1 house]
assert_equal 2 [r rpush mylist1 boat]
assert_encoding ziplist mylist1
assert_equal 1 [r lismember mylist1 house]
assert_equal 1 [r lismember mylist1 boat]
assert_equal 0 [r lismember mylist1 airplane]
}
test {LISMEMBER - regular list} {
r del mylist1
assert_equal 1 [r rpush mylist1 $largevalue(linkedlist)]
assert_equal 2 [r rpush mylist1 boat]
assert_encoding linkedlist mylist1
assert_equal 1 [r lismember mylist1 $largevalue(linkedlist)]
assert_equal 1 [r lismember mylist1 boat]
assert_equal 0 [r lismember mylist1 airplane]
}
test {DEL a list - ziplist} {
assert_equal 1 [r del myziplist2]
assert_equal 0 [r exists myziplist2]