Skip to content

Commit

Permalink
HINCRBYFLOAT implemented
Browse files Browse the repository at this point in the history
  • Loading branch information
antirez committed Nov 15, 2011
1 parent d4a3cfe commit 68bfe99
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/redis.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ struct redisCommand redisCommandTable[] = {
{"hmset",hmsetCommand,-4,"wm",0,NULL,1,1,1,0,0},
{"hmget",hmgetCommand,-3,"r",0,NULL,1,1,1,0,0},
{"hincrby",hincrbyCommand,4,"wm",0,NULL,1,1,1,0,0},
{"hincrbyfloat",hincrbyfloatCommand,4,"wm",0,NULL,1,1,1,0,0},
{"hdel",hdelCommand,-3,"w",0,NULL,1,1,1,0,0},
{"hlen",hlenCommand,2,"r",0,NULL,1,1,1,0,0},
{"hkeys",hkeysCommand,2,"r",0,NULL,1,1,1,0,0},
Expand Down
1 change: 1 addition & 0 deletions src/redis.h
Original file line number Diff line number Diff line change
Expand Up @@ -1104,6 +1104,7 @@ void hgetallCommand(redisClient *c);
void hexistsCommand(redisClient *c);
void configCommand(redisClient *c);
void hincrbyCommand(redisClient *c);
void hincrbyfloatCommand(redisClient *c);
void subscribeCommand(redisClient *c);
void unsubscribeCommand(redisClient *c);
void psubscribeCommand(redisClient *c);
Expand Down
27 changes: 27 additions & 0 deletions src/t_hash.c
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,33 @@ void hincrbyCommand(redisClient *c) {
server.dirty++;
}

void hincrbyfloatCommand(redisClient *c) {
double long value, incr;
robj *o, *current, *new;

if (getLongDoubleFromObjectOrReply(c,c->argv[3],&incr,NULL) != REDIS_OK) return;
if ((o = hashTypeLookupWriteOrCreate(c,c->argv[1])) == NULL) return;
if ((current = hashTypeGetObject(o,c->argv[2])) != NULL) {
if (getLongDoubleFromObjectOrReply(c,current,&value,
"hash value is not a valid float") != REDIS_OK) {
decrRefCount(current);
return;
}
decrRefCount(current);
} else {
value = 0;
}

value += incr;
new = createStringObjectFromLongDouble(value);
hashTypeTryObjectEncoding(o,&c->argv[2],NULL);
hashTypeSet(o,c->argv[2],new);
addReplyBulk(c,new);
decrRefCount(new);
signalModifiedKey(c->db,c->argv[1]);
server.dirty++;
}

void hgetCommand(redisClient *c) {
robj *o, *value;
unsigned char *v;
Expand Down

0 comments on commit 68bfe99

Please sign in to comment.