Don't encode element argument when dealing with ziplist

This commit is contained in:
Pieter Noordhuis 2011-03-08 16:51:41 +01:00
parent 21c5b508a4
commit 3ca7532a2d

View File

@ -560,11 +560,16 @@ int zzlInsert(robj *zobj, robj *ele, double score) {
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
/* This generic command implements both ZADD and ZINCRBY. */ /* This generic command implements both ZADD and ZINCRBY. */
void zaddGenericCommand(redisClient *c, robj *key, robj *ele, double score, int incr) { void zaddGenericCommand(redisClient *c, int incr) {
static char *nanerr = "resulting score is not a number (NaN)"; static char *nanerr = "resulting score is not a number (NaN)";
robj *key = c->argv[1];
robj *ele;
robj *zobj; robj *zobj;
robj *curobj; robj *curobj;
double curscore = 0.0; double score, curscore = 0.0;
if (getDoubleFromObjectOrReply(c,c->argv[2],&score,NULL) != REDIS_OK)
return;
zobj = lookupKeyWrite(c->db,key); zobj = lookupKeyWrite(c->db,key);
if (zobj == NULL) { if (zobj == NULL) {
@ -580,6 +585,8 @@ void zaddGenericCommand(redisClient *c, robj *key, robj *ele, double score, int
if (zobj->encoding == REDIS_ENCODING_ZIPLIST) { if (zobj->encoding == REDIS_ENCODING_ZIPLIST) {
unsigned char *eptr; unsigned char *eptr;
/* Prefer non-encoded element when dealing with ziplists. */
ele = c->argv[3];
if ((eptr = zzlFind(zobj,ele,&curscore)) != NULL) { if ((eptr = zzlFind(zobj,ele,&curscore)) != NULL) {
if (incr) { if (incr) {
score += curscore; score += curscore;
@ -620,6 +627,7 @@ void zaddGenericCommand(redisClient *c, robj *key, robj *ele, double score, int
zskiplistNode *znode; zskiplistNode *znode;
dictEntry *de; dictEntry *de;
ele = c->argv[3] = tryObjectEncoding(c->argv[3]);
de = dictFind(zs->dict,ele); de = dictFind(zs->dict,ele);
if (de != NULL) { if (de != NULL) {
curobj = dictGetEntryKey(de); curobj = dictGetEntryKey(de);
@ -672,17 +680,11 @@ void zaddGenericCommand(redisClient *c, robj *key, robj *ele, double score, int
} }
void zaddCommand(redisClient *c) { void zaddCommand(redisClient *c) {
double scoreval; zaddGenericCommand(c,0);
if (getDoubleFromObjectOrReply(c,c->argv[2],&scoreval,NULL) != REDIS_OK) return;
c->argv[3] = tryObjectEncoding(c->argv[3]);
zaddGenericCommand(c,c->argv[1],c->argv[3],scoreval,0);
} }
void zincrbyCommand(redisClient *c) { void zincrbyCommand(redisClient *c) {
double scoreval; zaddGenericCommand(c,1);
if (getDoubleFromObjectOrReply(c,c->argv[2],&scoreval,NULL) != REDIS_OK) return;
c->argv[3] = tryObjectEncoding(c->argv[3]);
zaddGenericCommand(c,c->argv[1],c->argv[3],scoreval,1);
} }
void zremCommand(redisClient *c) { void zremCommand(redisClient *c) {