summaryrefslogtreecommitdiff
path: root/src/t_string.c
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2011-11-12 19:27:35 +0100
committerantirez <antirez@gmail.com>2011-11-12 19:27:35 +0100
commit5574b53eae1743cca9eed5a9dd25bf418c974701 (patch)
treec671e9fb2ab7187e074fd3ea2cb5c4d623f9a0ef /src/t_string.c
parent64c7499eb88040c26aba264ab52756fd764d8fa4 (diff)
downloadredis-5574b53eae1743cca9eed5a9dd25bf418c974701.tar.gz
INCRBYFLOAT implementation
Diffstat (limited to 'src/t_string.c')
-rw-r--r--src/t_string.c26
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;