HINCRBYFLOAT implemented

This commit is contained in:
antirez 2011-11-15 15:09:39 +01:00
parent d4a3cfed9c
commit 68bfe993c8
3 changed files with 29 additions and 0 deletions

View File

@ -157,6 +157,7 @@ struct redisCommand redisCommandTable[] = {
{"hmset",hmsetCommand,-4,"wm",0,NULL,1,1,1,0,0}, {"hmset",hmsetCommand,-4,"wm",0,NULL,1,1,1,0,0},
{"hmget",hmgetCommand,-3,"r",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}, {"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}, {"hdel",hdelCommand,-3,"w",0,NULL,1,1,1,0,0},
{"hlen",hlenCommand,2,"r",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}, {"hkeys",hkeysCommand,2,"r",0,NULL,1,1,1,0,0},

View File

@ -1104,6 +1104,7 @@ void hgetallCommand(redisClient *c);
void hexistsCommand(redisClient *c); void hexistsCommand(redisClient *c);
void configCommand(redisClient *c); void configCommand(redisClient *c);
void hincrbyCommand(redisClient *c); void hincrbyCommand(redisClient *c);
void hincrbyfloatCommand(redisClient *c);
void subscribeCommand(redisClient *c); void subscribeCommand(redisClient *c);
void unsubscribeCommand(redisClient *c); void unsubscribeCommand(redisClient *c);
void psubscribeCommand(redisClient *c); void psubscribeCommand(redisClient *c);

View File

@ -346,6 +346,33 @@ void hincrbyCommand(redisClient *c) {
server.dirty++; 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) { void hgetCommand(redisClient *c) {
robj *o, *value; robj *o, *value;
unsigned char *v; unsigned char *v;