diff options
author | antirez <antirez@gmail.com> | 2011-11-12 19:27:35 +0100 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2011-11-12 19:27:35 +0100 |
commit | 5574b53eae1743cca9eed5a9dd25bf418c974701 (patch) | |
tree | c671e9fb2ab7187e074fd3ea2cb5c4d623f9a0ef /src/t_string.c | |
parent | 64c7499eb88040c26aba264ab52756fd764d8fa4 (diff) | |
download | redis-5574b53eae1743cca9eed5a9dd25bf418c974701.tar.gz |
INCRBYFLOAT implementation
Diffstat (limited to 'src/t_string.c')
-rw-r--r-- | src/t_string.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/t_string.c b/src/t_string.c index ce6233a98..1f0b1fbcc 100644 --- a/src/t_string.c +++ b/src/t_string.c @@ -1,4 +1,5 @@ #include "redis.h" +#include <math.h> /* isnan(), isinf() */ /*----------------------------------------------------------------------------- * String Commands @@ -382,6 +383,31 @@ void decrbyCommand(redisClient *c) { incrDecrCommand(c,-incr); } +void incrbyfloatCommand(redisClient *c) { + long double incr, value; + robj *o, *new; + + o = lookupKeyWrite(c->db,c->argv[1]); + if (o != NULL && checkType(c,o,REDIS_STRING)) return; + if (getLongDoubleFromObjectOrReply(c,o,&value,NULL) != REDIS_OK || + getLongDoubleFromObjectOrReply(c,c->argv[2],&incr,NULL) != REDIS_OK) + return; + + value += incr; + if (isnan(value) || isinf(value)) { + addReplyError(c,"increment would produce NaN or Infinity"); + return; + } + new = createStringObjectFromLongDouble(value); + if (o) + dbOverwrite(c->db,c->argv[1],new); + else + dbAdd(c->db,c->argv[1],new); + signalModifiedKey(c->db,c->argv[1]); + server.dirty++; + addReplyBulk(c,new); +} + void appendCommand(redisClient *c) { size_t totlen; robj *o, *append; |