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
Hide 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,21 +3744,17 @@ static void setnxCommand(redisClient *c) {
...
@@ -3726,21 +3744,17 @@ 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;
if (o->type != REDIS_STRING) {
addReply(c,shared.wrongtypeerr);
return REDIS_ERR;
} else {
} else {
if (o->type != REDIS_STRING) {
addReplyBulk(c,o);
addReply(c,shared.wrongtypeerr);
return REDIS_OK;
return REDIS_ERR;
} else {
addReplyBulkLen(c,o);
addReply(c,o);
addReply(c,shared.crlf);
return REDIS_OK;
}
}
}
}
}
...
@@ -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,44 +3946,37 @@ static void substrCommand(redisClient *c) {
...
@@ -3934,44 +3946,37 @@ 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);
size_t rangelen, strlen;
sds range;
o = lookupKeyRead(c->db,c->argv[1]);
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.nullbulk)) == NULL ||
if (o == NULL) {
checkType(c,o,REDIS_STRING)) return;
addReply(c,shared.nullbulk);
} else {
if (o->type != REDIS_STRING) {
addReply(c,shared.wrongtypeerr);
} else {
size_t rangelen, strlen;
sds range;
o = getDecodedObject(o);
strlen = sdslen(o->ptr);
/* convert negative indexes */
o = getDecodedObject(o);
if (start < 0) start = strlen+start;
strlen = sdslen(o->ptr);
if (end < 0) end = strlen+end;
if (start < 0) start = 0;
if (end < 0) end = 0;
/* indexes sanity checks */
/* convert negative indexes */
if (start > end || (size_t)start >= strlen) {
if (start < 0) start = strlen+start;
/* Out of range start or start > end result in null reply */
if (end < 0) end = strlen+end;
addReply(c,shared.nullbulk);
if (start < 0) start = 0;
decrRefCount(o);
if (end < 0) end = 0;
return;
}
if ((size_t)end >= strlen) end = strlen-1;
rangelen = (end-start)+1;
/* Return the result */
/* indexes sanity checks */
addReplySds(c,sdscatprintf(sdsempty(),"$%zu\r\n",rangelen));
if (start > end || (size_t)start >= strlen) {
range = sdsnewlen((char*)o->ptr+start,rangelen);
/* Out of range start or start > end result in null reply */
addReplySds(c,range);
addReply(c,shared.nullbulk);
addReply(c,shared.crlf);
decrRefCount(o);
decrRefCount(o);
return;
}
}
}
if ((size_t)end >= strlen) end = strlen-1;
rangelen = (end-start)+1;
/* Return the result */
addReplySds(c,sdscatprintf(sdsempty(),"$%zu\r\n",rangelen));
range = sdsnewlen((char*)o->ptr+start,rangelen);
addReplySds(c,range);
addReply(c,shared.crlf);
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) {
...
@@ -4285,107 +4278,78 @@ static void rpushCommand(redisClient *c) {
...
@@ -4285,107 +4278,78 @@ static void rpushCommand(redisClient *c) {
static void llenCommand(redisClient *c) {
static void llenCommand(redisClient *c) {
robj *o;
robj *o;
list *l;
list *l;
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
checkType(c,o,REDIS_LIST)) return;
o = lookupKeyRead(c->db,c->argv[1]);
l = o->ptr;
if (o == NULL) {
addReplyUlong(c,listLength(l));
addReply(c,shared.czero);
return;
} else {
if (o->type != REDIS_LIST) {
addReply(c,shared.wrongtypeerr);
} else {
l = o->ptr;
addReplySds(c,sdscatprintf(sdsempty(),":%d\r\n",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]);
listNode *ln;
if (o == NULL) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.nullbulk)) == NULL ||
checkType(c,o,REDIS_LIST)) return;
list = o->ptr;
ln = listIndex(list, index);
if (ln == NULL) {
addReply(c,shared.nullbulk);
addReply(c,shared.nullbulk);
} else {
} else {
if (o->type != REDIS_LIST) {
robj *ele = listNodeValue(ln);
addReply(c,shared.wrongtypeerr);
addReplyBulk(c,ele);
} else {
list *list = o->ptr;
listNode *ln;
ln = listIndex(list, index);
if (ln == NULL) {
addReply(c,shared.nullbulk);
} else {
robj *ele = listNodeValue(ln);
addReplyBulkLen(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]);
listNode *ln;
if (o == NULL) {
addReply(c,shared.nokeyerr);
if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.nokeyerr)) == NULL ||
checkType(c,o,REDIS_LIST)) return;
list = o->ptr;
ln = listIndex(list, index);
if (ln == NULL) {
addReply(c,shared.outofrangeerr);
} else {
} else {
if (o->type != REDIS_LIST) {
robj *ele = listNodeValue(ln);
addReply(c,shared.wrongtypeerr);
} else {
list *list = o->ptr;
listNode *ln;
ln = listIndex(list, index);
if (ln == NULL) {
addReply(c,shared.outofrangeerr);
} else {
robj *ele = listNodeValue(ln);
decrRefCount(ele);
decrRefCount(ele);
listNodeValue(ln) = c->argv[3];
listNodeValue(ln) = c->argv[3];
incrRefCount(c->argv[3]);
incrRefCount(c->argv[3]);
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;
listNode *ln;
o = lookupKeyWrite(c->db,c->argv[1]);
if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.nullbulk)) == NULL ||
if (o == NULL) {
checkType(c,o,REDIS_LIST)) return;
addReply(c,shared.nullbulk);
list = o->ptr;
} else {
if (o->type != REDIS_LIST) {
addReply(c,shared.wrongtypeerr);
} else {
list *list = o->ptr;
listNode *ln;
if (where == REDIS_HEAD)
if (where == REDIS_HEAD)
ln = listFirst(list);
ln = listFirst(list);
else
else
ln = listLast(list);
ln = listLast(list);
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);
listDelNode(list,ln);
addReply(c,shared.crlf);
server.dirty++;
listDelNode(list,ln);
server.dirty++;
}
}
}
}
}
}
...
@@ -4401,46 +4365,39 @@ static void lrangeCommand(redisClient *c) {
...
@@ -4401,46 +4365,39 @@ 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;
int rangelen, j;
list *list;
listNode *ln;
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 */
if (start < 0) start = llen+start;
if (end < 0) end = llen+end;
if (start < 0) start = 0;
if (end < 0) end = 0;
/* indexes sanity checks */
if (start > end || start >= llen) {
/* Out of range start or start > end result in empty list */
addReply(c,shared.emptymultibulk);
return;
}
if (end >= llen) end = llen-1;
rangelen = (end-start)+1;
o = lookupKeyRead(c->db,c->argv[1]);
/* Return the result in form of a multi-bulk reply */
if (o == NULL) {
ln = listIndex(list, start);
addReply(c,shared.nullmultibulk);
addReplySds(c,sdscatprintf(sdsempty(),"*%d\r\n",rangelen));
} else {
for (j = 0; j < rangelen; j++) {
if (o->type != REDIS_LIST) {
ele = listNodeValue(ln);
addReply(c,shared.wrongtypeerr);
addReplyBulk(c,ele);
} else {
ln = ln->next;
list *list = o->ptr;
listNode *ln;
int llen = listLength(list);
int rangelen, j;
robj *ele;
/* convert negative indexes */
if (start < 0) start = llen+start;
if (end < 0) end = llen+end;
if (start < 0) start = 0;
if (end < 0) end = 0;
/* indexes sanity checks */
if (start > end || start >= llen) {
/* Out of range start or start > end result in empty list */
addReply(c,shared.emptymultibulk);
return;
}
if (end >= llen) end = llen-1;
rangelen = (end-start)+1;
/* Return the result in form of a multi-bulk reply */
ln = listIndex(list, start);
addReplySds(c,sdscatprintf(sdsempty(),"*%d\r\n",rangelen));
for (j = 0; j < rangelen; j++) {
ele = listNodeValue(ln);
addReplyBulkLen(c,ele);
addReply(c,ele);
addReply(c,shared.crlf);
ln = ln->next;
}
}
}
}
}
}
...
@@ -4448,87 +4405,76 @@ static void ltrimCommand(redisClient *c) {
...
@@ -4448,87 +4405,76 @@ 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]);
int j, ltrim, rtrim;
if (o == NULL) {
list *list;
addReply(c,shared.ok);
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 */
if (start < 0) start = llen+start;
if (end < 0) end = llen+end;
if (start < 0) start = 0;
if (end < 0) end = 0;
/* indexes sanity checks */
if (start > end || start >= llen) {
/* Out of range start or start > end result in empty list */
ltrim = llen;
rtrim = 0;
} else {
} else {
if (o->type != REDIS_LIST) {
if (end >= llen) end = llen-1;
addReply(c,shared.wrongtypeerr);
ltrim = start;
} else {
rtrim = llen-end-1;
list *list = o->ptr;
}
listNode *ln;
int llen = listLength(list);
int j, ltrim, rtrim;
/* convert negative indexes */
if (start < 0) start = llen+start;
if (end < 0) end = llen+end;
if (start < 0) start = 0;
if (end < 0) end = 0;
/* indexes sanity checks */
if (start > end || start >= llen) {
/* Out of range start or start > end result in empty list */
ltrim = llen;
rtrim = 0;
} else {
if (end >= llen) end = llen-1;
ltrim = start;
rtrim = llen-end-1;
}
/* Remove list elements to perform the trim */
/* Remove list elements to perform the trim */
for (j = 0; j < ltrim; j++) {
for (j = 0; j < ltrim; j++) {
ln = listFirst(list);
ln = listFirst(list);
listDelNode(list,ln);
listDelNode(list,ln);
}
}
for (j = 0; j < rtrim; j++) {
for (j = 0; j < rtrim; j++) {
ln = listLast(list);
ln = listLast(list);
listDelNode(list,ln);
listDelNode(list,ln);
}
server.dirty++;
addReply(c,shared.ok);
}
}
}
server.dirty++;
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]);
listNode *ln, *next;
if (o == NULL) {
int toremove = atoi(c->argv[2]->ptr);
addReply(c,shared.czero);
int removed = 0;
} else {
int fromtail = 0;
if (o->type != REDIS_LIST) {
addReply(c,shared.wrongtypeerr);
} else {
list *list = o->ptr;
listNode *ln, *next;
int toremove = atoi(c->argv[2]->ptr);
int removed = 0;
int fromtail = 0;
if (toremove < 0) {
toremove = -toremove;
fromtail = 1;
}
ln = fromtail ? list->tail : list->head;
while (ln) {
robj *ele = listNodeValue(ln);
next = fromtail ? ln->prev : ln->next;
if ((o = lookupKeyWriteOrReply(c,c->argv[1],shared.czero)) == NULL ||
if (compareStringObjects(ele,c->argv[3]) == 0) {
checkType(c,o,REDIS_LIST)) return;
listDelNode(list,ln);
list = o->ptr;
server.dirty++;
removed++;
if (toremove < 0) {
if (toremove && removed == toremove) break;
toremove = -toremove;
}
fromtail = 1;
ln = next;
}
}
ln = fromtail ? list->tail : list->head;
addReplySds(c,sdscatprintf(sdsempty(),":%d\r\n",removed));
while (ln) {
robj *ele = listNodeValue(ln);
next = fromtail ? ln->prev : ln->next;
if (compareStringObjects(ele,c->argv[3]) == 0) {
listDelNode(list,ln);
server.dirty++;
removed++;
if (toremove && removed == toremove) break;
}
}
ln = next;
}
}
addReplySds(c,sdscatprintf(sdsempty(),":%d\r\n",removed));
}
}
/* This is the semantic of this command:
/* This is the semantic of this command:
...
@@ -4548,57 +4494,49 @@ static void lremCommand(redisClient *c) {
...
@@ -4548,57 +4494,49 @@ static void lremCommand(redisClient *c) {
*/
*/
static void rpoplpushcommand(redisClient *c) {
static void rpoplpushcommand(redisClient *c) {
robj *sobj;
robj *sobj;
list *srclist;
listNode *ln;
if ((sobj = lookupKeyWriteOrReply(c,c->argv[1],shared.nullbulk)) == NULL ||
checkType(c,sobj,REDIS_LIST)) return;
srclist = sobj->ptr;
ln = listLast(srclist);
sobj = lookupKeyWrite(c->db,c->argv[1]);
if (ln == NULL) {
if (sobj == NULL) {
addReply(c,shared.nullbulk);
addReply(c,shared.nullbulk);
} else {
} else {
if (sobj->type != REDIS_LIST) {
robj *dobj = lookupKeyWrite(c->db,c->argv[2]);
addReply(c,shared.wrongtypeerr);
robj *ele = listNodeValue(ln);
} else {
list *dstlist;
list *srclist = sobj->ptr;
listNode *ln = listLast(srclist);
if (ln == NULL) {
addReply(c,shared.nullbulk);
} else {
robj *dobj = lookupKeyWrite(c->db,c->argv[2]);
robj *ele = listNodeValue(ln);
list *dstlist;
if (dobj && dobj->type != REDIS_LIST) {
addReply(c,shared.wrongtypeerr);
return;
}
/* Add the element to the target list (unless it's directly
if (dobj && dobj->type != REDIS_LIST) {
* passed to some BLPOP-ing client */
addReply(c,shared.wrongtypeerr);
if (!handleClientsWaitingListPush(c,c->argv[2],ele)) {
return;
if (dobj == NULL) {
}
/* Create the list if the key does not exist */
dobj = createListObject();
dictAdd(c->db->dict,c->argv[2],dobj);
incrRefCount(c->argv[2]);
}
dstlist = dobj->ptr;
listAddNodeHead(dstlist,ele);
incrRefCount(ele);
}
/* Send the element to the client as reply as well */
addReplyBulkLen(c,ele);
addReply(c,ele);
addReply(c,shared.crlf);
/* Finally remove the element from the source list */
/* Add the element to the target list (unless it's directly
listDelNode(srclist,ln);
* passed to some BLPOP-ing client */
server.dirty++;
if (!handleClientsWaitingListPush(c,c->argv[2],ele)) {
if (dobj == NULL) {
/* Create the list if the key does not exist */
dobj = createListObject();
dictAdd(c->db->dict,c->argv[2],dobj);
incrRefCount(c->argv[2]);
}
}
dstlist = dobj->ptr;
listAddNodeHead(dstlist,ele);
incrRefCount(ele);
}
}
/* Send the element to the client as reply as well */
addReplyBulk(c,ele);
/* Finally remove the element from the source list */
listDelNode(srclist,ln);
server.dirty++;
}
}
}
}
/* ==================================== Sets ================================ */
/* ==================================== Sets ================================ */
static void saddCommand(redisClient *c) {
static void saddCommand(redisClient *c) {
...
@@ -4627,21 +4565,15 @@ static void saddCommand(redisClient *c) {
...
@@ -4627,21 +4565,15 @@ 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);
if (dictDelete(set->ptr,c->argv[2]) == DICT_OK) {
server.dirty++;
if (htNeedsResize(set->ptr)) dictResize(set->ptr);
addReply(c,shared.cone);
} else {
} else {
if (set->type != REDIS_SET) {
addReply(c,shared.czero);
addReply(c,shared.wrongtypeerr);
return;
}
if (dictDelete(set->ptr,c->argv[2]) == DICT_OK) {
server.dirty++;
if (htNeedsResize(set->ptr)) dictResize(set->ptr);
addReply(c,shared.cone);
} else {
addReply(c,shared.czero);
}
}
}
}
}
...
@@ -4683,65 +4615,43 @@ static void smoveCommand(redisClient *c) {
...
@@ -4683,65 +4615,43 @@ 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;
if (dictFind(set->ptr,c->argv[2]))
addReply(c,shared.cone);
else
addReply(c,shared.czero);
addReply(c,shared.czero);
} else {
if (set->type != REDIS_SET) {
addReply(c,shared.wrongtypeerr);
return;
}
if (dictFind(set->ptr,c->argv[2]))
addReply(c,shared.cone);
else
addReply(c,shared.czero);
}
}
}
static void scardCommand(redisClient *c) {
static void scardCommand(redisClient *c) {
robj *o;
robj *o;
dict *s;
dict *s;
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.czero)) == NULL ||
checkType(c,o,REDIS_SET)) return;
o = lookupKeyRead(c->db,c->argv[1]);
s = o->ptr;
if (o == NULL) {
addReplyUlong(c,dictSize(s));
addReply(c,shared.czero);
return;
} else {
if (o->type != REDIS_SET) {
addReply(c,shared.wrongtypeerr);
} else {
s = o->ptr;
addReplySds(c,sdscatprintf(sdsempty(),":%lu\r\n",
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;
de = dictGetRandomKey(set->ptr);
if (de == NULL) {
addReply(c,shared.nullbulk);
addReply(c,shared.nullbulk);
} else {
} else {
if (set->type != REDIS_SET) {
robj *ele = dictGetEntryKey(de);
addReply(c,shared.wrongtypeerr);
return;
}
de = dictGetRandomKey(set->ptr);
if (de == NULL) {
addReply(c,shared.nullbulk);
} else {
robj *ele = dictGetEntryKey(de);
addReplyBulkLen(c,ele);
addReplyBulk(c,ele);
addReply(c,ele);
dictDelete(set->ptr,ele);
addReply(c,shared.crlf);
if (htNeedsResize(set->ptr)) dictResize(set->ptr);
dictDelete(set->ptr,ele);
server.dirty++;
if (htNeedsResize(set->ptr)) dictResize(set->ptr);
server.dirty++;
}
}
}
}
}
...
@@ -4749,24 +4659,16 @@ static void srandmemberCommand(redisClient *c) {
...
@@ -4749,24 +4659,16 @@ 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;
de = dictGetRandomKey(set->ptr);
if (de == NULL) {
addReply(c,shared.nullbulk);
addReply(c,shared.nullbulk);
} else {
} else {
if (set->type != REDIS_SET) {
robj *ele = dictGetEntryKey(de);
addReply(c,shared.wrongtypeerr);
return;
}
de = dictGetRandomKey(set->ptr);
if (de == NULL) {
addReply(c,shared.nullbulk);
} else {
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,101 +5294,80 @@ static void zincrbyCommand(redisClient *c) {
...
@@ -5396,101 +5294,80 @@ static void zincrbyCommand(redisClient *c) {
static void zremCommand(redisClient *c) {
static void zremCommand(redisClient *c) {
robj *zsetobj;
robj *zsetobj;
zset *zs;
zset *zs;
dictEntry *de;
double *oldscore;
int deleted;
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 {
dictEntry *de;
double *oldscore;
int deleted;
if (zsetobj->type != REDIS_ZSET) {
addReply(c,shared.wrongtypeerr);
return;
}
zs = zsetobj->ptr;
de = dictFind(zs->dict,c->argv[2]);
if (de == NULL) {
addReply(c,shared.czero);
return;
}
/* Delete from the skiplist */
oldscore = dictGetEntryVal(de);
deleted = zslDelete(zs->zsl,*oldscore,c->argv[2]);
redisAssert(deleted != 0);
/* Delete from the hash table */
zs = zsetobj->ptr;
dict
Delete
(zs->dict,c->argv[2]);
de =
dict
Find
(zs->dict,c->argv[2]);
if (
htNeedsResize(zs->dict)) dictResize(zs->dict);
if (
de == NULL) {
server.dirty++
;
addReply(c,shared.czero)
;
addReply(c,shared.cone)
;
return
;
}
}
/* Delete from the skiplist */
oldscore = dictGetEntryVal(de);
deleted = zslDelete(zs->zsl,*oldscore,c->argv[2]);
redisAssert(deleted != 0);
/* Delete from the hash table */
dictDelete(zs->dict,c->argv[2]);
if (htNeedsResize(zs->dict)) dictResize(zs->dict);
server.dirty++;
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) {
zs = zsetobj->ptr;
addReply(c,shared.wrongtypeerr);
deleted = zslDeleteRangeByScore(zs->zsl,min,max,zs->dict);
return;
if (htNeedsResize(zs->dict)) dictResize(zs->dict);
}
server.dirty += deleted;
zs = zsetobj->ptr;
addReplyLong(c,deleted);
deleted = zslDeleteRangeByScore(zs->zsl,min,max,zs->dict);
if (htNeedsResize(zs->dict)) dictResize(zs->dict);
server.dirty += deleted;
addReplySds(c,sdscatprintf(sdsempty(),":%lu\r\n",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);
zs = zsetobj->ptr;
} else {
llen = zs->zsl->length;
if (zsetobj->type != REDIS_ZSET) {
addReply(c,shared.wrongtypeerr);
return;
}
zs = zsetobj->ptr;
int llen = zs->zsl->length;
long deleted;
/* convert negative indexes */
if (start < 0) start = llen+start;
if (end < 0) end = llen+end;
if (start < 0) start = 0;
if (end < 0) end = 0;
/* indexes sanity checks */
/* convert negative indexes */
if (start > end || start >= llen) {
if (start < 0) start = llen+start;
addReply(c,shared.czero);
if (end < 0) end = llen+end;
return;
if (start < 0) start = 0;
}
if (end < 0) end = 0;
if (end >= llen) end = llen-1;
/* increment start and end because zsl*Rank functions
/* indexes sanity checks */
* use 1-based rank */
if (start > end || start >= llen) {
deleted = zslDeleteRangeByRank(zs->zsl,start+1,end+1,zs->dict);
addReply(c,shared.czero);
if (htNeedsResize(zs->dict)) dictResize(zs->dict);
return;
server.dirty += deleted;
addReplyLong(c, deleted);
}
}
if (end >= llen) end = llen-1;
/* increment start and end because zsl*Rank functions
* use 1-based rank */
deleted = zslDeleteRangeByRank(zs->zsl,start+1,end+1,zs->dict);
if (htNeedsResize(zs->dict)) dictResize(zs->dict);
server.dirty += 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,57 +5554,45 @@ static void zrangeGenericCommand(redisClient *c, int reverse) {
...
@@ -5671,57 +5554,45 @@ 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;
/* convert negative indexes */
int rangelen, j;
if (start < 0) start = llen+start;
robj *ele;
if (end < 0) end = llen+end;
if (start < 0) start = 0;
if (end < 0) end = 0;
/* convert negative indexes */
/* indexes sanity checks */
if (start < 0) start = llen+start;
if (start > end || start >= llen) {
if (end < 0) end = llen+end;
/* Out of range start or start > end result in empty list */
if (start < 0) start = 0;
addReply(c,shared.emptymultibulk);
if (end < 0) end = 0;
return;
}
/* indexes sanity checks */
if (end >= llen) end = llen-1;
if (start > end || start >= llen) {
rangelen = (end-start)+1;
/* Out of range start or start > end result in empty list */
addReply(c,shared.emptymultibulk);
return;
}
if (end >= llen) end = llen-1;
rangelen = (end-start)+1;
/* 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 : 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 */
addReplySds(c,sdscatprintf(sdsempty(),"*%d\r\n",
addReplySds(c,sdscatprintf(sdsempty(),"*%d\r\n",
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);
if (withscores)
addReply(c,shared.crlf);
addReplyDouble(c,ln->score);
if (withscores)
ln = reverse ? ln->backward : ln->forward[0];
addReplyDouble(c,ln->score);
ln = reverse ? ln->backward : ln->forward[0];
}
}
}
}
}
}
...
@@ -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);
}
}
...
@@ -5862,80 +5731,62 @@ static void zcountCommand(redisClient *c) {
...
@@ -5862,80 +5731,62 @@ static void zcountCommand(redisClient *c) {
static void zcardCommand(redisClient *c) {
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;
zs = o->ptr;
} else {
addReplyUlong(c,zs->zsl->length);
if (o->type != REDIS_ZSET) {
addReply(c,shared.wrongtypeerr);
} else {
zs = o->ptr;
addReplySds(c,sdscatprintf(sdsempty(),":%lu\r\n",zs->zsl->length));
}
}
}
}
static void zscoreCommand(redisClient *c) {
static void zscoreCommand(redisClient *c) {
robj *o;
robj *o;
zset *zs;
zset *zs;
dictEntry *de;
o = lookupKeyRead(c->db,c->argv[1]);
if (o == NULL) {
if ((o = lookupKeyReadOrReply(c,c->argv[1],shared.nullbulk)) == NULL ||
checkType(c,o,REDIS_ZSET)) return;
zs = o->ptr;
de = dictFind(zs->dict,c->argv[2]);
if (!de) {
addReply(c,shared.nullbulk);
addReply(c,shared.nullbulk);
return;
} else {
} else {
if (o->type != REDIS_ZSET) {
double *score = dictGetEntryVal(de);
addReply(c,shared.wrongtypeerr);
} else {
dictEntry *de;
zs = o->ptr;
de = dictFind(zs->dict,c->argv[2]);
if (!de) {
addReply(c,shared.nullbulk);
} else {
double *score = dictGetEntryVal(de);
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;
dictEntry *de;
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]);
if (!de) {
addReply(c,shared.nullbulk);
addReply(c,shared.nullbulk);
return;
return;
}
}
if (o->type != REDIS_ZSET) {
addReply(c,shared.wrongtypeerr);
} else {
zset *zs = o->ptr;
zskiplist *zsl = zs->zsl;
dictEntry *de;
unsigned long rank;
de = dictFind(zs->dict,c->argv[2]);
score = dictGetEntryVal(de);
if (!de) {
rank = zslGetRank(zsl, *score, c->argv[2]);
addReply(c,shared.nullbulk);
if (rank) {
return;
if (reverse) {
}
addReplyLong(c, zsl->length - rank);
double *score = dictGetEntryVal(de);
rank = zslGetRank(zsl, *score, c->argv[2]);
if (rank) {
if (reverse) {
addReplyLong(c, zsl->length - rank);
} else {
addReplyLong(c, rank-1);
}
} else {
} else {
addReply
(c,shared.nullbulk
);
addReply
Long(c, rank-1
);
}
}
} else {
addReply(c,shared.nullbulk);
}
}
}
}
...
@@ -6006,78 +5857,61 @@ static void hsetCommand(redisClient *c) {
...
@@ -6006,78 +5857,61 @@ 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->encoding == REDIS_ENCODING_ZIPMAP) {
if (o->type != REDIS_HASH) {
unsigned char *zm = o->ptr;
addReply(c,shared.wrongtypeerr);
unsigned char *val;
unsigned int vlen;
if (zipmapGet(zm,c->argv[2]->ptr,sdslen(c->argv[2]->ptr), &val,&vlen)) {
addReplySds(c,sdscatprintf(sdsempty(),"$%u\r\n", vlen));
addReplySds(c,sdsnewlen(val,vlen));
addReply(c,shared.crlf);
return;
} else {
addReply(c,shared.nullbulk);
return;
return;
}
}
} else {
struct dictEntry *de;
if (o->encoding == REDIS_ENCODING_ZIPMAP) {
de = dictFind(o->ptr,c->argv[2]);
unsigned char *zm = o->ptr;
if (de == NULL) {
unsigned char *val;
addReply(c,shared.nullbulk);
unsigned int vlen;
if (zipmapGet(zm,c->argv[2]->ptr,sdslen(c->argv[2]->ptr), &val,&vlen)) {
addReplySds(c,sdscatprintf(sdsempty(),"$%u\r\n", vlen));
addReplySds(c,sdsnewlen(val,vlen));
addReply(c,shared.crlf);
return;
} else {
addReply(c,shared.nullbulk);
return;
}
} else {
} else {
struct
dictEntry
*
de;
robj *e =
dict
Get
Entry
Val(
de
)
;
de = dictFind(o->ptr,c->argv[2]);
addReplyBulk(c,e);
if (de == NULL) {
addReply(c,shared.nullbulk);
} else {
robj *e = dictGetEntryVal(de);
addReplyBulkLen(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;
int deleted = 0;
if (o == NULL) {
addReply(c,shared.czero);
return;
} else {
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,
(unsigned char*) c->argv[2]->ptr,
(unsigned char*) c->argv[2]->ptr,
sdslen(c->argv[2]->ptr), &deleted);
sdslen(c->argv[2]->ptr), &deleted);
} else {
} else {
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